You are on page 1of 9

Forrás: http://www.doksi.

hu

SEGÉDLET
AZ "X-WINDOWS PROGRAMOZÁSA" c.
MÉRÉSHEZ

Készült: A Távközlési és Telematikai Tanszék


UNIX LAboratóriumában

Összeállította: Baumann Ferenc


Tel.: 24-02
Forrás: http://www.doksi.hu

1. X-Windows
X-Window készülékfüggetlen hálózatorientált grafikus user interface(GUI).
 A grafikus user interface azt jelenti, hogy a felhasználó, többnyire szines
nagy felbontású, grafikus képeket használ a pixelekből felépülő képernyőn . Ezt inkább
egérrel, track ball-lal vagy más hasonló eszközzel vezérli, mint keyboard-dal.
 Hálózatorientált, mivel az alkalmazásnak nem szükségképpen kell
ugyanazon a computeren lenni, mint ahol a felhasználó ül.
 Készülékfüggetlensége két dolgot jelent. Egy X-Window alkalmazás
forráskódját le kell tudni fordítani és futtatni minden gyártó azon rendszerein, amelyek
az X-Window-t támogatják. Továbbá egy X-Window alkalmazás display független is.

Manapság az X-Window szinte az egyetlen igazán elterjedt GUI minden UNIX


operációs rendszeren. De nem csak a UNIX világra korlátozódik. Létezik VM PC-
DOS VMS operációs rendszerekben is.

X-Window rövid története:


Az MIT-n fejlesztették ki az Athena project keretében, melyet számos szervezet
alapított, köztük az IBM és a DEC. A project célja kialakítani egy közös GUI-t, amely
képes heterogén hálózati környezetben is müködni. 1986-ig azonban ezt csak az MIT-
n és a DEC-en belül használták. 1986-ban jelent meg az X10.4, amelyet már sok
UNIX-ban alkalmaztak, azonban a megbízhatósága nem volt a legjobb. Ezért 1987-
ben megjelent az X11 ipari szabvánnyá gyakorlatilag 1988-ban vált az X11.2
megjelenésével egyidőben. 1990-ben jelent meg az X11.4, amelyet a legtöbb gyártó
alkalmaz a rendszerében. Azóta már piacra került az X11.5 ill. az X11.6 is.

2. X koncepció

Client Server architektura


Az X-Window rendszerben nem szükséges, hogy az alkalmazás ugyanazon a
computeren fusson, amely a display-t kezeli. Ez programokat követel meg az
összeköttetés mindkét végén. Ezt két véget nevezzük X Client, ill. X server-nek. A két
végnek nem szükségszerűen kell kiszolgálnia mindkettőt, de kiszolgálhatja.

X server
Az X server egy olyan alkalmazás, amely egy számítógépen futva kezeli a display-t.
Válaszol az vezérlő input eszközöknek és közvetíti a felhasználó tevékenységét az X
client felé, mint X eseményeket. Az X server képes egyszerre több X client-sel

2
Forrás: http://www.doksi.hu

kommunikálni, ezért az is elképzelhető, hogy egy alkalmazás egyszerre több


számítógépen fut.
Létezik egy speciális terminál, amely nem képes alkalmazások futtatására, csak az
X környezet X server részének futtatására ill. a hálózatra csatlakozásra. Ez az ún. X
terminal.

X client
Ez az applikáció, az X környezet X client felöli oldala. Client oldalon szükséges egy
könyvtár, amely realizálja a kapcsolatot az X serverrel.

X hálózaton
 Az X client és az X server különválasztása lehetővé teszi az alkalmazásoknak a
display függetlenséget . Így nem szükséges a különböző tipusú display-knek megfelelő
könyvtárakat beszerkeszteni az X client oldalon. Az X server kezeli valamennyit, a
nagy felbontású színes monitortól a kis monochrome monitorig.
 Az X server-nek és az X client-nek nem kell különböző számítógépen lennie,.
ha ezt a számítógép teljesítménye lehetővé teszi.
 Az X server és az X client közötti kommunikációs mechanizmust X
