Seed wiki: Home, Användning, Arkitektur

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 23:35:02 +02:00
commit 841e7e9a92
3 changed files with 207 additions and 0 deletions

109
Användning.md Normal file

@@ -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 01
"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 <app>`.

67
Arkitektur.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

31
Home.md Normal file

@@ -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`.