Xlib

Xlib jest nazwa biblioteki oprogramowania , zapewniając realizację części klienckiej protokołu X Window System w C . Zawiera niskopoziomowe funkcje do interakcji z serwerem X. Funkcje te pozwalają programistom pisać programy bez znajomości szczegółów protokołu X. Niewiele aplikacji używa Xlib bezpośrednio; w ogóle, oni wykorzystać innych bibliotek, które opierają się na Xlib dostarczenie elementów o interfejsie graficznym .

Ta biblioteka pojawiła się około 1985 roku , została zaimplementowana przez XFree86 i nadal jest szeroko stosowana w systemach UNIX lub pokrewnych. Służy jako podstawa dla większości graficznych zestawów narzędzi wysokiego poziomu, takich jak:

Celem projektu XCB jest zastąpienie Xlib.

Typy danych

Główne typy danych w Xlib to struktury wyświetlania i typy identyfikatorów.

W pierwszym podejściu wyświetlacz jest fizycznym lub wirtualnym urządzeniem, na którym wykonywane są operacje graficzne. Struktura Display biblioteki Xlib zawiera informacje o wyświetlaczu , ale najważniejszą jej częścią są informacje o kanale między klientem a serwerem. Na przykład w systemie operacyjnym typu UNIX struktura Display zawiera deskryptor gniazda używanego dla tego kanału (można go znaleźć za pomocą makra ConnectionNumber ). Większość funkcji Xlib przyjmuje strukturę Display jako pierwszy argument, ponieważ działają one na kanale lub są względem konkretnego kanału. Wszystkie funkcje Xlib współpracujące z serwerem potrzebują tej struktury, aby uzyskać dostęp do kanału. Niektóre inne funkcje, które działają lokalnie, ale na danych odnoszących się do kanału, również wymagają tej struktury do identyfikacji kanału. Są to na przykład operacje na kolejkach zdarzeń, opisane poniżej.

Okna, mapy kolorów itp. są zarządzane przez serwer, co oznacza, że ​​wszystkie dane o ich realizacji są przechowywane na serwerze. Klient wykonuje operacje na tych obiektach przy użyciu identyfikatorów . Nie ma możliwości działania bezpośrednio na obiektach, może jedynie zażądać od serwera wykonania operacji na obiekcie, który wskazuje swoim identyfikatorem.

Typy Window , Pixmap , Font , Colormap itp. to wszystkie identyfikatory, które są konwertowane na liczby. Klient „tworzy” okno, żądając utworzenia okna z serwera. Ta operacja jest wykonywana przez wywołanie funkcji Xlib, która zwraca identyfikator okna, czyli liczbę. Ten numer może następnie zostać użyty przez klienta do żądania innych operacji w tym samym oknie z serwera.

Identyfikatory są unikalne na serwerze. Większość pozwala różnym aplikacjom odwoływać się do tych samych obiektów. Na przykład dwie aplikacje połączone z tym samym serwerem mogą używać tego samego numeru do odwoływania się do tego samego okna. Te dwie aplikacje używają dwóch różnych kanałów i dlatego mają dwie różne struktury wyświetlania ; jednak gdy żądają operacji na tym samym identyfikatorze, operacje te wpływają na ten sam obiekt.

Zwykle funkcje Xlib, które generują zapytania do serwera, wysyłają je natychmiast, ale przechowują je w buforze, zwanym „buforem wyjściowym” ( wyjście bufora ). W tym przypadku termin wyjście odnosi się do danych opuszczających klienta, aby przejść na serwer: bufor wyjściowy może zawierać żądania dowolnego typu, a nie tylko te, które mają widoczny wpływ na ekran. Gwarantowane jest opróżnienie bufora wyjściowego (tzn. Wszystkie żądania są wysyłane do serwera) po wywołaniu funkcji XSync lub XFlush , wywołaniu funkcji, która zwraca wartość z serwera (te funkcje są blokowane do momentu otrzymania odpowiedzi ) i pod pewnymi innymi warunkami.

Xlib przechowuje zdarzenia odebrane w kolejce. Aplikacja kliencka może sprawdzać i pobierać zdarzenia z tej kolejki. Podczas gdy serwer X wysyła zdarzenia asynchroniczne, aplikacje korzystające z biblioteki Xlib muszą jawnie wywoływać funkcje Xlib, aby uzyskać dostęp do zdarzeń w kolejce. Niektóre z tych funkcji blokują; iw tym przypadku opróżniają również bufor wyjściowy.

Błędy są odbierane i przetwarzane asynchronicznie: aplikacja udostępnia procedurę obsługi błędów, która jest żądana po odebraniu komunikatu o błędzie z serwera.