protokollnak nevezzük. Amikor a két vég nem egy gépben helyezkedik el, akkor az X
protokoll valamilyen hálózati protokollon keresztül ( általában TCP-IP) jut el a másik
végre. Azonban átviteli sebesség korlátok miatt ezt csak lokális hálózaton érdemes
alkalmazni.
 Lehetséges, hogy az X server különböző implementációi némileg különböző
módon jelenítik meg ugyanazt a funkciót. A különböző serverek fizikailag különböző
tulajdonságokkal rendelkezhetnek ( beállított színek, képernyő felbontása ). Így egy X
client különbözőképpen jelenhet meg, ha különböző X server-hez kapcsolódik.

3. X-Windows programozása

Az X windows programozási környezete 3 részt tartalmaz, melyek kapcsolatát a


következő ábra tartalmazza.

3
Forrás: http://www.doksi.hu

Application

X Toolkit
Widget set
Intrinsics

Xlib

X Windows programozási interface-e

Xlib
Ez az alapszint. Az X az X protocol-t jelenti, amely specifikálja az összes
információcsomag tartalmát, amelyet az X server küld az X client-nek és fordítva.
(akár egy gépen van az X server és client akár külön gépen.) Minden X protokoll
üzenetnek megfelel egy függvény a legalacsonyabb programozási szinten. Ez az Xlib
könyvtár.

X Toolkit
Az Xlib-nek létezik egy magasabb szintű alternatívája, amelynek része egy elem
gyűjtemény amelyet widget-nek nevezünk. Ezt a gyűjteményt az X alkalmazás
megjelenítésénél alkalmazhatjuk sikeresen. Ezek olyan elemek, mint a nyomógomb
kezelés, message box( amely feljön és megjelenit valamely információt a felhasználó
számára) , edit box (amelyben a felhaszáló adatokat gépelhet be az alkalmazás
számára). Pl. egy gomb megnyomásakor egy widget
 kiszámítja egy kijelzendő szöveg szélességét pixelben
 készít egy ablakot a kívánt méretben,
 beállítja, hogy az adott ablak milyen eseményekre lesz érzékeny,
 elvégzi a komplex grafikus műveletek ( 2D 3D alkalmazások pl.: forgatás),
 elhelyezi az ablakot a képernyőn,
 kezeli az eseményeket az ablakban.

Eseményvezérelt programok
Az X-Windows programok eseményvezéreltek. A tradicionális alkalmazásokban a
felhasználó párbeszédben véges számú lehetőségből választva vezérelte a programot.
(Pl.: Menü-vezérelt alkalmazások hiearachikus menüj mellett az alkalmazás elindulása
után megjelenik a főmenü, ebből juthatunk el a véges számú almenübe stb.) Minden

4
Forrás: http://www.doksi.hu

választás után egy újabb almenü v. egy alprogram választódik ki. Ez szigorúan
hierarchikus.
X-Window környezetben ez nem igaz. A felhasználó szabadon manipulálhatja a
programot. Becsukhatja az ablakot., egyszerre több példányban különböző
paraméterezéssel futtathatja, egyszerre az összes példány aktívan dolgozhat. Ilyen
környezetben egy tradicionális alkalmazás hamarosan lefagyna.
Ezért az alkalmazásokat X-Window környezetben úgy kell megtervezni, hogy az
applikáció helyesen reagáljon a felhasználó összes lehetséges ténykedésére. Ez csak
úgy lehetséges, ha a program fő ciklusában vár egy esemény megtörténésére, amikor
egy ismert esemény bekövetkezik, akkor azt egy függvény lekezeli. Nem kötelező
minden eseményt lekezelni. Dönteni kell arról, hogy lekezelendő, figyelmen kívül
hagyandó, vagy tovább kell adni .
Amikor egy eseményt generál a felhasználó, akkor az elősször egy esemény queue-
ba kerül, amelyet az alkalmazás olvas. Így nem vész el esemény akkor sem, ha az
alkalmazás elfoglalt. Minden alkalmazás rendelkezik egy saját esemény bufferrel. Az
XToolkit-et felhasználva a programozáskor az események automatikusan olvasódnak
az esemény bufferből és kerülnek ahhoz a widget-hez, amelyben az esemény
generálódott. A widget lekezeli, ignorálja, vagy feldolgozza azt.

