<h2>But de ce document</h2>
<p class="spip">Ce document me sert de mémo pour comprendre le fonctionnement des menus sous KDE.</p>

<h2>Personnalisation des menus de KDE</h2>
<p class="spip"><strong class="spip">kmenuedit</strong> permet de personnaliser les menus de KDE. Les modifications dans les menus sont enregistrées dans le dossier suivant :</p>

<p class="spip"><code class='spip_code' dir='ltr'>~/.config/menus/applications-kmenuedit.menu</code></p>

<p class="spip"><strong class="spip">update-menus</strong> permet de mettre à jour les menus après l’installation d’un programme. Ce programme est spécifique à Debian. Pour remettre à un utilisateur le menu par défaut, il faut supprimer le fichier « <strong class="spip"> /.config/menus/applications-kmenuedit.menu</strong> » et lancer <strong class="spip">update-menus</strong></p>

<p class="spip">Chaque entrée de menu est un fichier .desktop enregistré dans :</p>

<p class="spip"><code class='spip_code' dir='ltr'>~/.local/share/applications</code></p>

<p class="spip">Les menus de KDE sont configurés dans :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>~/.local/share/applications<br />
/usr/share/applications </code></div>
<p class="spip">Exemple de fichier .desktop :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>[Desktop Entry]<br />
Categories=Qt;KDE;TextEditor;<br />
DocPath=kate/index.html<br />
Encoding=UTF-8<br />
Exec=kate %U<br />
GenericName=Editeur de texte avancé<br />
Icon=kate<br />
InitialPreference=6<br />
MimeType=text/plain;application/x-desktop<br />
Name=Kate<br />
Path=<br />
Terminal=false<br />
Type=Application<br />
X-DCOP-ServiceType=Multi<br />
X-KDE-HasTempFileOption=true<br />
X-KDE-StartupNotify=true</code></div>
<p class="spip">Un fichier « .desktop » permet de créer une entrée de menu dans le menu K, mais également dans le menu contextuel si le « MimeType » correspond au fichier sélectionné. Si pour le « MimeType », il n’y a qu’un programme, l’entrée sera sous le menu principale sinon elle sera dans le sous-menu « Ouvrir avec »</p>

<h2>Les menu de Freedesktop</h2>
<p class="spip">Il faut trois types de fichiers pour créer des menus suivant la norme « <a href="http://standards.freedesktop.org/menu-spec/menu-spec-1.0.html" class="spip_out">Freedesktop</a> » :
<br /></p>
<li> Les fichiers « .desktop » décrivent les entrées de menus
<br /><li> Les fichiers « .menu » décrive » l’arborescence des menus »
<br /><li> Les fichiers « .directory » permettent d’ajouter des icônes et de traduire l’arborescence dans différentes langues
<p class="spip">La configuration de KDE pour l’utilisateur est dans «  /.kde/ » et pour tous les utilisateurs, elle est dans « /usr/ »</p>

<p class="spip">Chaque dossier et sous-dossier, contient un fichier .directory indiquant entre-autre le nom du menu et l’icône de celui-ci.</p>

<p class="spip">Le fichier « <strong class="spip"> /.config/menus/applications-kmenuedit.menu</strong> » permet de déplacer, d’ajouter ou d’enlever des menus à l’arborescence par défaut. Cet exemple montre comment supprimer l’entrée « Debian » :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code><!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"<br />
"http://www.freedesktop.org/standards/menu-spec/1.0/menu.dtd"><br />
<Menu><br />
  <Menu><br />
  <Name>Debian</Name><br />
  <Deleted/><br />
 </Menu><br />