Nie gwarantuje się zachowania zawartości okna, jeśli jest ono całkowicie lub częściowo zakryte. W takim przypadku aplikacja otrzyma zdarzenie Expose , gdy okno będzie ponownie widoczne. Aplikacja ma wówczas ponownie przerysować zawartość okna.

Funkcje

Funkcje biblioteki Xlib można pogrupować w następujący sposób:

  1. Operacje na połączeniu ( XOpenDisplay , XCloseDisplay ...);
  2. Żądania do serwera, w tym żądania operacji ( XCreateWindow , XCreateGC ...) i żądania informacji ( XGetWindowProperty ...);
  3. Operacje lokalne dla klienta: operacje na kolejce zdarzeń ( XNextEvent , XPeekEvent ...) i inne operacje na danych lokalnych ( XLookupKeysym , XParseGeometry , XSetRegion , XCreateImage , XSaveContext ...).

Przykład

Poniższy program tworzy okno zawierające w środku mały czarny kwadrat.

/* * Application Xlib simple affichant un carré dans une fenêtre. */ #include <X11/Xlib.h> #include <stdio.h> int main() { Display *d; int s; Window w; XEvent e; /* Ouvrir la connexion avec le serveur. */ d = XOpenDisplay(NULL); if (d == NULL) { printf("Impossible d'ouvrir le Display\n"); return 1; } s = DefaultScreen(d); /* Créer la fenêtre. */ w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1, BlackPixel(d, s), WhitePixel(d, s)); /* Choisir les événements qui nous intéressent. */ XSelectInput(d, w, ExposureMask | KeyPressMask); /* Afficher la fenêtre. */ XMapWindow(d, w); /* Boucle des événements. */ while (1) { XNextEvent(d, &e); /* Dessiner ou redessiner la fenêtre. */ if (e.type == Expose) { XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10); } /* Sortir si une touche est pressée. */ if (e.type == KeyPress) break; } /* Couper la connexion avec le serveur */ XCloseDisplay(d); return 0; }

Klient tworzy połączenie z serwerem, wywołując XOpenDisplay . Następnie prosi o utworzenie okna za pomocą XCreateSimpleWindow . Konieczne jest dodatkowe wywołanie XMapWindow w celu „ zmapowania ” okna, czyli uczynienia go widocznym na ekranie.

Kwadrat jest rysowany przez wywołanie funkcji XFillRectangle . Jednak nie należy tego robić przed utworzeniem okna. Rzeczywiście, okno nie ma pewności, że jego zawartość zostanie zachowana. Na przykład, jeśli okno jest zakryte, a następnie odkryte, jego zawartość może wymagać ponownego narysowania. Program jest informowany o konieczności ponownego narysowania całości lub części okna poprzez odebranie zdarzenia Expose .

Rysowanie zawartości okna odbywa się zatem w ramach pętli zdarzeń. Przed wejściem do tej pętli wybierane są zdarzenia, które aplikacja uzna za istotne, w tym przypadku za pomocą XSelectInput . Pętla zdarzeń oczekuje na nadejście zdarzeń: jeśli zdarzeniem jest naciśnięcie klawisza, aplikacja kończy pracę; jeśli zdarzenie wskazuje, że część okna jest teraz odkryta, zawartość okna jest rysowana. Funkcja XNextEvent blokuje i opróżnia bufor wyjściowy, gdy w kolejce nie ma żadnego zdarzenia.

Inne biblioteki

Biblioteka Xlib nie oferuje funkcji graficznych, takich jak przyciski, menu, paski przewijania itp. Te elementy graficzne, zwane widżetami , są dostarczane przez inne biblioteki, które same używają Xlib. W tym przypadku istnieją dwa typy bibliotek:

  • biblioteki zbudowane w oparciu o bibliotekę Intrinsics (Xt), która oferuje funkcjonalność dla widżetów, ale nie ma określonego widżetu; określone widgety są dostarczane jako biblioteki widżetów opartych na Xt, takich jak Xaw i Motif  ;
  • biblioteki, które udostępniają widżety, budując bezpośrednio na Xlib, bez użycia Xt, takie jak wersje X11 GTK + , Qt i FLTK .

Zwykle aplikacje korzystające z tych bibliotek widżetów wskazują zawartość okna przed wejściem w pętlę zdarzeń i nie muszą jawnie obsługiwać zdarzeń Expose w celu ponownego rysowania zawartości okna.

Biblioteka XCB jest substytutem dla Xlib. Ma dwa cele: zmniejszenie rozmiaru biblioteki i bezpośredni dostęp do protokołu X11. Została wydana zmodyfikowana wersja Xlib, oparta na XCB.

Zobacz też

Powiązane artykuły

Linki zewnętrzne