8. X

Inhalt:

8.1 Grundlagen

Die hier gegebenen Informationen können der X(1) Manpage entnommen werden!

  1. Client/Server Konzept:

    Im X-Umfeld werden Applikationen als "X-Clients" bezeichnet, die Zeichen-Requests an die Darstellungseinheit senden. Die Darstellungs-Einheit steuert die Grafikhardware, Tastatur und Maus an und wird als "X-Server" bezeichnet. Ein X-Server kann dabei ein oder mehrere "(X-)Screens" verwalten.

    Anwendung (Client) und X-Display (Server) koennen auf dem gleichen Rechner laufen, muessen aber nicht. Das X Window System ist netzwerk-transparent, Anwendungen auf diversen entfernten Rechnern können ihre grafischen Ausgaben auf einen X-Server umlenken.

    Architektur:

    	  Application code                \
    	  X toolkits (Xt, gtk, Qt)         } X Client
    	  Xlib                            /
    	  -------
    	  X-Server
    	  Hardware
    	  

  2. Adressierung X-Display: hostname:displaynummer.scrennnummer

    Das Display, an das der X-Client seine Ausgabe sendet steht üblicherweise in der Umgebungsvariable DISPLAY, die Variable wird von Anwendungen automatisch ausgelesen, sie wird beim starten des X Servers auf die Adresse des lokalen Displays (localhost:0.0 bzw. :0) gesetzt.

    Die Rechner-lokale Kommunikation zwischen Clients und X-Server geschieht ueber Unix-Domain Sockets (/tmp/.X11-unix/X0), zwischen verschiedenen Rechner kann die Kommunikation ueber TCP/IP oder DECnet geschehen.

  3. Einfache Zugriffsregelung über xhost

    Nötig, um unberechtigte Zeichen-Zugriffe und v.a. Auslesen von Tastatur- und Maus-Events zu verhindern.

    Problem bei xhost ist, dass allen Clients auf dem angegebenen Rechner Zugriff auf das lokale Display erlaubt wird, was ggf. zu einem Sicherheitsproblem fuehren kann. Besser ist hier der "xauth" Mechanismus als Alternative.

  4. Farben: symbolisch (in /usr/openwin/.../rgb.txt hinterlegt) oder numerisch: #RGB, #RRGGBB, #RRRGGGBBB, #RRRRGGGGBBBB, rgb:R/G/B, rgb:RR/GG/BB, rgb:RRR/GGG/BBB, rgb:RRRR/GGGG/BBBB; (R, G, B: 4 bit Hex Ziffer (0-9, a-f) für Rot, Grün, Blau)

    Beispiele:

  5. Fonts: Enthalten Angaben über Hersteller, Name, Kursivität, Grösse in Punkten, Codierung etc., getrennt durch '-'. Angaben können mit '*' dem X-Server überlassen werden, dieser sucht dann einen passenden Wert. Auflistung aller dem X Server bekannten Zeichensätze via xlsfonts, Experimentieren mit xfontsel.

    Beispiele:

  6. Geometry: Angaben über Fenstergröße und -position

    Syntax: BxH+xoff+yoff

    B, H: Breite und Höhe in Pixeln oder (bei xterm) Zeichen. xoff und yoff sind Abstand vom linken/rechten und oberen/unteren Bildschirmrand:

    Abstand von
    +xoff linkem Bildschirmrand
    -xoff rechtem Bildschirmrand
    +yoff oberen Bildschirmrand
    -yoff unteren Bildschirmrand

    BxH bzw. +xoff+yoff (oder entsprechend mit -) können weggelassen werden, um nur die Lage bzw. Größe des Fensters festzusetzen.

    Beispiel:

  7. Standard-Optionen:
    Option Bedeutung
    -fg farbe Vordergrundfarbe festlegen
    -bg farbe Hintergrundfarbe festlegen
    -fn font Zeichensatz festlegen (xterm, ...)
    -display dsp Display, auf dem die Ausgabe erfolgen soll
    -iconic Iconifiziert starten
    -title string Fenstertitel festlegen
    -geometry BxH+x+y Fenstergroesse & -position

    Viele "moderne" X-Programme (KDE, GNOME, ...) implementieren diese Optionen nicht durchgängig!

  8. X-Ressourcen: Voreinstellungen über .Xdefaults, Application Default-Files. Mögliche Einstellungen:

Einstellungen können gemacht werden in ~/.Xdefaults (MIT X11/XFree) bzw. ~/.Xressources (OpenWindows), ~/Klasse (z.B. ~/XTerm) oder /usr/X11R6/lib/X11/app-defaults/Klasse (MIT X11/XFree) bzw. /usr/openwin/lib/X11/app-defaults/Klasse (OpenWindows).

Einlesen von Dateien in die X Ressource Datenbank: xrdb -merge datei.

8.2 Einige Standard-X-Programme

xload:

xclock:

xev:
 

noon% xev
Outer window is 0x1800001, inner window is 0x1800002

