1
This commit is contained in:
184
gnome_asus_kbd_rgb_claude_prompt.md
Normal file
184
gnome_asus_kbd_rgb_claude_prompt.md
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
# Consignes de développement — Extension GNOME Shell (GNOME 48) : contrôle RGB clavier ASUS (asus-nb-wmi)
|
||||||
|
|
||||||
|
## 1) Contexte et objectif
|
||||||
|
Machine cible : **ASUS TUF Gaming A16 FA608UH** sous **Debian GNU/Linux 13 (trixie)**, **GNOME 48** (capture fournie).
|
||||||
|
Le rétroéclairage clavier est pilotable via l’interface noyau **asus-nb-wmi** :
|
||||||
|
|
||||||
|
- Intensité : `/sys/class/leds/asus::kbd_backlight/brightness` (0..max)
|
||||||
|
- Couleur (statique) : `/sys/class/leds/asus::kbd_backlight/kbd_rgb_mode`
|
||||||
|
Format : `cmd mode R G B speed` (ex : `1 0 255 165 0 0`)
|
||||||
|
|
||||||
|
But : créer une **extension GNOME Shell** qui ajoute un **icône dans la barre du haut**, et au clic affiche un **popover** permettant :
|
||||||
|
- 4 boutons d’intensité (Off/Faible/Moyen/Fort)
|
||||||
|
- 3 sliders **R**, **G**, **B**
|
||||||
|
- 1 slider **Master** (offset global sur R/G/B, ou gain global — à préciser)
|
||||||
|
- 6 couleurs prédéfinies (cases cliquables)
|
||||||
|
- Application **en direct** sur l’aperçu + sur le clavier
|
||||||
|
|
||||||
|
Le tout doit être **user-friendly** et robuste, avec gestion claire des **droits**.
|
||||||
|
|
||||||
|
## 2) Décision technique recommandée (à appliquer)
|
||||||
|
### Langage / framework
|
||||||
|
- **GJS / JavaScript** (langage standard des extensions GNOME Shell)
|
||||||
|
- UI via `PanelMenu.Button`, `PopupMenu`, `St` (et éventuellement `Slider` de GNOME Shell)
|
||||||
|
- Compatible **GNOME Shell 48**
|
||||||
|
|
||||||
|
### Architecture recommandée
|
||||||
|
Séparer en 3 blocs :
|
||||||
|
1. `ui.js` : construction du menu (widgets, layout, events)
|
||||||
|
2. `backend.js` : lecture/écriture sysfs + logique (clamp, master slider, presets)
|
||||||
|
3. `prefs/` : page de préférences (optionnel au MVP), + stockage presets (GSettings)
|
||||||
|
|
||||||
|
### Stockage (persistant)
|
||||||
|
- `GSettings` (schema dédié) : RGB courant, intensité, 6 presets, step RGB, mode “master”
|
||||||
|
- Appliquer au démarrage de session (extension enable) : relire settings et appliquer.
|
||||||
|
|
||||||
|
## 3) Gestion des droits — approche “propre” (prioritaire)
|
||||||
|
L’extension tourne en user-space (non root). Écrire dans `/sys/...` nécessite des droits.
|
||||||
|
|
||||||
|
**Approche recommandée (simple + stable) :**
|
||||||
|
- créer une **règle udev** qui donne accès en écriture à un groupe dédié (ex `kbdled`)
|
||||||
|
- ajouter l’utilisateur au groupe `kbdled`
|
||||||
|
- l’extension teste l’accès en écriture et affiche un message si absent
|
||||||
|
|
||||||
|
Exemple (à documenter dans README) :
|
||||||
|
- `/etc/udev/rules.d/99-asus-kbd.rules`
|
||||||
|
`SUBSYSTEM=="leds", KERNEL=="asus::kbd_backlight", GROUP="kbdled", MODE="0660"`
|
||||||
|
- `sudo groupadd -f kbdled`
|
||||||
|
- `sudo usermod -aG kbdled $USER`
|
||||||
|
- `sudo udevadm control --reload-rules && sudo udevadm trigger`
|
||||||
|
- logout/login
|
||||||
|
|
||||||
|
**Alternative (non MVP, mais “enterprise grade”) :**
|
||||||
|
- service systemd root + D-Bus + polkit. À proposer uniquement si l’utilisateur refuse udev.
|
||||||
|
|
||||||
|
## 4) Spécification UI (MVP)
|
||||||
|
### Icône
|
||||||
|
- Icône type “keyboard backlight” (symbolic) dans le top bar.
|
||||||
|
|
||||||
|
### Menu déroulant (popover)
|
||||||
|
- Ligne 1 : **4 boutons intensité** alignés (Off, 1, 2, 3)
|
||||||
|
(style : toggle buttons, celui actif surligné)
|
||||||
|
- Section sliders :
|
||||||
|
- `R` slider 0..255
|
||||||
|
- `G` slider 0..255
|
||||||
|
- `B` slider 0..255
|
||||||
|
- `Master` slider (définir le comportement exact, voir Questions)
|
||||||
|
- Ligne info (en bas) :
|
||||||
|
- `RGB=(r,g,b)` + `HEX=#RRGGBB` + `Intensity=n/max`
|
||||||
|
- Section presets :
|
||||||
|
- 6 cases couleur cliquables (carrés), appliquent RGB instantanément
|
||||||
|
- Un clic long (optionnel) ouvre un mini-dialog pour “enregistrer” la couleur courante dans ce preset
|
||||||
|
|
||||||
|
### UX exigée
|
||||||
|
- Application **immédiate** lors des changements sliders (avec debouncing 50–100ms pour éviter spam sysfs)
|
||||||
|
- Clamp et sécurité : jamais écrire hors 0..255 / 0..max_brightness
|
||||||
|
- Si `brightness=0`, on peut conserver RGB en mémoire mais ne pas écrire `kbd_rgb_mode` (optionnel)
|
||||||
|
|
||||||
|
## 5) Logique “Master slider”
|
||||||
|
Implémenter l’une des options suivantes (à trancher via Questions) :
|
||||||
|
- **Option A (offset)** : master ajoute un delta (-128..+127) à R,G,B en même temps (clamp).
|
||||||
|
- **Option B (gain)** : master agit comme “brightness RGB” 0..100% (multiplie R,G,B).
|
||||||
|
- **Option C (HSV value)** : convert RGB->HSV, master modifie V, puis reconvertit.
|
||||||
|
|
||||||
|
MVP : Option B (gain) est la plus intuitive pour un “tout monter/descendre”.
|
||||||
|
|
||||||
|
## 6) Implémentation backend (sysfs)
|
||||||
|
### Écriture
|
||||||
|
- utiliser `Gio.File.new_for_path(path).replace_contents(...)` (sync ou async)
|
||||||
|
- écrire :
|
||||||
|
- `brightness`: entier (0..max)
|
||||||
|
- `kbd_rgb_mode`: string `1 0 R G B 0\n`
|
||||||
|
- lecture :
|
||||||
|
- `max_brightness`
|
||||||
|
- `brightness`
|
||||||
|
- (si dispo) `kbd_rgb_state` pour init, sinon utiliser GSettings
|
||||||
|
|
||||||
|
### Debounce
|
||||||
|
- sur sliders, ne pas écrire à chaque pixel : buffer + `GLib.timeout_add()`.
|
||||||
|
|
||||||
|
### Robustesse
|
||||||
|
- si fichiers absents : afficher “Matériel non supporté”
|
||||||
|
- si permission refusée : afficher un bloc “Fix permissions” avec étapes udev
|
||||||
|
|
||||||
|
## 7) Repo / Outillage (Gitea + VS Code)
|
||||||
|
### Repo
|
||||||
|
Créer un repo Gitea (nom suggéré) : `gnome-asus-kbd-rgb`
|
||||||
|
Arborescence :
|
||||||
|
- `extension/`
|
||||||
|
- `metadata.json`
|
||||||
|
- `extension.js`
|
||||||
|
- `ui.js`
|
||||||
|
- `backend.js`
|
||||||
|
- `stylesheet.css` (optionnel)
|
||||||
|
- `schemas/org.gnome.shell.extensions.asuskbdrgb.gschema.xml`
|
||||||
|
- `prefs/` (optionnel MVP)
|
||||||
|
- `README.md`
|
||||||
|
- `INSTALL.md` (permissions udev + installation)
|
||||||
|
- `tools/` (scripts de dev, lint, packaging)
|
||||||
|
|
||||||
|
### Dev loop
|
||||||
|
- activer en local via `~/.local/share/gnome-shell/extensions/<uuid>/`
|
||||||
|
- recharger GNOME Shell :
|
||||||
|
- X11 : `Alt+F2`, `r`, Enter
|
||||||
|
- Wayland : logout/login
|
||||||
|
- logs :
|
||||||
|
- `journalctl -f -o cat /usr/bin/gnome-shell`
|
||||||
|
|
||||||
|
## 8) UUID et metadata
|
||||||
|
UUID conseillé : `asus-kbd-rgb@gilles`
|
||||||
|
(metadata.json doit déclarer `shell-version: ["48"]`)
|
||||||
|
|
||||||
|
## 9) Définition des presets (6)
|
||||||
|
Par défaut (modifiable) :
|
||||||
|
1. Orange (255,165,0)
|
||||||
|
2. Rouge (255,0,0)
|
||||||
|
3. Vert (0,255,0)
|
||||||
|
4. Bleu (0,0,255)
|
||||||
|
5. Blanc (255,255,255)
|
||||||
|
6. Cyan (0,255,255)
|
||||||
|
|
||||||
|
Stocker en GSettings sous forme `a{sv}` ou simples clés `preset1_r`, etc.
|
||||||
|
|
||||||
|
## 10) Tests fonctionnels à livrer
|
||||||
|
- Intensité change correctement (0..max)
|
||||||
|
- Sliders RGB appliquent instantanément
|
||||||
|
- Master slider influence R/G/B conformément au mode choisi
|
||||||
|
- Presets appliquent la couleur
|
||||||
|
- Redémarrage session : la dernière config est restaurée
|
||||||
|
- Cas “no permission” : message et guide udev affichés
|
||||||
|
- Cas “hardware absent” : message clair
|
||||||
|
|
||||||
|
## 11) Livrables attendus de Claude Code
|
||||||
|
1. Code complet extension GNOME Shell 48 (MVP)
|
||||||
|
2. `README.md` (usage) + `INSTALL.md` (permissions + installation)
|
||||||
|
3. `gschema.xml` + compilation instructions (`glib-compile-schemas`)
|
||||||
|
4. Un script `tools/install-local.sh` (copie dans ~/.local/share/gnome-shell/extensions)
|
||||||
|
5. Optionnel : page Prefs GNOME (`prefs.js`) pour gérer presets et mode master
|
||||||
|
|
||||||
|
## 12) Questions à trancher AVANT de coder (si ambigu)
|
||||||
|
Claude doit demander au début, puis implémenter par défaut si pas de réponse :
|
||||||
|
1. Master slider : **offset** ou **gain** ? (par défaut : gain 0..100%)
|
||||||
|
2. Pas (step) RGB : 1, 5, 10 ? (par défaut : 5, avec option prefs)
|
||||||
|
3. Au démarrage : lire sysfs si possible, sinon GSettings ? (par défaut : GSettings)
|
||||||
|
4. Sur `brightness=0` : garder couleur mémorisée sans l’écrire, ou écrire quand même ? (par défaut : mémoriser, n’écrire que si >0)
|
||||||
|
5. Presets : simple clic applique ; long-press pour enregistrer ? (par défaut : clic applique, bouton “Save to preset” option prefs)
|
||||||
|
|
||||||
|
## 13) Prompt d’exécution pour Claude Code
|
||||||
|
Tu es **Claude Code** (mode dev). Tu dois produire un projet complet dans un repo Git.
|
||||||
|
Contraintes :
|
||||||
|
- GNOME Shell 48 (GJS)
|
||||||
|
- Pas de dépendances externes
|
||||||
|
- Code lisible, modulaire, commenté
|
||||||
|
- Robustesse permissions + erreurs
|
||||||
|
- UX immédiate et fluide
|
||||||
|
|
||||||
|
Plan de travail exigé :
|
||||||
|
1. Générer l’arborescence complète
|
||||||
|
2. Implémenter backend sysfs + debounce
|
||||||
|
3. Implémenter UI popover (table + sliders + presets)
|
||||||
|
4. Implémenter GSettings + valeurs par défaut
|
||||||
|
5. Documenter installation + règle udev + troubleshooting
|
||||||
|
6. Tester et fournir checklist
|
||||||
|
|
||||||
|
Fin.
|
||||||
Reference in New Issue
Block a user