commit 841e7e9a92aa3135cff281b1b0fa7921ec3a6269 Author: claude Date: Sat Aug 29 23:35:02 2026 +0200 Seed wiki: Home, Användning, Arkitektur Co-Authored-By: Claude Fable 5 diff --git a/Användning.md b/Användning.md new file mode 100644 index 0000000..26d88ae --- /dev/null +++ b/Användning.md @@ -0,0 +1,109 @@ +# waydock — användning + +## Starta + +```bash +waydock # normal start +waydock --log debug # pratigare logg till stderr +waydock --log-file ~/.cache/waydock.log +waydock --config /annan/väg.json +``` + +Vid första start skapas `~/.config/waydock/config.json` med defaults. +Alla ändringar i filen slår igenom **live** — ingen omstart behövs. + +## Dagligt bruk + +- **Vänsterklick** på ikon: fokusera appen; klick igen minimerar + (Plasma-beteende, konfigurerbart) +- **Skroll** på ikon: växla mellan appens fönster +- **Mittklick**: starta ny instans (konfigurerbart) +- **Högerklick** på ikon: kontextmeny (innehållet väljs i configen) — + minimera, maximera, flytta till skärm ▸, pinna/släpp, stäng +- **Högerklick på tom yta**: Inställningar…, Ladda om config, Avsluta +- **Visa skrivbord-knappen** minimerar allt; klick igen återställer +- **Översikt-knappen** togglar Wayfires scale-vy (kräver ipc-pluginen) +- Grupp-ikoner får en siffra och accentprickar; hovra för fönsterlistan + +## Settings-GUI + +Högerklick på tom yta → **Inställningar…** Ändringar skrivs direkt till +JSON-filen och appliceras live. GUI:t och handredigering kan blandas fritt. + +## Configreferens (`config.json`) + +```jsonc +{ + "position": "bottom", // bottom | top | left | right + "centered": true, // ö i mitten i stället för hela kanten + "margin": 8, // px från skärmkant (0 = kant i kant) + "layer": "top", // top | overlay | bottom (always-on-top = overlay) + "avoid_windows": false, // true = reservera plats (exclusive zone) + + "appearance": { + "background": "#222222", // panelfärg + "opacity": 0.72, // paneltransparens 0–1 + "corner_radius": 14, + "border": { "color": "#ffffff", "opacity": 0.08, "width": 1 }, + "shadow": { "enabled": true, "blur": 18, "opacity": 0.45 }, + "accent": "#c9545d", // indikatorer, hover, urgency + "icon_size": 36, + "icon_spacing": 6, // px mellan ikoner + "padding": 6, // px innanför panelkanten + "hover_zoom": true, // liten zoom vid hover + "animations": true, // false stänger alla animationer + "indicator": { "style": "dot", "max": 3 } // dot | line | none + }, + + "behavior": { + "click": "focus_or_minimize", // focus_or_minimize | focus | cycle + "middle_click": "launch_new", // launch_new | close | none + "scroll": "cycle_windows", // cycle_windows | none + "group_apps": true, + "tooltips": true, + "urgent_pulse": true + }, + + "context_menu": ["minimize", "maximize", "move_to_output", + "pin", "close"], // ordning & urval styr menyn + + "pins": ["firefox", "org.kde.konsole", "org.kde.dolphin"], + "special_buttons": { "show_desktop": true, "overview": true }, + + "outputs": { // per-skärm-överstyrning (nyckel = connector) + "DP-1": { + "enabled": true, + "only_this_output": true, // visa bara fönster på den här skärmen + "pins": ["steam", "discord"] // null/utelämnad = ärver globala pins + } + }, + + "autohide": { + "enabled": false, + "mode": "dodge", // dodge (göm vid överlapp, kräver wayfire-ipc) + // | always (göm alltid, hot edge väcker) + "hide_delay_ms": 500, + "reveal_px": 2, // sensorbredd vid skärmkanten + "animation_ms": 200 + }, + + "hotspots": { // action: {"exec": "kommando"} eller {"ipc": "scale/toggle"} + "dwell_ms": 300, + "corners": { "top_left": null, "top_right": null, + "bottom_left": null, "bottom_right": null }, + "edges": { "top": null, "bottom": null, "left": null, "right": null } + }, + + "log": { "level": "info", "file": null } +} +``` + +## Tips + +- Wayfires **blur-plugin** kan ge frostat glas bakom panelen — + transparensen i `appearance.opacity` räcker för blur-effekten. +- Trasig JSON? waydock loggar felet och kör vidare på defaults utan att + röra din fil — rätta filen så laddas den om automatiskt. +- `pins` använder `.desktop`-id (filnamnet utan `.desktop`, + t.ex. `org.kde.konsole`). Hitta rätt id: + `ls /usr/share/applications | grep -i `. diff --git a/Arkitektur.md b/Arkitektur.md new file mode 100644 index 0000000..77cde76 --- /dev/null +++ b/Arkitektur.md @@ -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 diff --git a/Home.md b/Home.md new file mode 100644 index 0000000..19c1760 --- /dev/null +++ b/Home.md @@ -0,0 +1,31 @@ +# waydock + +Modern, resurssnål dock för Wayfire — transparent Plasma 6-känsla, +byggd i Rust/GTK4 som en enda binär. Körs på **brasse-linux01** i +Wayfire-DE-sessionen. + +- **[Användning](Användning)** — flaggor, dagligt bruk, hela configreferensen +- **[Arkitektur](Arkitektur)** — hur appen är byggd (moduler, nyckelbeslut, resursbudget) +- Planen och milstolparna ligger i repot: [`doc/plan.md`](https://gitea.brasse-pc.eu/brasse/waydock/src/branch/master/doc/plan.md) + +## Snabbstart + +```bash +curl -fsSL https://gitea.brasse-pc.eu/brasse/waydock/raw/branch/master/install.sh | sh +waydock # config skapas i ~/.config/waydock/config.json +``` + +Bygga själv: se [README](https://gitea.brasse-pc.eu/brasse/waydock#beroenden-archgaruda). + +## Krav + +- wlroots-compositor med `zwlr_foreign_toplevel_manager_v1` (Wayfire, Sway …) +- För översikt/flytta-till-skärm/dodge: Wayfires `ipc` + `ipc-rules`-plugins +- Miniatyrer i grupp-popupen är **inte möjliga** — Wayfire exponerar inte + per-fönster-bildfångst (`ext_foreign_toplevel_image_capture_source_v1`) + +## Släpp & CI + +CI (Pi5-runnern) kör `cargo check`/`clippy`/`test` på varje push. +Releaser byggs lokalt på brasse-linux01 med `./release.sh vX.Y.Z` som +taggar, bygger x64-binären och skapar Gitea-release + rullande `latest`.