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
|
||||
82
doc/plan.md
Normal file
82
doc/plan.md
Normal file
@@ -0,0 +1,82 @@
|
||||
# waydock — plan
|
||||
|
||||
## Goal
|
||||
|
||||
En modern, resurssnål och genomkonfigurerbar dock för Wayfire på
|
||||
brasse-linux01 — transparent med hint av `#222222`, i stil med KDE
|
||||
Plasma 6/Ubuntu-dockan. Ersätter på sikt sfwbar-dockan i Wayfire-DE.
|
||||
Allt konfigureras via en JSON-fil som kan redigeras för hand eller via
|
||||
inbyggt settings-GUI, med live-uppdatering åt båda hållen.
|
||||
|
||||
## Stack
|
||||
|
||||
- **Rust** (stabil, rustup) — en singel-binär, LTO-optimerad release
|
||||
- **GTK4 + gtk4-layer-shell** — rendering, CSS-theming, popovers/menyer
|
||||
- **wayland-client + wayland-protocols-wlr** — egen Wayland-anslutning
|
||||
mot `zwlr_foreign_toplevel_manager_v1` (fönsterlista, aktivera,
|
||||
minimera, maximera, stäng, flytta-mellan-outputs-kontext)
|
||||
- **gio** (ingår i GTK-stacken) — `.desktop`-uppslag, ikoner, applansering
|
||||
- Övriga crates: `serde`/`serde_json` (config), `notify` (filewatcher),
|
||||
`log` + `simplelog` (loggning)
|
||||
- **Wayfire IPC** (egen liten klient över unix-socket) — scale/expo-toggle
|
||||
och fönstergeometri för intelligent dodge
|
||||
- Mål-OS/arch: **linux-x64** (denna dator). Ingen Pi5-deploy.
|
||||
|
||||
## Deploy target
|
||||
|
||||
Pattern A (binär), med lokalt släppbygge:
|
||||
|
||||
- **CI (Gitea Actions, Pi5/arm64):** `cargo check` + `clippy` + `test`
|
||||
vid push till master — kompilerings-/lintvakt, inga artefakter.
|
||||
- **Släpp:** `./release.sh vX.Y.Z` på brasse-linux01 — taggar, bygger
|
||||
x64-release, skapar Gitea-release med binären + uppdaterar rullande
|
||||
`latest`. `install.sh` ger en-rads-install via curl.
|
||||
|
||||
## Config
|
||||
|
||||
`~/.config/waydock/config.json` (XDG). Genereras med defaults om den
|
||||
saknas. Filewatcher → alla ändringar appliceras live. Settings-GUI:t
|
||||
skriver samma fil. Schema dokumenteras i `doc/usage.md`.
|
||||
|
||||
## Milestones
|
||||
|
||||
1. **M0 Scaffold** — repo, docs, CI, VS Code-tasks, release-flöde *(klar)*
|
||||
2. **M1 Panelskelett** — layer-shell-fönster per skärm; position
|
||||
(top/bottom/left/right), centrering, marginal, layer, exclusive zone;
|
||||
CSS-pipeline från config (bakgrund/opacity/radie/skugga/kant);
|
||||
default-config-generering; loggning
|
||||
3. **M2 Fönsterspårning** — foreign-toplevel-klient; app_id → ikon/namn;
|
||||
körande appar med gruppering, indikatorprickar, urgency-puls,
|
||||
tooltips; klick = fokus/minimera, skroll = växla fönster,
|
||||
mittklick konfigurerbart
|
||||
4. **M3 Pins & per skärm** — pinnade appar (start via gio); unika pins
|
||||
per output; `only_this_output`-filter; visa skrivbord-knapp;
|
||||
översikt-knapp (scale)
|
||||
5. **M4 Menyer** — konfigurerbar högerklicksmeny per app (minimera,
|
||||
maximera, flytta till skärm-submeny, pin/unpin, stäng);
|
||||
tomyta-meny (inställningar, ladda om, avsluta)
|
||||
6. **M5 Settings-GUI** — GTK4-fönster som redigerar hela JSON-configen
|
||||
live (färger, transparens, skuggor, accent, storlek, beteende, pins,
|
||||
menyval, hotspots)
|
||||
7. **M6 Autohide & hotspots** — autohide med animation + hot edge-väckning;
|
||||
intelligent dodge via Wayfire IPC-geometri (fallback: alltid-dölj);
|
||||
hot corners/edges med exec- eller IPC-actions
|
||||
8. **M7 Polish & släpp** — profilering (mål: 0 % CPU i vila, < 70 MB RAM),
|
||||
release v0.1.0, wiki-docs
|
||||
9. **M8 Wayfire-DE-integration** — ersätt `autostart/11-dock.sh`
|
||||
(sfwbar) med waydock, pensionera sfwbar-configen
|
||||
|
||||
## Roadmap / expansions (överenskomna)
|
||||
|
||||
- Autohide + dodge-animering (M6)
|
||||
- Fönsterindikatorer + urgency-puls (M2)
|
||||
- Scroll- och mittklicksåtgärder (M2)
|
||||
- Wayfire IPC-integration för hotspots/översikt/dodge (M3/M6)
|
||||
|
||||
## Open questions
|
||||
|
||||
- Äkta fönsterminiatyrer i grupp-popup är **inte möjliga** — Wayfire
|
||||
exponerar inte `ext_foreign_toplevel_image_capture_source_v1`.
|
||||
Om protokollet dyker upp i senare Wayfire kan miniatyrer läggas till.
|
||||
- Dodge-precision beror på Wayfire IPC:ns view-geometri i 0.11-git —
|
||||
verifieras i M6.
|
||||
109
doc/usage.md
Normal file
109
doc/usage.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 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 <app>`.
|
||||
Reference in New Issue
Block a user