Widget programozása:
A widget-ek az egyszerű X-windows interface építőkövei. Minden X-Windows
widget-et hierarchikusan osztályokba vannak soroltak külső megjelenésük ill.
viselkedésük alapján. Az igy osztályokba sorolt widget-ek (jellemzően úgy
viselkednek, mint az objektumok) saját tulajdonságaikat minden esetben örökítik az
osztályban a hierarchiában alattuk levőre. Fizikailag egy osztály egy pointer, amely
egy adatstruktúrára mutat. Az X-windows object minden példánya két adatstruktúrából
áll:
 egy az osztály minden elemének általános viselkedését leiró adatstruktúrából
 egy egyedi adatstruktúrából, amely a speciális widget saját egyedi
viselkededését írja le.
Az Xtoolkit Intrisics definiál néhány alap widget osztályt, amelyek nem alkotnak
egy teljes hierarchikus struktúrát. Az olyan widget készletek, mint a Motif vagy az
Athena, ezen alap osztályok felhasználásával új teljes widget-készleteket épít fel. A
gyakorlatban a programozó csak nagyon ritkán használja az alap widget-eket. ( A
Motif widgetkészlet felépítését az 1. melléklet mutatja.)

Minden X alkalmazás a következő részekből áll:

5
Forrás: http://www.doksi.hu

1. A szükséges X header file-ok beillesztése a programba.


2. Az X alkalmazás inicializálása, melynek hatására létrejön a kapcsolat az
X client és az X server között.
3. A kívánt widget példányok definiálása
4. A definiált widget-ek módosítása, ill. az X események kezelésének
leírása (callback functions, event handlers )
5. A widget-ek megvalósítása.
6. Események feldolgozása.

Header file-ok

Minden X alkalmazás include file-jai a következők:


 <X11/Intrinsic.h> amely az általános toolkit definíciókat tartalmazza. Ez
automatikusan include-olja a az < X11/Xlib.h > header file-t amelyben az Xlib
függvények definíciói vannak. Alkalmazástól függően elképzelhető, hogy más belső
header file-okra is szükség van, de a mérésben ilyen nem fordul elő.
 <Xm/Xm.h> Ez egy általános header file, amelyre minden widget header
hivatkozik.
 <Xm/...h> Motif header file-ok.

Lényeges a header file-ok hivatkozási sorrendje a C programon belül. Ez


maghatározhatja a program futtathatóságát.

A helyes sorrend a következő:


 Minden szükséges C könyvtár include file-ja
 < X11/Intrinsic.h>
 Minden más X11 header file <X11/... >
 <Xm/Xm.h>
 Minden más Motif header <Xn/...>

Toolkit inicializálás

X programok inicilizálása az XtAppInitialize() vagy XtVaAppInitilize() híívással


történik. Ezt a rutint meg kell hívni mielött még bármely más X függvényt hívnánk.
Ennek hatására a következő történik:
 Megnyitja az összeköttetést az X server-rel,
 Felépít egy ún. resource adatbázist,

6
Forrás: http://www.doksi.hu

Kielemzi a parancssor tartalmát,


 Inicializálja a toolkit-et,
 Létrehoz egy toplevel widget-et, amely minden más widget szülője lesz az
alkalmazásban.

Pl.:

XtAppContext app_context;
Widget toplevel;

toplevel=XtAppInitialize(&app_context,"Name",NULL,0,&argc,argv,NULL,NULL,0)

Widget példányok definiálása

A widget példány generálása és felhasználása 3 lépésből áll:


 A widget példány létrehozása,
 Tudatni kell a szülőjével, hogy a létrehozott widget példány az ő
