Files
taninux/docs/eww-collaboration.md
T
karim 10b88a67bc Initial commit — TANINUX (camel): management app + distro packaging
- app: GTK System Settings (tsettings) + Software Hub (thub) + TUI
- distro/: camel.toml manifest + MANIFEST.md (Arch + [tanin] repo model)
- packaging/: taninux, tanin-desktop (niri metapackage), tanin-greet,
  tanin-libadwaita, tanin-setup
- docs/, data/, LICENSE (GPL-3.0-or-later)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 20:18:30 +02:00

146 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# eww ↔ TANINUX — Arbeits- & Koordinationsanleitung (für die TANINUX-Instanz)
**Lies das, bevor du irgendetwas anfasst, das die Bar/das Dock/eww betrifft.**
Es ist die verbindliche Spielregel zwischen dir (TANINUX-Instanz) und der
eww-Instanz, die `~/eww` besitzt. Es gibt sonst Chaos — wir hatten es schon.
---
## 0. Die EINE Regel
> **Fass `~/eww/**` nicht direkt an. Steuere Bar/Dock ausschließlich über
> Config-Dateien. Lass keinen Porter / Sync / Format-on-save über `~/eww`
> laufen.**
Warum so hart? Während gemeinsamer Arbeit hat *etwas auf deiner Seite*
(ein Sway-Porter o.ä.) `eww.yuck`, `eww.scss`, `launch.sh`, `dock.sh` **live
umgeschrieben — mitten zwischen Lesen und Schreiben der eww-Instanz.** Folge:
jeder Fix (Box-in-Box, Dock-Autohide, Flackern) wurde Sekunden später wieder
überschrieben. **Zwei Editoren auf derselben Datei = der einzige Fall, der
garantiert kaputtgeht.** Settings laufen über Config-Dateien → du brauchst eww
nie hand zu editieren.
---
## 1. Wenn du eww trotzdem ändern MUSST (Feature/Layout, kein Setting)
Es ist EIN Projekt — Code-Arbeit an der Bar ist kein Tabu. Aber:
1. **Niemals automatisiert** (kein Porter, kein Watcher, der `~/eww/**` schreibt).
2. **Einer nach dem anderen.** Sag der eww-Instanz Bescheid bzw. mach es selbst,
aber nicht *während* die eww-Instanz dieselbe Datei bearbeitet.
3. **eww ist bereits compositor-agnostisch** (siehe §4). **Portiere es nicht auf
Sway-only zurück** — das bricht es auf Hyprland und macht genau die Bugs.
---
## 2. Die Integrations-Schnittstelle (so steuerst du eww — ohne es anzufassen)
Drei Config-Dateien + ein Launcher. Detail-Verträge:
`eww-accent-integration.md`, `eww-panel-dock-integration.md`, `eww-integration.md`.
| Thema | Du schreibst | eww zieht nach via |
|------------------|------------------------------------------------|-----------------------------------------------------|
| **Akzentfarbe** | `~/.local/share/taninux/gui.json``accent_hex` (`#rrggbb`) | `scripts/accent.sh watch``$accent-dim` in scss, reload |
| **Hell/Dunkel** | `gsettings …interface color-scheme` (NICHT die JSON) | `scripts/colorscheme.sh` (defpoll) → `.light`-Klasse |
| **Panel & Dock** | `~/.local/share/taninux/panel.json` | `scripts/panelcfg.sh watch``eww update` (live) |
| **Dock-Pins** | `~/.config/eww/dock-pins` (Zeilen `exec\|class\|icon`) | Poll alle 2 s, automatisch |
| **Settings öffnen** | *(Ziel ist deine App)* | Control-Center-Zahnrad → `scripts/settings.sh``taninux-gtk` |
**`panel.json`-Schema** (v1, alles live, kein Reload):
```json
{
"version": 1,
"dock": { "autohide": true, "icon_size": 42, "hide_delay": 1.2 },
"bar": { "clock_format": "%H:%M %A, %d.%m.%Y",
"modules": { "music": true, "sys": true, "updates": true,
"net": true, "bt": true, "vol": true } }
}
```
- `dock.icon_size`: int 2464 · `dock.hide_delay`: 0.25.0 s · `dock.autohide`: bool
- `bar.clock_format`: strftime · `bar.modules`: bool je Modul (`music sys updates net bt vol`)
- Anwenden: Datei schreiben → Watcher zieht in ≤2 s nach. Für „sofort":
`~/eww/scripts/panelcfg.sh apply`.
- **Noch nicht im Schema:** `dock.position`, feste Bar/Dock-Größen (= Reload/
Geometrie-Neubau). Wenn du das in der GUI willst → bei der eww-Instanz anfragen,
nicht selbst in eww bauen.
**Grenze:** `gui.json`/`panel.json`/`dock-pins` gehören dir (schreib sie frei).
`~/.config/gtk-4.0/libadwaita.css` ist *dein* GTK-App-Akzent — **nicht** für eww.
`~/eww/**` gehört der eww-Instanz.
---
## 3. Wie ich das in TANINUX einordnen würde (Vorschlag)
Eine Seite **„Panel & Dock"** in *Personalization*, zwei Gruppen:
- **Top bar** — `bar.modules` (Toggles), `bar.clock_format`.
- **Dock** — `dock.autohide`, `dock.icon_size` (Slider 2464),
`dock.hide_delay`, gepinnte Apps (liest/schreibt `~/.config/eww/dock-pins`).
`core/panel.py` = Read/Write `panel.json` (+ `dock-pins`), Apply = Datei
schreiben **und optional** `~/eww/scripts/panelcfg.sh apply` feuern. Das ist
exakt die Akzent-Kette, nur mit mehr Keys. Du musst die eww-Variablennamen
**nicht** kennen.
---
## 4. Was in eww schon gebaut & getestet ist (Kontext, nicht ändern)
- **Compositor-Abstraktion** `~/eww/scripts/wm.sh`: erkennt Hyprland/Sway (`$WM`)
und kapselt alle WM-Befehle (`wm_clients/wm_focus/wm_goto_ws/wm_cursor_y/
wm_outputs/wm_lock/wm_exit/wm_blur_layer`). **dock.sh, power.sh, ws.sh,
workspaces.sh, launch.sh nutzen das.** → eww läuft auf beiden Compositoren.
- **Auto-hide ist compositor-aware:** Hyprland = **Cursor-Polling**
(`dock.sh watch`, kein GTK-Hover); Sway = **Hover-Trigger** (`dock-trigger`,
weil Sway kein cursorpos-IPC hat). `launch.sh` startet automatisch das Richtige.
- Akzent (gui.json), Hell/Dunkel (gsettings → Shibui-Weiß), Now-Playing im
Control Center, Updates-Panel, Power-Dropdown, Settings-Zahnrad,
Multi-Instanz-Rechtsklick, ESC/Klick-daneben-Dismiss — alles vorhanden.
---
## 5. NICHT wieder einbauen — die Bugs, die ständig zurückkamen
Wenn du (oder ein Porter) eww doch anfasst, **reintroduziere diese nicht:**
1. **Dock „Box-in-Box".** Ursache: ein **Drop-Shadow auf `.dock`**. Auf der
halbtransparenten, geblurrten Dock-Ebene blüht er in die Margin und rendert
als faler äußerer Kasten (bei opaken Panels passiert das nicht).
`.dock` darf **nur** `box-shadow: inset 0 1px 0 …` haben, **keinen Drop-Shadow**.
Zusätzlich: `window/.background/decoration { background: transparent;
box-shadow: none }` und `eventbox { background: transparent }` müssen bleiben.
2. **Dock flackert / bleibt offen auf Hyprland.** Ursache: GTK-Hover-Autohide
(`eventbox onhover/onhoverlost`). Kindbuttons feuern Enter/Leave (NotifyInferior)
→ Dauer-Toggle. → Auf Hyprland **Cursor-Polling** (`dock.sh watch`), NICHT Hover.
Genau deshalb ist die Sway-Hover-Variante **nicht** für Hyprland.
3. **Hell/Dunkel reagiert nicht.** Ursache: `gsettings monitor`-deflisten stirbt
in eww's Spawn-Env. → **defpoll** nutzen. Und: nach so einem Wechsel **vollen
eww-Neustart** (`launch.sh`), `eww reload` reicht nicht.
4. **Nerd-Font-Glyphen unsichtbar.** `button :text "glyph"` rendert nicht →
Glyphe als `label`-Kind im Button.
5. **Hyprland-Dispatch ist Lua.** `hyprctl dispatch "hl.dsp.focus({…})"`, nicht die
klassische Textsyntax. (In `wm.sh` schon gekapselt.)
---
## 6. Offene Sway-Punkte (wenn du DE-light auf swayfx fertigstellst)
- `swaylock` + `swayidle` installieren (für `power.sh` Lock).
- SwayFX-Dock-Blur zuverlässig: `layer_effects "gtk-layer-shell" blur enable` in
die Sway-Config (statt nur `wm_blur_layer`-Laufzeitversuch).
- eww-Keybinds (ESC-Dismiss, SUPER+A/N Panels) von `hyprland.lua` in die
Sway-Config übernehmen.
- Dann unter echtem Sway gegentesten — die `$WM=sway`-Zweige sind da, aber bisher
nur auf Hyprland verifiziert.
---
## TL;DR
1. eww nie automatisiert/parallel editieren. **Kein Porter über `~/eww`.**
2. Bar/Dock nur über `gui.json` + `panel.json` + `dock-pins` steuern.
3. eww ist schon dual (Hyprland+Sway) — **nicht** auf Sway-only zurückbauen.
4. Wenn du eww-Code wirklich brauchst: koordiniert, einer nach dem anderen,
und die §5-Bugs nicht wieder reinbauen.