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 …

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;
  • 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 …

Lanceur desktop et icon d'application seront localisés sur /tmp , en cas de redémarrage ou de plantage système, vous perdrez les données correspondantes.
Une fois que vous avez testé le fonctionnement, il vaut mieux écrire le script desktop de manière permanente.

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

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 !

  • utilisateurs/j5012/brouillons/mes_desktop_scripts.txt
  • Dernière modification: Le 26/12/2022, 22:00
  • par J5012