<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/28"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/28/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/28/atom/feed</id>
  <updated>2008-02-12T10:53:54+01:00</updated>
  <entry>
    <title>Tenter de maîtriser les menus KDE</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/28" />
    <id>http://artisan.karma-lab.net/node/28</id>
    <published>2005-12-19T00:21:48+01:00</published>
    <updated>2008-02-12T10:53:54+01:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Le Bureau" />
    <category term="Aucun" />
    <category term="OK" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
  Il y a souvent sous KDE des soucis de menus. Entrées en double, ou qui disparaissent. Ce qui suit est une compile de ce que j'ai testé avec plus ou moins de succès.
</p>

<p>
  Tout d'abord la base. Comme souvent, il n'y a pas un mais deux systèmes de menus sous linux. L'un est d'origine conjointe Debian/freedesktop.org et l'autre propre à KDE.
</p>    ]]></summary>
    <content type="html"><![CDATA[<p>
  Il y a souvent sous KDE des soucis de menus. Entrées en double, ou qui disparaissent. Ce qui suit est une compile de ce que j'ai testé avec plus ou moins de succès.
</p>

<p>
  Tout d'abord la base. Comme souvent, il n'y a pas un mais deux systèmes de menus sous linux. L'un est d'origine conjointe Debian/freedesktop.org et l'autre propre à KDE.
</p><!--break-->


	<a name='chapter_1'></a>
  <h2>Fonctionnement d'origine des menus KDE</h2>
	
<p>
  L'idée est qu'avant kde 3.2, il n'y avait pas de système unifié pour les menus. Gnome avait son système, Kde aussi. Pour KDE, les menus étaient stockés de manière arborescente dans <kbd>/usr/share/applnk</kbd> (ou <kbd>$HOME/.kde/share/applnk</kbd>). Un fichier <kbd>.desktop</kbd> correspondant à une application, les sous dossiers aux sous-menus.
</p>


	<a name='chapter_2'></a>
  <h2>Normalisation des menus xdg</h2>
	
<p>
  Le groupe de travail freedesktop.org a donc travaillé sur la spécification d'un menu unifié (menus dits XDG). La structure est maintenant stockée dans un fichier <kbd>.menu</kbd> comprenant l'arborescence et chaque entrée correspond à un fichier .desktop (comme pour kde). par exemple :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="sc3"><span class="re1">&lt;menu<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;name<span class="re2">&gt;</span></span></span>monDossier<span class="sc3"><span class="re1">&lt;/name<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;directory<span class="re2">&gt;</span></span></span>monDossier.directory<span class="sc3"><span class="re1">&lt;/directory<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;include<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;filename<span class="re2">&gt;</span></span></span>application1.desktop<span class="sc3"><span class="re1">&lt;/filename<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;filename<span class="re2">&gt;</span></span></span>application2.desktop<span class="sc3"><span class="re1">&lt;/filename<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/include<span class="re2">&gt;</span></span></span><br />
&nbsp; <span class="sc3"><span class="re1">&lt;/menu<span class="re2">&gt;</span></span></span>
  </div>
  
  </div>
</p>
<p>
  Les fichiers <kbd>.menus</kbd> sont stockés dans le chemin contrôlé par la variable <kbd>$XDG_CONFIG_DIRS</kbd> (généralement <kbd>$KDEDIR/etc/xdg/menus</kbd> et <kbd>/etc/xdg/menus</kbd>). La version utilisateur est quant à elle placée dans <kbd>$XDG_CONFIG_HOME</kbd> (<kbd>$HOME/.config/menus</kbd>).</p>
    
<p>
  Les fichiers <kbd>.desktop</kbd> sont stockés dans le chemin contrôlé par la variable <kbd>$XDG_DATA_DIRS</kbd> (généralement <kbd>$KDEDIR/share/applications</kbd>, <kbd>/usr/share/applications</kbd>, <kbd>/usr/local/share/applications</kbd>). La version utilisateur se trouve dans <kbd>$XDG_DATA_HOME</kbd> (<kbd>$HOME/.local/applications</kbd>)
</p>

<p>
  Les fichiers <kbd>.directory</kbd> décrivant les sous menus sont contrôlé par les mêmes variables que les <kbd>.desktop</kbd> ou le cas échéant dans les dossiers <kbd>$KDEDIR/share/desktop-directories</kbd>, <kbd>/usr/share/desktop-directories</kbd>, <kbd>/usr/local/share/desktop-directories</kbd> et <kbd>$HOME/.local/desktop-directories</kbd> pour l'utilisateur.
</p>
    

	<a name='chapter_3'></a>
  <h2>Reconstruction des menus par défaut</h2>
	
<p>
  Pour faire simple on va commence par "sanifier" les menus communs à tous (il faut être root).
</p>
<p>
  Lors de l'installation d'un pacquage, les entrées de menus associés aux applications sont présente dans un fichier à un format spécial. Ce fichier est copié en <kbd>/usr/lib/menu</kbd>.
</p>
<p>
  Prenons l'exemple du pacquage <kbd>synce</kbd> qui contient une définition de menus stocké dans le fichier <kbd>/usr/lib/menu/synce-software-manager</kbd>. Son contenu est le suivant :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  ?package(synce-software-manager): needs=&quot;x11&quot; section=&quot;More Applications/Communications&quot; title=&quot;Synce-software-manager&quot; longtitle=&quot;Software manager for WinCE devices&quot; command=&quot;synce-software-manager&quot; icon=&quot;communications_section.png&quot;
  </div>
  
  </div>
</p><p>
  Cela donne toutes les infos concernant l'appli, ainsi que la dépendance avec X11. Une fois le fichier copié du RPM par rpm/urpmi, le script d'installer du rpm va fabriquer l'entrée de menu à partir de ce fichier. Pour se faire, il va exécuter l'outil Debian <kbd>update-menus</kbd>.
</p>
    
<p>
  Cet utilitaire a pour objectif de scanner tous les fichiers <kbd>/usr/lib/menu</kbd> et fabriquer pour chaque entrée un fichier menu au norme FreeDesktop.org (fichier .desktop) qu'il va déplacer en <kbd>/var/lib/menu-xdg/applications/Mandrakelinux</kbd> (spécifique à la drake mais les autres distro devraient retrouver leurs petits). L'utilitaire va créer, si nécessaire, les sous dossier correspondant à l'entrée "section" du précédent fichier de package. Cette arborescence est celle que l'on retrouve dans nos menus KDE, Gnome, etc...
</p>
    
<p>
  <kbd>update-menus</kbd> ne se limite pas à cela, il va aussi lancer des scriptes pour chaque fichier de définition de package. Ces traitements sont assurés par en exécutant séquentiellement tout script contenu dans <kbd>/etc/menu-methods</kbd>. On trouvera par exemple dans ce dossier les scriptes créant des structures de menus pour <kbd>enlightenment</kbd> (s'il est installé).
</p>
    
<p>
  Enfin, <kbd>update-menus</kbd> va retrier les entrées de package afin de pouvoir ranger les menus (les fichiers .desktop) dans d'autres sections que celles que prévues par les concepteurs du package. Si l'on décide par exemple de déplacer tous les <kbd>Autres bureautique/traitement de texte</kbd> et <kbd>traitement de textes</kbd>. Le fichier de paramétrage des traductions de section étant assuré par le fichier <kbd>/etc/menu-methods/translate-menus</kbd>.
</p>
    
<p>
  Dans tous les cas faire un <kbd>man update-menus</kbd> pour plus d'infos sur le sujet.
</p>
    
<p>
  Voilà donc comment les menus apparaissent dans kde à chaque installation de package. Maintenant donc, rien ne nous empêche si les choses vont mal de lancer <kbd>update-menus</kbd> à la main. Pour cela, il suffit de taper :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  update-menus -n -v
  </div>
  
  </div>
</p><p>
  Pour info, -n implique un lancement synchrone (ne rendant la main qu'à la fin du traitement) et -v pour afficher le travail effectué. On peut aussi spécifier -d pour une sortie de debuggage.
</p>
    
<p>
  Il suffit ensuite de vérifier que les menus sont bien générés en <kbd>/var/lib/menu-xdg/applications/Mandrakelinux</kbd>.
</p>
    
<p class="note">
  Dés fois, les menus n'apparaissent toujours pas dans le dossier menu-xdg, il s'agit alors peut-être d'une erreur dans la définition de menus du package. J'ai eu un cas comme cela avec le package OpenOffice 1.9 de thac. Le fichier <kbd>/usr/lib/menu/OpenOffice</kbd> semblait bon et j'ai galèrer pendant un certain temps avant de me décifer à replacer les <kbd>package(OpenOffice)</kbd> par des <kbd>package(menu)</kbd> (pourquoi ?!?) et là, au <kbd>update-menus</kbd> suivant tout c'est bien passé.
</p>
    
<p>
  D'un point de vue utilisateur, <kbd>update-menus</kbd> effectue le même travail qu'au niveau root mais se base en plus sur les dossiers locaux au compte (~/.menu). Cela permet d'altérer la config de base pour des besoins spécifiques.
</p>
    

	<a name='chapter_4'></a>
  <h2>Les menus dans KDE</h2>
	
<p>
  Avant l'apparition des menus freedesktop.org, kde avait déjà son propre système de menus. Les menus par défaut, étaient stockés dans <kbd>/usr/share/applnk</kbd> (et ensuite l'arborescence des menus) puis ceux de l'utilisateur dans <kbd>~/.kde/share/applnk</kbd>. J'avoue ne pas bien avoir compris comment kde arbitre aujourd'hui entre freedesktop et applnk, c'est encore assez obscure (est-ce que <kbd>update-menus</kbd> a un scripte dans "menu-methods" qui généré les menus kde et qui m'aurait échappé ? Le script <kbd>menu</kbd> peut-être ?).
</p>
<p class="note">
  Il est possible de recharger les menus de kde sans avoir à relance. Il suffit pour cela de lancer la commande <kbd>kbuildsycoca</kbd> et pour réinitialiser le kicker <kbd>dcop kicker kicker restart</kbd>.
</p>
    

	<a name='chapter_5'></a>
  <h2>Spécificités Mandrake</h2>
	
<p
  >Tout d'abord, mandrake a mis en place un système de menus simplifiés qui complique un peu tout. Du coup il y a 3 systèmes de menu sous mdk, normal, simplifié et complet. Les deux derniers sont gérés par <kbd>menudrake</kbd>. Le passage d'un type de menu à l'autre est géré par la présence de :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="re1">$HOME</span><span class="sy0">/</span>.menu<span class="sy0">/</span>enable_mdk_customization<br />
<span class="re1">$HOME</span><span class="sy0">/</span>.menu<span class="sy0">/</span>enable_simplified<br />
<span class="sy0">/</span>etc<span class="sy0">/</span>menu<span class="sy0">/</span>disable_mdk_customization<br />
<span class="re1">$HOME</span><span class="sy0">/</span>.menu<span class="sy0">/</span>disable_mdk_customization<br />
<span class="sy0">/</span>etc<span class="sy0">/</span>menu<span class="sy0">/</span>enable_simplified
  </div>
  
  </div>
</p><p>  
  En gros, c'est un joli bazar géré par le scripte <kbd>/etc/profile.d/menu-xdg.sh</kbd>
</p>

<p>
  On comprend alors que le menu standard et simplifié de mandrake sont en fait deux versions de menus type XDG et que sinon, ce sont les menus kde qui priment (/usr/share/applnk).
</p>

<p>
  Pour utiliser les menus kde, il suffira donc de renomer en .old le scripte menu-xdg.sh. Et pour utiliser les menus xdg standard, on remplacera ce scripte par :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co0">#! /bin/sh</span><br />
<br />
<span class="kw3">export</span> <span class="re2">XDG_CONFIG_DIRS=</span><span class="st0">&quot;/var/lib/menu-xdg&quot;</span><br />
<span class="kw3">export</span> <span class="re2">XDG_DATA_DIRS=</span><span class="st0">&quot;/var/lib/menu-xdg:/usr/share&quot;</span>
  </div>
  
  </div>
</p>


	<a name='chapter_6'></a>
  <h2>Un petit script pour remettre de l'ordre</h2>
	
<p>
  Le premier scripte est à lancer en tant que root. Le second en tant qu'utilisateur (dans konsole avec kde lancé !!). Ils reprennent toutes les étapes expliquées dans ce tuto.
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co0">#! /bin/sh</span><br />
<br />
<span class="re2">XDG_MENU=</span><span class="sy0">/</span>etc<span class="sy0">/</span>profile.d<span class="sy0">/</span>menu-xdg.<a target="blank" href="http://pwet.fr/man/linux/commandes/sh"><span class="kw2">sh</span></a><br />
<span class="kw3">echo</span> <span class="st0">&quot;#! /bin/sh&quot;</span> <span class="sy0">&gt;</span> <span class="re1">$XDG_MENU</span><br />
<span class="kw3">echo</span> <span class="st0">&quot;export XDG_CONFIG_DIRS=&quot;</span><span class="sy0">/</span>var<span class="sy0">/</span>lib<span class="sy0">/</span>menu-xdg<span class="st0">&quot;&quot;</span> <span class="sy0">&gt;&gt;</span> <span class="re1">$XDG_MENU</span><br />
<span class="kw3">echo</span> <span class="st0">&quot;export XDG_DATA_DIRS=&quot;</span><span class="sy0">/</span>var<span class="sy0">/</span>lib<span class="sy0">/</span>menu-xdg:<span class="sy0">/</span>usr<span class="sy0">/</span>share<span class="st0">&quot;&quot;</span> <span class="sy0">&gt;&gt;</span> <span class="re1">$XDG_MENU</span><br />
<span class="kw3">echo</span> <span class="st0">&quot;rm -rf /etc/menu-methods/simplified&quot;</span> <span class="sy0">&gt;&gt;</span> <span class="re1">$XDG_MENU</span><br />
<span class="kw3">echo</span> <span class="st0">&quot;mkdir /etc/menu-methods/simplified&quot;</span> <span class="sy0">&gt;&gt;</span> <span class="re1">$XDG_MENU</span><br />
<br />
<span class="co0"># réinitialisation des menus</span><br />
update-menus -d -v -n
  </div>
  
  </div>
</p><p>  
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co0">#! /bin/sh</span><br />
<br />
<span class="co0"># fonction de réinitialisation de l'utilisateur</span><br />
<span class="kw3">cd</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> -rf .<span class="kw3">local</span><span class="sy0">/</span>share<span class="sy0">/</span>applications<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> -rf .menu<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> -rf .menu-updates.stamp<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> -rf .config<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> -rf .kde<span class="sy0">/</span>share<span class="sy0">/</span>applnk<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> -rf .kde<span class="sy0">/</span>share<span class="sy0">/</span>mimelnk<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> -rf .kde<span class="sy0">/</span>share<span class="sy0">/</span>services<br />
<br />
<span class="co0"># important sinon, tout part en vrille dans kcontrol (et aussi dans les menus)</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/mkdir"><span class="kw2">mkdir</span></a> -p .kde<span class="sy0">/</span>share<span class="sy0">/</span>applnk<span class="sy0">/</span>Settings<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/mkdir"><span class="kw2">mkdir</span></a> -p .kde<span class="sy0">/</span>share<span class="sy0">/</span>applnk<span class="sy0">/</span>Settingsmenu<br />
<br />
<span class="co0"># Ce hack semble utile pour la mdk 10.1/kde 3.4 (thac) sinon, l'utilisateur n'a plus de menus !!</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/mkdir"><span class="kw2">mkdir</span></a> .<span class="kw3">local</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/ln"><span class="kw2">ln</span></a> -s <span class="sy0">/</span>var<span class="sy0">/</span>lib<span class="sy0">/</span>menu-xdg<span class="sy0">/</span>applications<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/ln"><span class="kw2">ln</span></a> -s <span class="sy0">/</span>var<span class="sy0">/</span>lib<span class="sy0">/</span>menu-xdg<span class="sy0">/</span>desktop-directories<br />
<br />
<span class="co0"># réinitialisation de kde</span><br />
kbuildsycoca<br />
<br />
<span class="co0"># réinitialisation du kicker</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/dcop"><span class="kw2">dcop</span></a> kicker kicker restart
  </div>
  
  </div>
</p><p>
  Normalement, tout est maintenant en ordre.
</p>

    
    ]]></content>
  </entry>
</feed>
