Das X-Window-System
X – Window Programmierung
Medieninformatik – Hochschule Rhein-Main Systemprogrammierung 2010
Christine Bauers Jan Nowag Kathleen Oehring
X – Window Programmierung
Gliederung
1. Einführung X Window System 2. Geschichte 3. Archtikektur 4. X – Lib Programmierung 5. Toolkits 6. Verschiednes
1. Einführung in das X – Window - System
1. Einführung X – Window System
● Netzwerkprotokoll
● Client – Server – strukturiert
● Standartbaukasten zur Erstellung graphischer Benutzeroberflächen
● Windowmanager
● Netzwerktransparent
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
2. Geschichte
2. Geschichte
● 1984 – Entwicklung von u.a. MIT
● 1987 – Version X11
● 1988 – Gründung des nicht – kommerzielle X – Konsortiums
The Open Group ● 1994 – TheOpenGroup uebernahem die Entwicklung
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
2. Geschichte
● 1994 – Xfree86 erlangt immer größeren wird Standart der X – Implementierung
● 2003 – Xfree löst sich auf
X.Org Foundation
● 2004 – Die X – Org Foundation wird gegründet
● 2005 – Die Weiterentwicklung von X.Org, X.Org -Server, ist die meistverbreitete X - Implementierung
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
3. Architektur
3.1 Client 3.2 Server 3.3 X – Protokoll 3.4 Windowmanager 3.5 Kommunikationsmodell
3.1 Client
● Anwendungsprogramme
● Benutzt graphische Ein – und Ausgabe des Servers
● Kann auf selben Rechener laufen wie Server
● Beispiele: xclock, xcalc, xcalendar
● Spezieller Client: WindowManager
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
3.1 Client
xcalc xeyes xcalendar
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
3.2 Server
● Läuft auf Rechner am Arbeitsplatz
● Stellt graphische Dienste zur Verfügung
● Enthält Grafikkarten – Maus und Tastaturtreiber
● Steuert Ein – und Ausgabegeräte
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
3.3 X - Protokoll
● Sorgt für Kommunikation zwischen Client und Server
● Geräteunabhänig
● Basiert auf TCP/IP oder UNIX – Domain - Sockets
● 4 Arten zur Kommunikation
– Request
– Reply
– Event
– Error
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
3.3 X - Protokoll
Request
● Vom Benutzer ausgelöst
● Von X – Lib erzeugt
● Informationen für den Server z.B. Anweisung wie ein Fenster verschoben wurde
● Round – Trip – Request (erwartet Antwort – z.B. Veränderung der Fenstergröße)
● One – Way – Request (erwartet keine Antwort – z.B Linie zeichnen)
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
3.3 X - Protokoll
Reply
● Serverseitige Antwort
● Nur bei Round – Trip - Request
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
3.3 X - Protokoll
Events
● Vom Benutzer ausgelöste Aktionen (Mausbewegung, Tastendruck)
● Server kontrolliert sämtliche Eingabegeräte
● Server schickt registrierte Events an Anwendugsprogramm
● Events werden im Client in eine Warteschlange gelegt
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
3.3 X - Protokoll
Error
● Ähnlich zu Events
● Xlib stellt Funktionen zur Fehlerbehebung bereit
● Unterscheidung zwischen behebbaren und fatalen Fehlern
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
3.3 X - Protokoll
Pufferung
● Anfragen werden gesammelt
● Gesammelte Anfragen werden verschickt, wenn Puffer voll ist
● Ausnahmen
– Kein passendes Ereignis in der Warteschlange
– Round – Trip – Request
– Client entleert Puffer manuell
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
3.4 Windowmanager
● Spezieller X – Client
● Verwaltung der Fenster am Bildschirm
● Stellt Funktionen wie Minimieren, Vergrößern und Schließen zur Verfügung
● Kwin (KDE) ist bekanntester Windowmanager
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
3.4 Windowmanager
● Kwin – Bildschirmhintergrund ist kein root – Window, sondern KDE – Desktop selbst
● Aktionen wie Drag & Drop sind dadurch möglich
● Kann in verschiedenen Stilen angepasst werden
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
3.4 Windowmanager
KDE 4.1.3 Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
3.5 Kommunikationsmodell
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4. Xlib – Programmierung
4.1 Xlib 4.2 Funktionsweise 4.3 Nachteile 4.4 XCB
4.1 Xlib
• Basis des X Window Systems auf der Client-Seite
● in C geschriebene Programmbibliothek, die Funktionen und Datenstrukturen zur Kommunikation mit dem X-Server bereitstellt
● erfordert vom Programmierer keine Kenntnisse über das X-Protokoll
● bleibt den Entwicklern von grafischen Anwendungen normalerweise verborgen, da diese gegen Toolkits und andere Bibliotheken programmieren, welche auf der Xlib aufbauen
● Referenzimplementierung der X.Org Foundation
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.1 Xlib
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
Erzeugen eines einfachen Fensters:
1. Verbindung zum X-Server aufbauen 2. Fenster definieren 3. Informationen für den Windowmanager (optional) 4. Fenster anzeigen 5. Fenster schließen, Verbindung beenden
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
Wichtige Begriffe
● Host: Name des Servers im Netzwerk
● Display: X-Server aus Softwaresicht, mehrere X-Server auf einem Rechner erfordern Hardware, die Ein- und Ausgabegeräte für mehrere Benutzer bereitstellt
● Screen: Bildschirm an einem Display, wobei ein Display mehrere Bildschirme haben kann, die dann einem Benutzer zur Verfügung stehen
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
Host „eins“
Host „zwei“ Host „drei“
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
Verbindung mit dem Server aufbauen
Display *XOpenDisplay(char *display_name)
Für POSIX-konforme Systeme gilt: - display_name: hostname:display_number:screen_number (TCP) - display_name: hostname::display_number:screen_number (DECnet) - display_name: display_number:screen_number (UNIX Domain Socket)
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
Fenster definieren
int XDefaultScreen(Display *display)
- Liefert die Nummer des Standardbildschirms zurück - wird bei vielen Funktionsaufrufen benötigt
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
Window XRootWindow(Display *display, int screen_number)
- jedes zu erzeugende Fenster benötigt einen Vorfahren - bei Client-Fenstern auf oberster Ebene ist das der Windowmanager bzw. der ganze Bildschirm - verschachtelte Fenster sind möglich
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
Window XCreateSimpleWindow(Display *display, Window parent, int x, int y, unsigned int width, unsigned int height, unsigned int border_width, unsigned long border_color, unsigned long background)
- x und y geben die Position der linken oberen Ecke des Fensters an (wird von den Windowmanagern meistens ignoriert) - border_width gibt die Dicke des Rahmens an (wird auch meistens ignoriert) - Rückgabewert ist die Kennungs-ID des Fensters
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
Informationen für den Windowmanager
● dem Windowmanager können Informationen zu Fenstern übergeben werden
● z.B.: Fenstertitel, Icon, minimale oder maximale Größen, Gravitation etc.
● Funktionen zum Setzen einzelner Werte oder ganzer Strukturen
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
void XStoreName(Display *display, Window win, char *window_name)
- teilt dem Windowmanager den Namen des Fensters mit
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
Fenster anzeigen
void XMapWindow(Display *display, Window win)
- Zeigt das Fenster win an, vorausgesetzt alle Vorfahren werden auch angezeigt. - Handelt es sich um ein Fenster mit Nachfahren, für welche diese Funktion bereits aufgerufen wurde, dann werden diese jetzt auch angezeigt.
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
Fenster schließen
void XDestroyWindow(Display *display, Window win)
- zerstört das Fenster win und alle Nachfahren - guter Stil, Fenster würden beim Beenden der Verbindung ohnehin zerstört werden
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
Verbindung beenden
void XCloseDisplay(Display *display)
- beendet die Verbindung zum X-Server - alle Fenster und Ressourcen werden zerstört - guter Stil (gibt ggf. noch nicht gemeldete Fehler aus), Verbindung würde beim Beenden des Clients automatisch beendet werden
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
Events
● Nachrichten vom X-Server an den Client
● ausgelöst durch Ereignisse:
– Benutzereingaben (Maus, Tastatur)
– Seiteneffekte von Benutzereingaben (z.B. beim Schließen eines Fensters DestroyNotify-Event an alle Nachfahren und Expose-Event an alle zuvor verdeckten Fenster)
● Events werden in eine Warteschlange eingereiht
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
Event – Typen und Event – Masken
● es werden über 30 Event-Typen unterschieden
● Event-Masken verhindern unnötige Belastung des Systems
● dem X-Server wird explizit mitgeteilt, welche Events an den Client geschickt werden sollen (sollte vor dem Anzeigen eines Fensters durchgeführt werden)
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
Abarbeiten von Events
● Events, die durch Benutzereingaben ausgelöst wurden, werden entweder vom aktiven Fenster behandelt oder an den nächsten Vorfahren weitergegben, bis eines der Fenster das Event behandelt oder explizit verwirft
● die Abarbeitung erfolgt dann in einer Event-Schleife
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
Fehlerbehandlung
● Fehler, die auf dem X-Server durch Funktionsaufrufe auftreten, werden genau wie Events an den Client geschickt
● Fehler-Events werden von der Xlib nicht in eine Warteschlange eingefügt, sondern sofort durch die Fehler-Event-Routine bearbeitet
● Die Xlib bietet eine voreingestellte Fehler-Event-Routine, die Fehler auf stderr ausgibt
● Anwendungen können eigene Fehler-Event-Routinen definieren
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
Graphik mit X
● Funktionen zum Zeichnen von
– Punkten
– Linien
– Segmenten
– Kreisen, Bögen
– Vierecken
– Polygonen
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
Kommunikation zwischen Anwendungen
● bisher: Kommunikation zwischen Windowmanager und anderen Clients
● jetzt: Kommunikation zwischen Clients, die nicht direkt verwandt sind
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
Text mit X
● für jede Schriftgröße ist ein eigener Font notwendig
● verfügbare Fonts können aufgelistet und einzeln geladen werden
● Höhe und Breite müssen selbst berechnet werden, Text wird nicht automatisch umgebrochen oder ausgerichtet
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
● Acht separtate Cut-Puffer:
– nehmen beliebige Bytefolgen auf
– können von allen Clients gelesen und beschrieben werden
– Daten werden auf dem X-Server gespeichert
● Zu jedem Fenster können Properties gespeichert werden:
– sind über einen Namen identifizierbar
– haben einen festen Datentyp
– können von allen Clients gelesen und gesetzt werden
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.2 Funktionsweise
● Der Selection-Mechanismus ist eine Erweiterung des Cut-Puffers:
– nur ein Client kann zu einem Zeitpunkt Besitzer der Selection sein
– Daten bleiben bei einer Anwendung (und liegen nicht auf dem X-Server)
– zur Übertragung werden die Daten in ein Property des anfordernden Clients geschrieben
– dieser wird dann zum Besitzer der Selection gemacht
– für größere Datenobjekte (Bilder etc.) geeignet
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.3 Nachteile
● Durch ihre Größe ist die Xlib für kleine Plattformen ungeeignet.
● Xlib-Requests, die eine Antwort erwarten, laufen synchron ab. Dadurch werden die Clients solange blockiert, bis eine Antwort eingegangen ist, egal ob die Antwort tatsächlich sofort benötigt wird oder nicht.
● Die API macht es schwierig, Nebenläufigkeit fehlerfrei zu nutzen.
● Anfragen der Clients werden optimiert und daher nicht unmittelbar in Serveranfragen umgewandelt. Es ist kaum möglich, direkt auf das X-Protokoll zuzugreifen
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.3 Nachteile
● Durch ihre Größe ist die Xlib für kleine Plattformen ungeeignet.
● Xlib-Requests, die eine Antwort erwarten, laufen synchron ab. Dadurch werden die Clients solange blockiert, bis eine Antwort eingegangen ist, egal ob die Antwort tatsächlich sofort benötigt wird oder nicht.
● Die API macht es schwierig, Nebenläufigkeit fehlerfrei zu nutzen.
● Anfragen der Clients werden optimiert und daher nicht unmittelbar in Serveranfragen umgewandelt. Es ist kaum möglich, direkt auf das X-Protokoll zuzugreifen
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
4.4 XCB (X C Binding)
● soll die Xlib ersetzen
● Umstieg wird durch die Bibliothek Xlib/XCB erleichtert, die XCB als Transportschicht nutzt, aber sowohl XCB- als auch Xlib-Funktionsaufrufe (nebeneinander) zulässt
● Vorteile:
– kompakter trotz gleichen Funktionsumfangs
– ermöglicht direkten Zugriff auf das X-Protokoll durch XML - Beschreibungen
– bessere Unterstützung für nebenläufige und asynchrone Anfragen
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes
5. Toolkits
5. Toolkits
● Toolkits sind GUI-Bibliotheken
● Entwicklung von grafischen Oberflächen auf einer höheren Ebene als der Xlib
● Die wichtigsten Toolkits unter X Window sind Motif, Qt , Xt und GTK+
1. Qt
2. Xt
3. Motif
4. GTK+
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes 5. Toolkits
Qt
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes 5. Tookits
Qt
● C Klassenbibliothek und Toolkit für grafische Oberflächen
● ursprünglich als Widgetset für X-Window-Systeme entwickelt (Alternativ zu Motif)
● für Microsoft Windows zur Windows API Microsoft Foundation Classes (MFC)
● Qt-Toolkit plattformunabhängig → Framework für Unix/Linux, Windows und neuerdings auch MacOS X
● Umfang der Qt-Bibliothek stark weiterentwickelt, aktuellste Version Qt 3.3.3 von Trolltech
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes 5. Toolkits
Warum Qt?
● Plattformunabhängig → kann unverändert auf verschiedenen Plattformen kompiliert werden (Java auch, jedoch QT schneller ausgeführt)
● Bruchteil an Quellcode → Methoden, Sorgfälltige API
● schnelles Erlernen → Quelltexte offen und damit verbunden Einblick in konzeptuellen Aufbau
● mittlerweile weit verbreitet besonders in Programmierung von Linux- Anwendungen
● Arbeitserleichterung und Hilfe durch hervorragende Online-Dokumentation
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes 5. Toolkits
Qt – Beispielprogramm
● Erzeugung eines Fensters mit einem HelloButton und eines ExitButtons
● Einbindung der notwendigen Bibs
● Funktionseinbindung
● WindowWidget – Adden von ButtonWidget
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes 5. Toolkits
5. Toolkits
Xt
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes 5. Toolkits
Xt - X Toolkit
● X Toolkit Intrinsics library nutzt low-level Xlib library, mit Oo und freundlicher API
● Verwendet in C oder C++
● Keine Funktionen für graphische Objekte (buttons, Menüs, etc.) = widgets → Keine spezifischen widgets → andere Libs wie Xaw & Motif
● Xt gibt Funktionen wie z.B. Erstellung und Nutzung von widget types
● meisten modernen toolkits wie FLTK, GTK, und Qt kein Gebrauch von Xt library(eher Xlib direkt)
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes 5. Toolkits
GTK+
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes 5. Toolkits
GTK+
● Gimp Toolkit → Abkürzung GTK+
● Entwicklung von Peter Mattis, Spencer Kimball und Josh MacDonald → um abseits von Motif GUI für GIMP zu erstellen
● Heute → Verwendung von Vielzahl von Anwendungen, sowie in GNOME oder Xfce, neben Qt eines der erfolgreichsten Grafik Toolkits
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes 5. Toolkits
GTK+
● sehr brauchbare, funktionsreiche Werkzeugsammlung zum Erstellen grafischer Benutzeroberflächen
● freie Komponentenbibliothek unter der LGPL
● die API bietet Cross-Plattform-Kompatibilität
● in C geschrieben & mit Bindungen C++, Python & C # usw.
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes 5. Toolkits
GTK+ Beispielprogramm
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes 5. Toolkits
Motif oder MOTIF
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes 5. Toolkits
Motif (oder MOTIF)
● Programmbibliothek für Entwicklung für u.a. grafische GUIs
● Seit Version 2.1 Unicode Nutzung in etlichen mehrsprachigen Umgebungen
● erkennbar an quadratischen, dreidimensionalen Effekten z.B. Menüs, Knöpfe, Regler
● heutzutage angesichts von GTK+ und Qt weniger an Bedeutung
● Motif wurde von der Open Software Foundation geschaffen (OSF/Motif)
● gehört nun zur Open Group - Motif wird noch weiterentwickelt (Version 2.3 analog zu XPM auch Unterstützung von JPEG- und PNG-Bilddateien)
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes 6. Verschiedenes
6. Verschiedenes
Cygwin
● Cygwin/X Portierung X Window System → Microsoft Windows Systemen ( Windows NT, Windows 2000, Windows XP, Windows Vista, Windows Server 2003 und seit Version 1.7 auch unter Windows 7 und Windows Server 2008)
● Cygwin/X läuft auf allen Kunden- und Geschäftssystemen von Windows
● Cygwin/X bestehend aus : X Server, X libraries und nahezu allen Standard X clients (wie xterm, xhost, xdpyinfo, xclock, and xeyes)
● Bietet eine UNIX-ähnliche API zu Xlib and X clients
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes 6. Verschiedenes
Dargestellt:
- 2 offene Cygwin Bash Konsolen unter WinXP (eine führt eine Midnight- Commander Session aus) - X11-Server in rootless-mode - remote GUI-app (xclock) (tunneled over SSH via putty)
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes 6. Verschiedenes
Dargestellt:
- 2 offene Cygwin Bash Konsolen unter WinXP (eine führt eine Midnight- Commander Session aus) - X11-Server in rootless-mode - remote GUI-app (xclock) (tunneled over SSH via putty)
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes 6. Verschiedenes
X über SSH (X – Forwarding)
● Programm 'ssh' mit Option '-X'
● zeigt grafische Programme, die über SSH auf einem entfernten Rechner gestartet werden, auf dem eigenen lokalen Display an
● das Client-Programm muss dazu den X11-Standard einhalten
● der lokale Rechner muss einen X-Server bereitstellen
● unabhängig von den verwendeten Betriebssystemen
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes 6. Verschiedenes
X über SSH (X – Forwarding)
● Programm 'ssh' mit Option '-X'
● zeigt grafische Programme, die über SSH auf einem entfernten Rechner gestartet werden, auf dem eigenen lokalen Display an
● das Client-Programm muss dazu den X11-Standard einhalten
● der lokale Rechner muss einen X-Server bereitstellen
● unabhängig von den verwendeten Betriebssystemen
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes 6. Verschiedenes
X-Server X-Client
ssh-Tunnel
sshd ssh -X (proxy X-Server)
Terminal Shell lokaler Rechner lokaler Rechner
Einführung → Geschichte → Architektur → X-lib Programmierung → Toolkits → Verschiedenes