Listing 2
Hilfe zu Notifications
$ yad --help-notification
Aufruf:
yad [OPTION ?] - Yet another dialoging program
Benachrichtigungssymbol-Einstellungen
--notification Benachrichtigung
--menu=STRING Set initial popup menu
--no-middle Disable exit on middle click
--hidden Doesn't show icon at startup
--icon-size=SIZE Set icon size for fully specified
icons (default - 16)
Allerdings fehlt in der Online-Hilfe eine wichtige Funktion im Notification-Modus, nämlich --command. Als Argument dieser Option dient ein Shell-Befehl, den Yad ausführt, sobald Sie mit der linken Maustaste auf das Yad-Icon im Notification-Bereich klicken. Auch hier dient das Terminieren von Yad als voreingestellte Aktion. Das erfolgt also immer, solange Sie nicht über yad --notification --command=Befehl einen alternativen Befehl definieren. Hier wäre auch eine leere Eingabe mittels --command='' möglich. Zum Testen der Option eignet sich der Befehl eject, der die DVD-Schublade öffnet. Rufen Sie Yad mit dem Befehl aus der ersten Zeile von Listing 3 auf, öffnet ein linker Mausklick auf das Yad-Icon zwar die Laufwerksklappe, beendet dabei Yad aber nicht.
Listing 3
Befehle und Menüs
$ yad --notification --command=eject $ yad --notification --menu='Xterm!xterm|Editor!gedit' $ yad --notification --separator='§' --item-separator='%' --menu='...'
Es gibt noch eine Reihe weiterer Optionen, die Yad in diesem Modus auswertet, beispielsweise --listen oder --tooltip zusammen mit --text. In der bisher vorgestellten Form erzeugt Yad im Notification-Modus noch kein Menü. Da gilt es, zuvor als Argument der Option --menu zwischen einfachen Hochkommas in der Form 'Text!Befehl|...' zu definieren. Der Aufruf aus der zweiten Zeile von Listing 3 erzeugt das Menü aus Abbildung 5.

Abbildung 5: Eine einfache, mit Yad generierte Menüdefinition.
Jeder Menüeintrag besteht also aus zwei Teilen, dem Menütext und der beim Aufruf ausgeführten Befehlszeile. Zwischen Menütext und Befehlszeile steht als Item-Separator voreingestellt das Ausrufezeichen. Nach der Befehlszeile und vor dem nächsten Menüeintrag folgt | (die Pipe) als Separatorzeichen. Die beiden Trennzeichen lassen sich per Option von den Vorgaben abweichend vereinbaren (Listing 3, letzte Zeile).
Eine solche eigene Definition benötigen Sie dann, wenn beispielsweise das Pipe-Symbol in den Befehlszeilen auftritt. Wichtig: Yad interpretiert die Zeichen zwischen den Trennzeichen literal, benötigt also keine zusätzlichen Hochkommas oder Maskierungszeichen, sofern einfache Hochkommas die gesamte Zeichenkette einschließen. Verwenden Sie stattdessen doppelte Leerzeichen, nimmt die Bash in der Zeichenkette automatisch Ersetzungen vor.
FIFO als neuer Kanal
Die Methode, Menüeinträge direkt als Argument von --menu anzugeben, wirkt zwar auf den ersten Blick angenehm einfach, führt aber schnell zu unlesbaren und damit potenziell fehlerträchtigen Befehlszeilen. Sie beanspruchen schnell mehrere Zeilen im Terminal, sodass sich kaum noch unterscheiden lässt, wo der eine Eintrag endet und der andere beginnt. Zudem verwendet die Art, in der Yad die Argumente interpretiert, Zeilenumbrüche als Teile der Eingaben. Eine Alternative besteht darin, das gesamte Argument für das Menü in einem Bash-Array zu verwalten, das Sie dann in der Befehlszeile als Argument der Option --menu übergeben.
Es gibt noch eine weitere, sehr elegante Methode, um Yad im Notification-Modus zu betreiben und dabei sogar die Menüs zur Laufzeit zu ändern. Diese Variante setzt aber auf zusätzliche Datenkanäle in der Bash und eignet sich daher eher für fortgeschrittene Anwender. Dazu richten Sie zuerst eine FIFO ein (Listing 4, erste Zeile), die Sie dann als zusätzlichen Kanal etablieren (zweite Zeile). Zu guter Letzt starten Sie Yad im Hintergrund und verbinden es mit der FIFO (letzte Zeile).
Listing 4
Anbindung per FIFO
$ mkfifo FIFO $ exec 3<> FIFO $ yad --notification --listen <&3 &
Nun lassen sich Einstellungen mit dem Aufruf echo Einstellung >&3 an Yad senden; wobei die Software drei Schlüsselwörter erkennt: icon enthält den Pfad zum Icon, das im Notification-Bereich erscheint, tooltip den Tooltip dafür. Über menu geben Sie neue Menüs vor. Da echo die neuen Menüs als Argumente angibt, müssen Sie hier die normalen Regeln der Shell berücksichtigen. Zeilenumbrüche lassen sich beliebig verwenden, als Maskierungszeichen kommt der Backslash \ zum Einsatz. Allerdings berücksichtigt Yad Einrückungen am Anfang von Zeilen, was mitunter zu einer verschobenen Darstellung der Menüs führt (Abbildung 6). Möchten Sie weitere Optionen verwenden, wie etwa --command oder --no-middle, müssen Sie das beim Aufruf von Yad bereits berücksichtigen, etwa in der Formyad --notification --no-middle.

