Architektur und modulare Struktur von JES
July 23, 2026 · View on GitHub
Architekturprinzipien
- Trennung von UI und Logik: QML (Quickshell) ist ausschließlich für Rendering und Eingabe zuständig. Die gesamte Datenverarbeitung, das IPC-Parsing und Systemaufrufe sind in separate Module ausgelagert.
- Modularität nach Zweck: Jede Komponente der Oberfläche (Leiste, Launcher, Benachrichtigungen usw.) ist in einem eigenen Ordner isoliert. Minimale Querabhängigkeiten.
- Ereignisbasiertes Modell (subscribe): Statt Polling in bash-Schleifen werden langlebige Verbindungen über Go-Binärdateien verwendet, die Ereignisse von WM/MPD/System abonnieren.
- Stabile Shell-Schicht: Die Skripte sind in POSIX sh/bash geschrieben. Keine Abhängigkeiten von der fish/zsh-Runtime, Plugins oder interaktiven Features.
- Dynamisches Theme:
base16.jsonverwendet die zenburn-Palette.colors.jsonist für Gradienten-Hintergründe, Text und Akzentfarben zuständig – alles wird übermatugenaus dem Hintergrundbild extrahiert.
-- Verzeichnisbaum des Projekts und Aufgaben der Module --:
.
├── shell.qml # Quickshell-Einstiegspunkt. Registriert und positioniert Module.
├── bar/ # Leiste.
│ ├── components/ # Leisten-Popups + Workspace-Buttons.
│ └── images/ # Statische Icons, Assets.
├── launcher/ # App-Launcher: Suche, Kategorien, Hintergrund-Shader, Go-Backend.
├── wallpaper/ # Hintergrundbild-Auswahl und -Renderer: Vorschauen, Anwendung, TOML-Konfiguration, Hintergrundbild-Rendering.
├── notifications/ # Benachrichtigungs-Daemon.
├── popSysInf/ # Systeminfo-Popup (Helligkeit, Lautstärke).
├── power/ # Sitzungsmenü: Ausschalten, Neustart, Ruhezustand, Abmelden, Sperren.
├── helpers/ # QML-Helper.
├── screenpicker/ # Screenshot-Tool.
└── scripts/ # Logik-Kern: Kompilierte Go-Binärdateien + Bash-Skripte.
-- Datenfluss und IPC --:
- Initialisierung:
shell.qmlstartet die Module. Jedes Modul ruft beim Start das entsprechende Skript ausscripts/auf. - Datenerfassung:
- Go-Binärdateien (
music,Cava-internal,cal) übernehmen die Logik für große Datenmengen, die verarbeitet werden müssen. - Bash-Skripte (
brightness.sh,vol.sh,workspace-*.sh) bilden die Kernlogik – aus Gründen der Portabilität und Lesbarkeit.
- Go-Binärdateien (
- Übermittlung an die UI: Die Daten werden über
stdoutübertragen (JSON oder bei visuellen Programmen einfach ein String (wie bei cava)) → werden in QML überJsonListen/JsonPollgeparst → aktualisieren die Eigenschaften der Widgets. - Rückkopplung: Benutzeraktionen (Klick, Hotkey) → Aufruf eines Skripts/Binärfiles → Senden eines Befehls an WM/MPD/pipewire → ein Ereignis aktualisiert die UI.
-- Stack und Optimierung --:
| Schicht | Technologie | Rolle |
|---|---|---|
| WM | swayfx (primary), DriftWM (primary), Hyprland, Niri (WIP) | Tiling, Effekte, IPC |
| UI | Quickshell (Qt Quick / QML) | Rendering, Animationen, Eingabe |
| Backend | Go 1.21+ | Logik zur Verarbeitung großer Datenmengen |
| Shell | Bash 5.x / POSIX sh | Kernlogik |
| Theme | base16 + matugen | Statische Palette + dynamisches Theme |
| Lock | Hyprlock | Sperrbildschirm |
| Audio | PipeWire + pavucontrol-qt | Mixing, MPRIS, Cava |
Metriken: CPU im Leerlauf ~5–11% (Go subscribe) gegenüber 35–45% (bash polling). Die Binärdateien sind statisch gebaut, das Gewicht der Logik beträgt ~8-8.5 MB.
-- WM-Kompatibilitätsschicht --:
Die Abstraktion vom Tiling wird über drei Skript-Paare und eine Datei zur Anbindung an shell.qml realisiert:
active_window-{sway,hypr,niri}.shkb_layout-{sway,hypr,niri}.shworkspace-{sway,hypr,niri}.sh{Sway,Hypr,niri}Bar.qmlim Quickshell-Ordner, Unterverzeichnis bar/
Quickshell ermittelt den aktuellen WM über $XDG_CURRENT_DESKTOP und leitet die Aufrufe an das passende Skript weiter. Um auf einen neuen Tiling-WM zu portieren, genügt es, die Ausgabe im gleichen JSON-Format zu implementieren und das Mapping zu ergänzen.
-- Erweiterung --:
- Neues Widget: Ordner
widget_name/erstellen → QML-Komponente + Backend (Go/sh) → inshell.qmlregistrieren. - Theme wechseln: Die
matugen-Konfiguration bearbeiten (optional kann auchbase16.jsonangepasst werden, hat aber kaum Einfluss auf die visuelle Seite von JES) → Palette neu generieren. - WM hinzufügen: Einen IPC-Parser gemäß der Ausgabespezifikation der bestehenden Skripte implementieren → ins Routing aufnehmen.
- Optimierung: Das Polling-Skript durch eine Go-Binärdatei mit
subscribeersetzen → den Aufruf in QML aktualisieren.
-- Sonstiges --:
- UI-Schicht (QML): GPL-3.0
- Skripte und Binärdateien: GPL-3.0
- Für bessere Performance wird eine kontinuierliche Ausgabe der Skripte/Binärdateien bevorzugt
- Assets (Shader, Go-Quellcode, leere Platzhalter-Skripte sowie eine Platzhalter-qml-Datei zur Anbindung eines anderen Tiling-WM): siehe
for-quickshell/
-- Plugins --:
Installation
1. Öffnen Sie ~/.config/quickshell/
2. Legen Sie den Plugin-Ordner dort ab
3. Öffnen Sie config.toml
4. Tragen Sie folgende Zeilen ein:
[[plugin]]
name = "plugin name" # Daten aus der Eigenschaft name in manifest.json
active = true