</Menu></code></div>
<h2>Exemple d’entrée de menu ajoutée à la racine du menu K</h2>
<br /><li> /usr/share/applications/AS400.desktop
<br /><li>  /.local/share/applications/AS400.desktop
<div style='text-align: left;' class='spip_code' dir='ltr'><code>[Desktop Entry]<br />
Comment=<br />
Exec=konsole --profile Profil-AS400<br />
GenericName=<br />
Icon=alevt<br />
Name=AS400<br />
Path=<br />
StartupNotify=false<br />
Terminal=0<br />
TerminalOptions=<br />
Type=Application<br />
X-KDE-SubstituteUID=false<br />
X-KDE-Username=<br />
<br />
Categories=Qt;KDE;Core;<br />
OnlyShowIn=KDE;</code></div>
<h2>Actualisation des modifications</h2>
<p class="spip">En fonction du type de la modification, le résultat est immédiat ou apparaît seulement à la prochaine connexion de KDE. Pour éviter de se déconnecter, il faut lancer les commandes suivantes en tant que simple utilisateur :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>$ update-menus<br />
$ kbuildsycoca</code></div>
<p class="spip">Informations sur kbuildsycoca :
<br /></p>
<li> <a href="http://developer.kde.org/documentation/library/kdeqt/kde3arch/ksycoca.html" class="spip_out">http://developer.kde.org/documentation/library/kdeqt/kde3arch/ksycoca.html</a>
<h2>Ajout d’un nouveau menu</h2>
<p class="spip">Pour ajouter un menu pour tous les utilisateurs, il faut placer le fichier « test.menu » ci-dessous dans l’un des dossiers suivants :
<br /></p>
<li> /etc/xdg/menus/applications-merged
<br /><li>  /.config/menus
<div style='text-align: left;' class='spip_code' dir='ltr'><code><!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu<br />
1.0//EN""http://www.freedesktop.org/standards/menu-spec/1.0/menu.dtd"><br />
<Menu><br />
<Name>Applications</Name><br />
  <Menu><br />
    <Name>Test Menu</Name><br />
    <Directory>testmenu.directory</Directory><br />
    <Include><br />
    <Category>testmenu</Category><br />
    </Include><br />
  </Menu><br />
</Menu></code></div>
<p class="spip"><strong class="spip">Astuce </strong> : Pour créer ce fichier automatiquement, il est possible d’utiliser KMenuEdit, est de créer le menu. KMenuEdit, va créer (ou modifier) le fichier «  /.config/menus », qu’il suffira de déplacer dans « /etc/xdg/menus/applications-merged » pour qu’il soit valable pour les utilisateurs</p>

<h2>Supprimer une entrée de menu</h2>
<p class="spip">Pour supprimer par exemple l’entrée « Science et mathématiques », il faut placer le fichier « test.menu » ci-dessous dans l’un des dossiers suivants :
<br /></p>
<li> /etc/xdg/menus/applications-merged
<br /><li>  /.config/menus
<div style='text-align: left;' class='spip_code' dir='ltr'><code><!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"<br />
"http://www.freedesktop.org/standards/menu-spec/1.0/menu.dtd"><br />
<Menu><br />
 <Menu><br />
  <Name>Science</Name><br />
  <Deleted/><br />
 </Menu><br />
</Menu></code></div>
<h2>Ajouter un nouveau menu et supprimer un menu existant</h2>
<p class="spip">Le fichier ci-dessous est la combinaison des deux fichiers précédents :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code><!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"<br />
"http://www.freedesktop.org/standards/menu-spec/1.0/menu.dtd"><br />
<Menu><br />
<Name>Applications</Name><br />
  <Menu><br />
   <Name>Test Menu</Name><br />
    <Directory>testmenu.directory</Directory><br />
    <Include><br />
    <Category>testmenu</Category><br />
    </Include><br />
  </Menu> <br />
  <Menu><br />
    <Name>Science</Name><br />
    <Deleted/><br />
  </Menu><br />
</Menu> </code></div>
<h2>Création du menu « Programmes » et déplacement des menus « Science » et « Office » à l’intérieur</h2>
<div style='text-align: left;' class='spip_code' dir='ltr'><code><!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"<br />
"http://www.freedesktop.org/standards/menu-spec/1.0/menu.dtd"><br />
<Menu><br />
 <Menu><br />
  <Name>Programmes</Name><br />
 </Menu><br />
 <Move><br />
  <Old>Science</Old><br />
  <New>Programmes/Science</New><br />
 </Move><br />
 <Move><br />
  <Old>Office</Old><br />
  <New>Programmes/Office</New><br />
 </Move><br />
</Menu></code></div>
<p class="spip">La même chose en plus court et plus lisible :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code><!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"<br />
"http://www.freedesktop.org/standards/menu-spec/1.0/menu.dtd"><br />
<Menu><br />
 <Menu> <Name>Mes Programmes</Name> </Menu><br />
 <Move> <Old>Science</Old> <New>Mes Programmes/Science</New>  </Move><br />
 <Move> <Old>Office</Old>  <New>Mes Programmes/Office</New>   </Move><br />
