Xlib

редактировать
Xlib
Разработчик (и) X.Org Foundation
Первоначальный выпуск~ 1985
Репозиторий Измените это в Wikidata
Написано наC
Типе Библиотека
Веб-сайтwww.x.org, документация: www.x.org / Release / current / doc / libX11 / libX11 / libX11.html
X11-клиенты используют xlib для связи с сервером отображения.

Xlib (также известная как libX11 ) - это клиент протокола X Window System библиотека, написанный на языке программирования C. Он содержит функции для взаимодействия с X сервером. Эти функции позволяют программистам писать программы, не зная деталей протокола . Немногие приложения используют Xlib напрямую; вместо этого они используют другие библиотеки, которые используют функции Xlib для предоставления наборов инструментов виджетов :

Xlib появился примерно в 1985 году и в настоящее время используется в GUI для многих Unix-подобных операционных систем. Библиотека XCB - это попытка заменить Xlib. Хотя Xlib все еще используется в некоторых средах, современные версии сервера X.org реализуют Xlib поверх XCB.

Содержание

  • 1 Типы данных
  • 2 Протокол и события
  • 3 Функции
  • 4 Пример
  • 5 Другие библиотеки
  • 6 Ссылки
  • 7 Внешние ссылки

Типы данных

Роль KMS (настройка режима ядра), пример Linux Графический стек Linux Иллюстрирует Linux графический стек, текущий по состоянию на 24.08.2013 Схема: Humane-machine_interaction XCB и Xlib - это клиентские библиотеки, реализующие сервер отображения протокол связи Место некоторых модулей ядра Linux Сервер отображения находится между ядро ​​ (здесь: ядро ​​Linux ) и его клиенты. Он взаимодействует со своими клиентами по заданному протоколу. Место некоторых модулей ядра Linux Simple DirectMedia Layer может обходить Xlib и записывать напрямую в буфер кадра. Также доступен дополнительный порт для EGL

Основными типами данных в 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 можно сгруппировать в:

  1. операции с подключением (XOpenDisplay, XCloseDisplay,...);
  2. запросы к серверу, включая запросы операций (XCreateWindow, XCreateGC,...) и запросы информации (XGetWindowProperty,...); и
  3. операции, локальные для клиента: операции с очередью событий (XNextEvent, XPeekEvent,...) и другие операции с локальными данными (XLookupKeysym, XParseGeometry, XSetRegion, XCreateImage, XSaveContext,...)

Пример

Simple Приложение Xlib рисует поле и текст в окне. Без оконного менеджера украшений. Простое приложение Xlib, рисующее поле и текст в окне. С помощью IceWM оконного менеджера декораций.

Следующая программа создает окно с маленьким черным квадратом внутри:

/ * Простое приложение 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. Есть два вида таких библиотек: библиотеки

  • , созданные на основе библиотеки X Toolkit Intrinsics (Xt), которая обеспечивает поддержку виджетов, но не предоставляет никаких конкретных виджетов; определенные виджеты предоставляются библиотеками набора виджетов, которые используют Xt, например, библиотеками Xaw и Motif ;
  • , которые предоставляют наборы виджетов напрямую с использованием Xlib, без библиотеки Xt, например поскольку версии X GTK, Qt, FLTK и fpGUI.

Приложения, использующие любую из этих библиотек виджетов, обычно указывают содержимое окна перед входом в основной цикл и не нуждаются в явной обработке Выставитьсобытия и перерисовать содержимое окна.

Библиотека XCB является альтернативой Xlib. Его две основные цели: уменьшение размера библиотеки и прямой доступ к протоколу X11. Была создана модификация Xlib для использования XCB в качестве низкоуровневого уровня.

Ссылки

Внешние ссылки

В Wikibook X Window Programming есть страница по теме: XLib
Последняя правка сделана 2021-06-22 08:15:16
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте