Daten auf dem Desktop visualisieren mit X On Screen Display

Aus LinuxUser 07/2004

Daten auf dem Desktop visualisieren mit X On Screen Display

Nicht zu übersehen

Manchmal muss ein Linux-System seinen Benutzer auf etwas Wichtiges hinweisen. Damit dieser derartige Infos auch garantiert nicht übersieht, nutzt es dazu am besten XOSD.

Die Ankunft neuer E-Mails, das Eintreten kritischer Systemzustände oder eine per Fernbedienung hervorgerufene Lautstärkeänderung des Audiosystems – es gibt unzählige Dinge, über die man am besten unübersehbar und auffällig informiert werden will. Warum lässt man sich diese Daten dann nicht einfach “on screen” auf dem Desktop darstellen?

Linux wäre nicht Linux, hätte bisher noch niemand diese Idee in die Tat umgesetzt. Das Lösungswort heißt XOSD, eine Bibliothek, mit deren Hilfe grafische Anwendungen Texte direkt auf dem Bildschirmhintergrund darstellen können. Zu ihren Nutzern gehören beispielsweise Plugins für den Media-Player XMMS (Abbildung 1) und das Instant-Messaging-Programm LICQ (Abbildung 2).

Aber man muss kein Programmierer sein, um sich dieses Feature zunutze zu machen. Mit osd_cat liefert das XOSD-Paket (wir verwenden Version 2.2.5) ein Werkzeug mit, mit dem jeder beliebige Texte auf der grafischen Oberfläche anzeigen kann.

Abbildung 1: Mit einem XOSD-Plugin zeigt XMMS direkt auf dem Bildschirmhintergrund an, was gespielt wird.

Abbildung 1: Mit einem XOSD-Plugin zeigt XMMS direkt auf dem Bildschirmhintergrund an, was gespielt wird.

Abbildung 2: Warum den Chat nicht über den Hintergrund laufen lassen? Ein Anzeigeplugin für LICQ macht's möglich.

Abbildung 2: Warum den Chat nicht über den Hintergrund laufen lassen? Ein Anzeigeplugin für LICQ macht’s möglich.

XOSD gibt es sowohl im Quellcode [1] als auch als Binärpakete; zu letzteren weist eine Suche nach dem Stichwort xosd unter [2] den Weg. Während das Quellcode-Paket das angesprochene XMMS-Plugin enthält, fehlt es manchen der RPMs. Wer es dennoch ausprobieren will, ohne gleich zum Compiler greifen zu müssen, wird ebenfalls unter [2] fündig, muss aber nach xmms-xosd suchen. Nicht zur Standardausstattung gehört das LICQ-Plugin, das separat unter [3] erhältlich ist.

Ein wenig Kommandozeilentheorie

Das Schöne an Linux ist, dass alle Kommandozeilen-Tools einem einheitlichen Schema folgen, welches festlegt, dass Ausgaben über den so genannten “stdout”-Kanal (“Standard Output”), Eingaben über den Standard-Input-Kanal “stdin” und Fehlermeldungen über “stderror” erfolgen. Typischerweise sind “stdout” und “stderror” an das aktuell laufende Terminal gekoppelt, wodurch die Ausgaben direkt an den Bildschirm gesendet werden. Für die Eingabe sorgt standardmäßig die Tastatur.

Es besteht aber auch die Möglichkeit, den Standard-Ausgabe-Kanal eines Programms mit dem “stdin” eines weiteren zu koppeln und damit schlicht und ergreifend die Ausgabe des ersten Befehls durch den zweiten weiterverarbeiten zu lassen. Eine solche Pipeline entsteht durch Verwendung des Pipe-Symbols rpm -qa in der Befehlskette

rpm -qa | grep xosd

alle installierten RPM-Pakete auf. Wegen der Pipe zeigt es diese jedoch nicht auf dem Bildschirm an, sondern leitet die Ausgabe an den zweiten Befehl grep xosd weiter, der nur die Zeilen heraussucht, die die Zeichenkette xosd enthalten.

Auf dieselbe Weise funktioniert das Tool osd_cat. Es nimmt über den “stdin”-Kanal Zeichenfolgen entgegen und stellt diese dann “on screen”, live auf dem Bildschirm, dar. Alternativ darf das Tool mit einem Dateinamen als Parameter aufgerufen werden. So liest

osd_cat ~/.bashrc

die Datei .bashrc im Homeverzeichnis ~ und lässt ihren Inhalt in der linken oberen Bildschirmecke “durchrauschen”.

Die aktuelle Uhrzeit “on screen”

Dabei handelt es sich bislang um keine sehr praxisgerechte Anwendung, denn erstens erschweren dort abgelegte Desktop-Icons die Sicht; zweitens kann die rote Minischrift so schnell sowieso niemand lesen. Diese beiden Ärgernisse beseitigen die osd_cat-Optionen -A (alternativ --align=) für die horizontale Ausrichtung, -p (oder --pos=) für die vertikale und -f (alias --font=) für die verwendete Schrift (vgl. Tabelle 1): So platziert

date +"%k:%M:%S" | osd_cat -A center -p middle -f -adobe-helvetica-*-*-*-*-24-*-*-*-*-*-*-* -c darkgreen -s 5 -S lightgray

die aktuelle Zeit in der Mitte (-A center -p middle) des Bildschirms (Abbildung 3). Der date-Befehl gibt die aktuelle Uhrzeit dank der Formatierungsangabe +”%k:%M:%S” als klassische, durch Doppelpunkte getrennte Stunden:Minuten:Sekunden-Anzeige aus (%k steht für die aktuelle Stunde in 24-Stundenanzeige, %M für die aktuelle Minutenzahl und %S für die Sekunden). Mittels Pipe-Symbol gelangt dieses Datum zum Befehl osd_cat, der sich um die Darstellung kümmert.

Dank der 24 Punkt großen Helvetica-Schrift (-f -adobe-helvetica-*-*-*-*-24-*-*-*-*-*-*-*) lässt sich die Uhrzeit gut lesen; Kasten 1 erklärt, wie man den passenden Namen herausfindet. -c darkgreen färbt das Ausgegebene dunkelgrün; -s 5 -S lightgray definiert einen hellgrauen Schatten, der sich 5 Punkte unterhalb und rechts des Originaltexts befindet.

Abbildung 3: Die "osd_cat"-Parameter "--align=center" und "--pos=middle" sorgen dafür, dass die aktuelle Uhrzeit in der Bildschirmmitte erscheint.

Abbildung 3: Die “osd_cat”-Parameter “–align=center” und “–pos=middle” sorgen dafür, dass die aktuelle Uhrzeit in der Bildschirmmitte erscheint.

Beim Ausprobieren stellt man schnell befremdet fest, dass sich die Uhrzeit ganze fünf Sekunden lang einblendet, dabei nicht verändert und die Anzeige anschließend erstirbt. Obwohl sich osd_cat mit dem Parameter -d 60 dazu überreden lässt, die einmal von date übergebene Uhrzeit 60 Sekunden lang anzuzeigen, erfüllt eine solche stehende Uhr kaum ihren Zweck. Abhilfe naht in Form von Shell-Programmierung unter Verwendung der Linux-Standard-Shell Bash:

while true ; do date +"%k:%M:%S"; sleep 1; done | osd_cat -A left -p top -f -adobe-helvetica-*-*-*-*-24-*-*-*-*-*-*-* -c darkgreen -s 5 -S lightgray

Die Endlosschleife whiletrue; do ... ; done sorgt dafür, dass das Datum in alle Ewigkeiten neu ausgelesen wird. Damit die CPU nicht fortwährend Uhrzeiten bestimmen muss (wir brauchen nur jede Sekunde eine neue), bremst sleep 1 ein wenig: Jeder Schleifendurchlauf stoppt damit für die Dauer einer Sekunde.

Abbildung 4: Per Default zeigt "osd_cat" – sofern es soviele Daten bekommt – jeweils fünf Zeilen an, die es fortlaufend "durchschiebt".