ButtonPress event, serial 22, synthetic NO, window 0x1800001,
    root 0x2e, subw 0x1800002, time 2991767946, (33,51),
     root:(366,260),
    state 0x0, button 3, same_screen YES

ButtonRelease event, serial 22, synthetic NO, window 0x1800001,
    root 0x2e, subw 0x1800002, time 2991768170, (33,51),
    root:(366,260),
    state 0x400, button 3, same_screen YES

KeyPress event, serial 22, synthetic NO, window 0x1800001,
    root 0x2e, subw 0x1800002, time 2991770797, (33,51),
    root:(366,260),
    state 0x0, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 characters:  ""

KeyRelease event, serial 27, synthetic NO, window 0x1800001,
    root 0x2e, subw 0x1800002, time 2991771124, (33,51),
    root:(366,260),
    state 0x1, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 characters:  ""

xlsfonts:
noon% xlsfonts | wc -l
    1228
noon% xlsfonts
-adobe-courier-bold-o-normal--0-0-100-100-m-0-iso10646-1
-adobe-courier-bold-o-normal--0-0-100-100-m-0-iso8859-1
-adobe-courier-bold-o-normal--0-0-75-75-m-0-iso10646-1
-adobe-courier-bold-o-normal--0-0-75-75-m-0-iso8859-1
-adobe-courier-bold-o-normal--10-100-75-75-m-60-iso10646-1
-adobe-courier-bold-o-normal--10-100-75-75-m-60-iso8859-1
-adobe-courier-bold-o-normal--11-80-100-100-m-60-iso10646-1
-adobe-courier-bold-o-normal--11-80-100-100-m-60-iso8859-1	  

Fonts sind vom X-Server abhängig, wenn eine Anwendung einen bestimmten Zeichensatz benötigt, dann muß dieser dem X-Server bekannt gemacht werden.

xset:
Viele Einstellungen im X Server:
noon% xset
usage:  xset [-display host:dpy] option ...
    To turn bell off:
	-b                b off               b 0
    To set bell volume, pitch and duration:
	 b [vol [pitch [dur]]]          b on
    To disable bug compatibility mode:
	-bc
    To enable bug compatibility mode:
	bc
    To turn keyclick off:
	-c                c off               c 0
    To set keyclick volume:
	 c [0-100]        c on
    To control Energy Star (DPMS) features:
	-dpms      Energy Star features off
	+dpms      Energy Star features on
	 dpms [standby [suspend [off]]]     
	      force standby 
	      force suspend 
	      force off 
	      (also implicitly enables DPMS features) 
	      a timeout value of zero disables the mode 
    To control font cache:
	 fc [hi-mark [low-mark [balance]]]
	    both mark values spcecified in KB
	    balance value spcecified in percent (10 - 90)
    Show font cache statistics:
	 fc s
    To set the font path:
	 fp= path[,path...]
    To restore the default font path:
	 fp default
    To have the server reread font databases:
	 fp rehash
    To remove elements from font path:
	-fp path[,path...]  fp- path[,path...]
    To prepend or append elements to font path:
	+fp path[,path...]  fp+ path[,path...]
    To set LED states off or on:
	-led [1-32]         led off
	 led [1-32]         led on
    To set mouse acceleration and threshold:
	 m [acc_mult[/acc_div] [thr]]    m default
    To set pixel colors:
	 p pixel_value color_name
    To turn auto-repeat off or on:
	-r [keycode]        r off
	 r [keycode]        r on
	 r rate [delay [rate]]
    For screen-saver control:
	 s [timeout [cycle]]  s default    s on
	 s blank              s noblank    s off
	 s expose             s noexpose
	 s activate           s reset
    For status information:  q          

xfontsel:

xdpyinfo:
noon% xdpyinfo
name of display:    :0.0
version number:    11.0
vendor string:    The XFree86 Project, Inc
vendor release number:    40100000
XFree86 version: 4.1.0

...

default screen number:    0
number of screens:    1

screen #0:
  dimensions:    1024x768 pixels (347x260 millimeters)
  resolution:    75x75 dots per inch
  depths (7):    16, 1, 4, 8, 15, 24, 32
  root window id:    0x2e
  depth of root window:    16 planes
...

xwininfo:
noon% xwininfo

xwininfo: Please select the window about which you
          would like information by clicking the
          mouse in that window.

xwininfo: Window id: 0xa0000e "xterm"

  Absolute upper-left X:  514
  Absolute upper-left Y:  21
  Relative upper-left X:  0
  Relative upper-left Y:  0
  Width: 499
  Height: 316
  Depth: 16
  Visual Class: TrueColor
...
  Corners:  +514+21  -11+21  -11-431  +514-431
  -geometry 80x24-6+0 

xhost:
noon% xhost
access control enabled, only authorized clients can connect
noon% xhost +194.95.108.12
194.95.108.12 being added to access control list
noon% xhost
access control enabled, only authorized clients can connect
INET:194.95.108.12
noon% xhost -194.95.108.12
194.95.108.12 being removed from access control list
noon% xhost
access control enabled, only authorized clients can connect

