[[Vorlage(Archiviert)]] {{{#!vorlage Wissen [:Rechte: Rechte für Dateien und Ordner ändern] [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] [:Packprogramme: Archive entpacken] }}} [[Inhaltsverzeichnis(2)]] [[Bild(./kontextmenue.png, 55, align=left)]] Eine Spezialfunktion des Fenstermanagers [:Openbox:] ist das sogenannte ''"pipe menu"''. Dahinter steckt ein Mechanismus, der ein externes Programm oder Skript aufruft und die Ausgabe/das Ergebnis des Programms/Skripts wieder an Openbox übergibt. Damit lassen sich dynamische (Unter-)Menüs erzeugen, da bei jedem Aufruf des Menüpunkts das Skript erneut abgearbeitet wird. Diese Funktion wird erst vor dem Hintergrund verständlich, dass Openbox vom Konzept her ursprünglich auf das heute übliche Programm-Menü im Panel verzichtete und stattdessen das Kontextmenü [[Vorlage(Tasten, rmb)]] zur Auswahl und zum Start von Programmen benutzte. Das Kontextmenü lässt sich mit einem Pipemenü um eigenen Funktionen erweitern und dem persönlichen Bedarf anpassen. Nach ein wenig Grundwissen einige praktische Beispiele, was sich damit realisieren lässt. Weitere Ideen können gerne ergänzt werden. = Voraussetzungen = Unter [:Lubuntu:] muss man das Kontextmenü von Openbox erst aktivieren. Dazu klickt man den leeren Desktop mit der rechten Maustaste [[Vorlage(Tasten, rmb)]] an und wählt den Punkt ''"Einstellungen -> Fortgeschritten -> Beim Klicken auf den Desktop die Menüs des Fenstermanagers anzeigen"'' aus (siehe auch [:LXDE_Einstellungen#Desktop:]). == Skripte == Neue Funktionen werden meist - aber nicht zwangsläufig - als [:Shell:]- oder [:Python:]-Skripte realisiert. Diese müssen irgendwo gespeichert werden. Zwar ist der Ort prinzipiell egal, aus Gründen der Übersichtlichkeit wird * '''~/bin/''' - im Homeverzeichnis des angemeldeten Benutzers (den Ordner ggfs. anlegen) oder * '''/usr/local/bin/''' - für eine systemweite Nutzung empfohlen. Darüber hinaus müssen [:Shell:]-Skripte ausführbar [1] sein (bei Python-Skripten bisher nicht notwendig). Entweder benutzt man dazu einen [:Rechte#Datei-ausfuehrbar-machen:Dateimanager] oder den Befehl [:chmod:] in einem Terminalfenster [2]: {{{#!vorlage Befehl chmod 755 SKRIPTNAME.sh }}} == Einbindung in Openbox == Dazu editiert [3] man die Datei [:Openbox#menu-xml:~/.config/openbox/menu.xml]. Ein Editor mit Syntax-Hervorhebung für XML, der die Übersicht erleichtert (z.B. [:Geany:] oder [:Editoren:Medit]), ist empfehlenswert. {{{#!vorlage Hinweis Unter Lubuntu muss zuerst: 1. die Datei '''/usr/share/lubuntu/openbox/menu.xml''' nach '''~/.config/openbox/menu.xml''' kopiert werden und 1. die Verwendung von '''~/.config/openbox/menu.xml''' in '''~/.config/openbox/lubuntu-rc.xml''' aktiviert werden }}} Einträge in dieser Datei legen auch die Reihenfolge innerhalb des Kontextmenüs fest – je nachdem, ob etwas am Anfang oder am Ende steht, erscheint es am Anfang oder Ende des Kontextmenüs. Um das Einfügen zu erleichtern, hier ein Ausschnitt aus dieser Datei: {{{ ... firefox # ein neuer Pipemenü-Eintrag: # ... }}} {{{#!vorlage Tabelle <-2 rowclass="lxde-titel"> Syntax für neue Pipemenü-Einträge +++ Parameter Erklärung +++ `id="..."` beliebig, muss aber eindeutig und nicht leer sein +++ `label="..."` Bezeichnung des Menü-Eintrags +++ `execute="..."` Pfad und Name des Skripts }}} Konkretere Hinweise finden sich in den einzelnen Beispielen. Um eine neue Funktion verfügbar zu machen, muss Openbox neu gestartet werden: {{{#!vorlage Befehl openbox --reconfigure }}} Alternativ kann man sich auch ab- und wieder neu anmelden. = Beispiele = [[Bild(Wiki/Icons/Tango/document-new.png, 48, align=right)]] == Neue Datei aus Vorlage == Die Dateimanager [:Nautilus:] und [:Thunar:] ([:PCManFM:] verwendet leider keine Vorlagen) bieten eine Funktion, um im gerade geöffneten Ordner eine neue Datei anzulegen. Diese Möglichkeit erreicht man über das Menü mit ''"Datei -> Dokument anlegen"'' oder ''"Rechtsklick -> Neues Dokument erstellen"''. Standardmäßig wird hier meist nur der Eintrag "Leere Datei" angeboten, mit dem man ein leeres Textdokument erstellen kann. Um weitere Vorlagen zur Verfügung zu haben, kann man beliebige (leere) Vorlage-Dateien in den Ordner '''~/Vorlagen/''' im eigenen Homeverzeichnis abspeichern. Um z.B. eine Vorlage für [:LibreOffice/Bedienung#Writer:LibreOffice Writer] zu erstellen, speichert man einfach ein leeres Dokument als '''~/Vorlagen/OpenOffice Dokument.odt'''. Eine kleine Auswahl an Vorlagen kann man [[Anhang(./Vorlagen.zip ,hier)]] {dl} herunterladen und in den Vorlagenordner entpacken [4]. Das folgende Skript geht noch einen Schritt weiter. Nachdem man eine passende Vorlage ausgewählt hat, startet sofort das dafür zuständige Standardprogramm (dieses muss unter Umständen noch festgelegt werden, am einfachsten mit einem Dateimanager, dem Kontextmenü [[Vorlage(Tasten, rmb)]] und ''"Öffnen mit..."''). Außerdem wird das Paket {{{#!vorlage Paketinstallation libgnome2-0 }}} benötigt. === Skript === Vorlage für das Skript '''templates.sh''': {{{#!code bash #!/bin/bash #bad medicine to open templates, just like gnome! function generate_template_menu { ls ~/Vorlagen | while read; do echo '' echo -n '' echo -n "gnome-open ~/Vorlagen/${REPLY}" echo '' echo '' done } echo '' generate_template_menu echo '' }}} Quelle: [http://david.chalkskeletons.com/scripts/ David Barr - Openbox Pipemenu Scripts] {en} === menu.xml === Über folgende Eintrag werden die Vorlagen in das Kontextmenü eingebunden: {{{ }}} == Dateimanager == [[Bild(./places-menu.png, 200, align=right)]] Einen [:Dateimanager:] – zumindest für das eigene [:Homeverzeichnis:] – integriert das Shell-Skript [github:BunsenLabs/bunsen-pipemenus/blob/master/bin/bl-places-pipemenu:bl-places-pipemenu] {en}. Nachdem man es z.B. als '''~/bin/bl-places-pipemenu''' oder '''/usr/local/bin/bl-places-pipemenu''' gespeichert hat, kann es über drei Variablen an den eigenen Bedarf angepasst werden: {{{ # path to your "recent files" script, if you want to incorporate it: [mark]#[/mark]recent_script=/usr/bin/bl-recent-files-pipemenu # Command to open folders at "Browse here..." - any file manager open_folder_cmd=[mark]thunar[/mark] # Text editor of choice text_editor=[mark]geany[/mark] }}} Dann kann es über folgenden Eintrag ins Kontextmenü eingebunden werden: === menu.xml === {{{ }}} [[Bild(./menu.png, 48, align=right)]] == XDG-Menü == {{{#!vorlage Experten Inzwischen sind zwei Pakete in den offiziellen Paketquellen enthalten, die eine mehr oder weniger identische Funktion besitzen: * [packages:openbox-menu:] (ab [:Trusty:Ubuntu 14.04], siehe unten) * [packages:openbox-xdgmenu:] }}} === Skript === Mit dem [:Python:]-Skript '''xdg-menu.py''' ist das komplette [[Bild(LXDE/start-here.png, 16,)]] LXDE-Menü unten links (zusätzlich) über das Kontextmenü erreichbar. {{{#!code python #!/usr/bin/env python # # Copyright (C) 2008 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Author(s): Luke Macken # Miroslav Lichvar import gmenu, re, sys from xml.sax.saxutils import escape def walk_menu(entry): if entry.get_type() == gmenu.TYPE_DIRECTORY: print '' \ % (escape(entry.menu_id), escape(entry.get_name())) map(walk_menu, entry.get_contents()) print '' elif entry.get_type() == gmenu.TYPE_ENTRY and not entry.is_excluded: print ' ' % \ escape(entry.get_name().replace('"', '')) command = re.sub(' [^ ]*%[fFuUdDnNickvm]', '', entry.get_exec()) if entry.launch_in_terminal: command = 'xterm -title "%s" -e %s' % \ (entry.get_name(), command) print ' ' + \ '%s' % escape(command) print ' ' if len(sys.argv) > 1: menu = sys.argv[1] + '.menu' else: menu = 'applications.menu' print '' print '' map(walk_menu, gmenu.lookup_tree(menu).root.get_contents()) print '' }}} Quelle: [http://pkgs.fedoraproject.org/gitweb/?p=openbox.git;a=blob;f=xdg-menu;hb=HEAD Fedora Packages Git Repositories] {en} === menu.xml === Über folgenden Eintrag wird das Skript ins Kontextmenü eingebunden: {{{ }}} == Openbox-Menu == Ab [:Trusty:Ubuntu 14.04] besteht eine weitere sehr elegante Möglichkeit, vorhandene Programmstarter via Pipemenü verfügbar zu machen. Zuerst wird [https://bitbucket.org/fabriceT/openbox-menu openbox-menu] {en} installiert: {{{#!vorlage Paketinstallation openbox-menu, universe }}} === menu.xml === Über folgenden Eintrag wird das Programm anschließend ins Kontextmenü eingebunden: {{{ }}} Auf Wunsch können beim Programmaufruf weitere Parameter übergeben werden. Details sind der [:man:Manpage] zu entnehmen. = Problembehebung = Manchmal kann es passieren, dass ein Skript eine bestimmte Komponente oder ein anderes Programm benötigt, ohne die es nicht funktioniert. Falls also beispielsweise das oben genannte '''xdg-menu.py''' nicht funktioniert, führt man das Skript in einem Terminal-Fenster [2] aus, um die Ausgabe zu überprüfen: {{{#!vorlage Befehl python ~/bin/xdg-menu.py }}} Eine Fehlermeldung könnte z.B. so aussehen: {{{ Traceback (most recent call last): File "bin/xdg-menu.py", line 22, in import gmenu, re, sys ImportError: No module named gmenu }}} Nun sucht man in der [:Paketverwaltung:], ob ein entsprechendes Paket vorhanden ist und installiert es: {{{#!vorlage Paketinstallation python-gmenu }}} Damit ist das Problem in diesem konkreten Fall behoben. = Links = * [http://openbox.org/wiki/Help:Menus#Pipe_menus Pipemenu-Dokumentation] {en} im Openbox-Wiki * [http://openbox.org/wiki/Openbox:Pipemenus Openbox Pipemenu Scripts] {en} - Sammlung fertiger Skripte * [archwiki:Openbox#Pipes:Openbox Pipe menus] {en} - ArchWiki (vier weitere Skripte) * [github:BunsenLabs/bunsen-pipemenus:bunsen-pipemenus] {en} - mehrere Skripte aus CrunchBang * [http://lxlinux.com/openbox.html Openbox root menu, sub-menus, pipe menus] {en} - Debian Linux Openbox Guide * [:Openbox:] {Übersicht} Übersichtsartikel #tag: Shell, Desktop, LXDE, Openbox