Einrichtungsdateien und Menüaufbau für Desktop-Umgebungen nach freedesktop.org

Diese Seite versucht die Funktionsweise und den Aufbau der Menüstruktur und der Einrichtungsdateien (sogenannte Starter) bei Desktop-Umgebungen, die nach den Standards von freedesktop.org aufgebaut sind, so einfach wie möglich zu beschreiben. Im Wesentlichen wird hier auf Xfce eingegangen. Die Ausführungen lassen sich aber auf die anderen Desktop-Umgebungen übertragen. Nur wo es gravierende Unterschiede gibt, werde ich explizit näher darauf eingehen. Ich halte mich dabei weitestgehend an die Spezifikationen von freedesktop.org, jedoch soll diese Seite weder eine Übersetzung der Spezifikationen noch ein kompletter Abriss dieser sein. Es wird nur auf die grundlegendsten Dinge eingegangen. Weiterführende Details sind unter den angeführten Links nachlesbar.

Einrichtungsdateien

Die Einrichtungsdateien sind Dateien, die Informationen zu einer Anwendung wie z. B. Name, Symbol und Beschreibung enthalten. Diese Dateien werden zum Erstellen des Anwendungsmenüs und zum Starten der Anwendung verwendet. Die Einrichtungsdateien haben die Erweiterung .desktop und sind reine Textdateien. Zeilen, die mit einer Raute # beginnen oder Leerzeilen werden als Kommentar gewertet. Der Aufbau ist in Gruppen gegliedert, wobei der Gruppen-Eintrag in eckige Klammern geschlossen wird. Innerhalb der jeweiligen Gruppe folgt der Aufbau dem Prinzip Schlüsselname=Wert. Das Eingangs-Format für eine Einrichtungsdatei ist immer die Gruppe [Desktop Entry] Beispiel:

[Desktop Entry]
Schlüsselname_1=Wert1
Schlüsselname_2=Wert2
[Gruppe_x]
Schlüsselname_3=Wert3

Unterhalb des Gruppeneintrags müssen mindestens zwei Schlüssel stehen - Type und Name. Alle anderen Schlüssel sind optional, die Verwendung wird aber empfohlen um die volle Funktionalität sicher zu stellen. Die Schlüssel sind im Einzelnen:

Type - beschreibt den Typ der Einrichtungsdatei (Application, Link oder Directory)

Version - die Version der Spezifikation derzeit 1.0

Name - der Name der Anwendung z.B. Mozilla

GenericName - allgemeiner oder typischer Name der Anwendung z.B. Webbrowser

NoDisplay - bedeutet, die Anwendung existiert, wird aber nicht in Menüs angezeigt. Dies ist nützlich um z.B. Anwendungen mit MIME-Typen zu verknüpfen, ohne einen Menüpunkt zu erstellen, Beispiel evince und PDF

Comment - der angezeigte Tooltipp zur Anwendung z.B. "zeigt Internetseiten an"

Icon - das verwendete Icon, entweder als kompletter Pfad oder nur als Name, dann wird erst $XDG_DATA_DIRS/icons dann /usr/share/pixmaps durchsucht

OnlyShowIn - eine Liste von Desktop-Umgebungen, in der die Einrichtungsdatei angezeigt werden soll (GNOME, KDE, ROX, XFCE oder Old)

NotShowIn - das Gegenteil von OnlyShowIn, wobei nur einer der beiden Schlüssel in einer Gruppe stehen darf

TryExec - der Name eines ausführbaren Programms, das installiert sein muss. Ist es nicht installiert, wird der Eintrag nicht in Menüs angezeigt

Exec - das Programm, das ausgeführt werden soll, mit all seinen möglichen Argumenten

Path - ist die Einrichtungsdatei vom Typ Application, so ist dies das Arbeitsverzeichnis, in dem die Anwendung gestartet wird

Terminal - bestimmt, ob das Programm in einem Terminalfenster ausgeführt werden soll

MimeType - MIME-Typen, die von dieser Anwendung unterstützt werden

Categories - Kategorien in welchen der Eintrag in Menüs angezeigt werden soll

URL - ist die Einrichtungsdatei vom Typ Link, die URL des Zieles

Praxisbeispiele für Einrichtungsdateien

