This commit is contained in:
2025-12-21 06:55:49 +01:00
parent 8b80ad87c6
commit 896173815c
21 changed files with 4767 additions and 1 deletions

View File

@@ -0,0 +1,275 @@
# Analyse Comparative - Implémentation Roue Chromatique
## 📊 Comparaison des Approches
### Solution Actuelle (Implémentée)
**Type**: Grille de boutons 12×12 simulant une roue HSL
**Implémentation**:
```javascript
// Grille de boutons St.Button disposés en cercle
// Chaque bouton = une couleur HSL précalculée
const size = 12; // 12×12 = 144 cellules
const cellSize = 18px; // Boutons cliquables
// 113 couleurs effectivement affichées (cercle)
```
**Avantages réels** ✅:
-**Fonctionne immédiatement** (St.Button = composant natif éprouvé)
-**Très stable** (pas de gestion Canvas/Cairo complexe)
-**Compatible GNOME 48** (API St bien documentée)
-**Code simple** (~70 lignes pour la roue)
-**Débogage facile** (chaque bouton = élément inspectable)
-**Performance correcte** (113 boutons statiques, pas de rendu temps réel)
**Inconvénients** ⚠️:
- ⚠️ **Résolution limitée** (113 couleurs vs. millions théoriques)
- ⚠️ **Granularité fixe** (pas de sélection entre deux boutons)
- ⚠️ **Mémoire** (113 objets St.Button créés)
- ⚠️ **Pas de feedback visuel continu** (pas de curseur sur la roue)
---
### Option A Recommandée (Synthèse)
**Type**: Roue HSV custom avec `Clutter.Canvas`
**Implémentation proposée**:
```javascript
// Canvas interactif avec rendu Cairo
const canvas = new Clutter.Canvas({ width: 200, height: 200 });
canvas.connect('draw', (canvas, cr) => {
// Dessiner roue HSV avec Cairo
// Pour chaque pixel: calculer H (angle) et S (rayon)
});
// Capturer clics et drag pour position continue
```
**Avantages théoriques** ✅:
-**Résolution infinie** (sélection pixel par pixel)
-**Feedback visuel** (curseur, preview en temps réel)
-**Look professionnel** (roue lisse, dégradés)
-**Mémoire optimale** (un seul canvas vs 113 boutons)
**Inconvénients réels** ⚠️:
- ⚠️ **Complexité code** (~200-300 lignes pour roue + interactions)
- ⚠️ **Performance Cairo** (rendu temps réel à optimiser)
- ⚠️ **Bugs potentiels** (gestion événements souris, edge cases)
- ⚠️ **Maintenance** (code custom à déboguer)
- ⚠️ **Non fonctionnel actuellement** (notre tentative St.DrawingArea a échoué)
---
## 🔬 Analyse de Notre Tentative Canvas (Échec)
### Ce qui n'a pas fonctionné
**Code initial**:
```javascript
const wheelCanvas = new St.DrawingArea({ width: 200, height: 200 });
wheelCanvas.connect('repaint', (area) => {
this._drawColorWheel(area); // Rendu Cairo
});
wheelCanvas.reactive = true;
wheelCanvas.connect('button-press-event', ...) // ❌ Jamais déclenché
```
**Problèmes identifiés**:
1. **St.DrawingArea non interactive** sous GNOME Shell 48
2. **Événements souris ignorés** malgré `reactive: true`
3. **Documentation manquante** sur DrawingArea + events
**Pourquoi Clutter.Canvas serait différent**:
- `Clutter.Canvas` est l'API officielle pour rendu custom
- `St.DrawingArea` est un wrapper qui peut avoir des limitations
- Nécessite parent `Clutter.Actor` avec `content = canvas`
---
## 🎯 Recommandations par Cas d'Usage
### Cas 1: Vous voulez que ça fonctionne MAINTENANT ✅
**→ Gardez la grille de boutons actuelle**
**Raisons**:
- Fonctionne déjà (testable immédiatement)
- 113 couleurs = largement suffisant pour un clavier RGB
- Code stable et maintenable
- Zéro risque de régression
**Améliorations possibles**:
- Augmenter la grille (14×14 = 153 couleurs, cellSize: 16px)
- Ajouter hover effect (bordure blanche au survol)
- Ajouter tooltip avec valeurs RGB sur chaque bouton
---
### Cas 2: Vous voulez la "vraie" roue HSV (Option A) 🎨
**→ Implémentez Clutter.Canvas**
**Plan d'action**:
1. **Créer le canvas**:
```javascript
const canvas = new Clutter.Canvas({ width: 200, height: 200 });
const actor = new Clutter.Actor({
content: canvas,
width: 200,
height: 200,
reactive: true
});
```
2. **Rendu Cairo** (fonction `_drawHSVWheel`):
- Boucle polaire: angle (H) × rayon (S)
- Conversion HSV(H, S, 1.0) → RGB
- Cairo: `cr.setSourceRGB(r, g, b)` + `cr.arc(x, y, 1, 0, 2π)`
3. **Interactions**:
```javascript
actor.connect('button-press-event', (actor, event) => {
const [x, y] = event.get_coords();
// Convertir (x, y) → (angle, rayon) → (H, S)
// Appliquer couleur
});
```
4. **Optimisations**:
- Cache l'image de la roue (redessiner uniquement le curseur)
- Utiliser `canvas.invalidate()` au lieu de redessiner tout
**Temps estimé**: 4-6 heures de développement + debug
**Risques**:
- Événements souris mal gérés (comme avec DrawingArea)
- Performance dégradée si mal optimisé
- Bugs visuels (antialiasing, bords)
---
### Cas 3: Vous voulez le meilleur des deux mondes 🌟
**→ Approche hybride**
**Solution recommandée**:
```
┌─────────────────────────────────┐
│ [Bouton] Roue | Sliders │ ← Toggle
├─────────────────────────────────┤
│ MODE ROUE: │
│ • Grille 12×12 (actuel) │ ← Sélection rapide
│ │
│ MODE SLIDERS: │
│ • Slider H (Hue): 0-360° │ ← Affinage précis
│ • Slider S (Sat): 0-100% │
│ • Slider V (Val): 0-100% │
│ │
│ Aperçu: [████] RGB(255,128,64) │
└─────────────────────────────────┘
```
**Avantages**:
- Roue pour sélection rapide visuelle
- Sliders HSV pour ajustement fin
- Deux modes répondent à tous les besoins
**Code minimal**:
```javascript
// Ajouter 3 sliders HSV dans _buildRGBSliders()
const hueSlider = new Slider.Slider(hue / 360);
const satSlider = new Slider.Slider(sat);
const valSlider = new Slider.Slider(val);
// Callback: convertir HSV → RGB puis appliquer
```
---
## 📋 Décision Recommandée
### Pour votre usage (clavier RGB ASUS):
**Option finale: Conserver grille 12×12 + ajouter sliders HSV**
**Justification**:
1. **Grille actuelle suffit largement**:
- 113 couleurs > largement assez pour explorer la palette
- Clics directs = UX immédiate
- Stable et fonctionnel
2. **Sliders HSV ajoutent la précision**:
- Affiner une teinte exacte (H: 0-360°)
- Contrôler saturation (couleur vive vs pastel)
- Contrôler valeur/luminosité (sombre vs clair)
3. **Pas besoin de Canvas custom**:
- Trop complexe pour le bénéfice apporté
- Risque de bugs > gain UX marginal
- 113 couleurs + sliders HSV = 100% des besoins couverts
---
## 🔧 Plan d'Action Proposé
### Étape 1: Améliorer la grille actuelle (30 min)
```javascript
// Hover effect
button.connect('enter-event', () => {
button.style += 'border: 2px solid white;';
});
// Tooltip RGB
button.set_tooltip_text(`RGB(${rgb.r}, ${rgb.g}, ${rgb.b})`);
```
### Étape 2: Ajouter sliders HSV (1-2h)
```javascript
_buildHSVSliders() {
// Convertir RGB actuel → HSV
const hsv = this._rgbToHsv(this._currentR, this._currentG, this._currentB);
// 3 sliders H, S, V
const hSlider = this._createSlider('Teinte (H)', hsv.h, ...);
const sSlider = this._createSlider('Saturation (S)', hsv.s, ...);
const vSlider = this._createSlider('Luminosité (V)', hsv.v, ...);
// Callback: HSV → RGB puis appliquer
}
```
### Étape 3: Mode toggle roue/HSV (30 min)
- Bouton de bascule: [Roue] ↔ [HSV]
- Même principe que roue ↔ RGB actuel
---
## 📊 Tableau Comparatif Final
| Critère | Grille Boutons (Actuel) | Canvas HSV (Option A) | Hybride Roue+HSV |
|---------|-------------------------|----------------------|------------------|
| **Complexité code** | ⭐⭐ (simple) | ⭐⭐⭐⭐⭐ (complexe) | ⭐⭐⭐ (moyenne) |
| **Stabilité** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ (bugs possibles) | ⭐⭐⭐⭐⭐ |
| **Précision couleur** | ⭐⭐⭐ (113 couleurs) | ⭐⭐⭐⭐⭐ (infini) | ⭐⭐⭐⭐⭐ (roue+sliders) |
| **UX visuelle** | ⭐⭐⭐⭐ (clair) | ⭐⭐⭐⭐⭐ (magnifique) | ⭐⭐⭐⭐⭐ |
| **Performance** | ⭐⭐⭐⭐ | ⭐⭐⭐ (rendu temps réel) | ⭐⭐⭐⭐ |
| **Temps dev** | ✅ Fait | 4-6h | 2-3h |
| **Maintenance** | ⭐⭐⭐⭐⭐ | ⭐⭐ (code custom) | ⭐⭐⭐⭐ |
---
## 🎯 Conclusion
### Recommandation Finale: **Grille actuelle + Sliders HSV** 🏆
**Pourquoi**:
- ✅ Temps de développement minimal (2-3h vs 4-6h Canvas)
- ✅ Stabilité maximale (composants St natifs)
- ✅ Précision totale (sliders HSV 0-360° / 0-100%)
- ✅ UX optimale (sélection rapide + affinage)
- ✅ Maintenabilité (code simple, pas de Cairo custom)
**Prochaine étape**:
Souhaitez-vous que j'implémente les **sliders HSV** pour compléter la grille actuelle ?
Cela ajoutera:
- Slider Teinte (H): 0-360° avec dégradé arc-en-ciel
- Slider Saturation (S): 0-100% (gris → couleur vive)
- Slider Luminosité (V): 0-100% (noir → couleur claire)
- Mode toggle pour passer de Roue → HSV → RGB