</Menu></code></div>
<p class="spip">Création de deux sous-menus et déplacement de deux menus :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code><!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"<br />
"http://www.freedesktop.org/standards/menu-spec/1.0/menu.dtd"><br />
<Menu><br />
 <Menu> <Name>Mes Programmes</Name> </Menu><br />
 <Menu> <Name>Autres Programmes</Name> </Menu><br />
 <Move> <Old>Science</Old> <New>Mes Programmes/Science</New>  </Move><br />
 <Move> <Old>Office</Old>  <New>Autres Programmes/Office</New>   </Move><br />
</Menu></code></div>
<h2>Structure des menus avant KDE 3.2</h2>
<p class="spip">Cette structure de fichiers utilisé par KDE avant la version 3.2 n’est pas normalisée par « freedesktop » mais elle est toujours utilisable pour des raisons de compatibilités avec les anciennes applications.</p>

<p class="spip">La définition des entrées de ces menu est dans :
<br /></p>
<li>  /.kde/share/applnk/
<br /><li> ou /usr/share/applnk/
<p class="spip"><strong class="spip">Remarque</strong> : Le menu placé dans l’arborescence utilisateur à priorité sur le menu général en cas de conflit. Autrement les deux arborescences se complètent.</p>

<p class="spip">Voici la structure des menus :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>/usr/share/applnk/<br />
  .hidden                  -> Contient les entrèes des menus cachés  Dossier 1                -> Menu 1<br />
    .directory             -> Définition du menu<br />
    application1.desktop   -> Définiton de l'entrèe de menu pour application1<br />
    application2.desktop   -> Définiton de l'entrèe de menu pour application2<br />
  Dossier 2  -> Menu 2<br />
    ..  </code></div>
<p class="spip">Dés qu’un fichier ou un dossier est créé dans cette arborescence la mise à jour est immédiate.</p>

<p class="spip">Par contre en cas de modification d’un fichier existant, il est nécessaire de lancer cette commande pour voire les modifications :</p>

<p class="spip"><code class='spip_code' dir='ltr'>$ kbuildsycoca</code></p>

<p class="spip"><strong class="spip">Remarques</strong> : 
<br /></p>
<li> Ces entrées de menus n’ont pas besoins de fichier « .menu » pour fonctionner
<br /><li> A priori, ce mode de création des menus est peu (ou plus) utilisé par les nouvelles applications
<h2>Recherche de fichiers</h2>
<p class="spip">L’une des principales difficultés rencontré pour configurer les fichiers est de retrouver le bon fichier .desktop, .directory ou .menu sachant que le nom du fichier peut-être différent du nom du menu.</p>

<p class="spip">Pour cela, il est utile de connaître quelques commandes de recherches :</p>

<p class="spip">Liste des fichiers dont le contenu contient le motif indiqué dans le dossier indiqué :</p>

<p class="spip"><code class='spip_code' dir='ltr'>grep -ril pdf /usr/share/*</code></p>

<p class="spip">Rechercher un fichier se terminant par « desktop » dans le dossier indiqué :</p>

<p class="spip"><code class='spip_code' dir='ltr'>find /usr/share -iname '*desktop'</code></p>

<p class="spip">Rechercher dans la base de données initialisée par « updatedb » les fichiers contenant « desktop » :</p>

<p class="spip"><code class='spip_code' dir='ltr'>locate -i desktop</code></p>

<p class="spip">Recherche les fichiers contenant tous les termes indiqués :</p>

<p class="spip"><code class='spip_code' dir='ltr'>locate -i -A desktop pdf</code></p>

<h2>Autre lien</h2>
<p class="spip">Les menu de freedesktop :
<br /></p>
<li> <a href="http://standards.freedesktop.org/menu-spec/menu-spec-latest.html" class="spip_out">http://standards.freedesktop.org/menu-spec/menu-spec-latest.html</a>
<h2>Historique des modifications</h2>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Version</strong></th><th scope='col'><strong class="spip">Date</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>0.1</td><td>23/06/06</td><td>Création par Tony GALMICHE</td></tr>
<tr class="row_odd"><td>0.3</td><td>22/06/08</td><td>Mise en ligne</td></tr>
</tbody>
</table>