Les lanceurs de bureau sont des scripts au format Freedesktop avec une extension de fichier masqué, point desktop.
- Ils sont installés dans le chemin système (Path) par apt et localisés à
/usr/share/applications
. - Lorsqu'ils sont modifiés par l'utilisateur ou une application, ils sont localisés à
$HOME/.local/share/applications
.
Si deux lanceurs de même nom se trouvent dans les deux localisations possibles, c'est la version du dossier personnel qui l'emporte …
Prérequis
- Un niveau moyen en Anglais
- Lisez la documentation Spécifications Freedesktop
- Lisez la documentation Bash : Guide pour debutant
Problématique des applications Java
exemples pratiques : ancestris et jdownloader2
- ancestris s'installe comme un paquet debian dans le chemin du système
- jdownloader peut s'installer via script dans le chemin du système ou dans l'espace utilisateur
dans les deux cas, des lanceurs de bureau sont fournis et correctement installés
- l'icon ne s'affiche pas dans les menus d'applications, ou s'il s'affiche, disparaît lors du lancement
- l'icon ne s'affiche pas dans la barre de lancement unity, ni pendant l'exécution
lorsqu'on lit le code de programme du script lanceur, on s'aperçoit que l'icon associé à exec est lié à un script qui appelle un script qui appelle le programme java : unity n'associe pas le programme java en exécution avec le lanceur de bureau → est-ce un bug unity ou une mauvaise écriture du script lanceur ?
JDownloader2
Code de programme d'un script de lanceur de bureau qui fonctionne : l'icon lié au programme java s'affiche correctement lors de l'exécution …
#!/usr/bin/env xdg-open [Desktop Entry] Type=Application Name=JDownloader 2 Exec=$HOME/jd2/JDownloader2 Icon=$HOME/jd2/.install4j/JDownloader2.png Categories=Network;Application;
Ancestris
Code de programme d'un script de lanceur de bureau qui ne fonctionne pas : l'icon lié au programme java ne s'affiche pas !
[Desktop Entry] Encoding=UTF-8 Name=Ancestris Name[fr]=Ancestris – Programme de Généalogie Comment=A graphical viewer and editor genealogy program. Comment[fr]=Programme de généalogie respectant en tous points la norme gedcom. Exec=ancestris Icon=ancestris Terminal=false Type=Application Categories=Office;X-Genealogy;
Le fichier de configuration du menu pour ancestris, /usr/share/menus/ancestris
?package(ancestris):needs="x11" section="Applications/Office" \ title="ancestris" command="/usr/bin/ancestris" \ icon="/usr/share/pixmaps/ancestris.xpm"
Le fichier de script /usr/bin/ancestris
#!/bin/bash cd /usr/share/ancestris/bin/ sh ancestris "$@"
Le fichier de script java /usr/share/ancestris/bin/ancestris
#!/bin/sh # # resolve symlinks # PRG=$0 while [ -h "$PRG" ]; do ls=`ls -ld "$PRG"` link=`expr "$ls" : '^.*-> \(.*\)$' 2>/dev/null` if expr "$link" : '^/' 2> /dev/null >/dev/null; then PRG="$link" else PRG="`dirname "$PRG"`/$link" fi done progdir=`dirname "$PRG"` APPNAME=`basename "$PRG"` if [ -f "$progdir/../etc/$APPNAME".conf ] ; then . "$progdir/../etc/$APPNAME".conf fi # XXX does not correctly deal with spaces in non-userdir params args="" case "`uname`" in Darwin*) userdir="${default_mac_userdir}" ;; *) userdir="${default_userdir}" ;; esac while [ $# -gt 0 ] ; do case "$1" in --userdir) shift; if [ $# -gt 0 ] ; then userdir="$1"; fi ;; *) args="$args \"$1\"" ;; esac shift done if [ -f "${userdir}/etc/$APPNAME".conf ] ; then . "${userdir}/etc/$APPNAME".conf fi if [ -n "$jdkhome" -a \! -d "$jdkhome" -a -d "$progdir/../$jdkhome" ]; then # #74333: permit jdkhome to be defined as relative to app dir jdkhome="$progdir/../$jdkhome" fi readClusters() { if [ -x /usr/ucb/echo ]; then echo=/usr/ucb/echo else echo=echo fi while read X; do if [ "$X" \!= "" ]; then $echo "$progdir/../$X" fi done } absolutize_paths() { while read path; do if [ -d "$path" ]; then (cd "$path" 2>/dev/null && pwd) else echo "$path" fi done } clusters=`(cat "$progdir/../etc/$APPNAME".clusters; echo) | readClusters | absolutize_paths | tr '\012' ':'` if [ ! -z "$extra_clusters" ] ; then clusters="$clusters:$extra_clusters" fi nbexec=`echo "$progdir"/../platform*/lib/nbexec` case "`uname`" in Darwin*) eval exec sh '"$nbexec"' \ --jdkhome '"$jdkhome"' \ -J-Dcom.apple.mrj.application.apple.menu.about.name='"$APPNAME"' \ -J-Xdock:name='"$APPNAME"' \ '"-J-Xdock:icon=$progdir/../../$APPNAME.icns"' \ --clusters '"$clusters"' \ --userdir '"${userdir}"' \ ${default_options} \ "$args" ;; *) sh=sh # #73162: Ubuntu uses the ancient Bourne shell, which does not implement trap well. if [ -x /bin/bash ] then sh=/bin/bash fi eval exec $sh '"$nbexec"' \ --jdkhome '"$jdkhome"' \ --clusters '"$clusters"' \ --userdir '"${userdir}"' \ ${default_options} \ "$args" exit 1 ;; esac
Un code de programme de lanceur de bureau qui fonctionnerait pour ancestris devrait modifier la ligne Exec de façon à pointer directement sur le programme java au lieu de passer par un script qui appelle un script qui appelle ….
[Desktop Entry] Encoding=UTF-8 Name=Ancestris Name[fr]=Ancestris – Programme de Généalogie Comment=A graphical viewer and editor genealogy program. Comment[fr]=Programme de généalogie respectant en tous points la norme gedcom. Exec=/usr/share/ancestris/bin/ancestris Icon=/usr/share/pixmaps/ancestris.xpm Terminal=false Type=Application Categories=Office;X-Genealogy;
Problématique des applications scriptées Appimage
- rendre le script appimage exécutable
- indiquer le chemin complet
ou lancer l'application appimage, attendez que son icon apparaisse dans la barre des lanceurs, et ajouter au Tableau de bord …
Exemple avec Krita
[Desktop Entry] Encoding=UTF-8 Version=1.0 Type=Application Name=Krita Icon=krita.png Exec=/home3/Public/binary+/krita-3.1.2-x86_64.appimage StartupNotify=false StartupWMClass=krita OnlyShowIn=Unity; X-UnityGenerated=true
Exemple avec Avidemux
[Desktop Entry] Encoding=UTF-8 Version=1.0 Type=Application Name=Avidemux Icon=avidemux3_portable Exec=/home3/Public/binary+/avidemux_2.6.18.appImage StartupNotify=false StartupWMClass=avidemux3_portable OnlyShowIn=Unity; X-UnityGenerated=true
Problématique des lanceurs de Bureau sur le bureau
Dans les précédentes versions de Ubuntu, une commande permettait de creer facilement un lanceur de Bureau sur le bureau … Actuellement cette commande existe toujours mais est seulement disponible hors-depôt officiel.
Pourtant un mécanisme fort simple et méconnu permet de se substituer à cette commande et à toute application externe de création des raccourcis Freedesktop.
Il suffit pour cela de créer un modéle (ou template en anglais) du fichier lanceur de bureau dans le dossier prédéfini "Modèles" (Templates) du dossier Personnel de l'utilisateur courant de la session, et de rendre ce modéle de fichier exécutable.
- Créez le fichier modèle
gedit "$HOME/Modèles/Lanceur de Bureau.desktop"
- Remplissez-le
[Desktop Entry] Version=1.0 Type=Application Name=Desktop Laucher Name[fr_FR]=Lanceur de Bureau Comment=example template with gedit as application TryExec=gedit Exec=gedit Icon=icon
- Rendez-le exécutable
chmod u+x "$HOME/Modèles/Lanceur de Bureau.desktop"
Sur le bureau, pour créer un exemple raccourci lanceur, cliquez droit sur un espace vierge du bureau, dans le menu contextuel, choisissez "Nouveau document >" → "Lanceur de Bureau" → renommez-le simplement (sans extension)
Cliquez deux fois dessus, l'application exemple gedit se lancera sans provoquer d'erreurs … Si vous choisissez de créer manuellement un raccourci lanceur vous-même, ou de déplacer ou copier un raccourci lanceur existant, n'oubliez pas de le rendre exécutable sinon Ubuntu vous dira que le lanceur d'application est non fiable !