waydock v0.1: panel, pins, fönstergrupper, menyer, settings-GUI, live-config
Some checks failed
check / check (push) Failing after 52s
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>
This commit is contained in:
67
doc/architecture.md
Normal file
67
doc/architecture.md
Normal file
@@ -0,0 +1,67 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user