Abbildung 4: Per Default zeigt “osd_cat” – sofern es soviele Daten bekommt – jeweils fünf Zeilen an, die es fortlaufend “durchschiebt”.

Abbildung 4 illustriert den Haken an der Sache: osd_cat zeigt jeweils die fünf aktuellsten (Uhrzeiten-)Zeilen an; sind diese voll, scrollt die Anzeige einfach nach oben. Zum Glück beschränkt die in Tabelle 1 aufgeführte osd_cat-Option -l 1 die auszugebende Zeilenzahl auf eine.

Lautstärke anpassen

Komplexere Anwendungsbeispiele wie die Anzeige eines Lautstärkepegels erfordern lediglich ein wenig mehr Kombinationsgeschick, denn zunächst braucht man ein Programm, das entsprechende Informationen auf dem “stdout”-Kanal ausgibt. Eine gute Wahl hierfür ist aumix, ein Mixer, den alle gängigen Distributionen mitliefern, wenn auch nicht immer standardmäßig installieren.

aumix -q listet alle bekannten Soundkanäle und deren aktuelle Lautstärkeeinstellung (in Prozent) auf. Diese Ausgabe reduziert der Befehl grep vol auf die Zeile mit der Gesamtlautstärke. Anschließend teilt cut -d " " -f 3 diese Zeile in durch Leerzeichen getrennte (-d " ") Spalten auf und gibt seinerseits nur die dritte Spalte (-f 3) aus, welche die Lautstärke des rechten Kanals enthält: Geht man davon aus, dass rechter und linker Kanal in etwa den gleichen Volumenpegel haben, kann man sich, wie hier geschehen, auf den rechten beschränken.

Bei Suse 9.1 muss das Ergebnis noch etwas weiter bearbeitet werden; hier ändert man die dritte Zeile in Listing 1 in

aktuell=`aumix -q | grep vol | cut -d " " -f 3 | sed s/,//`

Im Endeffekt erhält man in beiden Fällen aber nur eine Zahl, keine Balkenanzeige, die osd_cat ausgeben könnte. Hier hilft das Shellskript aus Listing 1, das Sie am besten unter dem Namen pegel.sh speichern und mit chmod u+x pegel.sh ausführbar machen.

Im Körper seiner while-Schleife hängt es zwischen den beiden Stichwörtern do und done einhundert Mal je ein Zeichen an den bisherigen Inhalt ($) der Variablen balken an, der anfangs Aktuelle Lautstärke: lautet: Entweder kommt ein # dazu oder ein -. Den Balken aus Gatterzeichen baut die Schleife so lange auf, bis die laufvariable, die zu Beginn auf 1 steht und in jedem Schleifendurchlauf mit + 1 um eins erhöht wird, kleiner oder gleich (-le, “less or equal”) dem in aktuell gespeicherten Lautstärkewert ist. Dann wird die Zeile mit Minuszeichen aufgefüllt.

Mit echo gibt das Skript den so erzeugten Lautstärkepegelbalken (also den Inhalt der Variablen balken) aus. Damit dieser immer die gleiche Breite hat, benutzt man am besten eine Nichtproportionalschrift wie Courier zur Anzeige mittels osd_cat (Abbildung 5):

./pegel.sh | osd_cat -A left -p top -f -adobe-courier-*-r-*-*-10-*-*-*-*-*-*-* -c green

Der grüne Balken in der linken (-A left) oberen (-p top) Bildschirmecke ändert sich in dieser Form jedoch auch hier nicht. Dieses Problem lässt sich mit

while true; do ./pegel.sh ; sleep 1; done | osd_cat -l 1 -A left -p top -f -adobe-courier-*-r-*-*-10-*-*-*-*-*-*-* -c green

analog zur Uhr lösen – ein Ansatz, der sich auch bei anderen Visualisierungsanliegen nutzen lässt.

Abbildung 5: Der Balken aus #-Zeichen passt seine Breite der Lautstärke an.

