# CHANGELOG - Extension GNOME Shell ASUS RGB Keyboard Ce fichier documente l'évolution du développement de l'extension pour faciliter la reprise du travail. ## [Non publié] - En cours de développement ### 📅 2025-12-23 #### 🆕 Nouvelles Améliorations (Session 4 - suite) **Amélioration 9: Changement automatique de fond d'écran** ✅ - **Fonctionnalité**: L'extension change automatiquement le fond d'écran GNOME selon la couleur sélectionnée - **Système de nommage**: 9 wallpapers nommés `ec_v_.jpg` (ex: `ec_v_blue.jpg`, `ec_v_orange.jpg`) - **Implémentation**: - Nouvelle fonction `_changeWallpaper(accentColor)` dans ui.js - Intégration dans `_syncGnomeTheme()` pour changement automatique - Vérification d'existence du fichier avant application - Support mode clair ET mode sombre (picture-uri + picture-uri-dark) - **Installation**: - Dossier `wallpapers/` créé dans le projet - Script `install-local.sh` modifié pour copier automatiquement les wallpapers - Comptage et affichage du nombre de wallpapers installés - **Documentation**: docs/WALLPAPERS.md avec guide complet - **Fichiers modifiés**: - ui.js ligne 558-587 : Fonction _changeWallpaper() - ui.js ligne 619 : Intégration dans _syncGnomeTheme() - tools/install-local.sh ligne 112-128 : Copie des wallpapers - **Comportement**: - Si wallpaper absent → log informatif (pas d'erreur) - Si présent → changement automatique en même temps que couleur thème - **Résultat**: Synchronisation complète : couleur clavier + thème GNOME + fond d'écran ### 📅 2025-12-21 #### 🆕 Nouvelles Améliorations (Session 4) **Amélioration 4: Presets GNOME et restauration thème** ✅ - **Demande**: Remplacer les 6 presets personnalisés par les 9 couleurs d'accentuation GNOME - **Solution implémentée**: - Modification du schéma GSettings : ajout de `preset-7`, `preset-8`, `preset-9` - Mise à jour de tous les presets avec les couleurs GNOME officielles : 1. Bleu (53, 132, 228) - couleur par défaut GNOME 2. Turquoise (51, 209, 122) 3. Vert (87, 227, 137) 4. Jaune (246, 211, 45) 5. Orange (255, 120, 0) 6. Rouge (237, 51, 59) 7. Rose (246, 97, 81) 8. Violet (145, 65, 172) 9. Gris ardoise (119, 118, 123) - Adaptation UI : boucle de 6 → 9 presets, ajustement taille boutons (32px → 28px) - Restauration thème : désactiver la synchronisation remet GNOME sur "blue" (défaut) - **Résultat**: Cohérence totale entre presets clavier et couleurs d'accentuation GNOME **Amélioration 5: Style presets ronds et surbrillance** ✅ - **Demande**: Presets en forme de ronds avec cercle blanc autour du preset actif - **Solution implémentée**: - Modification style : `border-radius: 50%` pour rendre les presets circulaires - Taille ajustée : 26×26px pour des cercles parfaits - Fonction `_updatePresetSelection()` : cercle blanc épais (3px) + box-shadow sur le preset actif - Stockage des boutons dans `this._presetButtons[]` avec propriétés `_preset` et `_baseStyle` - Comparaison RGB avec tolérance de ±10 - Appel à chaque changement de couleur pour mise à jour en temps réel - **Résultat**: Feedback visuel clair du preset actuellement sélectionné **Amélioration 6: Synchronisation thème universelle** ✅ - **Problème**: Synchronisation thème GNOME fonctionnait uniquement depuis la roue chromatique - **Cause**: `_onPresetClicked()` appelait directement `Backend.writeRGB()` au lieu de `_onRGBChanged()` - **Solution**: Refactorisation de `_onPresetClicked()` pour utiliser `_onRGBChanged()` - **Déclenchement synchronisation maintenant actif**: - ✅ Depuis la roue chromatique - ✅ Depuis les sliders RGB - ✅ Depuis les presets - ✅ Depuis le slider Master - **Résultat**: La couleur GNOME se synchronise peu importe le mode de sélection utilisé **Amélioration 7: Forçage de l'état RGB au démarrage** ✅ **[CRITIQUE]** - **Problème**: Clavier parfois éteint au redémarrage, impossible à rallumer sous Debian - **Cause identifiée**: - Le firmware ASUS peut réinitialiser le contrôleur RGB au boot - L'extension vérifiait `brightness == 0` et ne touchait pas à RGB dans ce cas - Le contrôleur restait dans un état indéfini - **Solution implémentée**: - Suppression de la vérification `if (currentBrightness === 0)` dans `writeRGB()` - `_applyCurrentState()` force TOUJOURS brightness + RGB au démarrage - Logs explicites pour débugger l'initialisation - **Fichiers modifiés**: - backend.js ligne 171-206 : Suppression du skip RGB si brightness = 0 - ui.js ligne 837-849 : Forçage inconditionnel de l'état - **Documentation**: docs/ANALYSE_PERSISTANCE.md - **Résultat**: Le clavier sera toujours réinitialisé dans l'état GSettings au login GNOME **Amélioration 8: Correction couleurs presets GNOME** ✅ - **Problème**: Les presets ne correspondaient pas aux vraies couleurs d'accentuation GNOME - **Couleurs corrigées** (RGB hex → RGB décimal): 1. ✅ Bleu #3584e4 → (53, 132, 228) - déjà correct 2. ❌ Turquoise #2190a4 → (33, 144, 164) - corrigé (était 51,209,122) 3. ❌ Vert #3a944a → (58, 148, 74) - corrigé (était 87,227,137) 4. ❌ Jaune #c88800 → (200, 136, 0) - corrigé (était 246,211,45) 5. ❌ Orange #ed5b00 → (237, 91, 0) - corrigé (était 255,120,0) 6. ❌ Rouge #e62d42 → (230, 45, 66) - corrigé (était 237,51,59) 7. ❌ Rose #d56199 → (213, 97, 153) - corrigé (était 246,97,81) 8. ✅ Violet #9141ac → (145, 65, 172) - déjà correct 9. ❌ Ardoise #6f8396 → (111, 131, 150) - corrigé (était 119,118,123) - **Fichiers modifiés**: - schemas/org.gnome.shell.extensions.asuskbdrgb.gschema.xml ligne 45-89 - ui.js ligne 526-537 : Fonction `_rgbToGnomeAccent()` - **Résultat**: Synchronisation thème GNOME maintenant exacte avec les 9 couleurs officielles #### 🆕 Nouvelles Améliorations (Session 2 et 3) **Amélioration 1: Surbrillance des boutons d'intensité** ✅ - **Problème**: Les boutons OFF/1/2/3 n'affichaient pas de surbrillance du niveau sélectionné - **Cause**: Classe CSS incorrecte (`'button'` au lieu de `'brightness-button'`) - **Solution**: Correction de `style_class` dans `_buildBrightnessButtons()` - **Résultat**: Bouton actif affiché avec fond bleu et texte blanc gras **Amélioration 2: Surbrillance de la couleur sélectionnée dans la roue** ✅ - **Problème**: Pas de feedback visuel sur la couleur active dans la roue chromatique - **Solution implémentée**: - Stockage des 113 boutons dans `this._wheelButtons[]` - Ajout de propriétés `_rgb` et `_baseStyle` sur chaque bouton - Nouvelle fonction `_updateWheelSelection()` pour mettre à jour la bordure - Bordure blanche épaisse (3px) + box-shadow sur la couleur sélectionnée - Comparaison RGB avec tolérance de ±10 pour gérer les approximations HSL - **Appels**: - ✅ À la construction de la roue (affichage initial) - ✅ Sur clic dans la roue - ✅ Sur clic preset - ✅ Sur changement de couleur - **Résultat**: Indication claire de quelle couleur est actuellement appliquée dès l'ouverture du menu **Amélioration 3: Synchronisation avec le thème GNOME** ✅ - **Demande**: Appliquer automatiquement la couleur du clavier comme couleur d'accentuation GNOME - **Solution implémentée**: - Ajout clé GSettings `sync-gnome-theme` (booléen, défaut: false) - Fonction `_rgbToGnomeAccent()` : mapping RGB → 9 couleurs GNOME (blue, teal, green, yellow, orange, red, pink, purple, slate) - Algorithme: distance euclidienne dans l'espace RGB pour trouver la couleur la plus proche - Fonction `_syncGnomeTheme()` : applique via `org.gnome.desktop.interface accent-color` - UI: `PopupSwitchMenuItem` "Synchroniser thème GNOME" après les presets - **Déclenchement**: - ✅ Activation de la case à cocher (application immédiate) - ✅ Lors de chaque changement de couleur clavier (si activé) - **Résultat**: La couleur d'accentuation GNOME (affichée dans Paramètres → Apparence) change automatiquement pour correspondre au clavier RGB #### 🔍 Analyse des Problèmes Identifiés (Session 1) **Problème 1: Roue chromatique non fonctionnelle** - **Symptôme**: Impossible de sélectionner une couleur en cliquant sur la roue - **Cause identifiée**: - Première tentative avec `St.DrawingArea` non interactive sous GNOME Shell 48 - Deuxième tentative avec grille 16×16 de boutons (cellSize: 12px) potentiellement trop petits - Les boutons sont créés mais les clics ne sont pas détectés - **Hypothèse**: Boutons trop petits (12px) ou problème de style CSS empêchant l'interaction **Problème 2: Niveau d'intensité non visuellement sélectionné** - **Symptôme**: Aucune indication visuelle du bouton d'intensité actif - **Cause**: Pas de mise à jour du style CSS lors du clic - **Solution**: Ajouter classe CSS active et mettre à jour dans `_updateBrightnessButtons()` **Problème 3: Mode par défaut incorrect** - **Symptôme**: Mode sliders affiché par défaut alors que l'utilisateur préfère la roue - **Cause**: `this._colorPickerMode = 'sliders'` dans l'initialisation - **Solution**: Inverser pour `this._colorPickerMode = 'wheel'` #### 🔧 Correctifs Appliqués **Correctif 1: Roue chromatique fonctionnelle** ✅ - Augmentation de la taille des cellules: 12px → 18px (+50%) - Réduction de la grille: 16×16 → 12×12 pour meilleure visibilité - Ajout de bordure visible `rgba(0,0,0,0.3)` pour feedback visuel - Ajout de `reactive: true` et `track_hover: true` pour garantir l'interactivité - Espacement entre cellules: 2px → 3px pour meilleure séparation **Correctif 2: Surbrillance des boutons d'intensité** ✅ - Classe CSS `.active` déjà implémentée dans stylesheet.css - Style actif: fond bleu (`rgba(53, 132, 228, 0.8)`), texte blanc, gras - Fonction `_updateBrightnessButtons()` existante et fonctionnelle **Correctif 3: Mode roue par défaut** ✅ - Changement de `_colorPickerMode: 'sliders'` → `'wheel'` - Roue chromatique affichée en premier au démarrage - Bouton de bascule pour passer en mode sliders #### 📊 Résumé des Améliorations **Interface utilisateur:** - ✅ Roue chromatique 12×12 avec 113 couleurs cliquables - ✅ Boutons 18×18px, bien visibles et réactifs - ✅ Mode roue chromatique par défaut (préférence utilisateur) - ✅ Surbrillance automatique du niveau d'intensité actif - ✅ Aperçu couleur dans le header avec correction gamma sRGB **Ergonomie:** - ✅ Clic sur la roue chromatique → application immédiate au clavier - ✅ Slider Luminosité (Master) pour contrôle de l'intensité - ✅ Bascule facile entre roue et sliders RGB - ✅ Interface compacte et optimisée ### 📅 2025-12-20 #### ✅ Terminé - **Analyse du projet** : Compréhension complète des spécifications - **Architecture définie** : Séparation en 3 modules (ui.js, backend.js, extension.js) - **Schéma UI créé** : Documentation visuelle complète dans `docs/UI_SCHEMA.md` - Diagramme Mermaid de l'architecture - Layout ASCII du popover - Flux de données - Gestion des erreurs UI - **CLAUDE.md créé** : Guide pour futures instances de Claude Code - **CHANGELOG.md initialisé** : Ce fichier #### 🔄 En cours - Prêt pour installation et tests complets #### ✅ Tests Matériel Réalisés (ASUS TUF Gaming A16 FA608UH) - ✅ **Contrôle brightness** : Changement de niveaux 0-3 fonctionnel - ✅ **Contrôle RGB** : Écriture kbd_rgb_mode validée - ✅ **Permissions udev** : Règle corrigée et fonctionnelle - Règle finale : `ACTION=="add"` avec `RUN+="/bin/sh -c 'chgrp kbdled ...'"` - Rechargement module : `modprobe -r asus_nb_wmi && modprobe asus_nb_wmi` - Permissions validées : `kbdled` groupe appliqué correctement #### 📋 Terminé (MVP complet) - ✅ Arborescence complète du projet créée - ✅ backend.js implémenté (interface sysfs + debouncing) - ✅ ui.js implémenté (construction du popover complet) - ✅ extension.js créé (lifecycle GNOME Shell) - ✅ Schéma GSettings complet avec 6 presets - ✅ metadata.json créé - ✅ stylesheet.css créé pour le styling - ✅ Documentation installation (docs/INSTALL.md) - ✅ Documentation troubleshooting (docs/TROUBLESHOOTING.md) - ✅ Documentation tests (docs/TESTING.md) - ✅ Script d'installation (tools/install-local.sh) - ✅ README.md complet et détaillé #### 🎯 Décisions techniques prises - **Langage**: GJS (JavaScript GNOME Shell) - **GNOME Shell**: Version 48 - **UUID**: `asus-kbd-rgb@gilles` - **Master Slider**: Mode "gain" (multiplie R/G/B par 0-100%) - **Debouncing**: 75ms pour les sliders - **Permissions**: Règle udev + groupe `kbdled` (approche simple) - **Step RGB par défaut**: 5 - **Comportement brightness=0**: Mémoriser RGB sans écrire kbd_rgb_mode #### 📝 Presets couleur par défaut 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) #### 🔧 Interface matérielle - Path brightness: `/sys/class/leds/asus::kbd_backlight/brightness` - Path max: `/sys/class/leds/asus::kbd_backlight/max_brightness` - Path RGB: `/sys/class/leds/asus::kbd_backlight/kbd_rgb_mode` - Format RGB: `1 0 R G B 0\n` --- ## Notes pour reprise du développement ### Prochaines étapes recommandées 1. Créer l'arborescence complète des fichiers 2. Implémenter backend.js en premier (base pour tests) 3. Implémenter ui.js (interface) 4. Créer extension.js pour intégrer les modules 5. Tester avec règles udev configurées ### Points d'attention - **Permissions critiques**: L'extension ne peut pas fonctionner sans les règles udev - **Debouncing essentiel**: Éviter de spammer sysfs lors des déplacements de sliders - **Clamping obligatoire**: Toujours valider 0-255 pour RGB, 0-max pour brightness - **GNOME Shell 48**: Vérifier la compatibilité API (notamment pour Slider) - **Wayland vs X11**: Différence pour le rechargement en dev ### Dépendances système - GNOME Shell 48 - GLib/GIO pour sysfs - GSettings pour la persistance - udev pour les permissions ### Structure des modules ``` backend.js → Fonctions exportées: - checkHardwareSupport() - checkPermissions() - readBrightness() - writeBrightness(value) - readRGB() - writeRGB(r, g, b, master) - applyPreset(presetId) ui.js → Classe exportée: - KeyboardRGBIndicator extends PanelMenu.Button - Méthodes: _buildUI(), _onRGBChanged(), _onBrightnessChanged(), etc. extension.js → Fonctions requises: - init() - enable() - disable() ``` ### Tests à effectuer lors de la reprise - [ ] Extension se charge sans erreur - [ ] Popover s'affiche au clic - [ ] Sliders fonctionnent - [ ] Debouncing actif (vérifier dans les logs) - [ ] Écriture sysfs réussie (avec permissions) - [ ] GSettings sauvegarde correctement - [ ] Restauration au redémarrage de session