gyereke. Erre azért van szükség, mivel a továbbiakban a widget szülője menedzseli
a widget méretét elhelyezkedését stb.
 Létre kell hozni a widget ablakát, ill. láthatóvá kell tenni.

Erre több alternatív mód is létezik.


XtCreateWidget()
A widget példányok létrehozásának alapfüggvénye.
XtManageChild()
Az XtCreateWidget() függvénnyel létrehozott widget példány menedzselését
egy szülőhöz rendeli.
XtCreateManagedWidget()
XtVarCreateManagedWidget()
Ez a két függvény funkcójában azonos. A widget-et létrehozásakor egyben egy
szülőhöz is rendeli.
XmCreate<widgetname>()
Motif widget létrehozása. A <widgetname> helyére a widget nevét kell
helyettesíteni. Pl.: XmCreatePushButton

Eseménykezelés

7
Forrás: http://www.doksi.hu

Az eseménykezelés történhet callback függvénnyel vagy event handler-rel. Ez a


segédlet csak a callback függvényes eseménykezeléssel foglalkozik.
A callback függvény mindig void tipusú. Ebben a függvényben kell azt leírni,
hogy adott X esemény hatására mit válaszol az alkalmazás. A widget példány
callback függvénnyel történő kiegészítése az XtAddCallback() függvénnyel
történik.
A callback függvény 3 formális paraméterrel rendelkezik:
 Widget widget azonosító amelyre vonatkozik,
 caddr_t; egy cim ahol azok az adatok helyezkednek el, amelyet az alkalmazás át
kíván adni a callback függvénynek.
 caddr_t; egy cím, ahol a callback függvény adatokat tud visszaadni az
alkalmazásnak.

Widget-ek megvalósítása

A widget példányok létrehozása, ill. az eseménykezelő függvények megvalósítása


nem jelenti, hogy a widgethez rendelt window is létrjön. Erről külön kell gondoskodni.
Ezt az XtRealizeWidget() függvény teszi meg, amely gondoskodik a paraméterként
megadott widget ablakának megvalósításáról az összes gyerekével együtt.

Események feldolgozása.

Az események feldolgozását az XtMainLoop() v. XtAppMainLoop() függvény


végzi. Ez egy végtelen ciklus, amely folyamatosan érzékeli a beérkező X eseményeket
és meghívja az azt lekezelő függvényt.

Xlib programozása

Az Xlib hívások az X-Windows programozásának a legalacsonyabb szintjét


jelentik. Az összes magasabb szintű X elem ezekre sz Xlib könyvtári elemekre
hivatkozik. Minden Xlib-beli hívás az X protokoll egyegy elemét valósítja meg. A
gyakorlatban az X alkalmazásoknak vannak olyan részei, melyet nem lehet magasabb
szinten megvalósítani, azonban itt a programozás sokkal nehézkesebb.

Egy Xlib hívásokból felépülő program a következő részeket kell, hogy tartalmazza:

8
Forrás: http://www.doksi.hu

1. Csatlakozás az X Server-hez (XOpenDisplay)


2. A kezelendő objektumok paramétereinek beállítása (szín, méret ...)
3. Az objektumok létrehozása (XCreateSimpleWindow, XCreateWindow..)
4. A kezelendő események maszkjának beállítása és hozzárendelése az
objektumhoz (XSelectInput)
5. Az objektumok megjelenítése(XMapWindow)
6. Az esemény queue kitörlése (Xflush,Xsync)
7. Az események folyamatos feldolgozása (végtelen ciklus, XNextEvent)

Már a lépések számából is jól látható, nem is beszélve a kezelendő nagy


adatstruktúrákról, hogy az X-Windows programozása Xlib könyvtári elemekkel
nagyon komplikált. Főleg egy összetett, több menüt, almenüt, ill. ablakokat tartalmazó
alkalmazás esetén. Az Xlib könyvtár elemeit a 2. sz. melléklet tartalmazza. A pontos
szintaktikáját a BOSS-on Infoexplorer segítségével ismerheti meg.

You might also like