8.3 KiB
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 éventuellementSliderde GNOME Shell) - Compatible GNOME Shell 48
Architecture recommandée
Séparer en 3 blocs :
ui.js: construction du menu (widgets, layout, events)backend.js: lecture/écriture sysfs + logique (clamp, master slider, presets)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.rulesSUBSYSTEM=="leds", KERNEL=="asus::kbd_backlight", GROUP="kbdled", MODE="0660"sudo groupadd -f kbdledsudo usermod -aG kbdled $USERsudo 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 :
Rslider 0..255Gslider 0..255Bslider 0..255Masterslider (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 écrirekbd_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: string1 0 R G B 0\n
- lecture :
max_brightnessbrightness- (si dispo)
kbd_rgb_statepour 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.jsonextension.jsui.jsbackend.jsstylesheet.css(optionnel)schemas/org.gnome.shell.extensions.asuskbdrgb.gschema.xml
prefs/(optionnel MVP)README.mdINSTALL.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
- X11 :
- 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) :
- Orange (255,165,0)
- Rouge (255,0,0)
- Vert (0,255,0)
- Bleu (0,0,255)
- Blanc (255,255,255)
- 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
- Code complet extension GNOME Shell 48 (MVP)
README.md(usage) +INSTALL.md(permissions + installation)gschema.xml+ compilation instructions (glib-compile-schemas)- Un script
tools/install-local.sh(copie dans ~/.local/share/gnome-shell/extensions) - 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 :
- Master slider : offset ou gain ? (par défaut : gain 0..100%)
- Pas (step) RGB : 1, 5, 10 ? (par défaut : 5, avec option prefs)
- Au démarrage : lire sysfs si possible, sinon GSettings ? (par défaut : GSettings)
- 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) - 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 :
- tes reponse seront en francais
- commentaires en francais
- GNOME Shell 48 (GJS)
- Pas de dépendances externes
- Code lisible, modulaire, commenté
- Robustesse permissions + erreurs
- UX immédiate et fluide
- choix des icones parmis des elemnt gratuit, libre ou opensource
- les fichiers de documentation seront dans un dossier 'docs'
- maintien a jours un changelog qui sera utilise pour reprendre le devellopement de l'app
Plan de travail exigé : 0.0 Analyse complete du projet 0.1 Popose un schema webui (format ascii draw, mermaid, excalidraw, ....) 0.2 Creation d'un ToDO evolutif que tu mettra jours ( a faire, terminer, a tester, annulé, amelioration, ...) 0.3 Creation d'un changelog a mettre ajours frequement ( tu me posera la question) . les element qui y seront inscrit seront pertinent pour une reprise du devellopement
- Générer l’arborescence complète
- Implémenter backend sysfs + debounce
- Implémenter UI popover (table + sliders + presets)
- Implémenter GSettings + valeurs par défaut
- Documenter installation + règle udev + troubleshooting
- Tester et fournir checklist
Fin.