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>
This commit is contained in:
@@ -0,0 +1,145 @@
|
||||
# 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 24–64 · `dock.hide_delay`: 0.2–5.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 24–64),
|
||||
`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.
|
||||
Reference in New Issue
Block a user