Applications par défaut selon l'environnement

Des fonctionnements que vous voulez pas et qui dure dans le temps par manque de temps, il y en a pleins, dernièrement ayant installés différents environnements de bureau sur mon système (ce qui m’a perturbé mon menu, j’ai commencé à avoir des ouvertures de documents/emplacements avec la dernière applications installées.
Sauf que, c’est pas forcément l’application que je veux; pas si grave que ça, il suffit dans un environnement comme GNOME par exemple de sélectionner l’application par défaut qu’on veut, mais, parce qu’il y a toujours un « mais », d’une part, c’est lourd de le faire pour tous les types de documents et d’autre part certains ne sont pas accessible simplement par le biais d’une interface (par exemple le type représentant une clé usb).

Et c’est là qu’on se retrouve (enfin ceux que ça intéresse) à chercher comment fonctionne ces foutus types MIME et les applications associées afin de trouver un moyen d’automatiser un peu tout ça.

Type MIME

Comme dit pour les menus dans un précédent billet, freedesktop essaie d’harmoniser tout ça, ce qui nous donne une spécification pour les infos MIME.

En pratique et en passant rapidement, chaque application voulant rajoutant un nouveau type MIME fournit un fichier de description du type en question.
La plupart des types étant fournis par freedesktop (cf. /usr/share/mime/packages/freedesktop.org.xml).

Mais ce n’est qu’une étape, et à part si on crée de nouveaux type, c’est pour l’instant que de l’information.

Applications

Là est la partie intéressante, la liste des applications définies pour tel type MIME sont contenus dans le fichier /usr/share/applications/mimeinfo.cache (je passe sur les différents autre répertoire, cf. spécifications des répertoires de freedesktop).

Ce fichier est construit par la commande update-desktop-database qui va parcourir la liste des fichiers .desktop disponible et ayant comme type: Application.

Un exemple sera plus parlant, prenons le fichier evince.desktop qui représente le lecteur de document de GNOME, les deux lignes intéressantes sont:

Type=Application
MimeType=application/pdf;[...]

La ligne Type indique que c’est une application, la ligne MimeType indique les types de fichiers qu’il peut prendre en charge (elle est plus longue, mais c’est un exemple ;)).

Cet exemple donnera dans le fichier mimeinfo.cache:

application/pdf=evince.desktop;

Sauf qu’une fois installé un autre lecteur, la ligne aura par exemple cet aspect:

application/pdf=kde4-okularApplication_pdf.desktop;evince.desktop;

C’est sympa, sauf que ça lance la batterie KDE dès que je double clique sur un foutu .pdf ! Et c’est valable pour à peu près tout les types de documents et le plus embêtants sont les emplacements, par exemple, vous double cliquez sur une clé usb fraichement détectée et c’est dolphin qui démarre :/

Comme dit plus haut, on peut définir une application par défaut depuis l’interface de nautilus, mais une/une, en fait, nautilus ne fait qu’écrire dans le fichier ~/.local/share/applications/mimeapps.list quelle application il doit démarrer:

application/pdf=evince.desktop;

Enfin bref, passons au changement en masse.

Limiter aux applications d’un environnement

Pour cela, j’ai pas trouvé plus simple qu’un script (si vous avez une autre idée, je suis preneur):

#!/usr/bin/env bash

DE=GNOME
fichier_tmp=$(mktemp)
rep_tmp=$(mktemp -d)
apps_list="$XDG_DATA_DIRS:$XDG_DATA_HOME"
ex_IFS=$IFS
IFS=:
apps_list="$(echo $apps_list)"
IFS=$ex_IFS
echo "Recherche des fichiers *.destop appartenant à $DE."
for rep in $apps_list
do
  find $rep/applications -type f -name "*.desktop" \
    -exec grep -l "Categories=.*$DE" {} \; 2> /dev/null >> $fichier_tmp
done
echo "Les regroupe dans un répertoire unique."
for fichier in $(cat $fichier_tmp)
do
  ln -s "$fichier" "$rep_tmp/$(basename $fichier)" &> /dev/null
done
echo "Construction de la base"
update-desktop-database $rep_tmp

echo "Mise à jour de la base utilisateur."

user_app=${XDG_DATA_HOME:-$HOME/.local/share}/applications
grep -v 'MIME Cache' $rep_tmp/mimeinfo.cache >> $user_app/mimeapps.list

rm -r $rep_tmp &> /dev/null
rm $fihier_tmp &> /dev/null

Voilà, au final, je retrouve mes applications par défaut, ceci même si d’autres utilisateurs du système utilisent d’autres environnements.