xkill:
noon% xclock -geometry +0+0 &
[1] 678
noon% xkill
Select the window whose client you wish to kill with button 1....
xkill:  killing creator of resource 0x1800009
X connection to :0.0 broken (explicit kill or server shutdown).
[1]  + Exit 1                        xclock -geometry +0+0
noon% 

xterm:

Weitere Informationen: Artikel "TTYs and X Windows - Unix User Interaction now and then. An Introduction of Concepts for Novice Users." http://www.onlamp.com/pub/a/onlamp/2001/03/22/tty.html

8.3 Display entfernter Anwendungen umleiten 1 - Standard X

  1. Auf lokaler Maschine (mit laufendem X Server) entferntem Rechner Zugriff erlauben:
    localmachine% xhost +remotemachine
  2. Auf entferntem Rechner anmelden:
    localmachine% telnet remotemachine 
    bzw.
    localmachine% ssh -x remotemachine           # kleines 'x'! 
  3. Auf remote Maschine (mit X Client) Ausgaben auf lokalen Rechner umleiten:
    remotemachine% setenv DISPLAY localmachine:0.0
  4. X Client starten:
    remotemachine% xclock  

Achtung: Der X Client baut hier eine TCP-Verbindung zum lokalen X Server auf, welcher die Uhr dann anzeigt. Funktioniert dies nicht, so ist dies evtl. (wie z.B. auf SuSE 9.2) dadurch unterdrückt dass der X-Server per default auf keine TCP-Verbindungen lauscht, siehe /etc/X11/xdm/Xservers:
rfhinf103% cat /etc/X11/xdm/Xservers
...
:0 local /usr/X11R6/bin/X -nolisten tcp -br vt7
... 
Abhilfe schafft hier das Starten eines zweiten (lokalen) X-Servers (``X :1'') und Umlenken auf dessen Display (``setenv DISPLAY localmachine:1'').

8.4 Fortgeschrittene Zugriffskontrolle via xauth

Problem bei der xhost-basierten Zugriffskontrolle ist, dass alle Benutzer des jeweilgen Rechners Zugriff erhalten, was bei Mehrbenutzersystemen zu Problemen führen kann. Abhilfe schafft hier die xauth-basierte Zugriffskontrolle, die auf dem Prinzip von "Passworten" in Form von Magic Cookies für das jeweilige Display geschieht. Nur wer das Passwort (Cookie) besitzt darf zugreifen.

Befehle: xauth list, xauth add. Voraussetzung: xdm o.ä. der Authority Cookies aufsetzt.

Lokal:

delphi% xauth list
delphi:0  MIT-MAGIC-COOKIE-1  a0501d1f869149e97e1f7f663dab4ac2
noon/unix:0  MIT-MAGIC-COOKIE-1  6d90befa47fc677d31da3712b244c9f5
...


Remote:

noon% setenv DISPLAY delphi:0
noon% setenv XAUTHORITY /tmp/xauth
noon% xauth list
xauth:  creating new authority file /tmp/xauth
noon% xclock
Xlib: connection to ":0.0" refused by server
Xlib: Client is not authorized to connect to Server
Error: Can't open display: :0.0
noon% xauth add delphi:0  MIT-MAGIC-COOKIE-1  a0501d1f869149e97e1f7f663dab4ac2
xauth:  creating new authority file /tmp/xauth
noon% xclock
^C

     

8.5 Display entfernter Anwendungen umleiten 2 - Mit Secure Shell

Die ssh leitet die Ausgabe beim Aufruf mit "ssh -X" automatisch um - Zugriffskontrolle wird passed gesetzt, und $DISPLAY auf dem entfernten Rechner passend gesetzt, so daß die X-Session über die ssh-Verbindung (verschlüsselt!) getunnelt und an den lokalen X-Server weitergereicht wird:

localmachine% ssh -X remotemachine xclock

8.6 Startup - Prozesse

8.7 Startup - Dateien

Abarten an der FH-R: .xinitrc.x11, .xinitrc.x11-Auflösung, .xinitrc.openwin, .xsession.kde, ...

Beispiel:

#!/bin/sh
xclock &
xterm -geometry +0-0 &
xterm -geometry -0-0 &
twm                  # hier kein "&" !

8.8 Window Manager

Aufgaben: Fensterdekoration, Fenster- und Icon-Verwaltung; Menüs und Button-Bars (Startleiste, ...) zum starten und anwählen von Programmen. Theme-fähige Desktop-Umgebungen (KDE, GNOME) können Fenster-Dekoration on the fly ändern.

Window Manager sind reine X-Clients!

8.9 Demonstration zu X & KDE

Die folgenden Schritte zeigen wie X mit KDE 3.4 von einem entfernten Rechner aus gestartet werden kann, indem (anders als bei "startkde") alle KDE Komponenten einzeln der Reihe nach gestartet werden:

Literatur

(Übung)
(c) Copyright 1998-2006 Hubert Feyrer <hubert@feyrer.de>
$Id: 07-X.html,v 1.28 2007/06/13 23:04:53 feyrer Exp $