1.Beispiel: Wir müssen öfter mit einem Windows-System in einer Virtuellen Maschine arbeiten, haben es aber satt immer erst VirtualBox auf zu rufen, dann die Virtuelle Maschine auszuwählen und zu starten. Ein Klick auf ein Icon auf dem Desktop würde doch viel schneller gehen. Dafür erstellen wir uns eine Einrichtungsdatei mit folgendem Inhalt:

[Desktop Entry]
Version=1.0
Encoding=UTF-8
Type=Application
Name=Windows 2000
GenericName=Windows 2000
Comment=Windows 2000 starten
Icon=virtualbox
Exec=virtualbox --startvm "Windows 2000"
Terminal=false
StartupNotify=true

Unsere virtuelle Maschine in VirtualBox hat den Namen Windows 2000. Diesen übergeben wir mit dem Parameter --startvm an VirtualBox. Da der Name ein Leerzeichen enthält, muss er in Gänsefüßchen gesetzt werden. Die Datei speichern wir unter einem aussagekräftigen Namen mit der Endung .desktop in unserem Home-Verzeichnis im Desktop-Ordner. Jetzt steht dem Ein-Klick-Start von Windows nichts mehr im Wege.

2.Beispiel: Wir wollen mit einem Klick sehen, wieviel Aufträge noch in der Druckerwarteschlange hängen - zugegeben vielleicht etwas weit hergeholt. Die zugehörige Einrichtungsdatei könnte so aussehen:

[Desktop Entry]
Version=1.0
Encoding=UTF-8
Type=Application
Name=Druckaufträge
Comment=Druckerwarteschlange
Exec=midori http://localhost:631/jobs/
Icon=midori
Terminal=false
StartupNotify=true

Midori ist hier der verwendete Webbrowser, weil er schneller ist als alle anderen. Auch diese Datei speichern wir unter einem aussagekräftigen Namen im Desktop-Ordner unseres Heimatverzeichnisses.

3.Beispiel: Wir wollen das Senden-an-Menü von Thunar erweitern. Der Dateimanager Thunar besitzt ein Senden-an-Kontextmenü, welches ebenfalls mit den hier beschriebenen Einrichtungsdateien arbeitet. Diese sind im Verzeichnis /usr/share/thunar/sendto/ gespeichert. Wenn wir dort Einrichtungsdateien anlegen oder ändern, müssen wir natürlich als Root arbeiten, da wir als normaler User keine Schreibberechtigung haben. Als erstes sehen wir uns mal den Menüpunkt Printer an. An sich eine feine Sache, mit einem Rechtsklick ein Dokument an den Drucker zu schicken ohne vorher ein Programm zu öffnen. Der Menüpunkt hat zwei entscheidende Nachteile. Er schickt das Dokument nicht direkt an den Drucker, sondern öffnet nur den Druckdialog xfprint4. Dort muss ich dann erst den Drucker auswählen. Das sind schon wieder zwei Mausklicks zuviel. Wer noch dazu ein Office-Dokument auf diese Weise ausdrucken will, wird nicht das bekommen, was er erwartet, sondern eine Flut von Papier mit irgendwelchen Steuerzeichen. Wer noch Schmierpapier rum zu liegen hat, kann das gerne mal probieren. Ich empfehle aber ein Office-Dokument mit wenig Text zu nehmen.

Machen wir uns also daran, das Kontextmenü so anzupassen, dass man damit arbeiten kann. Als erstes erstellen wir eine Einrichtungsdatei für alle einfachen Dokumente. Diese könnte so aussehen:

[Desktop Entry]
Type=Application
Name=Drucker HPSlug
Exec=/usr/bin/lp -d HPSlug %f
Icon=printer
MimeTypes=application/pdf;text/plain;text/x-log;text/richtext;text/html;application/x-shellscript

Der auszuführende Befehl lautet hier /usr/bin/lp, der Parameter -d übergibt den Namen der Druckerwarteschlange, hier HPSlug, und die Variable %f enthält das zu druckende Dokument. Durch die MimeType-Definitionen schränken wir die Anzeige des Menüpunktes auf die angegebenen Dokument-Typen ein. Nach dem Speichern der Datei und einem Neustart von Thunar steht uns der neue Menüeintrag im Senden-an-Menü zur Verfügung.

