Comment savoir si le style sombre est actif ?

Au démarrage de mon éditeur de texte vim, je souhaite qu’il choisisse un thème sombre ou claire selon la préférence actuelle de mon bureau.

Je n’en ai besoin que pendant le lancement, parce que je ne change pas très souvent ce paramètre : la journée je préfère le thème clair et le soir le sombre. Si vraiment, j’ai besoin de changer le style de vim sans le redémarrer, je peux utiliser la commande :

:set background=dark
.

Jusqu’à récemment, je n’utilisais que le bureau GNOME, j’utilisais donc cette commande pour retrouver l’information :

gsettings get org.gnome.desktop.interface color-scheme

Maintenant que j’utilise aussi Cinnamon avec Linux Mint régulièrement, cette commande ne fonctionne plus : elle fait clairement référence au bureau GNOME puisqu’elle utilise l’outil de configuration gsettings (fourni par GLib) et un namespace lié à GNOME.

Pour aller vite, il est possible d’adapter cette commande pour le bureau Cinnamon. Ce n’est pas idéal, parce que j’ai maintenant deux lignes de configurations différentes de vim juste pour le choix du thème. En plus, si je souhaite tester d’autres bureaux Linux, je devrais ajouter à chaque fois des lignes spécifiques dans ma configuration.

Une solution à ce problème est d’utiliser l’interface D-Bus des portails XDG Desktop. Ces portails permettent aux développeurs logiciels d’utiliser des fonctionnalités communes aux différents bureaux Linux sans avoir besoin de connaître le bureau actuellement utilisé.

Je n’avais jamais utilisé D-Bus avant et j’ai galéré un peu à comprendre comment l’utiliser. Pour m’aider, j’ai retrouvé cette discussion qui propose d’ajouter la préférence de style dans XDG Desktop Portal. Elle m’a permis de savoir que je devais rechercher : un namespace org.freedesktop.appearance et une clé color-scheme.

J’ai ensuite trouvé que je pouvais utiliser gdbus et dbus-send pour interroger D-Bus.

Seulement, leur interface n’est pas vraiment faite pour chercher ce qui existe, mais plutôt pour consulter. Pour m’aider à chercher, j’ai utilisé le logiciel d-spy et la demande de fusion qui met à jour le code d’elementary OS pour utiliser la nouvelle interface.

Finalement, la commande que je dois exécuter est celle-ci :

gdbus call --session --dest org.freedesktop.portal.Desktop --object-path /org/freedesktop/portal/desktop --method org.freedesktop.portal.Settings.ReadOne org.freedesktop.appearance color-scheme | grep -Po "(?<=uint32 )\d"

En détail :

gdbus call
Utilise la commande gdbus avec la méthode call pour demander une valeur
--session
Nous voulons avoir des informations sur la session de l’utilisateur et non pas du système (--system).
--dest org.freedesktop.portal.Desktop --object-path /org/freedesktop/portal/desktop
Je ne connais pas assez D-Bus pour expliquer le détail, mais j’ai clairement vu avec d-spy que c’était ces valeurs que j’avais besoin pour interroger les XDG Desktop portal
--method org.freedesktop.portal.Settings.ReadOne
Depuis le patch pour elementary OS, j’ai trouvé que j’avais besoin du portail Settings et de sa méthode ReadOne. d-spy m’a permis de savoir que cette méthode attend deux paramètres, un namespace et une clé
org.freedesktop.appearance color-scheme
Les paramètres de la méthode définie juste avant.
| grep -Po "(?<=uint32 )\d"
J’utilise grep pour nettoyer le résultat de la commande afin de n’avoir plus que le chiffre de 0 à 2 qui correspond à la préférence (sinon la sortie ressemble à (<uint32 1>,))

Enfin, après avoir cherché toutes ces informations, je me suis rendu compte que le site XDG Desktop Portal donne un lien directement vers un site qui liste toutes les interfaces disponibles en détail et comment les interroger. J’aurais pu simplement faire une recherche du terme color-scheme et je serais arrivé à la bonne section avec toutes ces informations.

Toute cette recherche m’a amené à ce petit correctif de quelques lignes dans mon fichier vimrc.

Commentaires

Vous pouvez ajouter un commentaire avec votre compte Fediverse sur ce message.