Xlib
Эта статья нуждается в дополнительных цитатах для проверки . ( сентябрь 2018 г. ) |
Разработчик(и) | Фонд X.Org |
---|---|
Первоначальный выпуск | ~1985 [ нужна ссылка ] |
Стабильная версия | 1.8.10 [1]
/ 28 июля 2024 г |
Репозиторий | |
Написано в | С |
Тип | Библиотека |
Веб-сайт | www |
Xlib (также известная как libX11 ) — X Window System, протокола клиентская библиотека написанная на языке программирования C. Он содержит функции для взаимодействия с X- сервером . Эти функции позволяют программистам не зная подробностей протокола X. писать программы ,
Лишь немногие приложения используют Xlib напрямую; скорее, они используют другие библиотеки, которые используют функции Xlib для предоставления наборов инструментов для виджетов :
- Внутренние функции X Toolkit (Xt)
- Набор виджетов Афина (Закрыто)
- Мотив
- ФЛТК
- ГТК
- Qt (версия X11)
- Тк
- SDL (простой уровень DirectMedia)
- SFML (простая и быстрая мультимедийная библиотека)
Xlib появился примерно в 1985 году. [ нужна ссылка ] и используется в графических интерфейсах многих Unix-подобных операционных систем . Повторная реализация Xlib была представлена в 2007 году с использованием XCB . [2]
Типы данных
[ редактировать ]Основными типами данных в Xlib являются Display
[3] структура и типы идентификаторов.
Неформально дисплей — это физическое или виртуальное устройство, на котором выполняются графические операции. Display
Структура библиотеки Xlib содержит информацию об отображении, но, что более важно, она содержит информацию о канале между клиентом и сервером. Например, в Unix-подобной операционной системе Display
структура содержит дескриптор файла сокета этого канала (его можно получить с помощью команды ConnectionNumber
макрос.) Большинство функций Xlib имеют Display
структура в качестве аргумента, поскольку они либо работают на канале, либо относятся к конкретному каналу. В частности, всем функциям Xlib, которые взаимодействуют с сервером, нужна эта структура для доступа к каналу. Некоторым другим функциям нужна эта структура, даже если они работают локально, поскольку они работают с данными, относящимися к определенному каналу. К операциям такого типа относятся, например, операции с очередью событий, которые описаны ниже.
Окна, цветовые карты и т. д. управляются сервером, а это означает, что все данные об их фактической реализации хранятся на сервере. Клиент работает с этими объектами, используя их идентификаторы . Клиент не может напрямую работать с объектом, а может только запросить сервер выполнить операцию, указав идентификатор объекта.
Типы Windows
, Pixmap
, Font
, Colormap
и т. д. — все это идентификаторы, представляющие собой 32-битные целые числа (как и в самом протоколе X11). Клиент «создает» окно, запрашивая, чтобы сервер создал окно. Это делается посредством вызова функции Xlib, которая возвращает идентификатор окна, то есть число. Этот идентификатор затем может использоваться клиентом для запроса на сервер других операций в том же окне.
Идентификаторы уникальны для сервера. Большинство из них могут использоваться разными приложениями для обращения к одним и тем же объектам. Например, два приложения, подключающиеся к одному и тому же серверу, используют один и тот же идентификатор для ссылки на одно и то же окно. Эти два приложения используют два разных канала и, следовательно, имеют два разных Отображение структур; однако, когда они запрашивают операции с одним и тем же идентификатором, эти операции будут выполняться с одним и тем же объектом.
Протокол и события
[ редактировать ]Функции Xlib, отправляющие запросы на сервер, обычно не отправляют эти запросы немедленно, а сохраняют их в буфере, называемом буфером запросов . Термин запрос в данном случае относится к запросу от клиента, направленному на сервер: буфер запросов может содержать все виды запросов к серверу, а не только те, которые имеют видимый эффект на экране. Буфер запросов гарантированно будет очищен (т. е. все выполненные на данный момент запросы отправляются на сервер) после вызова функций XSync
или XFlush
, после вызова функции, возвращающей значение с сервера (эти функции блокируются до получения ответа), и в некоторых других условиях.
Xlib сохраняет полученные события в очереди. Клиентское приложение может проверять и извлекать события из очереди. Хотя X-сервер отправляет события асинхронно, приложения, использующие библиотеку Xlib, должны явно вызывать функции Xlib для доступа к событиям в очереди. Некоторые из этих функций могут блокироваться; в этом случае они также очищают буфер запросов.
Вместо этого ошибки принимаются и обрабатываются асинхронно: приложение может предоставить обработчик ошибок, который будет вызываться при каждом получении сообщения об ошибке от сервера.
Сохранение содержимого окна не гарантируется, если окно или одна из его частей сделана невидимой. В этом случае заявка отправляется Expose
событие, когда окно или одна его часть снова становится видимой. Затем приложение должно снова отрисовать содержимое окна.
Функции
[ редактировать ]Функции библиотеки Xlib можно сгруппировать в:
- операции по подключению (
XOpenDisplay
,XCloseDisplay
, ...); - запросы к серверу, в том числе запросы на операции (
XCreateWindow
,XCreateGC
,...) и запросы информации (XGetWindowProperty
, ...); и - операции, локальные для клиента: операции в очереди событий (
XNextEvent
,XPeekEvent
, ...) и другие операции с локальными данными (XLookupKeysym
,XParseGeometry
,XSetRegion
,XCreateImage
,XSaveContext
, ...)
Пример
[ редактировать ]Следующая программа создает окно с маленьким черным квадратом внутри:
/*
Simple Xlib application for creating a window and drawing a box in it.
gcc input.c -o output -lX11
*/
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
Display *display;
Window window;
XEvent event;
char *msg = "Hello, World!";
int s;
// open connection to the server
display = XOpenDisplay(NULL);
if (display == NULL)
{
fprintf(stderr, "Cannot open display\n");
exit(1);
}
s = DefaultScreen(display);
// create window
window = XCreateSimpleWindow(display, RootWindow(display, s), 10, 10, 200, 200, 1,
BlackPixel(display, s), WhitePixel(display, s));
// select kind of events we are interested in
XSelectInput(display, window, ExposureMask | KeyPressMask);
// map (show) the window
XMapWindow(display, window);
// event loop
for (;;)
{
XNextEvent(display, &event);
// draw or redraw the window
if (event.type == Expose)
{
XFillRectangle(display, window, DefaultGC(display, s), 20, 20, 10, 10);
XDrawString(display, window, DefaultGC(display, s), 50, 50, msg, strlen(msg));
}
// exit on key press
if (event.type == KeyPress)
break;
}
// close connection to the server
XCloseDisplay(display);
return 0;
}
Клиент создает соединение с сервером, вызывая XOpenDisplay
. Затем он запрашивает создание окна с XCreateSimpleWindow
. Отдельный звонок в XMapWindow
необходим для отображения окна, то есть для того, чтобы сделать его видимым на экране.
Квадрат рисуется вызовом XFillRectangle
. Эту операцию можно выполнить только после создания окна. Однако выполнить его один раз может быть недостаточно. Действительно, не всегда гарантируется сохранение содержимого окна. Например, если окно закрыто, а затем снова открыто, его содержимое может потребовать перерисовки. Программа информируется о том, что окно или его часть необходимо отрисовать путем приема Expose
событие.
Таким образом, отрисовка содержимого окна выполняется внутри цикла обработки событий . Перед входом в этот цикл выбираются события, которые интересуют приложение, в данном случае с помощью XSelectInput
. Цикл событий ожидает входящего события: если это событие является нажатием клавиши, приложение завершается; если это событие раскрытия, содержимое окна отрисовывается. Функция XNextEvent
блокирует и очищает буфер запросов, если в очереди нет событий.
Другие библиотеки
[ редактировать ]Xlib не обеспечивает поддержку кнопок, меню, полос прокрутки и т. д. Такие виджеты предоставляются другими библиотеками, которые, в свою очередь, используют Xlib. Существует два вида таких библиотек:
- библиотеки, построенные на основе библиотеки X Toolkit Intrinsics (Xt), которая обеспечивает поддержку виджетов, но не предоставляет какой-либо конкретный виджет; определенные виджеты предоставляются библиотеками наборов виджетов , использующими Xt, такими как Xaw и Motif ;
- библиотеки, которые предоставляют наборы виджетов, используя Xlib напрямую, без библиотеки Xt, такие как X-версии GTK , Qt , FLTK и fpGUI .
Приложения, использующие любую из этих библиотек виджетов, обычно определяют содержимое окна перед входом в основной цикл и не нуждаются в явной обработке. Expose
события и перерисовать содержимое окна.
Библиотека XCB является альтернативой Xlib. Его две основные цели: уменьшение размера библиотеки и прямой доступ к протоколу X11. Была создана модификация Xlib для использования XCB в качестве низкоуровневого уровня.
Ссылки
[ редактировать ]- ^ Алан Куперсмит. «[АНОНС] libX11 1.8.10» . Проверено 29 июля 2024 г.
- ^ «Примечания XDC2007» . 9 февраля 2007 г.
- ^ «Структура отображения на Freedesktop CVS» . Совет по поиску: typedef struct _XDisplay Display .
Внешние ссылки
[ редактировать ]- Официальная документация по программированию X.Org Foundation , включая самую последнюю версию интерфейса Xlib — C Language X в нескольких форматах.
- Краткое руководство по Xlib
- Страницы руководства для всех функций Xlib
- Страницы Кентона Ли о X Window и Motif
- Более длинное руководство по Xlib
- Использование Xlib для создания модуля заставки
- Най, Адриан (1990). Руководство по программированию Xlib . Полное руководство по системе X Window. Том. 1. О'Рейли Медиа. ISBN 0-937175-11-0 . [ обсуждать ]
- Най, Адриан (1990). Справочное руководство по Xlib . Полное руководство по системе X Window. Том. 2. О'Рейли Медиа. ISBN 0-937175-12-9 . [ обсуждать ]