YAD: Ein weiteres Dialog Programm
von Daniel Meiß-Wilhelm (leiche)
Was ist es?
Wenn Sie in der Paketquelle danach suchen, werden Sie es unter Development/Tools finden. In der Beschreibung steht:
Zeigt graphische Dialogfelder von Shell-Skripten oder der Kommandozeile. Yad ist ein Fork von Zenity mit vielen Verbesserungen, wie beispielsweise benutzerdefinierte Tasten, zusätzliche Dialoge, Popup-Menü im Infobereich Icon und vieles mehr.
CLI Anwendungsbeispiel:
yad --image=dialog-question --text='Wie geht es Ihnen?'
Wenn Sie jetzt ein Terminal öffnen und folgenden Code eingeben
yad --image=dialog-question --text='Wie geht es Ihnen?’
Sie werden dieses Fenster angezeigt bekommen:
Wie Sie feststellen werden handelt es sich um ein Dialog für Bash, oder anders ausgedrückt Kommandozeilen Interface.
Was können wir damit anfangen?
Ich bin mir sicher, das es uns den Umgang mit einigen Kommandos erleichtert.
Einige Beispiele wären: sleeptimer, alert_clock, update-notifier, die aktuelle Version von screenie und einige mehr, nicht zu vergessen repair-database von glamdring.
An Hand von alert_clock will ich zeigen wie es geht.
Wenn Sie alert_clock installiert haben, werden Sie folgendes Fenster sehen:
Anmerkung: die Bilder weichen ab, da eine neue Version von alert_clock freigegeben wurde. Der Artikel basiert auf die Version 0.33
Ich denke wir alle haben die Artikelserie Command Line Interface von Peter Kelly (critter) gelesen, die in den Ausgaben von 2009 bis 2010 erschienen sind, so können wir direkt mit YAD durchstarten.
Eine Sache noch yad --help in der Konsole/Terminal bietet eine Fülle an Informationen über YAD.
Auf gehts...
Als erstes benötigen wir ein paar Variablen für den ersten Befehl. Ein Script fängt meist wie folgt an:
#!/bin/bash
#
# Alarm clock for PCLinuxOS
#
# Don't miss important times and events. Turn your computer
# into the perfect wake up system. Set the alarm and get the
# Pizza out of the oven in perfect time.
#
# Author: D.M-Wilhelm (Leiche)
# Email: meisssw01 at gmail.com
# Licence: GPL
# First build: May Wed 11 2011
# Last build: Jul Sun 10 2011
# fixed icon display in systray, move zenity,
# based now on yad.
#
Encoding=UTF-8
#
# i18n - Internationalization - Internationalisierung
#
export TEXTDOMAIN=alert_clock
export TEXTDOMAINDIR="/usr/share/locale"
#
# define some variables - Definierung einiger Variablen
#
TITLE=alert_clock
VERSION=0.33
ICON=/usr/share/icons/wecker.png
#
Wir kümmern uns jetzt um die Variablen.
Warum?
Damit wir nicht jede Zeile aktualisieren brauchen, sondern nur die Variable. Zum Beispiel ändert sich die Version, wir definieren es so
VERSION=0.33+
Wir können es aber auch so definieren
YAD=$(yad --title=’alert_clock 0.33’ --window-icon=”/usr/share/icons/wecker.png”)
Das Hauptfenster von alert_clock sieht wie folgt aus:
function menu {
COUNTDOWN=$(yad --entry --text $"Enter minutes...!" --title="$TITLE"" $VERSION" --window-icon=$ICON \
--image=$ICON \
--button=$"Change:2" \
--button=$"Test:3" \
--button="gtk-ok:0" \
--button="gtk-close:1" \
)
Wenn Sie jetzt am Ende des Scripts ein} hinzufügen und in der nächsten Zeile >menu schreiben, können Sie das Hauptfenster schon ausführen.
Hinweis: das Script muß ausführbar sein: der einfachste Weg, ein rechtsklick auf das Script und Eigenschaften aufrufen, danach Berechtigungen > Datei als Programm ausführen anwählen.
Tipp: Installieren Sie Geany über die Synaptic und generieren Sie ein Script, um zu sehen wie YAD funktioniert.
Speichern Sie es zum Beispiel als alert_clock, setzen Sie es als Programm ausführbar und drücken Sie danach auf die Taste "F5". Wird ihnen das Hauptfenster angezeigt? Wenn nicht so erhalten Sie eine Fehlerbeschreibung im Xterminal Fenster. Im folgendem Bild, können Sie sehen das ich das { in der Zeile 8 vergessen habe und diese Nachricht erhalte:
./alert_test: line 15: syntax error near unexpected token `$'COUNTDOWN=$(yad --entry --text "Enter minutes...!" --title="$TITLE"" $VERSION" --window-icon=$ICON \t\t\t--image=$ICON \t\t\t--button="Change:2" \t\t\t--button="Test:3" \t\t\t--button="gtk-ok:0" \t\t\t--button="gtk-close:1" \t\t )'' ./alert_test: line15:` )'
Hinweis: Sie werden kein Icon angezeigt bekommen, wenn Sie alert_clock nicht installiert.
Tipp: um die Lokalisierung für das Script zu bekommen, muss vor jedes --text "bla" ein $ gesetzt werden. Im Klartext sollte es dann so aussehen --text $"bla". Ansonsten wird das Script nicht übersetzt. Ausserdem muss im Kopfbereich diese Zeilen stehen:
export TEXTDOMAIN=alert_clock
export TEXTDOMAINDIR="/usr/share/locale"
Nun wird uns das Hauptfenster angezeigt. Aber nur 2 von 4 Tasten gehen. Können Sie erraten welche das sind?
Wenn Sie nun an die Taste Ändern und an die Taste Test denken liegen Sie richtig. Wir müssen diese Tasten noch eine Funktion zuweisen.
Setzen Sie ihren Kursor (Mauszeiger) auf die Zeile 15 hinter ) und drücken Sie die <Enter> Taste. Schreiben Sie nun folgendes hinzu:
ret=$?
[[ $ret -eq 1 ]] && exit 0
#
#change sound - Sound ändern
#
if [[ $ret -eq 2 ]]; then
CHANGE=$(yad --title="$TITLE"" $VERSION" --window-icon=$ICON \
--file --width=600 --height=500 \
--text=$"<b>Choose your own audio file as alert!</b>
________________________________________________")
if [ -z "$CHANGE" ];then
exec alert_clock
exit 0
else
mkdir $HOME/.config/alert-clock
rm -rf $HOME/.config/alert-clock/alert sleep 1
ln -s "$CHANGE" $HOME/.config/alert-clock/alert
yad --title $"$TITLE"" $VERSION" \
--button="gtk-ok:0" \
--width 300 \
--window-icon=$ICON \
--text=$"Your own sound is set!!"
fi
menu
fi
#
#Test sound - Klang testen
#
if [[ $ret -eq 3 ]]; then
if [ -f $HOME/.config/alert-clock/alert ]; then
SOUND="$HOME/.config/alert-clock/alert"
else
SOUND='/usr/share/alert_clock/alarm.ogg'
fi
mplayer "$SOUND" | yad --title $"$TITLE"" $VERSION" \
--button="gtk-ok:0" \
--width 300 \
--window-icon=$ICON \
--text=$"Exit sound test!!"
killall mplayer
menu
fi
Drücken Sie nun die "F5" Taste um das Hauptfenster zu starten.
Im Hauptfenster drücken Sie die Test Schaltfläche. Wenn Sie alert_clock
installiert haben, werden Sie nun ein Alarmton hören. Davon ausgehend
das Sie die Mixerausgänge richtig konfiguriert haben.
Folgende Nachricht erhalten Sie zusätzlich von Geany:
Can'T open joystick device /dev/input/js0: No such file or
directory
Can't init input joystick
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use
your remote control.
MPlayer interrupted by signal 13 in module: play_audio
mplayer: no process found
Haben Sie kein Audio oder gar die falsche Datei gewählt, erhalten Sie folgende Fehlernachricht:
>Can't
open joystick device /dev/input/js0: No such file or
directory
Can't init input joysticky
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use
your remote control.
Invalid seek to negative position ffffffffffffffff!
mplayer: no processfound
Um ihren eigenen Ton zu wählen/setzen klicken Sie auf Ändern. Haben Sie sich für eine Audiodatei entschieden, klicken Sie erneut auf Testen. Gefällt ihnen der Ton und hört man ihn gut?
Aber wie funktioniert das nun genau, wenn ich auf Test oder Ändern Schaltfläche klicke?
Wir haben die Schaltflächen definiert als:
--button=$"Change:2" \
--button=$"Test:3" \
und haben hier fest gelegt was passieren soll wenn wir eine Schaltfläche betätigen.
ret=$?
Klicken wir auf die OK oder die Abbrech Taste, so beinhaltet das auch die Funktionen wie sie benannt sind. Standard Funktionen.
[[ $ret -eq 1 ]] && exit 0
#
#change sound - Sound ändern
#
if [[ $ret -eq 2 ]];
Unsere beiden extra Schaltflächen haben jedoch andere Funktionen und darum enden diese mit :2 oder :3 oder aber :5.
Zum austesten, löschen Sie die :3 aus der --button=$"Test:3" \
Zeile.
Wenn Sie jetzt auf testen klicken, wird das Programm normal beendet. Sie erhalten
keine Fehlermeldung.
Wie ich feststellen musste, muß ich alert_clock neu starten mit exec alert_clock Wenn wir nicht das Audio ändern. Da dann die eingegebne Zeit nicht angenommen wird. Eventuell ein Fehler in YAD.
Mit der Zeile if [[ $ret -eq 2 ]];, sagen wir der Applikation was passieren soll, wenn button=change:2 gedrückt wird.
Hinter ]]; kommt der Befehl.
then
CHANGE=$(yad --title="$TITLE"" $VERSION" --window-icon=$ICON \
--file --width=600 --height=500 \
--text=$"<b>Choose your own audio file as alert!</b>
________________________________________________")
if [ -z "$CHANGE" ];then
exec alert_clock
exit 0
else
mkdir $HOME/.config/alert-clock
rm -rf $HOME/.config/alert-clock/alert sleep 1
ln -s "$CHANGE" $HOME/.config/alert-clock/alert
yad --title $"$TITLE"" $VERSION" \
--button="gtk-ok:0" \
--width 300 \
--window-icon=$ICON \
--text=$"Your own sound is set!!"
fi
menu
fi
Wann immer ein if steht, wird auch ein fi benötigt oder aber unser Script wird mit einer Fehlermeldung beendet. Richtig ist if … ; then … else … fi.
Testen Sie es mit Geany aus.
Zu diesem Zeitpunkt haben wir ein perfekt funktionierendes Hauptfenster. Nun wird es Zeit alert_clock zu dem zu machen, was der Name verspricht.
Fügen Sie folgendes zu ihrem Script:
if [ "$COUNTDOWN" = "" ];then
exit
else
echo you enter "$COUNTDOWN" minutes
TIMER=$(echo $(($COUNTDOWN*60)))
TASK1=$(date -s "+$TIMER seconds" 2>/dev/null | cut -d " " -f4)
exec 3> >(yad --notification --command=CMD --image=$ICON --listen)
echo tooltip: $"Alarm clock was set to $COUNTDOWN minutes and notifiers at $TASK1!" >&3
#sleep $TIMER
while [ $TIMER -ge 1 ]
do
echo -n "$TIMER "
sleep 1
TIMER=$[$TIMER-1]
done
exec 3>&-
und starten Sie es. Wenn Sie die Fehlermeldung ./alert_test: line 82: syntax error: unexpected end of file erhalten, verzweifeln Sie nicht. Wir sollten sicher gehen, das unsere letzte Zeile mit einen fi endet.
Es sollte nun in etwa so aussehen, wenn Sie eine Zeit angegeben haben:
Wenn Sie nicht das Resultat bekommen, wie oben dargestellt, hat sich entweder ein Fehler eingeschlichen oder aber es fehlt das Icon. Der Countdown wird still runtergezählt und nach Beendigung wird unser Programm ohne Fehlermeldung geschlossen.
Um nun den Alarm auch dargestellt zu bekommen (akustisch und visuell) fügen wir zu unser Script:
#
#check which sound - auf Audio prüfen
#
if [ -f $HOME/.config/alert-clock/alert ]; then
SOUND="$HOME/.config/alert-clock/alert"
else
qqq SOUND='/usr/share/alert_clock/alarm.ogg'
fi
This is needed for our sound.
#
#alert output - Alarm Ausgabe
#
(mplayer -loop 0 "$SOUND") | yad --title $"$TITLE"" $VERSION" \
--button="gtk-ok:0" \
--width 300 --image=$ICON \
--window-icon=$ICON \
--text=$"<b>Time is over!!</b>"
exit;
fi
exit
Führen Sie es erneut aus. Hören Sie nun den Alarm?
Wenn nicht checken Sie die Fehlermeldungen, wenn Sie es über den Terminal ausführen.
Wann immer Sie ein Script benötigen, so nutzen Sie YAD, Zenity, GTKdialog oder Kdialog. Das wird ihnen den Alltag erleichtern.
Sie können sich das Script zum testen auch von meiner Webseite herunterladen.
Viel Glück