X window rendszer fogalmai UNIX rendszer felhasználói és • ő ő Kliens = a szolgáltatást igénybe vev . fejleszt i felülete (23-26. ea.) • Egy adott berendezés (gép) egyszerre elláthat szerver funkciókat is, és kliens programokat is futtathat. • ű ő Szeberényi Imre X szerver = az X display-t m ködtet , a BME IIT kliensek számára grafikus szolgáltatást nyújtó program.

M Ű E G Y T E M 1 7 8 2

UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 1 - UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 2 -

X display = munkahely felépítése Történelem 1984: MIT fejlesztés (Athena project + DEC + mások). Kiindulás: Stanford University „W” rendszere 1986: 10.4 els ő széles körben hozzáférhet ő változat 1987: 11.1 új alapok, nincs kompatibilitás a 10-es változattal 1988: 11.2 X konzorcium alakul a kiadott sw. támogatására 1989: 11.3 1990: 11.4 viszonylag kiforrott változat 1991: 11.5 bővítések (font szerver) 1994: 11.6 bővítések (Kerberos) 1996: 11.6.3 bővítések (Web funkciók), X konzorc. felbomlik 1998: 11.6.4 bővítések (LBX),Open Group

UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 3 - UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 4 -

Történelem X szerver feladatai 2001: 11.6.6 hibajavítás, Xfree86 • Engedje meg több kliens egyidej ű 2004: 11.6.7.0 bővítések, X.Org hozzáférését a display-hez. 2005: 11.6.8.2 hibajavítások • 2005: 11.6.9,11.7.0 EXA, refactoring, imake Értelmezze a hálózati üzeneteket, amit a 2006: 11.7.1 11.7.1 AIGLX kliensek küldenek. 2007: 11.7.2,11.7.3 DTrace, RandR • A kezel ői inputot küldje el a kliens 2008: 11.7.4 PciRework programnak. 2009: 11.7.5 Multi-Pointer, XI2, • Nyújtson kétdimenziós rajzolási 2010: 11.7.6 IncputClass, udev 2012: 11.7.7 Multitouch, primitíveket. 2013: 11.7.8

UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 5 - UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 6 -

1 X szerver feladatai/2 X rendszer szoftver architektúrája • Kezeljen komplex adatstruktúrákat, mint pl. window, font, icon, cursor, grafikus kontextus stb, melyekre egyszer űen ID-vel lehet hivatkozni. • Tegyen lehet ővé elosztott feldolgozást (máshol számol, máshol jelenít meg). • Nyújtson eszközfüggetlen, de alacsonyszint ű grafikus felületet a kliens számára.

UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 7 - UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 8 -

Egyes komponensek szerepe Egyes komponensek szerepe/2 • : • X toolkit intrinsic: A legalacsonyabb szint ű X szolgáltatásokat Objektum orientált programozási felületet nyújtó felület. Az Xlib rutinjai a kliens biztosító objektum kezel ő rendszer, amely kéréseit az X protokoll el őírásainak mind az objektum típusokat, mind az megfelel ően a hálózati rétegen keresztül objektum példányokat tárolja és eljuttatják a szerverhez és fogadják a adminisztrálja. Segítségével a származtatás szerver üzeneteit. módszerével újabb objektumokat hozhatunk létre. Az alapobjektum a window (widget), amely adatokat és a rajtuk m űveleteket végz ő eljárásokat tartalmazza.

UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 9 - UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 10 -

Egyes komponensek szerepe/3 Egyes komponensek szerepe/4 • X toolkit: • Ablakkezel ő: Magasabb szint ű objektumkönyvtár, amely Ablakok mozgatása, méretezése, átfedések az intrinsic alapobjektumaira épül. és azok megsz űnésének kezelése. Rendszerint a toolkit segítségével valósítják Érdekesség: nem határozták meg el őre az meg az olyan adatszerkezeteket mint pl a ablakkezelési stratégiát (okok: majd menü, nyomógomb, edit box stb. (Widget, kialakul + politika). gadget)

UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 11 - UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 12 -