Abbildung 5: Der Balken aus #-Zeichen passt seine Breite der Lautstärke an.

Listing 1

Aus einer Zahl einen Balken machen

#!/bin/bash
laufvariable=1;
aktuell=`aumix -q | grep vol | cut -d " " -f 3`
balken="Aktuelle Lautstärke: "
while test $laufvariable -le 100
do
        if test $laufvariable -le $aktuell
        then
                balken="$balken#"
        else
                balken="$balken-"
        fi
        laufvariable=`expr $laufvariable + 1`
done
echo $balken

Tabelle 1: <C>osd_cat<C>-Parameter

Parameter Bedeutung
-a, –age=Sekunden Beeinflusst das Scrollen von Texten. Wenn zwischen dem Eintreffen zweier Textzeilen mindestens die angegebene Zeit in Sekunden liegt, scrollt osd_cat nicht, sondern löscht den bisherigen Text. Der implizite Standardwert 0 bedeutet, dass immer gescrollt wird.
-p, –pos=Position Vertikale Ausrichtung des Texts auf dem Bildschirm: Soll er oben stehen, schreibt man top an die Stelle von Positionmiddle meint in der Mitte und bottom unten.
-A, –align=Position Horizontale Ausrichtung des Texts auf dem Bildschirm; statt Position wählt man zwischen den Werten left (linksbündiger Text), right (rechtsbündig) oder center (zentriert).
-f, –font=Schriftart Verwendete Schriftart (Standard: -misc-fixed-medium-r-semicondensed--*-*-*-*-c-*-*-*).
-c, –colour=Farbe Die gewünschte Schrift-Farbe in englischer Sprache: Die Standardfarbe Rot heißt red, gelb yellow, grün green etc.
-d, –delay=Sekunden Legt fest, wie lange (wieviele Sekunden) die Anzeige erscheinen soll (Standard: 5 Sekunden).
-o, –offset=Punkte Vertikaler Abstand (in Punkten) vom mit -p ausgewählten Bezugspunkt: So erscheint die Anzeige bei -p top -o 5 fünf Punkte unterhalb des oberen Bildschirmrands. Bei -p bottom und -p middle sorgt der Offsetwert für eine Verschiebung nach oben.
-i, –indent=Punkte Horizontaler Abstand (in Punkten) von dem mit -A ausgewählten Bezugspunkt: Im Zusammenhang mit -A left und -A center verschiebt -i 10 die Anzeige zehn Punkte weiter nach rechts. Bei -A right sorgt der Indentwert für eine Verschiebung nach links.
-h, –help Zeigt eine kurze Hilfe zu allen verfügbaren Parametern an.
-s, –shadow=Offset Legt den Abstand des Schattens vom Text fest. Den Schatten erzeugt osd_catOffset Punkte weiter rechts und unterhalb des Texts. Der Standardwert 0 sorgt für schattenlose Schrift.
-S, –shadowcolour=Farbe Legt die Farbe des Schattens fest. Der Standardwert ist black, was der Farbe Schwarz entspricht.
-O, –outline=Punkte Legt die Dicke der Textumrandung fest. Beim Standardwert 0 fehlt der Rahmen.
-u, –outlinecolour=Farbe Legt die Farbe des Rahmens fest, standardmäßig black.
-w, –wait Sorgt dafür, dass osd_cat solange mit der Darstellung von anliegenden Texten wartet, bis die Anzeige gelöscht wurde.
-l, –lines=Anzahl Legt fest, wieviele Zeilen die Anzeige haben soll (Standard: 5).

Kasten 1: Namen für Schriftarten finden

Die wohl einfachste Möglichkeit herauszufinden, wie die auf dem System installierten Schriftarten heißen, führt über das Tool xfontsel (Abbildung 6). Innerhalb des Schriftnamens sind eine Menge Informationen kodiert, darunter an erster Stelle (fndry für “foundry”, “Gießerei”) der Hersteller (in Abbildung 6adobe), die Schriftfamilie (fmly für “family”, im Beispiel helvetica), die Dicke (wght für “weight”), die Neigung (slant, zum Beispiel i – “italics” – für “kursiv”) oder die Größe in Pixeln (pxlsz, “pixelsize”).