Um Office-Dokumente auf diese Art direkt an den Drucker zu schicken, müssen wir uns eine andere Einrichtungsdatei erstellen.

[Desktop Entry]
Type=Application
Name=Office-Drucker HPSlug
Exec=/usr/bin/libreoffice -pt HPSlug %f
Icon=printer
TryExec=/usr/bin/libreoffice
MimeTypes=application/msword;application/msexcel;application/mspowerpoint;application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.spreadsheet

Der auszuführende Befehl lautet hier /usr/bin/libreoffice, der Parameter -pt übergibt die Druckerwarteschlange und die Variable %f enthält das zu druckende Dokument. Die Dokumenttypen sind auf Office-Dokumente beschränkt. Beim Klick auf den neuen Menüpunkt öffnet LibreOffice das Dokument, schickt es direkt zum Drucker und beendet sich sofort wieder. Benutzer von OpenOffice können übrigens die Einrichtungsdatei nach Anpassung der Befehlszeile ebenso benutzen.

Auf die gleiche Art und Weise kann man jetzt noch Menüpunkte für alle anderen installierten Drucker erstellen, man muss nur den Namen der Druckerwarteschlange in den Einrichtungsdateien anpassen.

In Thunar können übrigens, neben dem Senden-an-Menü auch noch andere benutzerdefinierte Aktionen erstellt werden. Die Erstellung selbst ist recht simpel (Menü Bearbeiten - Benutzerdefinierte Aktionen ...), gespeichert wird alles in einer XML-Datei im Heimatverzeichnis unter .config/Thunar/uca.xml.

Benutzer von Nautilus können zwar das Senden-an-Menü auch erweitern, die Organisation erfolgt hier aber nicht mit Einrichtungsdateien, sondern in einer xml-Datei /usr/share/nautilus-sendto/ui/nautilus-sendto.ui. Hier empfehle ich die Installation des Paketes nautilus-actions, mit dem sich auf einfache Weise solche benutzerdefinierten Aktionen erstellen lassen.

Benutzer von KDE3 und des Konquerors speichern die Einrichtungsdateien für die Kontextmenüs unter /usr/share/apps/konqueror/servicemenus/.

Für Benutzer von KDE4 und Konqueror oder Dolphin als Dateimanager können die Einrichtungsdateien entweder nur für den Benutzer in seinem Home-Verzeichnis unter ~/.kde/share/kde4/services/Servicemenus/ oder für alle Benutzer unter /usr/share/kde4/services/ServiceMenus/ gespeichert werden.

Menüaufbau

Das Aussehen des Anwendungsmenüs wird in einer XML-Datei festgelegt. Bei Xfce ist es die Datei /etc/xdg/menus/xfce-applications.menu, bei Gnome /etc/xdg/menus/gnome-application.menu. Schauen wir uns stellvertretend einmal die Datei für das Xfce-Menu genauer an. Damit ich hier auf diese Seite nicht endlose Code-Schnipsel einstellen muss, habe ich eine mit Kommentaren versehene Datei zum Download bereitgestellt. Die Kommentare werden natürlich zum Ende hin immer spärlicher, da sich ja die Menüpunkte doch immer wieder gleichen. Um die Kommentare besser vom eigentlichen Text unterscheiden zu können, empfehle ich einen Editor mit Syntaxhervorhebung, z.B. Geany. In Geany muss dann nur der entsprechende Dokumenttyp eingestellt werden.

Nun aber zur Datei selbst. Das gesamte Menu wird hier durch das Menu-Tag eingeschlossen, wir bewegen uns hier auf der ersten Ebene des Anwendungsmenus. Jedes Menu-Tag muss durch ein Name-Tag eindeutig identifizierbar sein. Innerhalb des Layout-Tags wird das Aussehen dieser ersten Ebene festgelegt. Hier finden wir also alle Einträge der ersten Ebene wieder. Direkte statische Verweise auf Programmstarter wie Terminal oder Webbrowser (Filename-Tag), Untermenüpunkte für Einstellungen (Menuname-Tag) und dynamisch zu erstellende Untermenüs (Merge-Tag). Durch Merge werden alle folgenden Menu-Tags nacheinander durchlaufen, die darin enthaltenen Kategorien ausgelesen, die Programmstarter daraufhin verglichen und bei Übereinstimmung ein entsprechender Menüeintrag angelegt. Jetzt tauchen bestimmt jede Menge Fragen auf.

