Servus Wolfgang,
im zweiten Teil will ich Deine Fragen nach Menüeinträgen behandeln (zu den Desktopicons wird es noch einen 3. Teil geben). Nun muss ich gleich bekennen, dass ich auf diesen Gebieten kein Experte bin, aber da ich mich in letzter Zeit damit beschäftigt habe will ich meine Erkenntnisse teilen. Meines Wissens gibt es darüber auch kein wirklich umfassendes HOWTO, auch nicht im englischen Forum. Ich habe mir die folgenden Informationen also Stück für Stück zusammentragen müssen.
Grundsätzlich erscheint das Thema am Anfang auch deshalb so unzugänglich, da das System für das Menü zahlreiche Files benutzt die auch noch an unterschiedlichen Orten "verstreut" abgespeichert sind. Zusätzlich sind bei den verschiedenen Puppy Versionen auch verschiedene "Window Manager" im Einsatz, d.h. hier kann es noch einmal Unterschiede geben. Ich spreche im Folgenden über meine Erfahrungen mit JWM, einige Dinge können im deutschen Puppy von deapsea daher abweichen.
Ich beginne mit einer kurzen Übersicht über die hauptsächlich benutzten Verzeichnisse. Die relevanten Files sind entweder einfache Textfiles oder im XML Format geschrieben - diese kann man am besten mit
Geany anschauen oder bearbeiten (als Textfile öffnen). Für die Icons ist
mpaint am Besten geeignet:
etc/xdg/templates
etc/xdg/menus
Hier befinden sich xml Dateien welche die Menüstruktur festlegen
usr/share/applications
usr/share/desktop-directories
Hier befinden sich Dateien welche den einzelnen Anwendungen zugeordnet sind und die Anwendungen mit der Menüstruktur sowie den Icons verknüpfen
usr/share/pixmaps
usr/local/lib/X11/mini-icons
usr/local/lib/X11/pixmaps
Hier befinden sich die Grafiken für die Icons
Ich versuche zuerst kurz das Prinzip zu erklären und dann einige Anwendungsbeispiele zu geben. Da das Thema komplex ist rate ich zum Verständnis im eigenen Puppy System mitzuschauen und die genannten Files zu öffnen. Zusätzlich ist es vielleicht nützlich die Struktur auf einem Blatt Papier zu skizzieren.
Menüstruktur
Das Menüstruktur wird durch eine Verknüpfung verschiedener Files erzeugt. Es entsteht eine "Art" Baumstruktur. Die Wurzel dieses Baumes ist:
/etc/xdg/templates/_root_.jwmrc
Das ist das Basic Template für die File Struktur. Darin finden sich sie folgenden Zeilen (Ausschnitt):
Code: Select all
...
<RootMenu label="Menu" labeled="false" height="24" onroot="3">
PUPPYMENU jwm-xdgmenu /etc/xdg/menus/puppy-desktop.menu
PUPPYMENU jwm-xdgmenu /etc/xdg/menus/puppy-system.menu
PUPPYMENU jwm-xdgmenu /etc/xdg/menus/puppy-setup.menu
...
Es werden also hier eine Reihe von .menu Files eingebunden, z.B:
/etc/xdg/menus/puppy-desktop.menu. In diesen Files finden sich die weitere Menüstruktur beschrieben, im Falle von puppy-desktop.menu (Ausschnitt)
Code: Select all
...
<Menu>
<Name>DesktopSettings</Name>
<Directory>Puppy-DesktopSettings.directory</Directory>
<Include>
<Category>X-Desktop</Category>
<Category>DesktopSettings</Category>
<Category>Screensaver</Category>
<Category>Accessibility</Category>
</Include>
</Menu>
<Menu>
<Name>DesktopCountry</Name>
<Directory>Puppy-DesktopCountry.directory</Directory>
<Include>
<Category>X-DesktopCountry</Category>
</Include>
</Menu>
...
<Menu> definiert einen Menüeintrag mit internem <Name>. Wichtig sind die Zeilen mit <Directory> und <Category>, sie stellen weitere Verknüpfungen zu Files im Bereich /usr/share her.
<Directory> beschreibt wie der Eintrag im Menü tatsächlich auf dem Bildschirm erscheinen soll. Diese Informationen sind im Verzeichnis /usr/share/desktop-directories gespeichert. Für jeden Menüeintrag sollte hier ein File mit der Endung .desktop vorhanden sein. Puppy-DesktopSettings.directory sieht z.B: so aus:
Code: Select all
[Desktop Entry]
Encoding=UTF-8
Name=Desktop Settings
Name[de]=Desktop Einstellungen
Icon=mini.window3d.xpm
Type=Directory
Man beachte das es hier möglich ist verschiedene Spracheinstellungen zu berücksichtigen.
<Category> bestimmt welche Anwendungen unter diesem Menüpunkt angezeigt werden. Und zwar haben alle Programme die im Menü aufscheinen sollen ein eigenes File im Folder
/usr/share/applications mit der Endung .desktop, z.B wallpaper.desktop:
Code: Select all
[Desktop Entry]
Encoding=UTF-8
Name=Wallpaper setter
Name[de]=Hintergrundbild setzen
Name[es]=Selector de Fondo de Pantalla Nathan
Icon=wallpaper.png
Comment=Set backdrop image
Exec=wallpaper
Terminal=false
Type=Application
Categories=DesktopSettings
GenericName=Wallpaper setter
Es ist eigentlich klar was die einzelnen Eintragungen bedeuten. Name erscheint als Text im Menü, man beachte wieder die Möglichkeit für verschieden Spracheinstellungen, Icon wählt ein Grafikfile in einem der möglichen Ordner. Exec gibt an welches Program gestartet wird. Und besonders wichtig: Categories sorgt dafür, dass dieser Eintrag bei allen Menüpunkten erscheint wo dieser Eintrag mit einer <Category> im .menu File übereinstimmt.
Die gesamte Menüstruktur die durch all diese verschiedenen Files vorgegeben ist wird durch den Befehl
fixmenus in das file
/root/.jwmrc übertragen. Wenn man mit dem ursprünglichen Template (
etc/xdg/templates/_root_.jwmrc) vergleicht, sieht man wie Schritt für Schritt aus den verschiedenen Informationen das endgültige Menü zusammengesetzt wird. Sehen kann man den Eintrag dann allerdings immer noch nicht, dazu ist es nötig den Windowmanager neu zu starten mit
jwm -restart. Diese Sequenz (fixmenus, jwm -restart) wird z.b. auch vom Puppy Packegemanager immer ausgeführt, deshalb flackert der Bildschirm kurz.
Ob es vielleicht auch weniger kompliziert ginge? Wahrscheinlich, aber nach einiger Zeit findet man sich ganz gut zurecht und das System ist recht flexibel. Es ist z.B. sehr einfach Programm hinzuzufügen oder wegzunehmen, es müssen nur die .desktop Files in /usr/share/applications erzeugt oder gelöscht werden. Die restliche Struktur bleibt davon völlig unberührt.
Führt man den
dir2pet script aus hat man die Möglichkeit einen Menüeintrag zu erzeugen. Im Prinzip wird hier nur ein die Menüstruktur /usr/share/applications und ein .desktop File für das Programm erzeugt. D.h man kann einen solchen Menüeintrag auch selbst herstellen, natürlich auch in einem sfs File. Am einfachsten ist es wenn man als Vorlage ein bestehendes .desktop file editiert.
Beispiele:
Wichtig beim Probieren ist, dass man nicht auf die Befehlsequenz
fixmenus,
jwm -restart vergisst, da man sonst die Änderungen im menü nicht sehen kann. Ausserdem muss man genau auf die Rechtschreibung achten, sonst werden die Einträge nicht zugeordnet.
Beispiel 1: Ein Programm im Menu hinzufügen
wir wollen z.b, dass fixmenus im Desktop Menü erscheint. Fixmenus ist in /usr/sbin, wird also gefunden, aber das Programm hat noch keinen Eintrag in /usr/share/applications. Wir nehmen daher ein Programm als Vorlage das in diesem Menüpunkt aufscheint (z.p wallpaper.desktop) und editieren, z.B:
Code: Select all
[Desktop Entry]
Encoding=UTF-8
Name=Fix Menus
Icon=setup48.png
Exec=fixmenus
Terminal=false
Type=Application
Categories=DesktopSettings
GenericName=Fix Menus
Und speichern als /usr/share/applications/fixmenus.desktop
Um den Eintrag zu sehen müssen wir noch im Terminal fixmenus eingeben - Leider ändert sich im Menu immer noch nichts, man muss zuerst mit jwm -restart den Window manager neu starten - das ist unpraktisch.
Um wirklich einen brauchbaren Menüpunkt zu haben kann man etwa folgenden scrip schreiben:
und unter /usr/bin/really_fixmenus abspeichern (Eigenschaften auf ausführbar setzen). Natürlich muss in fixemenus.desktop noch auf Exec=really_fixmenus ändern.
Nun sollte man einen brauchbaren Menüeintrag haben bei dem auf Knopfdruck das Menü aktualisiert wird.
Beispiel 2: Einen neuen Menüpunkt "Schule" anlegen
Dazu editiert man das template _root_.jwmrc (mit Geany öffnen) und fügt folgende Zeile ein (nach <Seperator/>)
Code: Select all
PUPPYMENU jwm-xdgmenu /etc/xdg/menus/puppy-schule.menu
natürlich fehlt dieses .menu file noch, am besten man öffnet die Vorlage /etc/xdg/menus/puppy-SKELETON.menu und editiert es z.B so:
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xfdesktop-menu PUBLIC "-//freedesktop//DTD Menu 0.8//EN" "http://www.freedesktop.org/standards/menu-spec/menu-0.8.dtd">
<Menu>
<Name>Schule</Name>
<DefaultAppDirs/>
<DefaultDirectoryDirs/>
<AppDir>/opt/kde/share/applications/kde</AppDir>
<Directory>Puppy-Schule.directory</Directory>
<Include>
<Category>Schule</Category>
</Include>
</Menu>
und speichert es unter Puppy-schule.menu.
Nun fehlt noch das entsprechende .directory file. Wir erstellen /usr/share/desktop-directories/Puppy-Schule.directory, etwa folgendermaßen:
Code: Select all
[Desktop Entry]
Encoding=UTF-8
Name=Schule
Icon=draw24.png
Type=Directory
Nun fehlen nur noch die Programme dafür. Ein Taschenrechner wäre z.B. nicht schlecht. Also ändern wir im File /usr/share/applications/Xcalc-scie...calculator.desktop in der Zeile
auf
!!! wichtig kein Leerzeichen hinter dem ;
Nun müsste dieser Taschenrechner 2 mal im Menü zu finden sein, einmal unter Schule und einmal unter der ursprünglichen Eintragung.
Beispiel 3: Einen Menüeintrag in einem Pet oder sfs File hinzufügen
Nach dem oben genannten Beispielen ist das einfach - in das Paket stammverzeichnis ein /usr/share/applications/programmname.desktop hinzufügen und auf die gewünschte Kategorie achten.
Beispiel 3: Die Menüstruktur in einem Pet oder sfs File ändern
Hier spekuliere ich jetzt ein wenig da ich das noch nicht ausprobiert habe. Ich glaube das die obige Methode mit geänderten Files in der Verzeichnisstruktur der Pakete nicht funktioniert.
Bei sfs-paketen haben geänderte Files keine Auswirkung, da meines Wissens die sfs die unterste schicht des "layered" Filesystems darstellen und von den darüberliegenden originalen Files in der pup-431.sfs einfach überschrieben werden.
Bei pet paketen ist die Anwendung noch problematischer. Das Safefile liegt über der pup-431.sfs, eine geänderte Menüstruktur kann zwar installiert werden, wird das pet jedoch deinstalliert bleiben die Löscheinträge bestehen und die originalen Menüfiles sind "ausmarkiert". Das Menü funktioniert nicht mehr.
Eine Möglichkeit wäre mit install- und uninstallscripten zu arbeiten. Habe ich aber noch nie gemacht. Da man bei Desktopicons etwas ähnliches benötigt spare ich mir einen Versuch für den 3.Teil auf.
Falls jemand wissen sollte wie sowas richtig gemacht wird - wäre sehr interessant ...
emil