[[Vorlage(Getestet, bionic)]] {{{#!vorlage Wissen [:Anwendungen_hinzufügen: Installation von Programmen] [:Paketquellen_freischalten/PPA: Verwenden eines PPAs] }}} [[Inhaltsverzeichnis()]] [[Bild(./yad_logo.png, 48, align=left)]] [sourceforge:yad-dialog:YAD] {en} ('''Y'''et '''A'''nother '''D'''ialog) ermöglicht das Erzeugen grafischer Dialoge aus Shell-Skripten oder auf der Kommandozeile. Es handelt sich um eine Abspaltung (Fork) von [:Zenity:], die einige Verbesserungen enthält. So kennt YAD nicht nur mehr, sondern auch komplexere Dialoge. Die Syntax von YAD ähnelt der von Zenity sehr. Dieser Artikel ist keine vollständige Dokumentation der Möglichkeiten von YAD. Er gibt einen Einstieg in den Umgang mit dem Programm. Für weitere Details sei auf die [:man:Manpage] und die Hilfeoptionen des Programms verwiesen. = Installation = Das Programm ist in den offiziellen Paketquellen enthalten [1]: {{{#!vorlage Paketinstallation yad, universe }}} = Bedienung = YAD wird von der Kommandozeile oder aus Skripten heraus aufgerufen. Die Rückgabe erfolgt auf der Standardausgabe oder wird in Skripten in Variablen oder Arrays gesichert. Ein einfaches Beispiel: {{{#!vorlage Befehl yad --text 'Hallo Welt!' }}} Das nächste Beispiel ist ein Einzeiler, der der besseren Lesbarkeit halber auf mehrere Zeilen verteilt wurde, weshalb die Zeilenumbrüche mit dem Backslash `\ ` maskiert werden: {{{#!vorlage Befehl yad --title 'Beispiel Fenster' \ --window-icon=gtk-about \ --geometry=400x100 \ --button=gtk-close \ --text 'Hallo Welt!' }}} == Separatoren == Die Ausgabe und bei einigen Aktionen auch die Eingabe nutzt Separatoren zum Trennen einzelner Einträge. Voreingestellt sind das Zeichen `|` zum Trennen der Einträge und das Zeichen `!` zum Trennen der einzelnen Wertzuweisungen in einem Eintrag. Fragt man also zwei Werte, eine Zahl und ein Wort mittels YAD ab, so wird die Ausgabe beispielsweise {{{1|eins}}} lauten. Übergibt man YAD, beispielsweise bei einem Formular, Argumente, so sieht die Eingabe etwa so aus: {{{Wert1!Wert2}}} Etwas komplexer wird dies bei der Anzeige im Benachrichtigungsfeld, wenn mehrere Einträge im Kontextmenü gewünscht sind (Symbole (Icons) für Menüeinträge im Benachrichtigungsfeld sind erst ab svn-Revision 471 verfügbar): {{{menu:EINTRAG1!AKTION1!ICON1|EINTRAG2!AKTION2!ICON2}}} Hier wird der Unterschied zwischen den Haupt-Separatoren `|` (`--separator`) und den Separatoren für einzelne Einträge `!` (`--item-separator`) deutlich. Die Separatoren können über die entsprechenden Optionen festgelegt werden. == Formulare == Ein Formular (`--form`) besteht aus Feldern (`--field`). Felder beinhalten Einträge, die durch Separatoren getrennt sind und in denen mehrere Werte übergeben werden können, welche durch weitere Separatoren getrennt sind. === Feldtypen === Folgende Tabelle zeigt die verschiedenen Typen der Felder. {{{#!vorlage Tabelle <-2 tablestyle="width: 95%;" rowclass="titel">Feldtypen in Formularen +++ Typ Beschreibung +++ `RO` read only - nur lesbares Feld +++ `NUM` numeric - Dezimalzahl +++ `CHK` Checkbox +++ `CBE` combobox - editierbare Combobox +++ `FL` Schaltfläche für Dateiauswahl +++ `SFL` Feld zum Erstellen einer Datei +++ `DIR` Schaltfläche für Verzeichniswahl +++ `CDIR` Feld zum Erstellen eines Verzeichnisses +++ `FN` Schaltfläche für Schriftauswahl +++ `MFL` Multiple Dateiauswahl +++ `DT` Datumsfeld +++ `CLR` Farbauswahl +++ `BTN` Schaltfläche +++ `LBL` Überschrift }}} Wie die Felder in der Praxis aussehen und wie die Optionen verwendet werden, kann man an folgendem kleinen Beispiel sehen. [[Bild(./examplefield.png, 230, right)]] Zugehöriger Befehl: {{{#!code bash yad \ --title="Field Optionen" \ --form \ --item-separator=, \ --separator=" " \ --field="Nur lesbares Feld:RO" Text \ --field="Auswahl einer Zahl:NUM" \ --field="Ich bin eine Checkbox:CHK" \ --field="Editierbares Feld:CBE" Text \ --field="Dateiauswahl:FL" \ --field="Hier kannst du eine Datei erstellen:SFL" \ --field="Verzeichnisauswahl:DIR" \ --field="Hier kannst du ein Verzeichnis erstellen:CDIR" \ --field="Schriftartauswahl:FN" \ --field="Hier kannst du mehrere Dateien wählen:MFL" \ --field="Wähle ein Datum:DT" \ --field="Wähle eine Farbe:CLR" \ --field="Ich bin ein klickbarer Button:BTN" \ --field="Ich bin eine Überschrift:LBL" \ --field="Texteingabe:TEXT" \ --button="Ich bin Button 1" \ --button="Ich bin Button 2" \ --button="Ich bin Button 3" \ --button="Ich bin Button 4" }}} Auch dies ein Einzeiler, der der besseren Lesbarkeit halber auf mehrere Zeilen verteilt wurde. Zeilenumbrüche wurden mit einem Backslash \ maskiert. In der Praxis wird man den Buttons auch Exit-Codes zuordnen wollen. Aber Achtung: Nur bei '''geraden''' Exit-Codes gibt YAD dann auch die Auswertung der Felder über die Standardausgabe zurück. Bei Buttons mit ungeradem Exit-Code bleibt die Standardausgabe leer. Beispiel: {{{$ yad --form --button="Button 1:10" --button="Button 2:20" --button="Button 3:30" --field "Texteingabefeld"; echo $?}}} = Anwendungsbeispiele = == Passwortabfrage == [[Bild(./example1.png, 230, right)]] {{{#!code bash #! /bin/bash eingabe="$(yad --entry --hide-text --button="Auswerten" --title="Passwort" --text="Gebe ein Passwort ein:")" yad --info --text="Die Eingabe war $eingabe" }}} Es wird nach einer Eingabe (`--entry`) gefragt. Die Eingabe soll durch Sternchen verschleiert werden (`--hide-text`). Mit `--text` erfolgt eine Mitteilung an den Benutzer. Was im Fenstertitel steht, definiert man mit der Option `--title`. Abschließend gibt es noch eine Schaltfläche, die den Dialog beendet (`--button`). Die Eingabe des Benutzers wird im vorliegenden Beispiel in einer Variable `$eingabe` gespeichert. Mit dem zweiten YAD-Befehl wird der Inhalt dieser Variable über einem Textdialog ausgeben. == Zahlenabfrage == [[Bild(./example2.png, 230, right)]] {{{#!code bash #! /bin/bash array=($(yad \ --item-separator="," \ --separator="\\n" \ --form \ --field="Wähle einen Wert":NUM 5,1..10,1)) yad --info --text="Der Wert ist ${array[0]}" }}} In diesem Formular (`--form`) wird ein Wert in einem Zahlenfeld (`--field`) gefragt. Dieser Wert wird in einem Array gespeichert. Mit dem zweiten YAD-Befehl wird die Eingabe des Benutzers in einem Textdialog ausgegeben. == Menüdialog == [[Bild(./example3.png, 230, right)]] {{{#!code bash #!/bin/bash #Pipe erstellen PIPE="$HOME/.pipe.tmp" rm $PIPE mkfifo $PIPE exec 3<> $PIPE #Yad Dialog erstellen yad --notification --listen <&3 & #Menüeinträge definieren echo "menu:\ Notify ausgeben!notify-send "...Test"|\ CD Fach öffnen!eject|\ Gedit öffnen!gedit|\ VLC Player öffnen!vlc|\ Beispielbutton 5!echo "Button 5 wurde gedrückt" " >&3 #Icon des Menübuttons definieren echo "icon:/pfad/zum/icon.png" >&3 #Name des Menüs definieren echo "tooltip:Beispielmenü" >&3 }}} Dieses kleine Beispielskript erstellt ein voll funktionsfähiges Panelsymbol (Trayicon) mit beispielhaften Funktionen wie z.B dem Öffnen des CD-Laufwerks oder dem Ausgeben einer Benachrichtigung. Ein Klick mit der rechten Maustaste [[Vorlage(Tasten, rmb)]] auf das Panelsymbol klappt das Menü auf. Es bietet sich an, anstelle eines Befehls für einen Menüpunkt auf ein weiteres Shellskript zu verweisen, da ansonsten schnell die Übersichtlichkeit leidet. {{{#!code bash #Menüeinträge definieren echo "menu:\ Mein Skript 1!/pfad/zu/meinem/skript1.sh|\ .. .. .." }}} == Entscheidungsabfrage == [[Bild(./example4.png, 230, right)]] {{{#!code bash #!/bin/bash #YAD Dialog erstellen yad --title="CD auswerfen" --text="Willst du das CD-Laufwerk öffnen?" --button="Ja, ich will" --button="Nein, lass es drinnen" --image=/pfad/zum/bild/im/fenster.png #Returnwert speichern ret=$? #Auswerten des Returnwertes if [ $ret = 0 ] #Wenn der Benutzer auf JA drückt, then #dann führe folgenden Befehl aus eject #Befehl else #Ansonsten führe diesen Befehl aus exit 1 #Befehl (hier exit 1 für beenden) fi }}} In einem solchen Dialog kann es beliebig viele Schaltflächen geben. Alle können mit unterschiedlichen Aktionen belegt werden. Die Schaltflächen haben drüber hinaus einen eigenen Rückgabewert, aufsteigend durchnummeriert. So liefert, wenn man es YAD nicht anders mitteilt, die erste Schaltfläche den Rückgabewert `0`, die zweite Schaltfläche hat den Rückgabewert `1` usw. Diese Werte können beispielsweise mit einer ''if''-Abfrage ausgewertet werden, wie hier im Beispiel gezeigt. Denkbar sich natürlich alle gängigen Methoden, die eine [:Shell:] mitbringt. = Problembehebung = Gibt man in einer Form (--form) einem Feld (--field) keinen Standard-Wert mit, so kommt es beim Einsatz von YAD-Version 0.33.1-1 dazu, dass bei einem im Script folgenden ''read'' der Fehler "read: Lesefehler: 0: Die Ressource ist zur Zeit nicht verfügbar" kommt. Daher ist es sinnvoll, immer einen Standard-Wert (bei Textfeldern ggf. "") anzugeben. == Störende Warnmeldung == Bei jedem Aufruf von Yad erscheint im Terminal eine Warnung {{{ Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged. }}} Der Eintrag an sich ist harmlos, stört ggf. aber die Übersicht erheblich. Man wird ihn los, indem man im Skript jeden Yad-Aufruf mit einem ans jeweilige Zeilenende gesetztem {{{ 2> /dev/null }}} die Meldung ins Nirvana schickt. = Links= * [sourceforge:yad-dialog:Projektseite] {en} * [http://sourceforge.net/p/yad-dialog/wiki/browse_pages/ Examples] {en} - verschiedene Beispiele * [post:5956017:Internetradio via cvlc abspielen] * [:Zenity:] - Klassiker und Vorgänger für GTK-basierende Systeme * [:KDialog:] - ausschließlich für KDE # tag: Shell, Programmierung