Warum gibt des den Menüpunkt "Andere" oder "Entwicklung" bei mir nicht?
Warum sehe ich das Untermenü "Bildschirmschoner" nicht?

Der Grund ist ganz einfach. Ein dynamisches Menü oder Untermenü wird nur angelegt, wenn es auch einen Starter/eine Einrichtungsdatei gibt, die den entsprechenden Categories-Eintrag hat. Ein leeres Menü anzulegen macht keinen Sinn.

Warum wird z.B. LibreOffice-Draw sowohl im Menü Büro als auch im Menü Grafik angezeigt?

In der Einrichtungsdatei /usr/share/applications/libreoffice-draw.desktop sind sowohl die Kategorie Office als auch Graphics festgelegt.

Was fangen wir jetzt mit unserem ganzen Wissen an?

Praktische Anwendung

Vorab: Ich übernehme keinerlei Haftung für entstandene Schäden an einem bestehenden System durch die Anwendung der folgenden Ausführungen.

Um das Gesamtsystem und andere Benutzer nicht zu beeinträchtigen kopieren wir uns die Menü-Dateien und die Einrichtungsdateien in unser Heimatverzeichnis.

cp /etc/xdg/menus/*.menu /home/${USERNAME}/.config/menus/
cp -rL /usr/share/applications/* /home/${USERNAME}/.local/share/applications/
mkdir /home/${USERNAME}/.local/share/desktop-directories
cp -rL /usr/share/desktop-directories/* /home/${USERNAME}/.local/share/desktop-directories/

Dann melden wir uns einmal ab und wieder an und öffnen die Datei ~/.config/menus/xfce-applications.menu mit einem Editor.

Das erste Beispiel vermittelt gleich einen Eindruck, wie die dynamische Menüerstellung funktioniert.

Hat eigentlich jemals schon jemand den Menüpunkt "Über Xfce" angeklickt? Nein? Wozu brauchen wir ihn dann? Wir ändern also die Zeile

<Filename>xfce4-about-xfce.desktop</Filename>

in

<!-- <Filename>xfce4-about-xfce.desktop</Filename> -->

und siehe da, nach dem Speichern der Datei ist der Menüpunkt verschwunden.

Leider nicht ganz. Wir haben zwar die statische Erstellung des Menüpunktes verhindert, aber die dynamische Erstellung des Menüs führt dazu, dass er an anderer Stelle wieder auftaucht.

Wo können wir noch ansetzen? Ach ja - in der Einrichtungsdatei wird ja die Kategorie festgelegt, in der die Anwendung im Menü angezeigt werden soll. Wir öffnen also mit einem Editor die zugehörige Einrichtungsdatei ~/.local/share/applications/xfce4-about-xfce.desktop und suchen die Zeile, die mit Categories beginnt. Wo wird "Über Xfce" gerade angezeigt? Auf der ersten Ebene des Anwendungsmenüs. Die Kategorie X-Xfce-Toplevel scheint also der Übeltäter zu sein. Wir ändern also die Zeile

Categories=X-XFCE;X-Xfce-Toplevel;

in

Categories=X-XFCE;

und speichern die Datei. Wer aber gedacht hat, wir sind den Menüpunkt endlich los, sieht sich getäuscht. Es ist wie beim Hase-und-Igel-Spiel, er taucht nur an anderer Stelle wieder auf.

Warum das denn nun wieder? In der Einrichtungsdatei ist noch die Kategorie X-XFCE festgelegt. Diese ist aber in der Definitionsdatei des Menus gar nicht vorhanden. Der Eintrag würde also zu keinem anderen definierten Menü passen, demzufolge wird er ins Menü Other - Andere einsortiert. Na dann löschen wir doch die Categorie-Zeile in der Einrichtungsdatei gleich ganz. Auch das hilft uns nicht weiter, keine Kategorie ist genauso viel wert, wie eine nicht definierte. Es gibt nur zwei Möglichkeiten, den Menüpunkt loszuwerden. Entweder wir löschen die zugehörige Einrichtungsdatei oder wir ändern in der Einrichtungsdatei die Zeile

OnlyShowIn=XFCE;

in

OnlyShowIn=123;

Menüpunkte nicht anzuzeigen ist ja noch einfach. Als nächstes wollen wir einen eigenen noch nicht vorhandenen Menüpunkt erstellen. Ich komme auf das Beispiel von den Einrichtungsdateien zum direkten Start einer virtuellen Maschine zurück. Nehmen wir an, wir haben mehrere virtuelle Maschinen, die wir alle direkt starten wollen, aber einen eigenen Menüpunkt dafür anlegen wollen. Zunächst einmal müssen wir für jede virtuelle Maschine eine Einrichtungsdatei nach dem obigen Beispiel einrichten. Als Kategorie tragen wir dort Machines; ein. Alle Einrichtungsdateien speichern wir in ~/.local/share/applications/. Dann legen wir im Verzeichnis ~/.local/share/desktop-directories/ eine Datei mit dem Namen virtual-machines.directory an, die folgenden Inhalt haben sollte:

[Desktop Entry]
Version=1.0
Encoding=UTF-8
Type=Directory
Icon=virtualbox
Name=Virtual Machines
Name[de]=Virtuelle Maschinen

Als letztes Editieren wir noch die Datei ~/.config/menus/xfce-applications.menu und legen dort einen neuen Menüpunkt innerhalb des Einstieg-Menu-Tags an.

<Menu>
	<Name>Virtual Machines</Name>
	<Directory>virtual-machines.directory</Directory>
	<Include>
		<Category>Machines</Category>
	</Include>
</Menu>

Das fertige Ergebnis sollte dann so ähnlich wie hier aussehen:

Ein letztes Beispiel noch zu eigenen Anpassungen des Anwendungsmenüs. Wer z.B. auf unterschiedlichen Rechnern mit unterschiedlichen Desktop-Umgebungen arbeitet, wird schnell feststellen, dass die Hand mit der Maus nicht die gewohnten Bewegungen macht, um einige Programme zu starten. Warum eigentlich? Erst so langsam kommt man dann darauf, dass die Menüs einfach unterschiedlich aussehen.

Links das Gnome-Menu, rechts das von Xfce. Wir sehen, bei Gnome gibt es den Menüpunkt "Sonstige" (Xfce - "Andere"), die Systemprogramme sind hier unter "Systemwerkzeuge" einsortiert, alles was bei Xfce ins "Netzwerk" gehört, geht bei Gnome ins "Internet" und bei Gnome heisst es "Software-Entwicklung", da wo Xfce nur einfach entwickelt. Da die dynamische Einsortierung alphabetisch erfolgt, sucht man seine gewohnten Programme erst mal an der falschen Stelle.

An unterschiedlichen Kategorien kann es ja nicht liegen. Der Grund ist einfach, das Gnome und Xfce hier unterschiedliche Lokalisierungen für die Menüpunkte verwenden. Wenn wir also in Xfce auch Software enwickeln wollen, müssen wir die entsprechende *.directory-Datei ändern. Öffnen wir also die Datei ~/.local/share/desktop-directories/xfce-development.directory mit einem Editor und ändern die Zeile

Name[de]=Entwicklung

in

Name[de]=Software-Entwicklung

und das Ergebnis sieht dann so aus:

Auch wenn wir hier hauptsächlich das Xfce-Menü bearbeitet haben, so gilt das Gesagte doch auch für alle anderen Desktop-Umgebungen die sich an die Standards von freedesktop.org anlehnen. Auch wenn z.B. KDE in der Beziehung selbst viele Erweiterungen eingebaut hat, die Grundlagen sollten doch die gleichen sein.

Über den Sinn oder Unsinn der angeführten Beispiele mag man sicher trefflich streiten können. Ich hoffe, sie haben aber etwas zum Verständnis des Aufbaus und der Funktionsweise der Anwendungsmenüs beigetragen. Rückmeldungen über Fehler oder Praxisbeispiele aus Eurer täglichen Arbeit sind natürlich gerne willkommen.

Weiterführende Links

benutzerdefinierte Aktionen in Thunar

KDE-Servicemenüs

Nautilus-Aktionen

Spezifikationen für Einrichtungsdateien

Spezifikationen für Icon Themes

Spezifikationen für Menüs