307 lines
8.5 KiB
Markdown
307 lines
8.5 KiB
Markdown
# 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.
|