Разработчик (и) | X.Org Foundation |
---|---|
Первоначальный выпуск | ~ 1985 |
Репозиторий | |
Написано на | C |
Типе | Библиотека |
Веб-сайт | www.x.org, документация: www.x.org / Release / current / doc / libX11 / libX11 / libX11.html |
Xlib (также известная как libX11 ) - это клиент протокола X Window System библиотека, написанный на языке программирования C. Он содержит функции для взаимодействия с X сервером. Эти функции позволяют программистам писать программы, не зная деталей протокола . Немногие приложения используют Xlib напрямую; вместо этого они используют другие библиотеки, которые используют функции Xlib для предоставления наборов инструментов виджетов :
Xlib появился примерно в 1985 году и в настоящее время используется в GUI для многих Unix-подобных операционных систем. Библиотека XCB - это попытка заменить Xlib. Хотя Xlib все еще используется в некоторых средах, современные версии сервера X.org реализуют Xlib поверх XCB.
Основными типами данных в Xlib являются структура Display
и типы идентификаторов.
Неформально дисплей - это физическое или виртуальное устройство, на котором выполняются графические операции. Структура Display
библиотеки Xlib содержит информацию об отображении, но, что более важно, она содержит информацию, относящуюся к каналу между клиентом и сервером. Например, в Unix-подобной операционной системе структура Display
содержит дескриптор файла socket этого канала (его можно получить с помощью Макрос ConnectionNumber
.) Большинство функций Xlib имеют структуру Display
в качестве аргумента, потому что они либо работают на канале, либо относятся к определенному каналу. В частности, все функции Xlib, которые взаимодействуют с сервером, нуждаются в этой структуре для доступа к каналу. Некоторые другие функции нуждаются в этой структуре, даже если они работают локально, потому что они работают с данными, относящимися к определенному каналу. К таким операциям относятся, например, операции с очередью событий, которые описаны ниже.
Окна, цветовые карты и т. Д. Управляются сервером, а это означает, что все данные об их фактической реализации хранятся на сервере. Клиент работает с этими объектами, используя их идентификаторы. Клиент не может напрямую работать с объектом, а может только запросить у сервера выполнение операции с указанием идентификатора объекта.
Типы Windows
, Pixmap
, Font
, Colormap
и т. Д. Являются идентификаторами, которые являются 32- битовые целые числа (как и в самом протоколе X11). Клиент «создает» окно, запрашивая у сервера создание окна. Это делается через вызов функции Xlib, которая возвращает идентификатор окна, то есть число. Затем этот идентификатор может использоваться клиентом для запроса на сервере других операций в том же окне.
Идентификаторы уникальны для сервера. Большинство из них могут использоваться разными приложениями для ссылки на одни и те же объекты. Например, два приложения, соединяющиеся с одним и тем же сервером, используют один и тот же идентификатор для ссылки на одно и то же окно. Эти два приложения используют два разных канала и, следовательно, имеют две разные структуры Display; однако, когда они запрашивают операции с одним и тем же идентификатором, эти операции будут выполняться с одним и тем же объектом.
Функции Xlib, которые отправляют запросы на сервер, обычно не отправляют эти запросы сразу, а сохраняют их в буфере, называемом буфером запроса. Термин «запрос» в данном случае относится к запросу от клиента, который направлен на сервер: буфер запроса может содержать все виды запросов к серверу, а не только те, которые имеют видимый эффект на экране. Буфер запросов гарантированно очищается (т. Е. Все выполненные запросы отправляются на сервер) после вызова функций XSync
или XFlush
, после вызова функции который возвращает значение с сервера (эти функции блокируются до получения ответа) и в некоторых других условиях.
Xlib хранит полученные события в очереди. Клиентское приложение может проверять и извлекать события из очереди. Хотя X-сервер передает события асинхронно, приложения, использующие библиотеку Xlib, должны явно вызывать функции Xlib для доступа к событиям в очереди. Некоторые из этих функций могут блокироваться; в этом случае они также очищают буфер запроса.
Ошибки вместо этого принимаются и обрабатываются асинхронно: приложение может предоставить обработчик ошибок, который будет вызываться при получении сообщения об ошибке от сервера.
Не гарантируется сохранение содержимого окна, если окно или одна из его частей становятся невидимыми. В этом случае приложению отправляется событие Expose
, когда окно одной его части снова становится видимым. Затем приложение должно снова нарисовать содержимое окна.
Функции в библиотеке Xlib можно сгруппировать в:
XOpenDisplay
, XCloseDisplay
,...);XCreateWindow
, XCreateGC
,...) и запросы информации (XGetWindowProperty
,...); иXNextEvent
, XPeekEvent
,...) и другие операции с локальными данными (XLookupKeysym
, XParseGeometry
, XSetRegion
, XCreateImage
, XSaveContext
,...)Следующая программа создает окно с маленьким черным квадратом внутри:
/ * Простое приложение Xlib для создания окна и рисования коробка в нем. gcc input.c -o output -lX11 * / #include#include #include #include int main (void) {Display * display; Окно окна; Событие XEvent; char * msg = "Привет, мир!"; int s; // открываем соединение с сервером display = XOpenDisplay (NULL); if (display == NULL) {fprintf (stderr, «Невозможно открыть дисплей \ n»); выход (1); } s = DefaultScreen (дисплей); // создаем окно window = XCreateSimpleWindow (display, RootWindow (display, s), 10, 10, 200, 200, 1, BlackPixel (display, s), WhitePixel (display, s)); // выбираем тип интересующих нас событий XSelectInput (отображение, окно, ExposureMask | KeyPressMask); // отображать (показывать) окно XMapWindow (display, window); // цикл событий для (;;) {XNextEvent (display, event); // рисуем или перерисовываем окно if (event.type == Expose) {XFillRectangle (display, window, DefaultGC (display, s), 20, 20, 10, 10); XDrawString (отображение, окно, DefaultGC (отображение, s), 50, 50, сообщение, strlen (сообщение)); } // выход при нажатии клавиши if (event.type == KeyPress) break; } // закрываем соединение с сервером XCloseDisplay (display); возврат 0; }
Клиент создает соединение с сервером, вызывая XOpenDisplay
. Затем он запрашивает создание окна с XCreateSimpleWindow
. Отдельный вызов XMapWindow
необходим для отображения окна, то есть для того, чтобы сделать его видимым на экране.
Квадрат рисуется путем вызова XFillRectangle
. Эта операция может быть выполнена только после создания окна. Однако одного его выполнения может быть недостаточно. Действительно, не всегда гарантируется сохранение содержимого окна. Например, если окно закрыто, а затем снова открыто, его содержимое может потребовать перерисовки. Программа информируется о том, что окно или его часть должны быть нарисованы при приеме события Expose
.
Таким образом, отрисовка содержимого окна выполняется внутри цикла , обрабатывающего события. Перед входом в этот цикл выбираются события, которые интересуют приложение, в данном случае с помощью XSelectInput
. Цикл событий ожидает входящего события: если это событие - нажатие клавиши, приложение завершает работу; если это событие expose, отображается содержимое окна. Функция XNextEvent
блокирует и очищает буфер запроса, если в очереди нет события.
Xlib не обеспечивает поддержку кнопок, меню, полос прокрутки и т. Д. Такие виджеты предоставляются другими библиотеками, которые, в свою очередь, используют Xlib. Есть два вида таких библиотек: библиотеки
Приложения, использующие любую из этих библиотек виджетов, обычно указывают содержимое окна перед входом в основной цикл и не нуждаются в явной обработке Выставить
события и перерисовать содержимое окна.
Библиотека XCB является альтернативой Xlib. Его две основные цели: уменьшение размера библиотеки и прямой доступ к протоколу X11. Была создана модификация Xlib для использования XCB в качестве низкоуровневого уровня.
В Wikibook X Window Programming есть страница по теме: XLib |