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 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.
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 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.
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)
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.
Infos
[1] XOSD: http://www.ignavus.net/software.html
[2] XOSD-RPMs: http://rpm.pbone.net/
[3] LICQ-XOSD-Plugin: http://sourceforge.net/projects/licq-osd