Bei der Suche nach einer passenden Schrift klickt man am besten mit der linken Maustaste auf das Stichwort fmly in der zweiten Zeile von oben, hält die Maus gedrückt und wählt eine Schriftfamilie aus. Sobald man die Maustaste nun loslässt, zeigt xfontsel die passende Schriftart an. Sternchen in der dritten Zeile mit dem Schriftnamen besagen, dass die an der jeweiligen Stelle kodierte Eigenschaft egal ist.

Klickt man jedoch auf andere Stichwörter in der zweiten Zeile, lässt sich die Schrift durch Hinzuwahl weiterer Charakteristika genauer spezifizieren; ausgegraute Punkte im jeweiligen Auswahldialog stehen nicht zur Verfügung.

Entspricht die Zusammenstellung den eigenen Ansprüchen, kopiert ein Klick auf den Knopf select den Fontnamen aus der dritten Zeile in den Zwischenspeicher, so dass er sich mit der mittleren Maustaste dort einfügen lässt, wo er gebraucht wird – beispielsweise hinter der -f-Option eines osd_cat-Aufrufs. Leider funktioniert dies nicht auf allen Systemen. (Hagen Höpfner/Patricia Jung)

Abbildung 6: "xfontsel" hilft beim Finden passender Schriftarten.

Abbildung 6: “xfontsel” hilft beim Finden passender Schriftarten.

Der Autor

Hagen Höpfner ist wissenschaftlicher Mitarbeiter am Institut für Technische und Betriebliche Informationssysteme der Fakultät für Informatik an der Otto-von-Guericke-Universität Magdeburg. In seiner Freizeit spielt der begeisterte Vater Gitarre in der Rockband “Gute Frage” (http://www.gutefrage.de/).

Glossar

LICQ

Ein grafischer Open-Source-Client für den Chat-Dienst ICQ (http://www.licq.org/).

true

Ein Kommandozeilenprogramm, das nichts tut, aber das erfolgreich. Genaugenommen gibt es einfach nur einen Wert zurück, den die Shell als positiv, als “wahr” interpretiert. Eine solche Bedingung in einem Schleifenkopf ist demnach immer erfüllt; die Schleife läuft ewig.

while-Schleife

Ein Programmierkonstrukt, das das Programm dazu bringt, eine “Tätigkeit” so lange zu wiederholen, wie die Bedingung erfüllt ist, die nach dem Stichwort “while” aufgeführt wird. In Listing 1 wiederholen sich die Anweisungen zwischen den (Shell-spezifischen) Stichwörtern “do” und “done” also, so lange der Test, ob der Inhalt (“$”) der Variablen “laufvariable” kleiner oder gleich (“-le”) 100 ist, ein positives Ergebnis liefert.

Nichtproportionalschrift

Schrift, bei der alle Buchstaben wie bei der Schreibmaschine die gleiche Breite haben. Bei Proportionalschriften wie Times oder Helvetica hängt deren Breite dagegen von ihrer “natürlichen Laufweite” ab: Ein i nimmt weniger Platz weg als ein m.

;

Stehen – anders als in Listing 1 – mehrere Shell-Befehle in einer Zeile, müssen sie durch Semikolon getrennt werden.

Zwischen sogenannten Backticks (von links oben nach rechts unten zeigenden einfachen Anführungszeichen) stehende Anweisungen führt die Shell aus und ersetzt den gesamten Ausdruck einschließlich der Backticks durch deren Ergebnis. Im Beispiel in Listing 1 landet so die Ausgabe des Befehls “aumix -q | grep vol | cut -d ” ” -f 3″ in der Variablen “aktuell”.

expr

Ein Befehl, der in der Shell einen arithmetischen oder logischen Ausdruck auswertet. In Listing 1 sorgt er für die (ganzzahlige) Addition des aktuellen Inhalts von “laufvariable” und 1.

LinuxUser 07/2004 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben