# 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 configens `outputs{}`. - **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