11 KiB
Guide débutant - Extension Pilot Control pour GNOME
Ce guide explique en détail comment fonctionne l'extension et comment la personnaliser.
📚 Table des matières
Architecture de l'extension
Vue d'ensemble
Une extension GNOME Shell est composée de plusieurs fichiers JavaScript qui interagissent avec l'environnement GNOME :
Extension Pilot Control
│
├─ extension.js ──────────> Bouton dans le panel GNOME
│ │
│ └─> Menu déroulant (Start/Stop/Restart)
│ └─> Ouvre pilotWindow.js
│
├─ ui/pilotWindow.js ─────> Fenêtre principale
│ │
│ ├─> Section Services
│ ├─> Section Telemetry (avec métriques)
│ └─> Section Commands
│
├─ yamlConfig.js ─────────> Lecture/Écriture du config.yaml
│
└─ serviceManager.js ─────> Commandes systemctl (start/stop/restart)
Fichiers principaux
| Fichier | Rôle | Difficulté |
|---|---|---|
metadata.json |
Infos sur l'extension (nom, version, UUID) | ⭐ Facile |
extension.js |
Point d'entrée, crée le bouton panel | ⭐⭐ Moyen |
yamlConfig.js |
Parse et sauvegarde le YAML | ⭐⭐⭐ Avancé |
serviceManager.js |
Contrôle systemd | ⭐⭐ Moyen |
ui/pilotWindow.js |
Interface principale | ⭐⭐⭐ Avancé |
ui/metricEditDialog.js |
Dialogue d'édition métrique | ⭐⭐ Moyen |
ui/commandEditDialog.js |
Dialogue d'édition commandes | ⭐⭐ Moyen |
prefs.js |
Fenêtre de préférences | ⭐ Facile |
Comprendre le code
1. extension.js - Le point d'entrée
// Ce fichier crée le bouton dans le panel GNOME
export default class PilotExtension extends Extension {
enable() {
// Appelé quand l'extension est activée
this._indicator = new PilotIndicator(this);
Main.panel.addToStatusArea(this.uuid, this._indicator);
}
disable() {
// Appelé quand l'extension est désactivée
this._indicator.destroy();
}
}
Concepts clés :
enable(): Fonction appelée au démarrage de l'extensiondisable(): Fonction appelée à l'arrêt de l'extensionPilotIndicator: Classe qui crée l'icône + menu dans le panel
2. yamlConfig.js - Parser YAML simple
// Ce fichier lit et écrit le fichier config.yaml
export class YamlConfig {
load() {
// 1. Lit le fichier config.yaml
// 2. Parse le YAML en objet JavaScript
// 3. Retourne l'objet config
}
save(config) {
// 1. Convertit l'objet JavaScript en YAML
// 2. Crée une sauvegarde du fichier actuel
// 3. Écrit le nouveau fichier
}
}
Fonctions utiles :
getTelemetryMetrics(): Retourne toutes les métriquesgetCommandsAllowlist(): Retourne la liste des commandes autoriséesupdateTelemetryMetric(name, updates): Modifie une métriquesetTelemetryEnabled(enabled): Active/désactive la télémétrie
3. serviceManager.js - Contrôle systemd
// Ce fichier exécute les commandes systemctl
export class ServiceManager {
startService() {
// Exécute: systemctl --user start mqtt_pilot.service
}
stopService() {
// Exécute: systemctl --user stop mqtt_pilot.service
}
isServiceActive() {
// Vérifie si le service est en cours d'exécution
}
}
Commandes systemctl utilisées :
systemctl --user start: Démarrer le servicesystemctl --user stop: Arrêter le servicesystemctl --user restart: Redémarrer le servicesystemctl --user is-active: Vérifier le statut
4. ui/pilotWindow.js - Interface graphique
// Fenêtre principale avec GTK4 + libadwaita
export const PilotWindow = GObject.registerClass(
class PilotWindow extends Adw.Window {
_buildUI() {
// Construit 3 sections :
// 1. Service Control
// 2. Telemetry Metrics
// 3. Commands
}
_loadData() {
// Charge les données depuis config.yaml
// Met à jour l'interface
}
_saveConfig() {
// Sauvegarde les modifications
// Redémarre le service
}
});
Composants UI utilisés :
Adw.Window: Fenêtre principaleAdw.HeaderBar: Barre d'en-tête avec boutonsAdw.PreferencesGroup: Groupes de préférencesAdw.ActionRow: Lignes avec titre/sous-titreGtk.Switch: Interrupteur ON/OFFGtk.Button: Boutons
Installation pas à pas
Étape 1 : Vérifier les prérequis
# Vérifier que GNOME Shell est installé
gnome-shell --version
# Doit afficher : GNOME Shell 45.x ou supérieur
# Vérifier que le service Pilot existe
systemctl --user status mqtt_pilot.service
Étape 2 : Installer l'extension
Méthode automatique (recommandée) :
cd /home/gilles/app/pilot/gnome-pilot-extension
./install.sh
Méthode manuelle :
# 1. Créer le répertoire
mkdir -p ~/.local/share/gnome-shell/extensions/pilot-control@gnome-shell-extensions
# 2. Copier tous les fichiers
cp -r /home/gilles/app/pilot/gnome-pilot-extension/* \
~/.local/share/gnome-shell/extensions/pilot-control@gnome-shell-extensions/
# 3. Vérifier que les fichiers sont bien copiés
ls ~/.local/share/gnome-shell/extensions/pilot-control@gnome-shell-extensions/
Étape 3 : Activer l'extension
# Activer l'extension
gnome-extensions enable pilot-control@gnome-shell-extensions
# Vérifier qu'elle est bien activée
gnome-extensions list --enabled | grep pilot
Étape 4 : Redémarrer GNOME Shell
Sur X11 :
- Appuyez sur
Alt+F2 - Tapez
r - Appuyez sur
Entrée
Sur Wayland :
- Déconnectez-vous
- Reconnectez-vous
Étape 5 : Utiliser l'extension
- Cherchez l'icône d'ordinateur en haut à droite (dans le panel)
- Cliquez dessus pour voir le menu
- Cliquez sur "Open Control Panel" pour ouvrir la fenêtre principale
Personnalisation
Modifier le chemin du fichier de configuration
Éditez yamlConfig.js:25-32 :
_findConfigPath() {
const possiblePaths = [
'/votre/chemin/personnalisé/config.yaml', // Ajoutez votre chemin ici
GLib.build_filenamev([GLib.get_home_dir(), 'app/pilot/pilot-v2/config.yaml']),
// ... autres chemins
];
}
Modifier le nom du service systemd
Éditez serviceManager.js:9 :
constructor() {
this.serviceName = 'votre_service.service'; // Changez ici
}
Changer l'icône du panel
Éditez extension.js:40-43 :
const icon = new St.Icon({
icon_name: 'network-server-symbolic', // Changez l'icône ici
style_class: 'system-status-icon',
});
Icônes disponibles :
computer-symbolicnetwork-server-symbolicpreferences-system-symbolicsystem-run-symbolic
Ajouter une nouvelle métrique
- Ajoutez la métrique dans
config.yaml(Pilot V2) - L'extension détectera automatiquement la nouvelle métrique
- Elle apparaîtra dans la section Telemetry
Personnaliser les couleurs
Éditez stylesheet.css :
/* Changer la couleur des warnings */
.warning {
color: #ff0000; /* Rouge au lieu d'orange */
}
/* Ajouter des styles personnalisés */
.custom-style {
background-color: #3584e4;
color: white;
}
Dépannage
L'extension n'apparaît pas dans la liste
# Vérifier que l'extension est bien installée
ls -la ~/.local/share/gnome-shell/extensions/pilot-control@gnome-shell-extensions/
# Vérifier les logs GNOME Shell
journalctl -f -o cat /usr/bin/gnome-shell | grep -i pilot
Solution : Vérifiez que tous les fichiers sont bien copiés, notamment metadata.json.
Erreur "Extension had error"
# Voir les erreurs détaillées
journalctl -f -o cat /usr/bin/gnome-shell
Solutions courantes :
- Vérifier la syntaxe JavaScript (pas de fautes de frappe)
- Vérifier que tous les imports sont corrects
- Redémarrer GNOME Shell
Le service ne démarre pas
# Vérifier que le service existe
systemctl --user list-units | grep mqtt_pilot
# Vérifier les erreurs du service
systemctl --user status mqtt_pilot.service
journalctl --user -u mqtt_pilot.service -n 50
Solution : Assurez-vous que le service mqtt_pilot.service est bien configuré en tant que service utilisateur.
Les modifications ne sont pas sauvegardées
- Vérifiez les permissions du fichier
config.yaml - Vérifiez les logs pour voir les erreurs de sauvegarde
- Vérifiez qu'une sauvegarde a été créée (
config.yaml.backup_*)
# Vérifier les permissions
ls -la ~/app/pilot/pilot-v2/config.yaml
# Vérifier les sauvegardes
ls -la ~/app/pilot/pilot-v2/config.yaml.backup_*
L'interface ne se met pas à jour
- Cliquez sur le bouton "Refresh" (icône refresh dans le header)
- Fermez et rouvrez la fenêtre de contrôle
- Redémarrez l'extension :
gnome-extensions disable pilot-control@gnome-shell-extensions
gnome-extensions enable pilot-control@gnome-shell-extensions
Ressources utiles
Documentation GNOME
Outils de développement
# Looking Glass (debugger GNOME Shell)
# Alt+F2, tapez 'lg'
# Recharger l'extension rapidement
gnome-extensions disable pilot-control@gnome-shell-extensions && \
gnome-extensions enable pilot-control@gnome-shell-extensions
# Voir les logs en temps réel
journalctl -f -o cat /usr/bin/gnome-shell
Exemples de code
L'extension utilise plusieurs patterns courants :
Pattern 1 : GObject.registerClass
const MyClass = GObject.registerClass(
class MyClass extends ParentClass {
_init() {
super._init();
// Initialisation
}
});
Pattern 2 : Callbacks (connect)
button.connect('clicked', () => {
// Action au clic
});
Pattern 3 : Timeout
GLib.timeout_add(GLib.PRIORITY_DEFAULT, 500, () => {
// Exécuté après 500ms
return GLib.SOURCE_REMOVE; // Ne pas répéter
});
Conclusion
Cette extension est conçue pour être simple et facilement modifiable. N'hésitez pas à :
- Expérimenter : Modifier les fichiers et tester
- Consulter les logs : Utiliser
journalctlpour comprendre les erreurs - Lire le code : Tous les fichiers sont commentés pour faciliter la compréhension
Pour toute question, consultez d'abord ce guide, puis les logs GNOME Shell.
Bon développement ! 🚀