Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску
X11-клиенты используют xlib для связи с сервером отображения .

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

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

Типы данных [ править ]

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

Основными типами данных в Xlib являются структура Display[2] и типы идентификаторов.

Неформально дисплей - это физическое или виртуальное устройство, на котором выполняются графические операции. DisplayСтруктура библиотеки Xlib содержит информацию о дисплее, но что более важно, содержит информацию относительно канала между клиентом и сервером. Например, в Unix-подобной операционной системе Displayструктура содержит дескриптор файла сокета этого канала (его можно получить с помощью ConnectionNumberмакроса). Большинство функций Xlib имеютDisplayструктура в качестве аргумента, потому что они либо работают на канале, либо относятся к определенному каналу. В частности, все функции Xlib, которые взаимодействуют с сервером, нуждаются в этой структуре для доступа к каналу. Некоторые другие функции нуждаются в этой структуре, даже если они работают локально, потому что они работают с данными, относящимися к определенному каналу. К операциям такого типа относятся, например, операции с очередью событий, которые описаны ниже.

Окна, цветовые карты и т. Д. Управляются сервером, а это означает, что все данные об их фактической реализации хранятся на сервере. Клиент работает с этими объектами, используя их идентификаторы . Клиент не может напрямую работать с объектом, но может только запросить у сервера выполнение операции с указанием идентификатора объекта.

Типы Windows, Pixmap, Font, Colormapи т.д., все идентификаторы, которые являются 32-битными целыми числами (так же , как в самом протоколе X11). Клиент «создает» окно, запрашивая у сервера создание окна. Это делается с помощью вызова функции Xlib, которая возвращает идентификатор окна, то есть число. Затем этот идентификатор может использоваться клиентом для запроса на сервер других операций в том же окне.

Идентификаторы уникальны для сервера. Большинство из них могут использоваться разными приложениями для ссылки на одни и те же объекты. Например, два приложения, соединяющиеся с одним и тем же сервером, используют один и тот же идентификатор для ссылки на одно и то же окно. Эти два приложения используют два разных канала и, следовательно, имеют две разные структуры отображения ; однако, когда они запрашивают операции с одним и тем же идентификатором, эти операции будут выполняться с одним и тем же объектом.

Протокол и события [ править ]

Функции Xlib, которые отправляют запросы на сервер, обычно не отправляют эти запросы сразу, а сохраняют их в буфере, называемом буфером запроса . Термин запрос в этом случае относится к запросу от клиента, который направлен на сервер: буфер запроса может содержать все виды запросов к серверу, а не только те, которые имеют видимый эффект на экране. Буфер запросов гарантированно будет очищен (т. Е. Все запросы, выполненные до сих пор, отправляются на сервер) после вызова функций XSyncили XFlushпосле вызова функции, которая возвращает значение с сервера (эти функции блокируются до тех пор, пока не будет получен ответ. получен), и в некоторых других условиях.

Xlib хранит полученные события в очереди. Клиентское приложение может проверять и извлекать события из очереди. Хотя X-сервер отправляет события асинхронно, приложения, использующие библиотеку Xlib, должны явно вызывать функции Xlib для доступа к событиям в очереди. Некоторые из этих функций могут блокироваться; в этом случае они также очищают буфер запроса.

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

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

Функции [ править ]

Функции в библиотеке Xlib можно сгруппировать в:

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

Пример [ править ]

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

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

/ *  Простое приложение Xlib для создания окна и рисования в нем рамки.  gcc input.c -o output -lX11 * / #include  <X11 / Xlib.h>#include  <stdio.h>#include  <stdlib.h>#include  <string.h> int  main ( void ) {  Display  * display ;  Окно  окна ;  Событие XEvent  ; char * msg = "Привет, мир!" ; int s ;        // открываем соединение с сервером  display  =  XOpenDisplay ( NULL );  if  ( display  ==  NULL )  {  fprintf ( stderr ,  «Невозможно открыть дисплей \ n » );  выход ( 1 );  }  s  =  Экран по умолчанию ( дисплей );  // создать окно  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 .

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

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

Ссылки [ править ]

  1. ^ «Принятие» .
  2. ^ "Структура отображения в CVS Freedesktop" . Подсказка для поиска: typedef struct _XDisplay Display .

Внешние ссылки [ править ]

  • Официальная документация по программированию X.Org Foundation , включая самую последнюю версию Xlib - C Language X Interface в нескольких форматах.
  • Краткое руководство по Xlib
  • Страницы руководства для всех функций Xlib
  • Страницы Кентона Ли о X Window и Motif
  • Более подробное руководство по Xlib
  • Использование Xlib для создания модуля заставки