Gnome Shell Extensions, modifier la zone de statut

Gnome est sorti il y a peu en version stable, la 3.0 et le peu qu’on puisse dire, c’est que ça en fait du changement. Certains sont pour, d’autres contre, mais peu importe, au final, ça a tendance à s’équilibrer et chacun y trouve son compte. Ceci dit, ce nouveau Gnome nous vient avec une interface/gestionnaire de fenêtre, Gnome Shell dont une grande partie du code est écrite en Javascript et utilisant du CSS pour le design. Ce dernier fournit également un système d’extensions qui, combinés au fait que c’est du Javascript donne une certaine liberté de configuration (si on connaît un peu de Javasciprt).

Revenons à Gnome Shell, ce dernier a une zone de statut (qui remplace l’ancienne zone de notification qui elle se retrouve en bas et cachée :|) dont une des icônes a tendance à m’agacer, celle nommée « accès universel » (déjà, je ne comprend pas le nom). Cette zone n’est pas configurable, je me fais une raison et en profite pour voir de plus près ces possibilités de modifications de Gnome Shell.

Tout d’abord, une des premières pages visitées donne une liste assez intéressante des possibilités de Gnome Shell, entre autre, la console Javascript (et un peu plus) intégrée qu’on peut lancer avec: Alt+F2 puis: lg

En cliquant sur la pipette (en haut à gauche), puis sur l’icône « accès universel », on a 2 lignes qui se rajoutent dans la console:

>>> 
r(0) = [0x953d340 StBin.panel-button]

En cliquant sur le résultat (le 0x9…), on peut inspecter l’objet et entre autre voir qu’il y a 2 fonctions aux noms assez évocateurs, hide() et show(). Il n’y a plus qu’à tester:

>>> r(0).hide()
r(2) = undefined

L’icône a disparu; parfait. Et il se trouve que vous pouvez inspecter tout objet affiché.

Ceci dit, c’est bien beau, mais comment rendre ça permanent ? Il est temps de jeter un coup d’oeil aux extensions.

Gnome Shell fournit un outil pour créer une extension:

$ gnome-shell-extension-tool --create

Name should be a very short (ideally descriptive) string.
Examples are: "Click To Focus",  "Adblock", "Shell Window Shrinker".

Name: test

Description is a single-sentence explanation of what your extension does.
Examples are: "Make windows visible on click", "Block advertisement popups"
              "Animate windows shrinking on minimize"

Description: pour tester

Uuid is a globally-unique identifier for your extension.
This should be in the format of an email address (foo.bar@extensions.example.com), but
need not be an actual email address, though it's a good idea to base the uuid on your
email address.  For example, if your email address is janedoe@example.com, you might
use an extension title clicktofocus@janedoe.example.com.
Uuid [test@host]: test@home.lan
Created extension in '/home/test/.local/share/gnome-shell/extensions/test@home.lan'
$

Cet utilitaire crée un répertoire sous $XDG_DATA_HOME/gnome-shell/extensions contenant:

  • metadata.json : Informations sur votre extension.
  • stylesheet.css : Design de votre extension
  • extension.js : Le code à proprement dit.

extension.js contient déjà du code, c’est un exemple. Pour voir ce que ça fait: Alt+F2 puis r (juste « r »), puis cliquez sur le panel, Gnome Shell devrait vous dire bonjour.

Bien, mais c’est pas ce qu’on veut, voyons voir comment ça fonctionne…

  • Gnome Shell charge l’extension puis exécute la fonction main()
  • Les éléments de l’interface sont accessibles depuis l’objet imports.ui qui correspond au répertoire js/ui de l’installation de Gnome shell. Sous Archlinux : /usr/share/gnome-shell/js/ui

En jetant un coup d’oeil au fichier /usr/share/gnome-shell/js/ui/panel.js, on remarque la présence d’une constante:

const STANDARD_TRAY_ICON_ORDER = ['a11y', 'display', 'keyboard', 'volume', 'bluetooth', 'network', 'battery'];

En fait, ça correspond aux icônes de statut dans l’ordre d’apparition (si elles sont disponibles) et a11y correspond à l’icône accès universel (a .. 11 lettres .. y pour accessibility). Pour chaque icône, il existe une implémentation définie dans le même fichier:

const STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION = {
    'a11y': imports.ui.status.accessibility.ATIndicator,
    'volume': imports.ui.status.volume.Indicator,
    'battery': imports.ui.status.power.Indicator,
    'keyboard': imports.ui.status.keyboard.XKBIndicator
};

Modifions extension.js :

const Panel = imports.ui.panel;
function main() {
	Panel.STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION['a11y'] = false;
}

Les extensions se chargeant avant la construction de la zone de statut, cette dernière sera chargée sans cette icône.

Le but de départ est atteint, mais ça fait peu pour une extension (qui modifie une constante en plus). Quitte à découvrir, je me suis dit pourquoi ne pas aussi modifier l’ordre d’apparition des icônes et de fil en aiguille, j’ai fait une extension un peu plus conséquente: gnome-shell-msa

L’archive contient un PKGBUILD et les fichiers composant l’extension:

wget http://tuxce.no-ip.org/~tuxce/archlinux/gnome-shell/gnome-shell-msa-1-1.src.tar.gz
tar xzxvf gnome-shell-msa-1-1.src.tar.gz
cd gnome-shell-msa-1-1
makepkg -i

Elle a besoin d’être installée parce que pour le moment, je n’ai pas trouvé comment faire accepter à GSettings un schéma en dehors de /usr/share/glib-2.0/schemas.

Redémarrer gnome-shell.

Quelques essais:

# Placer le bluetooth et la batterie en premiers
gsettings set org.gnome.shell.extensions.msa icon-order "['bluetooth', 'battery']"
# Cacher l'accès universel
gsettings set org.gnome.shell.extensions.msa icons-hide "['a11y']"
# Remttre à 0
gsettings reset org.gnome.shell.extensions.msa icons-hide
gsettings reset org.gnome.shell.extensions.msa icons-order
# Désactiver l'icône de l'accès universel (nécessite un redémarrage de gnome-shell)
gsettings set org.gnome.shell.extensions.msa icons-disable "['a11y']"

L’extension était juste un moyen de voir un peu ce que permet Gnome Shell, et étant donné qu’une extension contient un fichier metadata.json contenant la version exacte de Gnome Shell, elle sera périmée dès la première mise à jour.


La documentation n’étant pas si simple à trouver, voici les ressources que j’ai utilisé:

  • Musings of an OS plumber, un ensemble d’article couvrant la personalisation de Gnome Shell
  • API Gjs. Il existe 2 implémentation Javascript sous Gnome Seed étant l’implémentation Javascript basée sur le moteur Webkit alors que Gjs est basé sur SpiderMonkey, Gnome n’a pas encore tranché entre les deux même si Gnome Shell utilise Gjs.
  • gnome-shell-extensions qui sont disponibles sur AUR pour Archlinux.
  • Les fichiers sources de gnome-shell, js/ui
  • + l’ensemble des liens de l’article