Vývojář | X.Org Foundation |
---|---|
Aktuální verze | 1.8.10 (28. července 2024) |
Operační systém | GNU/Linux BSD UN*X |
Vyvíjeno v | C |
Typ softwaru | knihovna |
Licence | Expat licencia X11 license Historical Permission Notice and Disclaimer |
Web | gitlab |
Některá data mohou pocházet z datové položky. |
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:
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. 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.
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. 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ě.
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. 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 v Xlib knihovně jsou rozděleny na
XOpenDisplay
, XCloseDisplay
, ...);XCreateWindow
, XCreateGC
,...) a dotazy pro získání informací (XGetWindowProperty
, ...)XNextEvent
, XPeekEvent
, ...) a ostatní operace na lokálních datech (XLookupKeysym
, XParseGeometry
, XSetRegion
, XCreateImage
, XSaveContext
, ...)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 <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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;
}