# eww ↔ TANINUX — Integrations-Vertrag (Handover) **Zweck:** Ab jetzt werden die **eww-Bar** (`~/eww`, symlinked nach `~/.config/eww`) und die **TANINUX-Settings-App** *zusammen gedacht*. Dieses Dokument ist der Vertrag: was über welche Datei fließt, wer was besitzt, und was man beim Ändern der einen Seite auf der anderen beachten muss. Gegenstück: `docs/eww-accent-integration.md` (der ursprüngliche Accent-Handoff TANINUX → eww). Dieses Dokument hier ist die **vollständige, gelebte** Sicht. --- ## TL;DR — die Schnittstellen | # | Thema | Quelle der Wahrheit (TANINUX schreibt) | eww liest / reagiert via | |---|----------------|-----------------------------------------------------|--------------------------------------------------| | 1 | **Akzentfarbe**| `~/.local/share/taninux/gui.json` → `accent_hex` | `~/eww/scripts/accent.sh watch` → setzt `$accent-dim` in `eww.scss`, `eww reload` | | 2 | **Hell/Dunkel**| `gsettings org.gnome.desktop.interface color-scheme`| `~/eww/scripts/colorscheme.sh get` (defpoll 2 s) → `.light`-Klasse an den Panels | | 3 | **Compositor** | *(unabhängig erkannt — keine Datei)* | `~/eww/scripts/wm.sh` erkennt `hyprland`/`sway` selbst | | 4 | **Settings öffnen** | *(App ist das Ziel)* | eww Control-Center-Zahnrad → `~/eww/scripts/settings.sh` → `taninux-gtk` | Kurz: **Akzent läuft über die JSON, Hell/Dunkel über gsettings, Compositor erkennt jede Seite selbst.** Diese drei Achsen müssen konsistent bleiben. --- ## 1. Akzentfarbe — `gui.json` → eww - **TANINUX schreibt** bei jeder Akzent-Änderung `~/.local/share/taninux/gui.json`, Feld `accent_hex` (fertiger Hex, z. B. `#8f8aac`). Schema siehe `eww-accent-integration.md`. - **eww** hat einen Watcher `scripts/accent.sh watch` (gestartet aus `~/eww/launch.sh`), der `gui.json` alle 2 s auf mtime-Änderung pollt und bei Änderung: - `accent_hex` liest (Fallback `#8f8aac`, wenn Datei/Feld fehlt/ungültig), - damit **nur die eine Zeile** `$accent-dim:` in `~/eww/eww.scss` neu schreibt, - `eww reload` auslöst. - In der SCSS leiten sich **alle** Akzent-Werte aus `$accent-dim` ab: ```scss $accent-dim: #8f8aac; // = accent_hex (von accent.sh verwaltet) $accent: lighten($accent-dim, 8%); $accent-08: rgba($accent, 0.08); $accent-14: rgba($accent, 0.14); $accent-22: rgba($accent, 0.22); ``` - **Verifiziert:** Akzent in der App auf z. B. `take`/grün stellen → Bar/Panels/ Dock tinten innerhalb ~2 s nach. **Wenn TANINUX hier etwas ändert:** Solange `accent_hex` ein `#rrggbb` bleibt, muss eww **nichts** angepasst werden. Neue Akzent-Keys (über die 5 Fuji-Töne hinaus) brauchen nur einen gültigen Hex — eww ist farbagnostisch. --- ## 2. Hell/Dunkel — gsettings (NICHT die JSON) **Klare Abgrenzung:** Hell/Dunkel läuft **global über `gsettings org.gnome.desktop.interface color-scheme`** (`prefer-dark` / `prefer-light` / `default`). Das `color_scheme`-Feld in `gui.json` ist für eww **nur informativ und wird ignoriert.** - **TANINUX** setzt beim Umschalten die gsettings-Keys (`gui/desktop.py`, `gsettings set …`). Das ist der globale Standard und greift für alle GTK-Apps. - **eww** pollt `scripts/colorscheme.sh get` (defpoll, 2 s) → `light`/`dark` und hängt eine `.light`-Klasse an alle Panels/Dock (Bar bleibt immer dunkel). Hell = „Shibui"-Weiß-Palette in `eww.scss` (`$bg-l`, `$fg-l`, …). - **Wichtig (Lesson learned):** Ein `gsettings monitor`-Deflisten **stirbt** in eww's Spawn-Umgebung — deshalb **defpoll**, nicht monitor. Und: ein `deflisten→defpoll`-Wechsel braucht einen **vollen eww-Neustart** (`launch.sh`), ein `eww reload` reicht nicht. **Vertrag:** Damit eww dem App-Umschalter folgt, **muss TANINUX die gsettings tatsächlich setzen** (nicht nur `gui.json.color_scheme`). Tut es das nicht, bleibt eww auf dem alten Modus — das ist dann ein TANINUX-Bug, kein eww-Bug. (Beobachtet: einmal stand `gui.json=light`, aber `gsettings=prefer-dark` → eww blieb korrekterweise dunkel.) --- ## 3. Compositor-Erkennung — beide Seiten, unabhängig Beide Apps müssen auf **Hyprland UND Sway/SwayFX** laufen. Es gibt **keine geteilte Datei** dafür — jede Seite erkennt selbst: - **TANINUX:** eigene Compositor-Erkennung (von dir gebaut). - **eww:** `~/eww/scripts/wm.sh` — eine sourcebare Abstraktion. Erkennt über `$HYPRLAND_INSTANCE_SIGNATURE` / `$SWAYSOCK` / `pgrep` und setzt `$WM`. Bietet einheitliche Funktionen, die alle eww-Scripts nutzen: | Funktion | Hyprland | Sway / SwayFX | |-----------------------|---------------------------------------|---------------------------------------| | `wm_clients` | `hyprctl clients -j` | `swaymsg -t get_tree` | | `wm_focus ` | `hl.dsp.focus({window="address:…"})` | `[con_id=…] focus` | | `wm_goto_ws` / `cycle`| `hl.dsp.focus({workspace=…})` | `workspace number …` | | `wm_cursor_y` | `hyprctl cursorpos` | *(kein Cursor-IPC → Menü zentriert)* | | `wm_outputs` | `hyprctl monitors` | `swaymsg -t get_outputs` | | `wm_lock` / `wm_exit` | `hyprlock` / `hl.dsp.exit()` | `swaylock -f` / `swaymsg exit` | | `wm_blur_layer` | `hyprctl keyword layerrule blur,…` | SwayFX `layer_effects … blur enable` | Genutzt von: `dock.sh`, `power.sh`, `ws.sh`, `workspaces.sh`, `launch.sh`. **Hyprland-Eigenheit:** Dispatch läuft auf diesem Setup über die **Lua-API** (`hyprctl dispatch "hl.dsp.…()"`), nicht über die klassische Textsyntax. `hl.dsp.focus` springt automatisch auf den Workspace des Fensters. **Konsistenz-Regel:** Wenn TANINUX seine Compositor-Erkennung ändert (neue Compositor, andere Detektion), sollte `wm.sh` dieselbe Logik spiegeln, damit beide Apps nie auseinanderlaufen. Idealerweise teilt man sich später *eine* Detektionsquelle — aktuell bewusst getrennt (keine harte Kopplung). --- ## 4. eww startet die Settings-App Das **Zahnrad oben rechts im Control Center** öffnet die TANINUX-GUI: `~/eww/scripts/settings.sh` → `cd ~/projects/taninux && setsid -f env PYTHONPATH=src /usr/bin/python -m taninux.gui`. - **System-Python**, nicht das venv — das venv hat **kein `gi`/PyGObject** (Systempaket). Entry point laut `pyproject.toml`: `taninux-gtk = taninux.gui.app:main`. - Single-Instance über die GTK-App-ID `ch.gabrielevarano.Taninux` → zweiter Klick fokussiert nur. **Wenn TANINUX die Startweise ändert** (z. B. richtig installiertes `taninux-gtk` mit `gi` im venv, oder ein `.desktop`/Binary auf dem PATH): `scripts/settings.sh` entsprechend anpassen — am besten auf `taninux-gtk`, sobald es ohne `PYTHONPATH=src`-Hack läuft. --- ## Datei- & Besitz-Karte | Pfad | Besitzer | Rolle | |----------------------------------------------|-----------|-------| | `~/.local/share/taninux/gui.json` | TANINUX | Akzent (`accent_hex`) — eww liest | | `gsettings …interface color-scheme` | TANINUX | Hell/Dunkel global — eww liest | | `~/.config/gtk-4.0/libadwaita.css` | TANINUX | **GTK-App-Akzent** — *nicht* für eww, nicht anfassen | | `~/eww/**` (yuck, scss, scripts) | **eww** | Bar/Panels/Dock — TANINUX fasst das **nie** an | | `~/eww/scripts/wm.sh` | eww | Compositor-Abstraktion | | `~/eww/scripts/accent.sh` | eww | gui.json → `$accent-dim` | | `~/eww/scripts/colorscheme.sh` | eww | gsettings → light/dark | | `~/eww/scripts/settings.sh` | eww | startet TANINUX-GUI | **Goldene Regel:** TANINUX schreibt **nie** in `~/eww/**`; eww schreibt **nie** in TANINUX-Dateien (außer es liest `gui.json` und startet die GUI). Die SCSS-Verdrahtung gehört eww, die Settings-Logik gehört TANINUX. --- ## Checkliste beim Ändern **TANINUX-Seite ändert Akzent-Format?** → nur prüfen, dass `accent_hex` ein `#rrggbb` bleibt. Sonst nichts. **TANINUX-Seite ändert Hell/Dunkel-Mechanik?** → muss weiterhin `gsettings color-scheme` setzen. eww hängt daran. **Neuer Compositor unterstützt?** → `wm.sh` um einen `$WM`-Zweig erweitern (dieselben Funktionen implementieren). Sonst läuft die Bar dort nicht. **Settings-Startweg ändert sich?** → `~/eww/scripts/settings.sh` anpassen. --- ## Status (Stand dieser Übergabe) - ✅ Akzent live aus `gui.json` (getestet: ume/violet ↔ take/green). - ✅ Hell/Dunkel live aus gsettings (Shibui-Hell-Palette, Bar bleibt dunkel). - ✅ Compositor-Abstraktion `wm.sh` — auf **Hyprland verifiziert**; Sway-Zweige implementiert (final unter Sway noch gegenzutesten). - ✅ Settings-Zahnrad startet `taninux-gtk` (System-Python). - ⚠️ Für Sway fehlen noch **`swaylock` + `swayidle`** (Pakete installieren). - ⚠️ SwayFX-Blur fürs Dock: `wm_blur_layer` versucht `layer_effects` live; zuverlässiger ist die Regel in der SwayFX-Config (`layer_effects "gtk-layer-shell" blur enable`).