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