2 Ablakok jelllemz ői Ablakok jelllemz ői/2 • Minden ablak gyerek ablak, kivéve a root • A bal fels ő sarok az origó, és az ablakon ablakot. belül a saját sarkához relatívak a • A gyerek csak az apukája területén látszik, koordináták, melyek pixelben értend ők. és csak onnan kaphat inputot. • Minden ablak saját attribútumokkal • Ugyanattól a szül őtől származó gyerekek rendelkezik (háttérszín, kurzor típusa, átfedhetik egymást. gravitáció, backing strore, eseménymaszk, ő • Inputot csak akkor kaphat, ha az input mozgathatóság, méretezhet ség stb.) fókusz nála van. • Minden ablak egy hierarchikus gyerek- szül ő kapcsolat része.

UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 13 - UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 14 -

Gyerek - szül ő kapcsolat X alkalmazás tervezése, m űködése • A display nem teljes egészében az alkalmazásé. • Az ablakok között átfedések lehetnek. Ezek megsz űnésekor az ott lev ő információt újra kell rajzolni. • Nem akkor, vagy nem csak akkor kell rajzolni amikor az információ el őáll a programban, hanem amikor a szerver (pontosabban az ablak kezel ő) azt kéri.

UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 15 - UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 16 -

X alkalmazás tervezése, m űködése/2 X alkalmazás felépítése

• A programhoz aszinkron események • Inicializálás : érkeznek, amelyeket le kell kezelni. Kapacsolódás a szerverhez, window-k • A program működését események létrehozása, szerver er őforrások lefoglalása határozzák meg. A működés objektum és attribútumaik beállítása. szemléletet tükröz. Az objektumok az • Eseményhurok : ablakok, amelyek eseményekkel (üzenet) a programhoz érkez ő események kommunikálnak egymással. feldolgozása.

UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 17 - UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 18 -

3 Kapcsolódás a szerverhez HOST:SERVER.SCR • HOST: • HOST:SERVER.SCR A szervert futtató számítógép hálózati alakú azonosító stringgel történik, amit azonosítója (név vagy cím). vagy explicit kap a megfelel ő Xlib rutin, vagy az explicit megadás hiányában a • SERVER: DISPLAY környezeti változóból veszi. Az adott hoston futó szerver azonosító száma (0. az els ő szerver). • SCR: A kívánt screen sorszáma (0. az els ő). • Például: bubuka.iit.bme.hu:0.0

UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 19 - UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 20 -

X rendszer indítása X rendszer indítása/2 • Grafikus bejelentkezés – nincs teend ő • X szerver indítása (startx, ...) • Egyébként: • Kapcsolatfelvétel: – X szerver indítása – direkt – X alkalmazások indítása (kapcsolatfelvétel) • program –display a.b.c:0.1 • szerveroldali authentikáció (xauth) Helyi X Helyi – indirekt (XDMCP) szerver kliens • WM indítása: – Távoli X Távoli .xinitrc – szerver kliens .xsession

UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 21 - UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 22 -