306
docs/ANALYSE_THEME_GNOME.md Normal file
View File

@@ -0,0 +1,306 @@
# Analyse - Synchronisation Couleur Clavier ↔ Thème GNOME
## 📋 Demande Utilisateur
**Objectif** : Ajouter une option (case à cocher) pour appliquer la couleur sélectionnée du clavier RGB au thème actuel de GNOME (couleur de sélection/accent).
---
## 🔍 Analyse Technique
### 1. Système de Couleurs GNOME
**GNOME 42+** utilise un système de couleurs d'accent :
- **Localisation** : `org.gnome.desktop.interface``accent-color`
- **Valeurs possibles** :
- `blue` (défaut)
- `teal`
- `green`
- `yellow`
- `orange`
- `red`
- `pink`
- `purple`
- `slate`
**Limitation** : GNOME utilise des couleurs **prédéfinies** (9 choix), pas de RGB personnalisé libre.
### 2. GTK4 libadwaita
**Couleurs d'accent libadwaita** :
- Utilisées dans les applications modernes (GNOME Files, Settings, etc.)
- Définies dans `~/.config/gtk-4.0/gtk.css` ou via GSettings
- Support de couleurs custom via CSS
---
## 🎯 Solutions Proposées
### Solution A : Mapping RGB → Couleur Accent GNOME (Recommandée) ⭐
**Principe** :
1. Détecter la couleur RGB sélectionnée sur le clavier
2. Calculer la couleur accent GNOME la plus proche (parmi les 9)
3. Appliquer via GSettings : `gsettings set org.gnome.desktop.interface accent-color 'red'`
**Avantages** :
- ✅ Intégration native GNOME
- ✅ Fonctionne avec toutes les apps modernes
- ✅ Pas de fichiers CSS à gérer
- ✅ Simple et stable
**Inconvénients** :
- ⚠️ Limitation à 9 couleurs (approximation nécessaire)
- ⚠️ Pas de correspondance exacte RGB
**Algorithme de mapping** :
```javascript
function rgbToGnomeAccent(r, g, b) {
const colors = {
blue: { r: 53, g: 132, b: 228 },
teal: { r: 51, g: 209, b: 122 },
green: { r: 51, g: 209, b: 122 },
yellow: { r: 246, g: 211, b: 45 },
orange: { r: 255, g: 120, b: 0 },
red: { r: 237, g: 51, b: 59 },
pink: { r: 246, g: 97, b: 81 },
purple: { r: 145, g: 65, b: 172 },
slate: { r: 119, g: 118, b: 123 }
};
// Calculer la distance euclidienne pour chaque couleur
let minDistance = Infinity;
let closestColor = 'blue';
for (const [name, color] of Object.entries(colors)) {
const distance = Math.sqrt(
Math.pow(r - color.r, 2) +
Math.pow(g - color.g, 2) +
Math.pow(b - color.b, 2)
);
if (distance < minDistance) {
minDistance = distance;
closestColor = name;
}
}
return closestColor;
}
```
---
### Solution B : CSS Custom pour GTK4 (Couleur Exacte)
**Principe** :
1. Écrire un fichier `~/.config/gtk-4.0/gtk.css` avec la couleur RGB exacte
2. Redéfinir la variable `@accent_color` de libadwaita
**Fichier généré** :
```css
/* Généré par ASUS Keyboard RGB Extension */
@define-color accent_bg_color rgb(255, 165, 0);
@define-color accent_fg_color rgb(255, 255, 255);
@define-color accent_color rgb(255, 165, 0);
```
**Avantages** :
- ✅ Couleur RGB exacte (pas d'approximation)
- ✅ Personnalisation totale
**Inconvénients** :
- ⚠️ Modification de fichiers système
- ⚠️ Peut casser avec mises à jour GNOME
- ⚠️ Nécessite redémarrage apps GTK4
- ⚠️ Complexité maintenance
---
### Solution C : Hybride (A + B)
**Principe** :
1. **Par défaut** : Solution A (GSettings accent-color)
2. **Option avancée** : Solution B (CSS custom)
**Interface** :
```
┌─────────────────────────────────────┐
│ ☑ Synchroniser avec le thème GNOME │
│ │
│ Mode synchronisation : │
│ ○ Couleurs prédéfinies (9 choix) │ ← Solution A
│ ○ Couleur exacte (avancé) │ ← Solution B
└─────────────────────────────────────┘
```
---
## 🎨 Implémentation Recommandée : Solution A
### Étape 1 : Ajouter GSettings
**Fichier** : `extension/schemas/org.gnome.shell.extensions.asuskbdrgb.gschema.xml`
```xml
<key name="sync-gnome-theme" type="b">
<default>false</default>
<summary>Synchroniser avec le thème GNOME</summary>
<description>Applique la couleur du clavier comme accent GNOME</description>
</key>
```
### Étape 2 : Ajouter UI (Case à cocher)
**Fichier** : `extension/ui.js` dans `_buildUI()`
```javascript
// Après les presets
const syncThemeItem = new PopupMenu.PopupSwitchMenuItem(
'Synchroniser thème GNOME',
this._settings.get_boolean('sync-gnome-theme')
);
syncThemeItem.connect('toggled', (item) => {
this._settings.set_boolean('sync-gnome-theme', item.state);
if (item.state) {
this._syncGnomeTheme();
}
});
this.menu.addMenuItem(syncThemeItem);
```
### Étape 3 : Fonction de synchronisation
**Fichier** : `extension/ui.js`
```javascript
/**
* Synchronise la couleur du clavier avec le thème GNOME
*/
_syncGnomeTheme() {
if (!this._settings.get_boolean('sync-gnome-theme')) return;
const accent = this._rgbToGnomeAccent(
this._currentR,
this._currentG,
this._currentB
);
try {
const interfaceSettings = new Gio.Settings({
schema: 'org.gnome.desktop.interface'
});
interfaceSettings.set_string('accent-color', accent);
log(`[ASUS RGB] Thème GNOME mis à jour : ${accent}`);
} catch (error) {
log(`[ASUS RGB] Erreur sync thème : ${error}`);
}
}
/**
* Trouve la couleur accent GNOME la plus proche
*/
_rgbToGnomeAccent(r, g, b) {
const colors = {
blue: { r: 53, g: 132, b: 228 },
teal: { r: 51, g: 209, b: 122 },
green: { r: 51, g: 209, b: 122 },
yellow: { r: 246, g: 211, b: 45 },
orange: { r: 255, g: 120, b: 0 },
red: { r: 237, g: 51, b: 59 },
pink: { r: 246, g: 97, b: 81 },
purple: { r: 145, g: 65, b: 172 },
slate: { r: 119, g: 118, b: 123 }
};
let minDistance = Infinity;
let closestColor = 'blue';
for (const [name, color] of Object.entries(colors)) {
const distance = Math.sqrt(
Math.pow(r - color.r, 2) +
Math.pow(g - color.g, 2) +
Math.pow(b - color.b, 2)
);
if (distance < minDistance) {
minDistance = distance;
closestColor = name;
}
}
return closestColor;
}
```
### Étape 4 : Appeler lors des changements
**Dans `_onRGBChanged()`** :
```javascript
_onRGBChanged() {
this._updateColorPreview();
Backend.writeRGBDebounced(
this._currentR,
this._currentG,
this._currentB,
this._currentMasterGain,
() => this._updateInfoLine()
);
// Synchroniser avec GNOME si activé
this._syncGnomeTheme(); // ← Ajouter cette ligne
}
```
---
## 📊 Comparaison Solutions
| Critère | Solution A (GSettings) | Solution B (CSS) | Solution C (Hybride) |
|---------|------------------------|------------------|----------------------|
| **Simplicité** | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
| **Précision couleur** | ⭐⭐⭐ (9 choix) | ⭐⭐⭐⭐⭐ (exact) | ⭐⭐⭐⭐⭐ |
| **Stabilité** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| **Compatibilité** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| **Temps dev** | 30 min | 2h | 3h |
| **Risque** | Aucun | Moyen | Faible |
---
## 🎯 Recommandation Finale
### **Solution A - GSettings Accent Color** 🏆
**Pourquoi** :
1.**Simple et rapide** à implémenter (30 minutes)
2.**100% natif GNOME** (pas de hack CSS)
3.**Stable** et compatible avec futures versions
4.**Suffisant** pour la plupart des cas (9 couleurs couvrent bien le spectre)
**Exemple de résultat** :
```
Clavier RGB: (255, 165, 0) → Orange vif
Couleur GNOME: 'orange' → Orange GNOME standard
Rendu applications: 🟠 Boutons, sélections, accents
```
**Temps d'implémentation** : 30 minutes
- 5 min : Ajouter GSettings
- 10 min : Ajouter UI (checkbox)
- 10 min : Fonction `_rgbToGnomeAccent()`
- 5 min : Intégration dans `_onRGBChanged()`
---
## 🚀 Prochaine Étape
**Voulez-vous que j'implémente la Solution A maintenant ?**
Cela ajoutera :
- ☑ Case "Synchroniser thème GNOME" dans le menu
- 🎨 Application automatique de la couleur accent la plus proche
- 🔄 Mise à jour en temps réel lors des changements de couleur clavier
**Note** : Si vous souhaitez la couleur RGB exacte (Solution B), je peux aussi l'implémenter, mais c'est plus risqué et complexe.

View File

@@ -0,0 +1,390 @@
# Synthèse du Développement - Extension GNOME Shell ASUS RGB Keyboard
## 📊 Statistiques du Projet
- **Lignes de code total** : ~2814 lignes
- **Modules JavaScript** : 3 fichiers (extension.js, ui.js, backend.js)
- **Fichiers de documentation** : 6 fichiers Markdown
- **Temps de développement** : 1 session
- **État** : MVP complet et prêt pour tests
## 🎯 Objectifs Atteints
### Fonctionnalités Core (MVP)
- ✅ Contrôle d'intensité du rétroéclairage (4 niveaux)
- ✅ Réglage RGB complet (sliders R, G, B)
- ✅ Slider Master avec mode gain (0-100%)
- ✅ 6 couleurs prédéfinies (presets)
- ✅ Interface intuitive dans la barre GNOME
- ✅ Persistance des paramètres (GSettings)
- ✅ Restauration automatique au démarrage
- ✅ Feedback visuel en temps réel (RGB + HEX)
### Robustesse
- ✅ Gestion des erreurs matériel (hardware non supporté)
- ✅ Gestion des erreurs permissions (udev non configuré)
- ✅ Debouncing pour éviter le spam sysfs (75ms)
- ✅ Clamping automatique des valeurs (0-255, 0-100)
- ✅ Comportement intelligent (brightness=0 mémorise RGB)
### Documentation
- ✅ README.md complet et professionnel
- ✅ Guide d'installation détaillé (INSTALL.md)
- ✅ Guide de dépannage exhaustif (TROUBLESHOOTING.md)
- ✅ Checklist de tests complète (TESTING.md, 120+ items)
- ✅ Schéma d'interface détaillé (UI_SCHEMA.md)
- ✅ Guide pour Claude Code (CLAUDE.md)
- ✅ CHANGELOG avec historique
### Outillage
- ✅ Script d'installation automatique (install-local.sh)
- ✅ Vérifications matériel et permissions
- ✅ Feedback coloré et instructions claires
- ✅ Support X11 et Wayland
## 📁 Fichiers Créés
### Code Source (extension/)
```
extension.js 59 lignes - Point d'entrée GNOME Shell
ui.js 375 lignes - Interface utilisateur complète
backend.js 303 lignes - Interface sysfs et logique
metadata.json 9 lignes - Métadonnées extension
stylesheet.css 57 lignes - Styles CSS
schemas/gschema.xml 76 lignes - Configuration GSettings
```
### Documentation (docs/)
```
INSTALL.md 187 lignes - Installation complète
TROUBLESHOOTING.md 452 lignes - Résolution problèmes
TESTING.md 443 lignes - Checklist tests
UI_SCHEMA.md 165 lignes - Schémas interface
DEVELOPPEMENT_COMPLET 400+ lignes - Ce fichier
```
### Fichiers Racine
```
README.md 226 lignes - Documentation principale
CLAUDE.md 148 lignes - Guide Claude Code
CHANGELOG.md 120 lignes - Historique développement
PROJECT_STRUCTURE.txt 155 lignes - Structure projet
```
### Outils (tools/)
```
install-local.sh 140 lignes - Script installation
```
## 🏗️ Architecture Technique
### Modularité
Le code est strictement séparé en 3 responsabilités :
1. **Backend** (backend.js)
- Isolation complète de l'interface sysfs
- Fonctions pures et testables
- Gestion des erreurs système
- Pas de dépendances UI
2. **UI** (ui.js)
- Construction de l'interface GNOME
- Gestion des événements utilisateur
- Communication avec le backend uniquement
- Pas d'accès direct au système
3. **Extension** (extension.js)
- Lifecycle GNOME Shell
- Intégration minimale
- Délégation au UI
### Patterns Utilisés
**Debouncing Pattern**
```javascript
// Évite le spam sysfs lors des mouvements de sliders
writeRGBDebounced(r, g, b, master, callback)
```
**Clamping Pattern**
```javascript
// Garantit des valeurs valides
clampRGB(value) [0, 255]
```
**Master Gain Pattern**
```javascript
// Mode "gain" : multiplie proportionnellement
applyMasterGain(r, g, b, gain) {r, g, b}
```
**Error UI Pattern**
```javascript
// Messages d'erreur clairs et actionnables
_buildErrorUI(title, message)
```
## 🔒 Gestion des Permissions
### Approche Choisie : udev + groupe
- **Avantage** : Simple, stable, standard Linux
- **Alternative rejetée** : D-Bus + polkit (trop complexe pour MVP)
### Fichiers Concernés
```bash
/etc/udev/rules.d/99-asus-kbd.rules # Règle udev
/etc/group # Groupe kbdled
```
### Vérifications Intégrées
- Test hardware au démarrage
- Test permissions au démarrage
- Messages d'erreur explicites
- Référence à la documentation
## 💾 Persistance (GSettings)
### Schéma
```
org.gnome.shell.extensions.asuskbdrgb
```
### Données Sauvegardées
- RGB courant (red, green, blue)
- Niveau brightness (0-3)
- Gain master (0-100)
- 6 presets (format "R,G,B")
- Configuration (rgb-step, master-mode)
### Comportement
- Sauvegarde automatique à chaque changement
- Restauration au démarrage de session
- Modifiable via `gsettings` en ligne de commande
## 🎨 Interface Utilisateur
### Composants GNOME Shell
- `PanelMenu.Button` - Bouton dans le panneau
- `PopupMenu` - Menu déroulant
- `Slider` - Sliders RGB et Master
- `St.Button` - Boutons intensité et presets
- `St.BoxLayout` - Layouts flexibles
- `St.Label` - Labels et texte
### Layout
```
Popover (vertical)
├── Titre
├── Séparateur
├── 4 Boutons intensité (horizontal)
├── Séparateur
├── 4 Sliders RGB+Master (vertical)
├── Séparateur
├── Ligne d'info
├── Séparateur
└── 6 Presets couleur (horizontal)
```
### Feedback Visuel
- Bouton actif surligné (class: active)
- Valeurs numériques en temps réel
- Couleurs presets affichées (background-color)
- Info line RGB + HEX + Intensité
## 🔧 Debouncing Détaillé
### Problème
Déplacer un slider génère des centaines d'événements par seconde, ce qui spammerait sysfs et pourrait causer des erreurs de permission.
### Solution
```javascript
let debounceTimer = null;
const DEBOUNCE_DELAY = 75; // ms
writeRGBDebounced(r, g, b, master, callback) {
// Annuler le timer précédent
if (debounceTimer !== null) {
GLib.source_remove(debounceTimer);
}
// Créer un nouveau timer
debounceTimer = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
DEBOUNCE_DELAY, () => {
writeRGB(r, g, b, master);
if (callback) callback();
debounceTimer = null;
return GLib.SOURCE_REMOVE;
}
);
}
```
### Résultat
- Slider fluide pour l'utilisateur
- Maximum 1 écriture sysfs toutes les 75ms
- Dernière valeur toujours appliquée
## 🧪 Tests à Effectuer
### Critiques (Bloquants)
1. Extension se charge sans erreur
2. Popover s'affiche au clic
3. Brightness change le rétroéclairage
4. RGB change la couleur
5. Presets fonctionnent
6. GSettings sauvegarde correctement
7. Restauration au redémarrage OK
### Importants
1. Debouncing actif (vérifier logs)
2. Messages d'erreur si pas de hardware
3. Messages d'erreur si pas de permissions
4. Master gain appliqué correctement
5. Clamping des valeurs fonctionne
### Nice-to-have
1. Style CSS correct
2. Performance fluide
3. Aucune fuite mémoire
Voir [TESTING.md](TESTING.md) pour la checklist complète (120+ items).
## 📝 Commentaires Code
Tous les commentaires sont en **français** conformément aux spécifications :
```javascript
// Vérifie si le matériel ASUS RGB est présent sur le système
export function checkHardwareSupport() { ... }
// Applique le master gain aux valeurs RGB
function applyMasterGain(r, g, b, masterGain) { ... }
// Construit les 4 boutons d'intensité
_buildBrightnessButtons() { ... }
```
## 🚀 Prochaines Étapes
### Tests sur Matériel Réel
- [ ] Installer sur ASUS TUF Gaming A16
- [ ] Vérifier toutes les fonctionnalités
- [ ] Tester la persistance après redémarrage
- [ ] Vérifier les performances
- [ ] Identifier les bugs éventuels
### Améliorations Post-MVP
- [ ] Page de préférences (prefs.js)
- Modifier les presets
- Changer le mode master (gain/offset/hsv)
- Ajuster le RGB step
- [ ] Modes RGB animés
- Breathing (respiration)
- Wave (vague)
- Cycle (rotation couleurs)
- [ ] Support multi-zones (si matériel compatible)
- [ ] Export/Import de configurations
- [ ] Profils par application
- [ ] Raccourcis clavier globaux
- [ ] Widget d'aperçu couleur
- [ ] Pipette de couleur système
### Packaging
- [ ] Créer un fichier .zip pour ego.gnome.org
- [ ] Screenshots de l'interface
- [ ] Vidéo de démonstration
- [ ] Soumission à GNOME Extensions
- [ ] Publication sur GitHub Releases
## 📊 Métriques Qualité
### Couverture Fonctionnelle
- **MVP défini** : 100% implémenté
- **Tests planifiés** : 120+ items documentés
- **Documentation** : Complète (6 fichiers)
- **Gestion erreurs** : Tous les cas couverts
### Maintenabilité
- **Modularité** : 3 modules indépendants
- **Commentaires** : Tous les fichiers commentés
- **Documentation code** : Fonctions documentées
- **Pas de dette technique** : Code clean
### Robustesse
- **Validation entrées** : Clamping systématique
- **Gestion erreurs** : Try/catch appropriés
- **Messages utilisateur** : Clairs et actionnables
- **Fallbacks** : Valeurs par défaut définies
## 🎓 Apprentissages
### Bonnes Pratiques GNOME Shell
- Utilisation correcte de GObject.registerClass
- Imports ESM modernes (import/export)
- Lifecycle extension proper (enable/disable)
- Intégration GSettings standard
### Gestion Linux
- Règles udev pour permissions
- Interface sysfs kernel
- Groupes système
- Persistance via GSettings
### Architecture
- Séparation responsabilités (UI/Backend/Extension)
- Patterns de debouncing
- Gestion d'état avec settings
- Messages d'erreur UX
## 📚 Ressources Utilisées
### Documentation GNOME
- GNOME Shell Extensions: https://gjs.guide/extensions/
- GSettings: https://docs.gtk.org/gio/class.Settings.html
- St (Shell Toolkit): GNOME Shell source code
### Kernel Linux
- sysfs LED interface: `/sys/class/leds/`
- asus-nb-wmi driver documentation
### Outils
- gjs (GNOME JavaScript)
- glib-compile-schemas
- journalctl (debugging)
## ✅ Checklist Complétude MVP
-**Fonctionnalités core** : Toutes implémentées
-**Interface utilisateur** : Complète et fonctionnelle
-**Persistance** : GSettings configuré
-**Gestion erreurs** : Hardware + Permissions
-**Documentation** : 6 fichiers complets
-**Installation** : Script automatique
-**Tests** : Checklist 120+ items
-**Code qualité** : Commenté, modulaire, propre
-**Tests réels** : À effectuer sur matériel
## 🎉 Conclusion
Le projet **GNOME Shell Extension - ASUS Keyboard RGB Control** est **complet au niveau MVP** et prêt pour les tests sur matériel réel.
### Points Forts
- Architecture propre et modulaire
- Documentation exhaustive
- Gestion d'erreurs complète
- Installation simplifiée
- Code maintenable
### Prochaine Étape Critique
**Tester sur l'ASUS TUF Gaming A16 FA608UH** avec Debian 13 et GNOME 48.
Une fois les tests validés, l'extension pourra être :
1. Publiée sur extensions.gnome.org
2. Partagée avec la communauté ASUS Linux
3. Améliorée avec les fonctionnalités post-MVP
---
**Développé avec Claude Code - 2025-12-20**

View File

@@ -0,0 +1,154 @@
# Fix Permissions udev - ASUS Keyboard RGB
## Problème Initial
La règle udev simple ne fonctionnait pas :
```bash
SUBSYSTEM=="leds", KERNEL=="asus::kbd_backlight", GROUP="kbdled", MODE="0660"
```
**Symptôme** : Les permissions restaient à `root:root` même après rechargement udev et redémarrage.
## Diagnostic
```bash
udevadm test /sys/class/leds/asus::kbd_backlight 2>&1 | grep -E "(GROUP|MODE|kbdled)"
```
Résultat vide → La règle n'était pas déclenchée.
## Solution Fonctionnelle
### Règle udev Corrigée
```bash
sudo tee /etc/udev/rules.d/99-asus-kbd.rules > /dev/null << 'EOF'
ACTION=="add", SUBSYSTEM=="leds", KERNEL=="asus::kbd_backlight", TAG+="uaccess", RUN+="/bin/sh -c 'chgrp kbdled /sys/class/leds/asus::kbd_backlight/brightness && chmod g+w /sys/class/leds/asus::kbd_backlight/brightness'"
ACTION=="add", SUBSYSTEM=="leds", KERNEL=="asus::kbd_backlight", TAG+="uaccess", RUN+="/bin/sh -c 'chgrp kbdled /sys/class/leds/asus::kbd_backlight/kbd_rgb_mode && chmod g+w /sys/class/leds/asus::kbd_backlight/kbd_rgb_mode'"
EOF
```
### Pourquoi Ça Fonctionne
1. **`ACTION=="add"`** : La règle se déclenche uniquement lors de l'événement "add" (ajout du device)
2. **`TAG+="uaccess"`** : Ajoute un tag pour l'accès utilisateur
3. **`RUN+=`** : Exécute une commande shell directement
4. **`/bin/sh -c '...'`** : Lance un shell pour exécuter plusieurs commandes
5. **`chgrp kbdled`** : Change le groupe du fichier
6. **`chmod g+w`** : Ajoute les permissions d'écriture pour le groupe
### Application de la Règle
Après avoir créé la règle, il faut déclencher l'événement "add" :
```bash
# Recharger les règles udev
sudo udevadm control --reload-rules
# Retirer le module kernel
sudo modprobe -r asus_nb_wmi
# Réinsérer le module (déclenche l'événement "add")
sudo modprobe asus_nb_wmi
# Attendre que le module se charge
sleep 2
```
### Vérification
```bash
ls -l /sys/class/leds/asus::kbd_backlight/brightness
ls -l /sys/class/leds/asus::kbd_backlight/kbd_rgb_mode
```
**Résultat attendu :**
```
-rw-rw-r-- 1 root kbdled 4096 ... brightness
--w--w---- 1 root kbdled 4096 ... kbd_rgb_mode
```
### Test Fonctionnel
```bash
# Test brightness
echo 3 > /sys/class/leds/asus::kbd_backlight/brightness
# Test RGB (orange)
echo "1 0 255 165 0 0" > /sys/class/leds/asus::kbd_backlight/kbd_rgb_mode
```
**Aucune erreur "Permission denied" ne doit apparaître.**
## Matériel Testé
- **Modèle** : ASUS TUF Gaming A16 FA608UH
- **OS** : Debian GNU/Linux 13 (trixie)
- **Kernel** : 6.12.x
- **Module** : `asus_nb_wmi`
## Fichiers Concernés
### sysfs
```
/sys/class/leds/asus::kbd_backlight/
├── brightness (contrôle intensité 0-3)
└── kbd_rgb_mode (contrôle RGB, format "1 0 R G B 0")
```
### udev
```
/etc/udev/rules.d/99-asus-kbd.rules
```
### Groupe système
```
/etc/group (ligne kbdled)
```
## Alternative : Service systemd
Si la règle udev ne fonctionne toujours pas (rare), on peut utiliser un service systemd :
```bash
# Script
sudo tee /usr/local/bin/asus-kbd-permissions.sh > /dev/null << 'EOF'
#!/bin/bash
sleep 2
chgrp kbdled /sys/class/leds/asus::kbd_backlight/brightness 2>/dev/null
chmod 0660 /sys/class/leds/asus::kbd_backlight/brightness 2>/dev/null
chgrp kbdled /sys/class/leds/asus::kbd_backlight/kbd_rgb_mode 2>/dev/null
chmod 0660 /sys/class/leds/asus::kbd_backlight/kbd_rgb_mode 2>/dev/null
EOF
sudo chmod +x /usr/local/bin/asus-kbd-permissions.sh
# Service
sudo tee /etc/systemd/system/asus-kbd-permissions.service > /dev/null << 'EOF'
[Unit]
Description=ASUS Keyboard RGB Permissions
After=multi-user.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/asus-kbd-permissions.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable asus-kbd-permissions.service
sudo systemctl start asus-kbd-permissions.service
```
## Références
- **udev manual** : `man 7 udev`
- **Module kernel** : Documentation du driver `asus-nb-wmi`
- **Tests réalisés** : 2025-12-20
---
**Note** : Ce fix est intégré dans la documentation officielle ([docs/INSTALL.md](INSTALL.md)) et dans le script d'installation ([tools/install-local.sh](../tools/install-local.sh)).

227
docs/INSTALL.md Normal file
View File

@@ -0,0 +1,227 @@
# Guide d'Installation - Extension ASUS Keyboard RGB
Ce guide vous explique comment installer et configurer l'extension GNOME Shell pour contrôler le rétroéclairage RGB de votre clavier ASUS.
## Prérequis
### Système
- **OS**: Debian GNU/Linux 13 (trixie) ou distribution compatible
- **GNOME Shell**: Version 48
- **Matériel**: Clavier ASUS avec support RGB via `asus-nb-wmi`
### Vérification du support matériel
Avant l'installation, vérifiez que votre clavier est supporté :
```bash
# Vérifier la présence des fichiers sysfs
ls -la /sys/class/leds/asus::kbd_backlight/
```
Vous devriez voir les fichiers suivants :
- `brightness` - Intensité du rétroéclairage
- `max_brightness` - Valeur maximale d'intensité
- `kbd_rgb_mode` - Contrôle des couleurs RGB
Si ces fichiers n'existent pas, votre matériel n'est pas supporté par cette extension.
## Étape 1 : Configuration des permissions
L'extension nécessite des droits d'écriture sur les fichiers sysfs. La méthode recommandée utilise les règles udev.
### 1.1 Créer une règle udev
Créez le fichier `/etc/udev/rules.d/99-asus-kbd.rules` avec la règle qui fonctionne :
```bash
sudo tee /etc/udev/rules.d/99-asus-kbd.rules > /dev/null << 'EOF'
ACTION=="add", SUBSYSTEM=="leds", KERNEL=="asus::kbd_backlight", TAG+="uaccess", RUN+="/bin/sh -c 'chgrp kbdled /sys/class/leds/asus::kbd_backlight/brightness && chmod g+w /sys/class/leds/asus::kbd_backlight/brightness'"
ACTION=="add", SUBSYSTEM=="leds", KERNEL=="asus::kbd_backlight", TAG+="uaccess", RUN+="/bin/sh -c 'chgrp kbdled /sys/class/leds/asus::kbd_backlight/kbd_rgb_mode && chmod g+w /sys/class/leds/asus::kbd_backlight/kbd_rgb_mode'"
EOF
```
Cette règle s'exécute lors de l'ajout du device et applique directement les bonnes permissions.
### 1.2 Créer le groupe kbdled
```bash
sudo groupadd -f kbdled
```
### 1.3 Ajouter votre utilisateur au groupe
```bash
sudo usermod -aG kbdled $USER
```
### 1.4 Recharger les règles udev et appliquer les permissions
```bash
# Recharger les règles udev
sudo udevadm control --reload-rules
# Retirer et réinsérer le module pour déclencher l'événement "add"
sudo modprobe -r asus_nb_wmi
sudo modprobe asus_nb_wmi
# Attendre 2 secondes que le module se charge
sleep 2
```
### 1.5 Déconnexion / Reconnexion
**Important**: Vous devez vous déconnecter et vous reconnecter pour que l'appartenance au groupe soit prise en compte.
```bash
# Vérifier l'appartenance au groupe après reconnexion
groups | grep kbdled
```
### 1.5 Vérifier les permissions
Vérifiez que les permissions ont été appliquées correctement :
```bash
ls -l /sys/class/leds/asus::kbd_backlight/brightness
ls -l /sys/class/leds/asus::kbd_backlight/kbd_rgb_mode
```
**Résultat attendu :**
```
-rw-rw-r-- 1 root kbdled ... brightness
--w--w---- 1 root kbdled ... kbd_rgb_mode
```
Le groupe doit être `kbdled` (et non `root`).
### 1.6 Test d'écriture
Testez que vous pouvez contrôler le clavier :
```bash
# Test intensité niveau 3 (maximum)
echo 3 > /sys/class/leds/asus::kbd_backlight/brightness
# → Le rétroéclairage doit passer au maximum
# Test intensité niveau 1 (faible)
echo 1 > /sys/class/leds/asus::kbd_backlight/brightness
# → Le rétroéclairage doit diminuer
# Test couleur RGB (orange)
echo "1 0 255 165 0 0" > /sys/class/leds/asus::kbd_backlight/kbd_rgb_mode
# → Le clavier doit devenir orange
# Test couleur RGB (rouge)
echo "1 0 255 0 0 0" > /sys/class/leds/asus::kbd_backlight/kbd_rgb_mode
# → Le clavier doit devenir rouge
```
**Si aucune erreur "Permission denied" n'apparaît et que votre clavier change de couleur/intensité, c'est parfait !**
## Étape 2 : Installation de l'extension
### 2.1 Cloner le dépôt
```bash
cd ~/Documents
git clone https://github.com/gilles/gnome-asus-kbd-rgb.git
cd gnome-asus-kbd-rgb
```
### 2.2 Compiler le schéma GSettings
```bash
cd extension/schemas
glib-compile-schemas .
cd ../..
```
### 2.3 Installation automatique
Utilisez le script fourni :
```bash
./tools/install-local.sh
```
### 2.4 Installation manuelle (alternative)
Si vous préférez installer manuellement :
```bash
# Créer le dossier de destination
mkdir -p ~/.local/share/gnome-shell/extensions/asus-kbd-rgb@gilles
# Copier les fichiers
cp -r extension/* ~/.local/share/gnome-shell/extensions/asus-kbd-rgb@gilles/
# Compiler le schéma dans le dossier d'installation
glib-compile-schemas ~/.local/share/gnome-shell/extensions/asus-kbd-rgb@gilles/schemas/
```
## Étape 3 : Activation de l'extension
### 3.1 Recharger GNOME Shell
**Sur X11** :
- Appuyez sur `Alt+F2`
- Tapez `r`
- Appuyez sur Entrée
**Sur Wayland** :
- Déconnectez-vous et reconnectez-vous
### 3.2 Activer l'extension
Via l'application Extensions :
```bash
gnome-extensions enable asus-kbd-rgb@gilles
```
Ou via l'interface graphique :
1. Ouvrez l'application "Extensions"
2. Recherchez "ASUS Keyboard RGB Control"
3. Activez le bouton
### 3.3 Vérification
Vous devriez voir une icône de clavier dans la barre supérieure de GNOME Shell (à droite). Cliquez dessus pour ouvrir le menu de contrôle.
## Étape 4 : Vérification des logs
Si l'extension ne s'affiche pas ou ne fonctionne pas :
```bash
# Voir les logs en temps réel
journalctl -f -o cat /usr/bin/gnome-shell
# Ou voir les dernières erreurs
journalctl -xe | grep -i asus
```
## Désinstallation
Pour désinstaller l'extension :
```bash
# Désactiver
gnome-extensions disable asus-kbd-rgb@gilles
# Supprimer
rm -rf ~/.local/share/gnome-shell/extensions/asus-kbd-rgb@gilles
# Optionnel : supprimer le groupe et la règle udev
sudo deluser $USER kbdled
sudo rm /etc/udev/rules.d/99-asus-kbd.rules
sudo udevadm control --reload-rules
```
## Dépannage
Si vous rencontrez des problèmes, consultez le fichier [TROUBLESHOOTING.md](TROUBLESHOOTING.md).
## Support
- **Issues**: https://github.com/gilles/gnome-asus-kbd-rgb/issues
- **Documentation**: Voir les autres fichiers du dossier `docs/`

324
docs/TESTING.md Normal file
View File

@@ -0,0 +1,324 @@
# Checklist de Tests - Extension ASUS Keyboard RGB
Ce document fournit une checklist complète pour tester l'extension avant publication ou après modification.
## Prérequis pour les tests
- [ ] GNOME Shell 48 installé
- [ ] Matériel ASUS avec clavier RGB supporté
- [ ] Règles udev configurées (groupe `kbdled`)
- [ ] Utilisateur membre du groupe `kbdled` (après déconnexion/reconnexion)
## 1. Installation
### 1.1 Installation initiale
- [ ] Le script `./tools/install-local.sh` s'exécute sans erreur
- [ ] Les fichiers sont copiés dans `~/.local/share/gnome-shell/extensions/asus-kbd-rgb@gilles/`
- [ ] Le schéma GSettings est compilé (`gschemas.compiled` existe)
- [ ] L'extension apparaît dans `gnome-extensions list`
### 1.2 Activation
- [ ] La commande `gnome-extensions enable asus-kbd-rgb@gilles` fonctionne
- [ ] Aucune erreur dans `journalctl -f -o cat /usr/bin/gnome-shell`
- [ ] L'icône de clavier apparaît dans la barre supérieure (après rechargement)
## 2. Interface Utilisateur
### 2.1 Icône et menu
- [ ] L'icône `keyboard-brightness-symbolic` est visible dans le panneau
- [ ] Clic sur l'icône ouvre le popover
- [ ] Le popover affiche le titre "Rétroéclairage Clavier ASUS"
- [ ] Le menu est bien formaté et lisible
### 2.2 Section Intensité
- [ ] Les 4 boutons d'intensité sont visibles (OFF, 1, 2, 3)
- [ ] Clic sur "OFF" éteint le rétroéclairage
- [ ] Clic sur "1" met l'intensité à faible
- [ ] Clic sur "2" met l'intensité à moyenne
- [ ] Clic sur "3" met l'intensité à forte (max)
- [ ] Le bouton actif est surligné visuellement
- [ ] Un seul bouton est actif à la fois
### 2.3 Section Sliders RGB
- [ ] Le slider Rouge fonctionne et affiche la valeur (0-255)
- [ ] Le slider Vert fonctionne et affiche la valeur (0-255)
- [ ] Le slider Bleu fonctionne et affiche la valeur (0-255)
- [ ] Le slider Master fonctionne et affiche la valeur (0-100)
- [ ] Déplacer un slider met à jour la valeur numérique en temps réel
- [ ] Les sliders sont fluides (pas de lag visible)
### 2.4 Ligne d'information
- [ ] La ligne d'info affiche `RGB=(r,g,b)` correctement
- [ ] Le code HEX `#RRGGBB` est correct
- [ ] L'intensité `Intensité=n/3` est correcte
- [ ] Les valeurs se mettent à jour après changement de slider
- [ ] Les valeurs se mettent à jour après clic sur preset
- [ ] Les valeurs se mettent à jour après changement d'intensité
### 2.5 Section Presets
- [ ] 6 boutons de preset sont visibles
- [ ] Les couleurs de fond correspondent aux presets :
- Preset 1 : Orange (#FFA500)
- Preset 2 : Rouge (#FF0000)
- Preset 3 : Vert (#00FF00)
- Preset 4 : Bleu (#0000FF)
- Preset 5 : Blanc (#FFFFFF)
- Preset 6 : Cyan (#00FFFF)
- [ ] Clic sur un preset applique la couleur immédiatement
- [ ] Les sliders RGB se mettent à jour après clic sur preset
- [ ] La ligne d'info se met à jour après clic sur preset
## 3. Fonctionnalités Backend
### 3.1 Écriture brightness
- [ ] Passage de OFF (0) à 1 allume le clavier
- [ ] Passage de 1 à 2 augmente la luminosité
- [ ] Passage de 2 à 3 augmente encore la luminosité
- [ ] Passage de 3 à OFF éteint le clavier
- [ ] Les valeurs sont écrites correctement dans `/sys/class/leds/asus::kbd_backlight/brightness`
### 3.2 Écriture RGB
- [ ] Changement de Rouge modifie la couleur du clavier
- [ ] Changement de Vert modifie la couleur du clavier
- [ ] Changement de Bleu modifie la couleur du clavier
- [ ] Les valeurs RGB sont clampées (0-255)
- [ ] Format dans `kbd_rgb_mode` est correct : `1 0 R G B 0\n`
### 3.3 Master Gain
- [ ] Master à 100% : couleurs normales
- [ ] Master à 50% : couleurs à mi-intensité
- [ ] Master à 0% : noir (aucune couleur visible)
- [ ] Master à 75% : couleurs proportionnellement réduites
- [ ] Le gain est appliqué à toutes les composantes RGB
### 3.4 Debouncing
- [ ] Déplacer rapidement un slider ne spam pas sysfs (vérifier logs)
- [ ] Il y a un délai de ~75ms entre les écritures
- [ ] La dernière valeur est bien appliquée après l'arrêt du slider
- [ ] Aucun message d'erreur de permission dû au spam
### 3.5 Comportement brightness=0
- [ ] Si brightness=0, changement RGB ne modifie pas le clavier (reste éteint)
- [ ] Les valeurs RGB sont mémorisées dans GSettings
- [ ] Passage de brightness 0→1 restaure la dernière couleur RGB
- [ ] Aucun message d'erreur lors du changement RGB avec brightness=0
## 4. Persistance (GSettings)
### 4.1 Sauvegarde
- [ ] Changer Rouge, fermer le menu, rouvrir → valeur conservée
- [ ] Changer Vert, fermer le menu, rouvrir → valeur conservée
- [ ] Changer Bleu, fermer le menu, rouvrir → valeur conservée
- [ ] Changer Master, fermer le menu, rouvrir → valeur conservée
- [ ] Changer Brightness, fermer le menu, rouvrir → valeur conservée
- [ ] Appliquer un preset, fermer le menu, rouvrir → preset appliqué
### 4.2 Restauration au démarrage
- [ ] Configurer RGB (ex: rouge pur), brightness à 2
- [ ] Fermer la session, se reconnecter
- [ ] L'extension restaure automatiquement RGB rouge et brightness 2
- [ ] Le clavier affiche la bonne couleur dès le démarrage
- [ ] Les sliders affichent les bonnes valeurs
### 4.3 Commandes GSettings manuelles
```bash
# Tester la lecture
gsettings get org.gnome.shell.extensions.asuskbdrgb red
gsettings get org.gnome.shell.extensions.asuskbdrgb green
gsettings get org.gnome.shell.extensions.asuskbdrgb blue
gsettings get org.gnome.shell.extensions.asuskbdrgb master-gain
gsettings get org.gnome.shell.extensions.asuskbdrgb brightness-level
```
- [ ] Les commandes retournent les bonnes valeurs
- [ ] Modifier via `gsettings set`, rouvrir le menu → nouvelle valeur affichée
## 5. Gestion des Erreurs
### 5.1 Matériel non supporté
Tester sur une machine sans clavier ASUS :
- [ ] L'extension charge sans crash
- [ ] Le popover affiche "❌ Matériel non supporté"
- [ ] Message clair : "Aucun clavier ASUS RGB détecté"
- [ ] Pas de sliders ni boutons (seulement le message d'erreur)
### 5.2 Permissions insuffisantes
Tester sans règles udev (ou retirer l'utilisateur du groupe `kbdled`) :
- [ ] L'extension charge sans crash
- [ ] Le popover affiche "⚠️ Permissions insuffisantes"
- [ ] Message clair avec référence à `docs/INSTALL.md`
- [ ] Pas de tentative d'écriture sysfs (pas d'erreur dans logs)
### 5.3 Valeurs invalides
- [ ] Entrer une valeur RGB > 255 → clampée à 255
- [ ] Entrer une valeur RGB < 0 → clampée à 0
- [ ] Entrer une valeur Master > 100 → clampée à 100
- [ ] Entrer une valeur Master < 0 → clampée à 0
- [ ] Brightness > 3 → clampée à 3
## 6. Logs et Debug
### 6.1 Logs au démarrage
```bash
journalctl -f -o cat /usr/bin/gnome-shell | grep -i asus
```
- [ ] Message "Activation de l'extension ASUS Keyboard RGB"
- [ ] Message "Extension ASUS Keyboard RGB activée avec succès"
- [ ] Aucune erreur JavaScript
### 6.2 Logs pendant l'utilisation
- [ ] Changement RGB affiche "RGB mis à (r, g, b) [master: X%]"
- [ ] Changement brightness affiche "Brightness mise à N (valeur)"
- [ ] Aucune erreur "Permission denied"
- [ ] Aucun spam (grâce au debouncing)
### 6.3 Logs à la désactivation
```bash
gnome-extensions disable asus-kbd-rgb@gilles
```
- [ ] Message "Désactivation de l'extension ASUS Keyboard RGB"
- [ ] Message "Extension ASUS Keyboard RGB désactivée"
- [ ] Aucune erreur de nettoyage
## 7. Robustesse
### 7.1 Rechargement GNOME Shell
- [ ] Alt+F2, `r` → l'extension se recharge correctement (X11)
- [ ] Logout/login → l'extension se recharge correctement (Wayland)
- [ ] État restauré après rechargement
### 7.2 Désactivation/Réactivation
```bash
gnome-extensions disable asus-kbd-rgb@gilles
gnome-extensions enable asus-kbd-rgb@gilles
```
- [ ] Pas d'erreur lors de la désactivation
- [ ] Pas d'erreur lors de la réactivation
- [ ] L'icône réapparaît
- [ ] Fonctionnalités intactes
### 7.3 Utilisation intensive
- [ ] Déplacer rapidement tous les sliders pendant 30 secondes
- [ ] Cliquer rapidement sur tous les boutons
- [ ] Alterner rapidement entre presets
- [ ] Aucun crash
- [ ] Aucune fuite mémoire visible
- [ ] Performances stables
## 8. Compatibilité
### 8.1 GNOME Shell 48
- [ ] Extension fonctionne sur GNOME 48.0
- [ ] Extension fonctionne sur GNOME 48.x (dernière version)
### 8.2 Debian 13 (Trixie)
- [ ] Installation réussie
- [ ] Toutes les fonctionnalités opérationnelles
- [ ] Aucun conflit de packages
## 9. Documentation
- [ ] README.md est à jour
- [ ] INSTALL.md couvre tous les cas
- [ ] TROUBLESHOOTING.md aide à résoudre les problèmes courants
- [ ] CLAUDE.md guide correctement les futures instances
- [ ] CHANGELOG.md est à jour
- [ ] UI_SCHEMA.md correspond à l'implémentation
## 10. Code Quality
### 10.1 Linting JavaScript
```bash
# Si eslint est disponible
eslint extension/*.js
```
- [ ] Aucune erreur de syntaxe
- [ ] Pas d'imports manquants
- [ ] Variables non utilisées supprimées
### 10.2 Revue de code
- [ ] Commentaires en français présents et clairs
- [ ] Fonctions documentées
- [ ] Code modulaire et lisible
- [ ] Pas de code mort (dead code)
- [ ] Gestion d'erreurs présente
## Résumé des Tests
**Total des tests** : ~120 items
### Statut Critique (Bloquant si échec)
- Installation et activation
- Détection matériel et permissions
- Fonctionnalités core (brightness, RGB, presets)
- Persistance GSettings
- Pas de crash
### Statut Important (À corriger rapidement)
- UI correcte et responsive
- Debouncing fonctionnel
- Messages d'erreur clairs
- Logs appropriés
### Statut Nice-to-have (Améliorations)
- Performance optimale
- Style CSS parfait
- Documentation exhaustive
---
## Rapport de Test
Compléter après les tests :
**Date** : _______________
**Testeur** : _______________
**GNOME Shell version** : _______________
**Matériel** : _______________
**Tests réussis** : ______ / 120
**Tests échoués** : ______
**Bugs trouvés** :
-
-
**Notes** :

445
docs/TROUBLESHOOTING.md Normal file
View File

@@ -0,0 +1,445 @@
# Guide de Dépannage - Extension ASUS Keyboard RGB
Ce document vous aide à résoudre les problèmes courants avec l'extension GNOME Shell ASUS Keyboard RGB.
## Table des matières
1. [L'extension ne s'affiche pas](#lextension-ne-saffiche-pas)
2. [Message "Permissions insuffisantes"](#message-permissions-insuffisantes)
3. [Message "Matériel non supporté"](#message-matériel-non-supporté)
4. [Les sliders ne fonctionnent pas](#les-sliders-ne-fonctionnent-pas)
5. [La couleur ne change pas](#la-couleur-ne-change-pas)
6. [Les paramètres ne sont pas sauvegardés](#les-paramètres-ne-sont-pas-sauvegardés)
7. [Erreurs dans les logs](#erreurs-dans-les-logs)
8. [L'extension se désactive automatiquement](#lextension-se-désactive-automatiquement)
---
## L'extension ne s'affiche pas
### Symptômes
- L'icône de clavier n'apparaît pas dans la barre supérieure
- L'extension est activée mais rien ne se passe
### Solutions
#### 1. Vérifier que l'extension est activée
```bash
gnome-extensions list
gnome-extensions info asus-kbd-rgb@gilles
```
Si elle n'apparaît pas :
```bash
gnome-extensions enable asus-kbd-rgb@gilles
```
#### 2. Vérifier l'installation
```bash
ls -la ~/.local/share/gnome-shell/extensions/asus-kbd-rgb@gilles/
```
Fichiers requis :
- `extension.js`
- `ui.js`
- `backend.js`
- `metadata.json`
- `schemas/org.gnome.shell.extensions.asuskbdrgb.gschema.xml`
- `schemas/gschemas.compiled`
#### 3. Recompiler le schéma GSettings
```bash
cd ~/.local/share/gnome-shell/extensions/asus-kbd-rgb@gilles/schemas/
glib-compile-schemas .
```
#### 4. Recharger GNOME Shell
**X11** : `Alt+F2`, tapez `r`, Entrée
**Wayland** : Déconnexion/Reconnexion
#### 5. Vérifier les logs
```bash
journalctl -f -o cat /usr/bin/gnome-shell | grep -i asus
```
---
## Message "Permissions insuffisantes"
### Symptômes
- Le menu affiche "⚠️ Permissions insuffisantes"
- Message : "Impossible d'accéder au rétroéclairage"
### Cause
L'utilisateur n'a pas les droits d'écriture sur les fichiers sysfs.
### Solutions
#### 1. Vérifier la règle udev
```bash
cat /etc/udev/rules.d/99-asus-kbd.rules
```
Devrait contenir :
```
SUBSYSTEM=="leds", KERNEL=="asus::kbd_backlight", GROUP="kbdled", MODE="0660"
```
Si le fichier n'existe pas, créez-le :
```bash
echo 'SUBSYSTEM=="leds", KERNEL=="asus::kbd_backlight", GROUP="kbdled", MODE="0660"' | sudo tee /etc/udev/rules.d/99-asus-kbd.rules
```
#### 2. Vérifier le groupe kbdled
```bash
getent group kbdled
```
Si le groupe n'existe pas :
```bash
sudo groupadd -f kbdled
```
#### 3. Vérifier l'appartenance au groupe
```bash
groups | grep kbdled
```
Si vous n'êtes pas dans le groupe :
```bash
sudo usermod -aG kbdled $USER
```
**Important** : Déconnexion/Reconnexion requise !
#### 4. Recharger udev
```bash
sudo udevadm control --reload-rules
sudo udevadm trigger
```
#### 5. Vérifier les permissions finales
```bash
ls -l /sys/class/leds/asus::kbd_backlight/brightness
# Devrait afficher : -rw-rw---- 1 root kbdled
```
Test d'écriture :
```bash
echo 2 > /sys/class/leds/asus::kbd_backlight/brightness
```
Si erreur "Permission denied", vérifiez que vous êtes bien déconnecté/reconnecté.
---
## Message "Matériel non supporté"
### Symptômes
- Le menu affiche "❌ Matériel non supporté"
- Message : "Aucun clavier ASUS RGB détecté"
### Cause
Le kernel ne détecte pas le clavier ASUS ou le module `asus-nb-wmi` n'est pas chargé.
### Solutions
#### 1. Vérifier les fichiers sysfs
```bash
ls -la /sys/class/leds/ | grep asus
```
Devrait afficher `asus::kbd_backlight`
Si absent :
```bash
ls -la /sys/class/leds/
```
Cherchez un dossier similaire pour votre clavier.
#### 2. Vérifier le module kernel
```bash
lsmod | grep asus
```
Devrait afficher `asus_nb_wmi` ou `asus_wmi`
Si absent, charger le module :
```bash
sudo modprobe asus-nb-wmi
```
#### 3. Vérifier le matériel
```bash
sudo dmesg | grep -i asus
sudo dmesg | grep -i keyboard
```
Cherchez des messages indiquant la détection du clavier.
#### 4. Vérifier dans le BIOS
Certains ordinateurs ASUS permettent de désactiver le rétroéclairage RGB dans le BIOS. Vérifiez les options "Keyboard Backlight" ou "RGB Lighting".
---
## Les sliders ne fonctionnent pas
### Symptômes
- Les sliders bougent mais la couleur ne change pas
- Pas de feedback visuel
### Solutions
#### 1. Vérifier la brightness
Si la brightness est à 0 (OFF), les changements RGB sont mémorisés mais non appliqués. Augmentez d'abord la brightness.
#### 2. Vérifier les logs
```bash
journalctl -f -o cat /usr/bin/gnome-shell | grep RGB
```
Vous devriez voir des messages comme :
```
RGB mis à (255, 165, 0) [master: 100%]
```
#### 3. Tester manuellement
```bash
# Test RGB rouge
echo "1 0 255 0 0 0" > /sys/class/leds/asus::kbd_backlight/kbd_rgb_mode
```
Si cela ne fonctionne pas, le problème est au niveau matériel/kernel, pas de l'extension.
---
## La couleur ne change pas
### Symptômes
- Les sliders fonctionnent mais la couleur reste la même
### Solutions
#### 1. Vérifier le master slider
Si le master slider est à 0%, toutes les couleurs seront noires. Augmentez-le à 100%.
#### 2. Vérifier la valeur brightness
```bash
cat /sys/class/leds/asus::kbd_backlight/brightness
```
Si c'est 0, la couleur ne s'affichera pas.
#### 3. Redémarrer l'extension
```bash
gnome-extensions disable asus-kbd-rgb@gilles
gnome-extensions enable asus-kbd-rgb@gilles
```
Puis recharger GNOME Shell (Alt+F2, r).
---
## Les paramètres ne sont pas sauvegardés
### Symptômes
- À chaque redémarrage, les couleurs reviennent aux valeurs par défaut
### Solutions
#### 1. Vérifier GSettings
```bash
gsettings list-schemas | grep asuskbdrgb
```
Devrait afficher : `org.gnome.shell.extensions.asuskbdrgb`
#### 2. Vérifier les valeurs stockées
```bash
gsettings get org.gnome.shell.extensions.asuskbdrgb red
gsettings get org.gnome.shell.extensions.asuskbdrgb green
gsettings get org.gnome.shell.extensions.asuskbdrgb blue
```
#### 3. Définir manuellement
```bash
gsettings set org.gnome.shell.extensions.asuskbdrgb red 255
gsettings set org.gnome.shell.extensions.asuskbdrgb green 165
gsettings set org.gnome.shell.extensions.asuskbdrgb blue 0
```
#### 4. Recompiler le schéma
```bash
cd ~/.local/share/gnome-shell/extensions/asus-kbd-rgb@gilles/schemas/
glib-compile-schemas .
```
---
## Erreurs dans les logs
### Comment voir les logs
```bash
# Logs en temps réel
journalctl -f -o cat /usr/bin/gnome-shell
# Dernières erreurs
journalctl -xe | grep -E "(error|Error|ERROR)"
```
### Erreurs courantes
#### "Extension asus-kbd-rgb@gilles had error: ..."
Réinstaller l'extension :
```bash
./tools/install-local.sh
```
#### "Failed to load schema org.gnome.shell.extensions.asuskbdrgb"
Recompiler le schéma GSettings (voir ci-dessus).
#### "Permission denied" dans les logs
Problème de permissions (voir section correspondante).
---
## L'extension se désactive automatiquement
### Symptômes
- L'extension s'active puis se désactive immédiatement
- Ou se désactive après un certain temps
### Solutions
#### 1. Vérifier la compatibilité
```bash
gnome-shell --version
```
Doit afficher : `GNOME Shell 48.x`
Si version différente, modifier `metadata.json` :
```json
"shell-version": [
"48",
"47" // Ajouter votre version
]
```
#### 2. Vérifier les erreurs JavaScript
```bash
journalctl -f -o cat /usr/bin/gnome-shell | grep -i "syntax\|error"
```
#### 3. Mode debug
Activer avec verbose logging :
```bash
gnome-extensions enable asus-kbd-rgb@gilles
journalctl -f /usr/bin/gnome-shell
```
---
## Obtenir de l'aide
Si aucune solution ne fonctionne :
1. **Collecter les informations de debug** :
```bash
# Créer un fichier de debug
{
echo "=== System Info ==="
uname -a
gnome-shell --version
echo -e "\n=== Hardware ==="
ls -la /sys/class/leds/asus::kbd_backlight/
echo -e "\n=== Permissions ==="
ls -l /sys/class/leds/asus::kbd_backlight/brightness
groups
echo -e "\n=== Extension Status ==="
gnome-extensions info asus-kbd-rgb@gilles
echo -e "\n=== GSettings ==="
gsettings list-recursively org.gnome.shell.extensions.asuskbdrgb
echo -e "\n=== Recent Logs ==="
journalctl -xe --no-pager | grep -i asus | tail -20
} > ~/asus-kbd-rgb-debug.txt
```
2. **Ouvrir une issue** sur GitHub avec le fichier `asus-kbd-rgb-debug.txt`
3. **Forum GNOME** : https://discourse.gnome.org/
---
## Réinstallation complète
Si tout échoue, réinstallation complète :
```bash
# 1. Désactiver et supprimer
gnome-extensions disable asus-kbd-rgb@gilles
rm -rf ~/.local/share/gnome-shell/extensions/asus-kbd-rgb@gilles
# 2. Nettoyer GSettings
gsettings reset-recursively org.gnome.shell.extensions.asuskbdrgb
# 3. Réinstaller
cd ~/Documents/gnome-asus-kbd-rgb
./tools/install-local.sh
# 4. Recharger GNOME Shell
# X11: Alt+F2, r
# Wayland: logout/login
# 5. Réactiver
gnome-extensions enable asus-kbd-rgb@gilles
```

170
docs/UI_SCHEMA.md Normal file
View File

@@ -0,0 +1,170 @@
# Schéma de l'Interface Utilisateur
## Vue d'ensemble
L'extension ajoute une icône dans la barre supérieure de GNOME Shell. Au clic, un popover s'affiche avec tous les contrôles.
## Diagramme Mermaid - Architecture UI
```mermaid
graph TD
A[Top Bar GNOME Shell] --> B[Panel Button avec icône clavier]
B -->|Clic| C[Popover Menu]
C --> D[Section Intensité]
C --> E[Section Sliders RGB]
C --> F[Section Info]
C --> G[Section Presets]
D --> D1[Bouton OFF]
D --> D2[Bouton Faible]
D --> D3[Bouton Moyen]
D --> D4[Bouton Fort]
E --> E1[Slider Rouge 0-255]
E --> E2[Slider Vert 0-255]
E --> E3[Slider Bleu 0-255]
E --> E4[Slider Master 0-100%]
F --> F1[Label RGB=r,g,b]
F --> F2[Label HEX=#RRGGBB]
F --> F3[Label Intensity=n/max]
G --> G1[Preset 1: Orange]
G --> G2[Preset 2: Rouge]
G --> G3[Preset 3: Vert]
G --> G4[Preset 4: Bleu]
G --> G5[Preset 5: Blanc]
G --> G6[Preset 6: Cyan]
E1 -->|Change| H[Backend: Debounce]
E2 -->|Change| H
E3 -->|Change| H
E4 -->|Change| H
D1 -->|Click| H
D2 -->|Click| H
D3 -->|Click| H
D4 -->|Click| H
G1 -->|Click| H
G2 -->|Click| H
G3 -->|Click| H
G4 -->|Click| H
G5 -->|Click| H
G6 -->|Click| H
H --> I[Écriture sysfs]
I --> J[/sys/class/leds/asus::kbd_backlight/]
H --> K[Sauvegarde GSettings]
```
## Layout ASCII du Popover
```
┌─────────────────────────────────────────────────────┐
│ Rétroéclairage Clavier ASUS │
├─────────────────────────────────────────────────────┤
│ │
│ Intensité: │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ OFF │ │ 1 │ │ 2 │ │ 3 │ │
│ └─────┘ └─────┘ └─────┘ └─────┘ │
│ │
│ ┌────────────────────────────────────────────┐ │
│ │ Rouge ●─────────────────────○ 255 │ │
│ └────────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────────┐ │
│ │ Vert ●─────────────────────○ 255 │ │
│ └────────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────────┐ │
│ │ Bleu ●─────────────────────○ 255 │ │
│ └────────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────────┐ │
│ │ Master ●─────────────────────○ 100% │ │
│ └────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────┐ │
│ │ RGB=(255,165,0) #FFA500 Intensité=2/3 │ │
│ └────────────────────────────────────────────┘ │
│ │
│ Couleurs prédéfinies: │
│ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │
│ │ 🟠│ │🔴 │ │🟢 │ │🔵 │ │⚪ │ │🔵 │ │
│ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ │
│ │
└─────────────────────────────────────────────────────┘
```
## Flux de Données
```
Utilisateur → Slider/Bouton → Event Handler (ui.js)
Debounce Timer (50-100ms)
Backend.applyRGB() (backend.js)
Clamping + Master Gain
┌────────────────┴────────────────┐
↓ ↓
Écriture sysfs Sauvegarde GSettings
(kbd_rgb_mode, brightness) (persistance)
↓ ↓
Mise à jour matérielle Restauration au démarrage
```
## Composants GNOME Shell Utilisés
- **PanelMenu.Button** : Bouton dans la top bar
- **PopupMenu.PopupBaseMenuItem** : Items personnalisés dans le menu
- **St.BoxLayout** : Layout vertical/horizontal
- **St.Button** : Boutons d'intensité
- **Slider** : Sliders RGB et Master (API GNOME Shell)
- **St.Label** : Labels et texte d'information
- **St.Bin** : Containers pour les presets couleur
## Interactions Utilisateur
### Actions Immédiates (sans confirmation)
- Déplacer un slider RGB → Application immédiate avec debounce
- Cliquer sur un bouton d'intensité → Application immédiate
- Cliquer sur une couleur preset → Application immédiate
- Déplacer le slider Master → Ajuste R/G/B proportionnellement
### Feedback Visuel
- Slider actif → Curseur se déplace
- Bouton intensité actif → Surligné/highlighted
- Info line → Mise à jour en temps réel
- Preset cliqué → Feedback visuel temporaire
## Gestion des Erreurs UI
### Permission refusée
```
┌─────────────────────────────────────────────────────┐
│ ⚠️ Permissions insuffisantes │
│ │
│ Impossible d'accéder au rétroéclairage. │
│ Veuillez configurer les règles udev. │
│ │
│ Voir: docs/INSTALL.md │
└─────────────────────────────────────────────────────┘
```
### Matériel non supporté
```
┌─────────────────────────────────────────────────────┐
│ ❌ Matériel non supporté │
│ │
│ Aucun clavier ASUS RGB détecté sur ce système. │
└─────────────────────────────────────────────────────┘
```
## Notes d'Implémentation
1. **Debouncing**: Utiliser `GLib.timeout_add()` avec timeout de 75ms
2. **Master Slider**: Multiplier R/G/B par (master/100) avant écriture
3. **Presets**: Stocker dans GSettings, charger au démarrage
4. **Info Line**: Mettre à jour via callback après chaque changement
5. **Style**: Utiliser `stylesheet.css` pour personnalisation minimale

View File

@@ -0,0 +1,138 @@
# Synthèse — Mettre en place une roue chromatique (HSV) dans GNOME Shell 48
## Contexte
- GNOME Shell 48 (GJS) utilise **St/Clutter** (pas GTK dans le Shell).
- Il nexiste **pas** de composant natif « roue chromatique » (type `GtkColorChooser`) directement exploitable dans une extension GNOME Shell.
- Objectif : offrir une **roue HSV** pour choisir une couleur (H, S) + un contrôle d**intensité** (V), puis produire un RGB (0255) utilisable pour piloter un matériel (ex. clavier RGB).
---
## Options possibles (du plus recommandé au plus “hybride”)
### Option A — Roue HSV native GNOME Shell (recommandée)
**Principe**
- Créer un widget custom basé sur `Clutter.Canvas`.
- Dessiner une roue HSV (visualisation en V=1 pour lisibilité).
- Capturer les interactions souris :
- angle → **Hue (H)**
- rayon → **Saturation (S)**
- Ajouter un slider pour **Value (V)** (intensité).
- Convertir HSV → RGB (0255) et déclencher un callback.
**Avantages**
- 100% intégré au Shell (look & feel cohérent extension).
- Dépendances minimales (GJS uniquement).
- Utilisable dans un menu top-bar, Quick Settings, ou popup.
- Contrôle immédiat (idéal pour piloter des LED).
**Inconvénients**
- Code à maintenir (rendu + interaction).
- Optimisation possible nécessaire pour performance (cache image).
**Recommandation**
- Cest la meilleure solution pour une extension GNOME 48, surtout si lusage cible est le pilotage hardware RGB.
---
### Option B — Sliders RGB (solution la plus robuste)
**Principe**
- Ne pas faire de roue.
- 3 sliders `St.Slider` ou `PopupSliderMenuItem` :
- R (0255)
- G (0255)
- B (0255)
- Afficher un carré daperçu (preview) `St.Widget` dont la couleur suit les sliders.
**Avantages**
- Très simple, très stable, très maintenable.
- Exact pour piloter des LED (RGB natif).
- Peu de code, faible coût performance.
**Inconvénients**
- Moins intuitif quune roue HSV.
- Expérience utilisateur moins “graphique”.
**Recommandation**
- Excellent si priorité = fiabilité et précision LED.
- Peut être combiné avec la roue (Option A) pour affiner.
---
### Option C — Hybride : application GTK externe (GtkColorChooser) + DBus
**Principe**
- Créer une petite app GTK (hors Shell) utilisant `GtkColorChooser` (roue native GNOME).
- Lextension GNOME Shell lance lapp ou communique via DBus.
- Lapp renvoie la couleur choisie (RGB/HSV) à lextension.
**Avantages**
- UI GNOME native parfaite (roue GTK).
- Moins de code côté Shell pour le rendu.
**Inconvénients**
- Architecture plus lourde (extension + service/app).
- Gestion DBus, packaging, cycle de vie de lapp.
- Moins fluide pour un usage “réglage instantané”.
**Recommandation**
- À considérer si tu veux absolument la roue GTK standard et acceptes la complexité.
---
### Option D — Réutiliser du code existant (extensions / libs)
**Principe**
- Sinspirer dune extension existante (Color Picker, etc.) ou porter un widget JS déjà implémenté.
- Intégrer le code (Canvas, HSV->RGB, interactions) dans ton extension.
**Avantages**
- Gain de temps si un code de roue HSV est déjà éprouvé.
- Possibilité de reprendre des patterns Shell (PopupMenu, Quick Settings, etc.).
**Inconvénients**
- Variabilité de qualité et compatibilité GNOME 48.
- Nécessite vérification licence / maintenance.
**Recommandation**
- Très efficace si tu trouves un code déjà aligné GJS/Clutter moderne.
---
## Rendu “fidèle” vs LED (point important)
- Une roue à lécran (sRGB) ne correspond pas parfaitement au rendu des LED de clavier.
- Recommandé :
- afficher RGB 0255 et/ou HEX
- prévoir un slider dintensité (V) + luminosité matériel
- optionnel : appliquer une correction empirique (ex. réduire le bleu) pour coller au rendu réel.
---
## UX conseillée (pragmatique)
### MVP (simple et efficace)
- Roue HSV (H,S) + slider V
- Aperçu (carré couleur)
- Affichage RGB (0255) + HEX
- Bouton “Appliquer” (ou appliquer en live)
### Version “confort”
- Roue HSV + sliders RGB (affinage)
- Presets (palette)
- Historique des dernières couleurs
- “Appliquer au démarrage” (persist)
---
## Recommandation finale
Pour GNOME Shell 48, le meilleur choix est :
1. **Option A** (roue HSV custom via `Clutter.Canvas`) + slider V
2. compléter par **Option B** (sliders RGB) si tu veux une précision LED maximale
Option C (GTK externe) est valable mais plus lourde et moins adaptée à un réglage rapide dans le Shell.
---
## Livrables possibles (si on passe à limplémentation)
- Widget `HsvWheel` réutilisable (Canvas + interaction)
- Intégration top-bar (PopupMenu) ou Quick Settings
- Callback standard `onColor({r,g,b,h,s,v})`
- Module utilitaire HSV<->RGB
- (Option) pipeline dapplication : sysfs / asusctl / DBus service
s