Xlib
Author
Albert FloresXlib a knihovny, které ji využívají. Xlib je v informatice název sady knihoven implementujících protokoly pro komunikaci mezi aplikacemi (tj. klienty) a X Serverem v grafickém uživatelském rozhraní (GUI) X Window System. Xlib je naprogramována v jazyce C. Knihovna umožňuje programovat aplikace bez toho, aby programátor musel znát detaily X protokolu. Jen málo aplikací dnes využívá Xlib přímo. Pro programování grafických aplikací jsou používány vyšší knihovny, které následně využívají funkce Xlib, například:
* Intrinsics (Xt) * Athena widget set (Xaw) * Motif * FLTK * GTK+ * Qt (X11 version) * Tk
Xlib byla vytvořena kolem roku 1985, a v současné době se využívá v grafickém uživatelském prostředí mnoha unixových systémů. V současné době probíhá snaha nahradit zastaralou knihovnu Xlib novějšími knihovnami XCB. +more Xlib je díky širokému nasazení v různých programech stále hojně využívána, a proto je XCB interně použita v nových implementacích Xlib jako nejnižší transportní vrstva.
Datové typy
Hlavním datovým typem v Xlibu je Display a typy identifikátorů. Neformálně je Display fyzické nebo virtuální zařízení, kde se provádí veškeré grafické operace. +more Struktura typu Display v Xlib knihovně obsahuje informace o samotném zobrazování, ale co je důležitější, obsahuje i informace týkající se toku informací mezi klientem a serverem. Například v Unixovém operačním systému obsahuj typ Display soubor ovládající socket grafické karty. Typy Window, Pixmap, Font, Colormap a další jsou identifikátory, které jsou 32bitová celá čísla (typ integer). Klient si vytvoří okno tím, že odešle požadavek na server, který pak okno vytvoří. Toto je vše provedeno pomocí volání funkcí z knihovny Xlib, která vrací identifikátory. Tyto identifikátory mohou být použity na vyžádání klienta opět na stejném okně.
Protokoly a události
Xlib funkce, které odesílají požadavek na server, obvykle neposílají tyto požadavky ihned, ale ukládají je do vyrovnávací paměti (request buffer). Termín požadavek znamená v tomto případě žádost, která je rovnou od klienta přesměrována na server. +more Request buffer může ve své paměti obsahovat většinou všechny druhy požadavků, a to nejen ty, které mají viditelný dopad na obrazovce. Request buffer také zaručuje, že všechny žádosti budou odeslány včas na server, dokud nebudou zavolány funkce XSync nebo XFlush, které požadují návratové hodnoty od serveru (tyto funkce jsou blokovány dokud nejsou všechny odpovědi odeslány). Xlib ukládá přijaté události do fronty. Klientská aplikace může prohledávat a získávat události z fronty. Zatímco X server odesílá události asynchronně, aplikace využívající knihovny Xlib požaduje nutně explicitní volání funkcí Xlib pro přístup k událostem stojících ve frontě. Některé události lze zablokovat, avšak v tom případě dojde k vyprázdnění Request bufferu.
Funkce
Funkce v Xlib knihovně jsou rozděleny na
# operace pro spojení (XOpenDisplay, XCloseDisplay, . ); # požadavky na server, včetně ostatních operací (XCreateWindow, XCreateGC,. +more) a dotazy pro získání informací (XGetWindowProperty, . ) # lokální operace v klientských aplikacích, operace ve frontě událostí (XNextEvent, XPeekEvent, . ) a ostatní operace na lokálních datech (XLookupKeysym, XParseGeometry, XSetRegion, XCreateImage, XSaveContext, . ).
Příklad
Jednoduchá Xlib aplikace vykreslující čtvereček a text v okně. +more Bez dekorací správce oken. Jednoduchá Xlib aplikace vykreslující čtvereček a text v okně. S dekoracemi správce oken IceWM. Následující program demonstruje vytvoření okna s malým černých čtvercem uvnitř:.
/* Simple Xlib application drawing a box in a window. gcc input.c -o output -lX11 */
#include #include #include #include
int main(void) { Display *d; Window w; XEvent e; char *msg = "Hello, World!"; int s;
/* open connection with the server */ d = XOpenDisplay(NULL); if (d == NULL) { fprintf(stderr, "Cannot open display\n"); exit(1); }
s = DefaultScreen(d);
/* create window */ w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 200, 200, 1, BlackPixel(d, s), WhitePixel(d, s));
/* select kind of events we are interested in */ XSelectInput(d, w, ExposureMask | KeyPressMask);
/* map (show) the window */ XMapWindow(d, w);
/* event loop */ while (1) { XNextEvent(d, &e); /* draw or redraw the window */ if (e.type
Expose) { XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10); XDrawString(d, w, DefaultGC(d, s), 50, 50, msg, strlen(msg)); } /* exit on key press */ if (e.type
KeyPress) break; }
/* close connection to server */ XCloseDisplay(d);
return 0; }
Související články
CLX (Common Lisp) * X Window System * Protokoly a architektura pro X Window System
Externí odkazy
[url=http://tronche. com/gui/x/xlib-tutorial/]A short tutorial on Xlib[/url] * [url=http://tronche. +morecom/gui/x/xlib/function-index. html]Manual pages for all Xlib functions[/url] * [url=http://www. x. org/docs/X11/xlib. pdf]Xlib - C Language X Interface[/url] * [url=http://www. rahul. net/kenton/bib. html]Kenton Lee's pages on X Window and Motif[/url] * [url=https://web. archive. org/web/20071018025425/http://users. actcom. co. il/~choo/lupg/tutorials/xlib-programming/xlib-programming. html#create_window]A longer tutorial on Xlib[/url] * [url=http://www. dis. uniroma1. it/%7eliberato/screensaver]Using Xlib for creating a screensaver module[/url].