Ceci est une ancienne révision du document !
Tutoriel : programmer une extension Gnome Shell
Ce tutoriel concerne les personnes intéressées dans la programmation d'extensions Gnome Shell.
Les informations présentées ici sont normalement valables au moins pour les versions 3.18 à 3.24 de Gnome Shell.
J'ai appris à faire des extensions "en autodidacte" et mes conseils sont sans aucun doute perfectibles, je ne suis en aucun cas une autorité en la matière.
Introduction
Qu'est Gnome Shell ?
Le vocabulaire autour de Gnome/Gnome 3/Gnome Shell est parfois confus.
Gnome est un ensemble de logiciels libres formant un environnement de bureau. Depuis la version 3 de cet environnement, Gnome Shell constitue le shell graphique de l'environnement Gnome, c'est-à-dire qu'il fournit l'interface graphique venant se greffer autour du gestionnaire de fenêtres (nommé Mutter).
Tous les 6 mois, aux alentours de l'équinoxe, une version stable de Gnome est diffusée, numérotée 3.xx, où xx est un numéro pair. Les distributeurs (les personnes qui mettent à disposition les paquets des distributions) mettent alors quelques jours à quelques mois avant de proposer ces paquets aux utilisateurs.
Vous pouvez connaître votre version de Gnome Shell en tapant
gnome-shell --version
Le code de Gnome Shell
L'interface Gnome Shell a la particularité d'être codée en javascript. Ce code est ensuite interprété par un moteur de rendu nommé Gjs (basé sur le moteur de rendu javascript de Firefox).
Vous le savez peut-être, javascript a la particularité d'autoriser le monkeypatching, c'est-à-dire qu'une fonction du code peut être réécrite à un autre endroit du code, dynamiquement. On peut donc modifier l'aspect et le comportement de la quasi-totalité des composants de l'interface Gnome Shell !
On va d'abord se procurer le code source de l'interface par défaut :
Rendez-vous à l'adresse https://github.com/GNOME/gnome-shell/tree/gnome-3-xx
où xx est votre version de Gnome Shell, cliquez sur le bouton vert pour télécharger le code source au format .zip et décompressez-le avec un gestionnaire d'archives.
La partie du code qui nous intéresse est dans le dossier ./js/ui
, vous pouvez ne conserver que ce dossier là si le reste vous encombre. Je vous conseille d'ailleurs de changer les permissions de ce dossier pour le mettre en lecture seule : nous n'allons jamais ni le modifier ni l'exécuter.
Javascript
Ce tutoriel n'est pas un cours sur le javascript, il est conseillé de se familiariser préalablement avec ce langage, qui n'est heureusement pas le plus compliqué en ce monde.
Ce n'est pas ici que vous apprendrez la syntaxe des conditionnelles et des affectations, ceci dit les explications fournies devraient vous suffire à suivre même si vous débutez.
Pré-requis
Les crashs
On va ici "jouer" avec Gnome Shell lui-même. Il est très très probable qu'on le fasse crasher à un moment ou à un autre, et il va donc falloir sérieusement améliorer la résilience aux crashs de votre installation.
Voici quelques idées ou astuces pour cela :
En cas de crash du gestionnaire de fenêtre
Utilisez des applications avec des boutons de fenêtre "CSD", de manière à ce que vous ne perdiez pas totalement le contrôle sur vos fenêtres en cas de disparition des barres de fenêtres.
Un terminal comme Terminix peut être utile par exemple.
En cas de crash de Gnome Shell
Tout d'abord, ayez des icônes sur le bureau.
Dans ~/.local/share/nautilus/scripts
, créez un fichier "Remplacer Gnome Shell" contenant seulement les lignes suivantes :
#!/bin/bash gnome-shell -r
Vous pouvez maintenant entièrement recharger Gnome Shell à partir du menu "clic-droit" fournit par Nautilus sur les fichiers, et donc notamment sur le bureau.
En cas de crash total de la session graphique
Avec Ctrl+Alt+F2
, vous pouvez vous accédez à une console (tty2) où vous pouvez vous connecter en ligne de commande et par exemple annuler la manipulation ayant généré le crash en 1er lieu.
Si vous n'êtes pas à l'aise en ligne de commande, installez Weston, il vous servira d'environnement de secours pouvant être lancé sur tty2 (par exemple) avec la commande weston
(utilise Wayland, et peut donc être lancé en parallèle d'un environnement sur Xorg.
Tester et débugguer
J'admets ne pas être un grand expert en débuggage, il existe probablement mieux que ce que je suggère ici.
Avec Alt+F2
, on trouve une fenêtre pour lancer des commandes. Cette fenêtre accepte des commandes "spéciales" internes à Gnome Shell.
Recharger
La commande r
recharge Gnome Shell, cela peut prendre quelques instants.
Les extensions notamment sont rechargées depuis le début, comme si l'ordinateur venait d'être allumé.
Looking Glass
La commande lg
ouvre Looking Glass, un outil dont on reparlera plus tard.
Voir les logs "en direct"
Entrer dans un terminal la commande
gnome-shell -r
C'est beaucoup plus "violent" que de simplement recharger Gnome Shell, et donc plus long. Toutes les erreurs émises entre autres par les extensions, mais aussi les messages ou les avertissements, apparaissent maintenant dans le terminal.
Pour pouvoir quitter le terminal, utilisez simplement le script qu'on a créé plus haut.
Un premier exemple
On peut créer une extension en forkant une extension existante, mais pour commencer, nous allons utiliser la méthode "classique" en lançant la commande
gnome-shell-extension-tool --create-extension
On vous demande un nom, une description et un identifiant ("uuid"). L'identifiant est souvent au format nom-extension@pseudo
, inspirez-vous des identifiants d'extensions existants dans ~/.local/share/gnome-shell/extensions/
(mettez ce dossier dans vos signets Nautilus d'ailleurs).
Analysons les fichiers ainsi créés (~/.local/share/gnome-shell/extensions/
votre-uuid/
) :
metadata.json
Ce fichier est obligatoire pour qu'une extension soit reconnue par Gnome Shell.
Entre accolades, on a une liste de propriétés au format "clef": valeur
séparées par des virgules.
Pour l'instant, il y a les clefs :
uuid
: obligatoire, doit correspondre au nom du dossier ;name
: obligatoire, apparaît dans gnome-tweak-tool ;description
: obligatoire, apparaît dans gnome-tweak-tool ;shell-version
: un tableau (array) de valeurs entre guillemets séparées par des virgules.
extension.js
Ce fichier est obligatoire pour qu'une extension soit reconnue par Gnome Shell.
stylesheet.css
Ce fichier n'est pas obligatoire.
Créons une vraie extension
Une idée
extension.js
S'adapter à l'utilisateur
Ajouter des paramètres
Ajouter des langues
prefs.js
Autre exemple d'extension
Ce dont je n'ai pas parlé ici
Parce que je préfère ne parler que de ce que je comprends à peu près, je n'ai pas abordé certains aspects du développement d'extensions pourtant très puissants. En voici quelques uns :