.xsession példa X programok konfigurálása host=`hostname`; defaults=$HOME/.Xdefaults → resources=$HOME/.Xresources; hostdefaults=$defaults-$host • Közös toolkit közös szintaxis (–display, if [ -f $resources ]; then # betöltend ő attribútumok –geometry) xrdb -load $resources; fi if [ -f $defaults ]; then # hozzáf űzend ő attribútumok • Er őforrások tárolása a szerverben (xrdb) xrdb -merge $defaults; fi if [ -f $hostdefaults ]; then # Host-specifikus beállítások – ezt rendszerint a belépéskor lefutó script tölti xrdb -merge $hostdefaults; fi fel (ld. el őző dia). & # wm + néhány alkalmazás xclock -chime -bg green -geometry 100x80-0+0 & • Ajánlott feladat: xbiff -geometry 50x80-110+0 & -geometry 80x24+0-0 & xterm exec xterm -title "Login Window" -geometry 80x24+10+10 -ls echo "xterm*background: yellow" | xrdb –merge xterm nem leválasztott exec

UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 23 - UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 24 -

4 X környezet konfigurálása Cseréljük le a wm-t • .Xdefaults, .xinitrc, .xsession • Meg kell állítani a futó wm-t (ps, kill) – ekkor azonban rendszerint ki is léptet a rendszer, mert a • .mwmrc, .fvwmrc, .twmrc, ... .xinitrc vagy a .xsession úgy indította a wm-t hogy, ...... • xmodmap – Konfiguráljunk sajat .xinitrc-t, .xsession (vnc esetén .vnc/xstartup), melyben nem a wm indítása az utolsó • xhost parancs. (cp ~szebi/.xsession) • xrdb • Indítani kell egy új wm-t (twm, /usr/dt/bin/dtwm, fvwm2). (leválasztott process !!!) • app-defaults (/usr/X/lib/X11/app-defaults) • /usr/X/lib/X11/xdm/Xsession

UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 25 - UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 26 -

Üres X program Üres X program/2

#include screen = DefaultScreen(display); #include wMain = XCreateSimpleWindow(display, DefaultRootWindow(display), main(int argc, char *argv[]) { 0, 0, DisplayWidth(display,screen) / 2, Display *display; DisplayHeight(display, screen) / 2, Window wMain; WhitePixel(display, screen), int screen; WhitePixel(display, screen), XEvent event; BlackPixel(display, screen)); if ((display = XOpenDisplay(argc ? while(1) argv[1]: NULL)) == NULL) { XNextEvent(display, &event); fprintf(stderr, ”Can't open\n"); XCloseDisplay(display); exit(1); } nem éri el soha }

UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 27 - UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 28 -

hello X program hello X program/2 #include if ((display=XOpenDisplay(NULL)) == NULL) { #include fprintf(stderr,"cannot connect"); exit( -1 ); #include } #include screen = DefaultScreen( display ); #define FONT "fixed" if ((font_info=XLoadQueryFont(display, FONT)) == NULL) { #define PAD 1 fprintf(stderr," Cannot open font); exit(-1); #define BORDER 1 } char Hello[] = "Hello X Window"; fth = font_info->max_bounds.ascent + main(int argc, char *argv[]) font_info->max_bounds.descent; { xsh.flags = PPosition | PSize; Display *display; int screen; xsh.height = fth + 2 * PAD; Window wMain; GC gc; xsh.width = XTextWidth(font_info, Hello, sizeof(Hello)) + 2 * PAD; XFontStruct *font_info; XGCValues gcv; xsh.x = (DisplayWidth(display, screen) - unsigned long fth; XSizeHints xsh; xsh.width) / 2; XSetWindowAttributes xswa; xsh.y = (DisplayHeight(display, screen) - xsh.height) / 2;

UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 29 - UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 30 -

5 hello X program/3 hello X program/4 wMain = XCreateSimpleWindow(display, DefaultRootWindow(display), XSelectInput(display, wMain, ExposureMask | xsh.x, xsh.y, xsh.width, xsh.height, BORDER, KeyPressMask | ButtonPressMask | BlackPixel(display,screen), StructureNotifyMask); WhitePixel(display,screen)); XMapWindow(display, wMain); XSetStandardProperties(display, wMain,"hello", while(1) { "hello_icon",NULL, argv, argc, &xsh); int x,y; eseményhurok xswa.colormap = DefaultColormap(display, screen); unsigned int width, height; xswa.bit_gravity = CenterGravity; XEvent event; XChangeWindowAttributes(display, wMain, XNextEvent(display, &event); CWColormap | CWBitGravity , &xswa); gcv.font = font_info->fid; switch (event.type) { gcv.foreground = BlackPixel(display, screen); case ConfigureNotify: gcv.background = WhitePixel(display, screen); width = event.xconfigure.width; gc = XCreateGC(display, wMain, height = event.xconfigure.height; GCFont | GCForeground | GCBackground, &gcv); break;

UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 31 - UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 32 -

hello X program/5 Motifhello case Expose: while(XCheckTypedEvent(display,Expose, &event)); x = (width - XTextWidth(font_info, Hello, #include sizeof(Hello))) / 2; #include y = (height + font_info->max_bounds.ascent - font_info->max_bounds.descent) / 2; #include XClearWindow(display, wMain); XDrawString(display, wMain, gc, x, y, main(int argc, char *argv[]) Hello, sizeof(Hello)); break; { case KeyPress: rajzolás Widget topLevel, hello; case ButtonPress: XUnloadFont(display, font_info->fid); XFreeGC(display,gc); XCloseDisplay(display); exit(1); } } }

UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 33 - UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 34 -

Motifhello/2

topLevel = XtInitialize(argv[0], "Motifhello", NULL, 0, &argc, argv);

hello = XtCreateManagedWidget("hello", xmLabelWidgetClass,topLevel, NULL, 0);

XtRealizeWidget(topLevel); XtMainLoop(); }

UNIX alapok © BME-IIT Sz.I. 2012.11.21-30. - 35 -

6