Ce billet est une traduction libre de l'article : Wednesday Why: Menus écrit par Chris Tyler.

2008-06-24-wednesday_why-menus.png

Les menus des applications de Fedora listent différents programmes provenant de paquetages variés. Fedora fournit de nombreux environnements de bureaux, dont GNOME, KDE et XFCE ; chacun d'entre eux utilise sa propre structure de menu pouvant inclure ou exclure certains programmes, tels que les panneaux de contrôle propres à chacun d'eux. Chaque titre de menu ainsi que les entrées sont affichés dans la langue courante de la session. En outre, la disposition des menus fait souvent l'objet d'affinements à chaque nouvelle version de Fedora, alors que certains paquetages n'ont pas varié d'un iota au cours de la transition. Voilà quelques propriétés de ces menus dont on s'attachera à décrire les mécanismes en jeu.

Les spécifications des entrées du menu sont définies de façon collaborative au sein du projet freedesktop.org. Toute paquetage Fedora induisant l'apparition d'une entrée dans le menu contient un ou plusieurs fichiers .desktop décrivant ces entrées. Par exemple, le paquetage evolution contient un fichier .desktop (ici tronqué, compte-tenu du nombre important de traductions du nom et des commentaires qu'il contient) :

$ rpm -ql evolution | grep desktop
/usr/share/applications/evolution.desktop

Celui-ci contient ainsi les informations nécessaire à l'affichage de l'entrée Evolution dans le menu :

[Desktop Entry]
Encoding=UTF-8
Name=Evolution Mail and Calendar
Name[ar]=بريد و تقويم إيفُليوشِن
Name[as]=Evolution মেইল বৰ্ষপঞ্জি
...
Name[fr]=Messagerie et calendrier d'Evolution
...
Name[zh_HK]=Evolution 郵件與行事曆
Name[zh_TW]=Evolution 郵件與行事曆
...
Comment=Manage your email, contacts and schedule
Comment[ar]=قُم بإدارة بريدك الكتروني، مراسليك وجدولك
Comment[as]=আপোনাৰ ই-মেইল অ্যাকাউন্টসমূহকে এখানে বিন্যাস কৰক
...
Comment[fr]=Gérer vos courriels, contacts et agendas
...
Comment[zh_HK]=管理你的郵件、聯絡人和行程
Comment[zh_TW]=管理您的郵件、連絡人和行程
Exec=evolution
Icon=evolution
Terminal=false
Type=Application
Categories=GNOME;GTK;Office;Email;Calendar;ContactManagement;X-Red-Hat-Base;
StartupNotify=true
X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Product=Evolution
X-GNOME-Bugzilla-Component=BugBuddyBugs
X-GNOME-Bugzilla-Version=2.22.x
X-GNOME-Bugzilla-OtherBinaries=evolution-data-server-2.22;evolution-exchange-storage;evolution-alarm-notify;

Comme on peut le voir, ce fichier contient le nom et la description du programme par défaut (en anglais) et celle spécifique à la langue de l'environnement choisie. Il indique également la commande lancée par l'entrée, l'icône à afficher (qui est celle du thème choisi si celui-ci propose une icône correspondant au nom spécifié), si le programme doit être lancé depuis un terminal, l'encodage à utiliser pour l'affichage du nom et de la description, la catégorie à laquelle appartient l'application, et si le programme supporte le protocole Startup Notify (grosso modo, une application implémentant ce protocole enverra chaque fois qu'elle sera lancée ou quittée un message de notification au serveur X, qui pourra être intercepté par une autre application comme une applet, etc). Quant aux champs X-GNOME-Bugzilla-* à la fin de ce fichier, ils caractérisent une entrée propre à un environnement de bureau, et qui seront ignorés par les autres (le préfixe « X- » indique que le champ n'est pas standard ou est expérimental).

Les informations contenues dans ce fichier peuvent par ailleurs être indifféremment utilisées pour décrire une entrée de menu, une icône sur un tableau de bord ou sur le bureau. L'emplacement du fichier .desktop détermine en quelque sorte la représentation associée : un fichier placé dans les répertoires /usr/share/applications/ décrira une entrée dans le menu, tandis que le même fichier placé dans le répertoire du bureau (~/Bureau/) affichera un lanceur sur ce dernier. Pour placer sur le bureau un lanceur d'une application présente dans le menu, il suffit donc simplement de copier le fichier .desktop correspondant dans /usr/share/applications/ vers ~/Bureau/.

L'organisation du menu est régie par des fichiers de configuration placés dans le répertoire /etc/xdg/menus (les spécifications de ces fichiers, au format XML, sont définies sur http://standards.freedesktop.org/me...). Ces fichiers décrivent la hiérarchie des catégories présentes dans le menu « Applications » ou « Système » par exemple, les emplacements de recherche des fichiers .desktop à afficher, etc.

Par exemple, le fichier /etc/xdg/menus/applications.menu, correspondant au menu « Applications », contient une section relative à la catégorie « Bureautique » (« Office » en anglais) :

  <!-- Office -->
  <Menu>
    <Name>Office</Name>
    <Directory>Office.directory</Directory>
    <Include>
      <And>
        <Category>Office</Category>
      </And>
    </Include>
  </Menu> <!-- End Office -->

L'entrée « Evolution » décrite plus haut est ainsi affichée dans cette catégorie, puisque défini dans le champ Categories comme appartenant à la catégorie Office. Le tag <INCLUDE> mérite qu'on s'y attarde : il spécifie quels fichiers .desktop y seront incorporés, en l'occurence, tous ceux de catégorie « Office ». Si l'on considère cette fois la section relative à la catégorie « Outils système » (« Categories ») :

<!-- Accessories submenu -->
  <Menu>
    <Name>Accessories</Name>
    <Directory>Accessories.directory</Directory>
    <Include>
      <And>
        <Category>Utility</Category>
        <Not>
          <Category>System</Category>
        </Not>
      </And>
    </Include>
  </Menu> <!-- End Accessories -->

on constate que le bloc <Include> contient un sous-bloc Utility : tous les fichiers .desktop de catégorie « Utility » seront affichés dans le menu dans cette catégorie. En révanche étant suivi d'un bloc <Not> de négation contenant la catégorie System, un fichier marqué à la fois Utility ET System ne sera pas affiché (ceux-ci étant affichés sous Fedora dans le menu dans le menu « Système »).