Xlib

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
VývojářX.Org Foundation
Aktuální verze1.7.3 (7. prosince 2021)
Operační systémGNU/Linux
BSD
UN*X
Vyvíjeno vC
Typ softwaruknihovna
LicenceExpat license
X11 license
Historical Permission Notice and Disclaimer
Webgitlab.freedesktop.org/xorg/lib/libx11
Některá data mohou pocházet z datové položky.
Xlib a knihovny, které ji využívají.

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.

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. 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. 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

  1. operace pro spojení (XOpenDisplay, XCloseDisplay, ...);
  2. požadavky na server, včetně ostatních operací (XCreateWindow, XCreateGC,...) a dotazy pro získání informací (XGetWindowProperty, ...)
  3. 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ě. 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 <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;
 }

Související články

Externí odkazy

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.