30

Simple lanceur d'applications (dmenu, lsdesktop)

J'ai récemment repris le développement d'isotop. C'est presque prêt, il reste surtout des traductions et de la documentation à rédiger. Mais ce n'est pas de ça dont je veux parler aujourd'hui.

Un élément très important dans un environnement de travail c'est la façon dont on peut ouvrir de nouvelles applications. Je suis un grand fan de dmenu, mais il faut reconnaître qu'il n'est peut-être pas le plus facile d'accès, surtout si on est attaché à l'utilisation de la souris.

Un bonne alternative existe, c'est xfce4-appfinder, mais je trouve dommage de devoir installer des dépendances d'XFCE juste pour 1 application.

Une autre alternative existe : rofi avec le mode approprié. Il se charge de liste les fichiers “.desktop” présents sur un système pour en faire un menu. C'est cool, mais il y a des trucs que je ne veux pas voir dans le menu, j'aimerais donc pouvoir supprimer ces entrées.

J'ai donc décidé de m'y coller avec mes quelques compétences. Me voici en train de coder un bout de C pour lister les fichiers “.desktop” présents sur ma machine, que ce soit les fichiers systèmes (/usr/local/share/applications) mais aussi ceux que j'aurais pu créer pour mon bon plaisir ($HOME/.local/applications).

Ça s'appelle lsdesktop, et ça fait environ 200 lignes de code.

Ce petit outil se contente de lister le nom des applications et la commande associée. Il ne se préoccupe pas de la catégorie ou encore de la langue (libre à vous de le rajouter :P). Il va ignore chage fichier “.desktop” précisé dans le fichier `$HOME/.config/lsdesktop.exclude”, ça permet de cacher des entrées indésirables. Par exemple, j'ai ça :

$ cat ~/.config.lsdesktop.exclude
gtk3-demo.desktop
gtk3-icon-browser.desktop
gtk3-widget-factory.desktop

Pour le compiler, téléchargez le fichier lsdesktop.c puis entrez

make ldesktop

Si vous lancez lsdesktop, vous obtiendrez un truc comme ça :

$ lsdesktop 
sxiv|sxiv %F
LibreOffice 7.0 Calc|libreoffice7.0 --calc %U
Xfe|xfe
Xfi|xfi %f
Xfp|xfp %f
LibreOffice 7.0 Draw|libreoffice7.0 --draw %U
Xfw|xfw %F
LibreOffice 7.0 Impress|libreoffice7.0 --impress %U
LibreOffice 7.0 Math|libreoffice7.0 --math %U
LibreOffice 7.0|libreoffice7.0 %U
LibreOffice 7.0 Writer|libreoffice7.0 --writer %U
MuPDF|mupdf %f
mpv Media Player|mpv --player-operation-mode=pseudo-gui -- %U

Reste à mettre ça dans un menu. Pour commencer, on va envoyer la sortie à dmenu après avoir mis les choses en forme :

$ lsdesktop |column -t -s'|' |dmenu -l 10

Cela donne :

On peut en faire un petit script, et même si c'est déjà rapide, on ajoute un cache pour ne pas avoir à lancer lsdesktop s'il n'y a pas de nouveaux fichiers “.desktop”

#!/bin/sh

cachedir="${XDG_CACHE_HOME:-"$HOME/.cache"}"
cache="$cachedir/ddesktop"

if [ ! -f "${cache}" -o -n "$(find ${desktopfilespath} -newer ${cache} 2>/dev/null)" ]
then
    lsdesktop -s '::' | column -t -s '::' > ${cache}
fi

test -s $HOME/.dmenurc && . $HOME/.dmenurc
l=21
p="Run:"

cat ${cache} |\
    dmenu -nb $nb -nf $nf -sb $sb -sf $sf -fn $fn -i -l $l -p "$p" | \
    sed 's/^.*  //g' |\
    ${SHELL:-"/bin/sh"} &

Toutefois, cela ne s'utilise qu'au clavier. Qu'à cela ne tienne, on va patcher dmenu. Cependant, comme les patches ne mettre pas en évidence ce que la souris survole, je l'ai modifié un peu.

Maintenant, ça ressemble à ça :

Finalement, on peut aussi très bien l'intégrer à un autre environnement. Par exemple, on peut créer un fichier menu à inclure pour fluxbox (ça c'est pour arpi :P).

Dans le menu de fluxbox :

[submenu] (Apps)
[include] (~/.fluxbox/fluxbox.automenu)
[end]

Un fichier fluxbox-automennu appelé en début de session pour créer le menu :

IFS=':'
lsdesktop -s ":"|\
while read -r n c; do
    echo "[exec] (${n}) {${c}}"
done 

Ce dernier se lance ainsi :

sh fluxbox-automenu > ~/.fluxbox/fluxbox.automenu

On doit pouvoir faire de même avec d'autres outils :)

05/11/2020 12:39


Commentaires