Files
waydock/doc/architecture.md
claude bc2fa65558
Some checks failed
check / check (push) Failing after 52s
waydock v0.1: panel, pins, fönstergrupper, menyer, settings-GUI, live-config
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>
2026-08-29 23:24:29 +02:00

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 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