Abbildung 6: Tabulatoren am Anfang von Menüzeilen führen zu Einrückungen.
Listing 5 zeigt das Skript yadmenu.sh, mit dem Yad ein Anwendermenü erzeugt. Der Aufruf FIFO=$(mktemp) (Zeile 5) erzeugt einen zufälligen, eindeutigen Dateinamen unter /tmp/. Falls eine Datei mit diesem Namen schon existiert, löscht das Skript sie (Zeile 6). Mit dem Namen erzeugt Mkfifo eine spezielle Datei vom Typ Fifo, auch als benannte Pipe bezeichnet, die zur Kommunikation mit Yad dient (Zeile 7), und bindet sie als Kanal ein (Zeile 9). Um zu verhindern, dass sich das Programm bei einem linken Mausklick schließt, starten Sie Yad hier mit der Option --command='...' (Zeile 11).
Listing 5
yadmenu.sh
#!/bin/bash # yadmenu.sh # Time-stamp: <2021-09-15 13:39:05> # FIFO erstellen FIFO="$(mktemp)" rm $FIFO mkfifo $FIFO # Kanal etablieren exec 3<> $FIFO # Yad starten yad --notification --command='xterm -e pacui u' --listen <&3 & # Menü definieren >&3 echo "menu:\ PW!y-showpw.sh|\ GEEQIE!geeqie|\ XTERM!xterm|\ yay CLEAN!xterm -e "yay -Scc"|\ PACUI!xterm -e pacui|\ EDIT MENU!gedit /usr/local/bin/y-menu.sh|\ X-TILE 1!x-tile 1|\ ... fin!echo "kill $$" \ " # Tooltip definieren >&3 echo "TOOLTIP:Mittels TOOLTIP: eingestellter Tooltip!" # Icon definieren >&3 echo "icon:/usr/share/icons/Adwaita/16x16/emblems/emblem-favorite-symbolic.symbolic.png"
Das Menü selbst definiert echo ab Zeile 13. Die Schreibweisen echo >&3 und >&3 echo stehen gleichwertig nebeneinander und entsprechen echo "..." >&3. Die Bash erlaubt es, das Umleiten auch an erster Position in der Befehlszeile vorzunehmen, was es erleichtert, die Argumente schnell auszutauschen.
Eine Besonderheit weist die vorletzte Zeile der Menüdefinition auf (Zeile 21): Sie erzeugt den Menüeintrag ... fin und generiert beim Anklicken die Ausgabe kill PID. Die Prozessnummer bezieht sich dabei auf die Shell, die als Interpreter für das Skript dient. Damit erlaubt es diese Ausgabe, den Prozess zu beenden. Die Definitionen des Tooltip-Texts (Zeile 24) und des Notification-Icons (Zeile 26) erfolgen analog zur Menüdefinition. Schlüsselwörter wie ICON:, TOOLTIP: und MENU: dürfen Sie sowohl groß wie auch klein schrieben.
Das Skript yadmenu.sh machen Sie vor dem Aufruf mittels chmod a+x yadmenu.sh ausführbar. Rufen Sie es von einem Terminal aus auf, lässt es sich mit kill PID beenden. Alternativ starten Sie es nicht als eigenständigen Prozess, sondern führen es mit source ./yadmenu.sh in der aktuellen Shell aus. In diesem Fall lassen sich der Tooltip, das Icon und die Menüeinträge vom Terminal aus mittels >&3 echo "..." verändern, ohne das Skript vorher neu zu starten.





