Some checks failed
check / check (push) Failing after 52s
M0–M5 ur doc/plan.md: layer-shell-dock per skärm med transparent #222222-ö, pins + körande appar (gruppering, badges, indikatorer), klick/skroll/mittklick, konfigurerbar högerklicksmeny, tomyta-meny, settings-GUI som redigerar JSON-configen live, filewatcher, Wayfire-IPC-stubbar (scale, flytta-till-skärm), CI + release-flöde. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
4.0 KiB
4.0 KiB
waydock — arkitektur (hur appen är tänkt att byggas)
Översikt
┌────────────────────────────────────────┐
│ waydock (1 process) │
wayfire ── wl ────►│ toplevel.rs zwlr_foreign_toplevel │
(egen anslutning) │ │ (fönster, states, output)│
│ ▼ │
wayfire ── ipc ───►│ wayfire_ipc.rs scale/expo, geometri │
(unix-socket) │ │ │
│ ▼ │
│ state ──► dock.rs ── GTK4-fönster/skärm│
│ ▲ (layer-shell, CSS) │
│ config.rs ───┘ │
│ ▲ ▲ │
│ │ └── notify-filewatcher (live) │
│ └──────── settings.rs (GUI ↔ JSON) │
└────────────────────────────────────────┘
Moduler
| Modul | Ansvar |
|---|---|
main.rs |
CLI-flaggor, loggning, GTK-init, kopplar ihop allt |
config.rs |
Serde-schema för JSON-configen, defaults, load/save, filewatcher med debounce |
style.rs |
Config → CSS-sträng (CssProvider), färger/opacity/radier/skuggor/accent |
toplevel.rs |
Egen wayland-client-anslutning; foreign-toplevel-events → app-state; requests (activate/minimize/maximize/close/fullscreen) |
icons.rs |
app_id → .desktop (gio DesktopAppInfo) → namn, ikon, launch-kommando; cache |
dock.rs |
Ett Gtk.ApplicationWindow per monitor via gtk4-layer-shell; bygger ikonrad av pins + körande grupper; indikatorer, tooltips, klick/skroll |
menu.rs |
Konfigurerbar högerklicksmeny per app + tomyta-menyn (Popover/GMenu) |
settings.rs |
Settings-fönster; widgets bundna mot config-structen; skriver JSON (debounced) |
hotspots.rs |
Osynliga 1 px-layer-ytor för hot corners/edges + autohide-sensor; dwell-timer; action = exec eller IPC |
wayfire_ipc.rs |
Minimal klient mot $WAYFIRE_SOCKET (längd-prefixad JSON); scale/toggle, expo/toggle, view-geometri för dodge |
Nyckelbeslut
- En process, ingen polling. Wayland-fd:n och IPC-socketen hängs in i
GLib-mainloopen (
unix_fd_add_local). Allt är händelsestyrt → 0 % CPU i vila. - Egen Wayland-anslutning för foreign-toplevel i stället för att gräva i GTK:s — enklare, stabilare, samma mönster som waybar/nwg-dock.
- Output-matchning: GTK:s
Monitor::connector()↔wl_output.name(v4) från egna anslutningen ↔ Wayfire IPC:ns output-namn. Samma nyckel ("DP-1" …) används i configensoutputs{}. - Gruppering sker på app_id. Grupp-popup (Popover) listar fönstren
med titel. Äkta miniatyrer är omöjliga tills Wayfire exponerar
ext_foreign_toplevel_image_capture_source_v1. - Theming = genererad CSS. Configvärden interpoleras i en CSS-template; om filen ändras laddas providern om. GTK:s egna animationer/transitions används där det går (billigt, GPU).
- Autohide/dodge: utan fönstergeometri i wlr-protokollet används Wayfire IPC för view-rektanglar; saknas IPC faller den tillbaka till "alltid dölj + hot edge väcker".
- Fel-tålighet: saknad ikon → generisk; saknad .desktop → app_id som namn, ingen launch; IPC nere → funktioner göms; trasig config → logga + kör defaults (skriver aldrig över en trasig fil).
Resursbudget
- Release-profil:
lto = "thin",opt-level = 3,strip = true,panic = "abort",codegen-units = 1 - Mål: binär < 10 MB, RSS < 70 MB (3 skärmar), 0 % CPU i vila, inga per-frame-omritningar utanför hover/animationer
- Ikon-pixbufar cachas per (namn, storlek); .desktop-uppslag cachas