Xlib - Xlib
Эта статья нужны дополнительные цитаты для проверка.Сентябрь 2018 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Разработчики) | Фонд X.Org |
---|---|
изначальный выпуск | ~1985[нужна цитата ] |
Репозиторий | |
Написано в | C |
Тип | Библиотека |
Интернет сайт | www |
Xlib (также известный как libX11) является X Window System клиент протокола библиотека написано в Язык программирования C. Это содержит функции для взаимодействия с X сервер. Эти функции позволяют программисты писать программы, не зная подробностей протокол. Немногие приложения используют Xlib напрямую; скорее они используют другие библиотеки, которые используют функции Xlib для предоставления наборы инструментов для виджетов:
- X Toolkit Intrinsics (Xt)
- Набор виджетов Афина (Xaw)
- Мотив
- ФЛТК
- GTK
- Qt (Версия X11)
- Тк
- SDL (простой уровень DirectMedia)
- SFML (простая и быстрая мультимедийная библиотека)
Xlib появился примерно в 1985 году.[нужна цитата ], и в настоящее время используется в GUI для многих Unix-подобный операционные системы. В XCB library - это попытка заменить Xlib. Хотя Xlib все еще используется в некоторых средах, современные версии сервера X.org реализуют Xlib поверх XCB.[1]
Типы данных
Основными типами данных в Xlib являются Отображать
[2] структура и типы идентификаторов.
Неформально дисплей - это физическое или виртуальное устройство, на котором выполняются графические операции. В Отображать
Структура библиотеки Xlib содержит информацию об отображении, но, что более важно, она содержит информацию относительно канала между клиентом и сервером. Например, в Unix-подобный операционная система, Отображать
структура содержит дескриптор файла разъем этого канала (его можно получить с помощью ConnectionNumber
макрос.) Большинство функций Xlib имеют Отображать
структура в качестве аргумента, потому что они либо работают на канале, либо относятся к определенному каналу. В частности, все функции Xlib, которые взаимодействуют с сервером, нуждаются в этой структуре для доступа к каналу. Некоторые другие функции нуждаются в этой структуре, даже если они работают локально, потому что они работают с данными, относящимися к определенному каналу. К операциям такого типа относятся, например, операции с очередью событий, которые описаны ниже.
Окна, цветовые карты и т. Д. Управляются сервером, а это означает, что данные об их фактической реализации хранятся на сервере. Клиент работает с этими объектами, используя их идентификаторы. Клиент не может напрямую работать с объектом, но может только запросить у сервера выполнение операции с указанием идентификатора объекта.
Типы Windows
, Pixmap
, Шрифт
, Цветовая карта
и т. д. - все идентификаторы, которые являются 32-битными целыми числами (как и в самом протоколе X11). Клиент «создает» окно, запрашивая у сервера создание окна. Это делается через вызов функции Xlib, которая возвращает идентификатор окна, то есть число. Затем этот идентификатор может использоваться клиентом для запроса на сервере других операций в том же окне.
Идентификаторы уникальны для сервера. Большинство из них могут использоваться разными приложениями для ссылки на одни и те же объекты. Например, два приложения, соединяющиеся с одним и тем же сервером, используют один и тот же идентификатор для ссылки на одно и то же окно. Эти два приложения используют два разных канала и, следовательно, имеют два разных Отображать конструкции; однако, когда они запрашивают операции с одним и тем же идентификатором, эти операции будут выполняться с одним и тем же объектом.
Протокол и события
Функции Xlib, которые отправляют запросы на сервер, обычно не отправляют эти запросы сразу, а сохраняют их в буфере, называемом буфер запроса. Период, термин запрос в данном случае относится к запросу от клиента, который направлен на сервер: буфер запроса может содержать все виды запросов к серверу, а не только те, которые имеют видимый эффект на экране. Буфер запросов гарантированно будет очищен (т.е. все запросы, выполненные на данный момент, отправляются на сервер) после вызова функций XSync
или же XFlush
, после вызова функции, возвращающей значение с сервера (эти функции блокируются до получения ответа), и в некоторых других условиях.
Xlib хранит полученные события в очереди. Клиентское приложение может проверять и извлекать события из очереди. Хотя X-сервер передает события асинхронно, приложения, использующие библиотеку Xlib, должны явно вызывать функции Xlib для доступа к событиям в очереди. Некоторые из этих функций могут блокироваться; в этом случае они также очищают буфер запроса.
Вместо этого ошибки принимаются и обрабатываются асинхронно: приложение может предоставить обработчик ошибок, который будет вызываться всякий раз, когда будет получено сообщение об ошибке от сервера.
Не гарантируется сохранение содержимого окна, если окно или одна из его частей становятся невидимыми. В этом случае заявка отправляется Разоблачать
событие, когда окно одной его части снова становится видимым. Затем приложение должно снова нарисовать содержимое окна.
Функции
Функции в библиотеке Xlib можно сгруппировать в:
- операции над подключением (
XOpenDisplay
,XCloseDisplay
, ...); - запросы к серверу, в том числе запросы на операции (
XCreateWindow
,XCreateGC
, ...) и запросы информации (XGetWindowProperty
, ...); и - операции, локальные для клиента: операции с очередью событий (
XNextEvent
,XPeekEvent
, ...) и другие операции с локальными данными (XLookupKeysym
,XParseGeometry
,XSetRegion
,XCreateImage
,XSaveContext
, ...)
Пример
Следующая программа создает окно с маленьким черным квадратом внутри:
/* Простое приложение Xlib для создания окна и рисования в нем рамки. gcc input.c -o output -lX11*/ #включают <X11/Xlib.h>#включают <stdio.h>#включают <stdlib.h>#включают <string.h> int главный(пустота){ Отображать *отображать; Окно окно; XEvent мероприятие; char *сообщение = "Привет, мир!"; int s; // открываем соединение с сервером отображать = XOpenDisplay(НОЛЬ); если (отображать == НОЛЬ) { fprintf(stderr, "Не удается открыть дисплей п"); выход(1); } s = DefaultScreen(отображать); // создаем окно окно = XCreateSimpleWindow(отображать, RootWindow(отображать, s), 10, 10, 200, 200, 1, BlackPixel(отображать, s), БелыйПиксель(отображать, s)); // выбираем интересующие нас события XSelectInput(отображать, окно, ExposureMask | KeyPressMask); // отображаем (показываем) окно XMapWindow(отображать, окно); // цикл событий за (;;) { XNextEvent(отображать, &мероприятие); // рисуем или перерисовываем окно если (мероприятие.тип == Разоблачать) { XFillRectangle(отображать, окно, По умолчаниюGC(отображать, s), 20, 20, 10, 10); XDrawString(отображать, окно, По умолчаниюGC(отображать, s), 50, 50, сообщение, Strlen(сообщение)); } // выход при нажатии клавиши если (мероприятие.тип == Нажатие клавиши) перемена; } // закрываем соединение с сервером XCloseDisplay(отображать); возвращаться 0; }
Клиент устанавливает соединение с сервером, вызывая XOpenDisplay
. Затем он запрашивает создание окна с XCreateSimpleWindow
. Отдельный звонок в XMapWindow
необходим для отображения окна, то есть для того, чтобы сделать его видимым на экране.
Квадрат нарисован вызовом XFillRectangle
. Эта операция может быть выполнена только после создания окна. Однако одного его выполнения может быть недостаточно. Действительно, не всегда гарантируется сохранение содержимого окна. Например, если окно закрыто, а затем снова открыто, его содержимое может потребовать перерисовки. Программа информируется о том, что окно или его часть должны быть нарисованы при приеме Разоблачать
мероприятие.
Поэтому отрисовка содержимого окна выполняется внутри цикл обработки событий. Перед входом в этот цикл выбираются события, которые интересуют приложение, в данном случае с XSelectInput
. Цикл событий ожидает входящего события: если это событие - нажатие клавиши, приложение завершает работу; если это событие expose, отображается содержимое окна. Функция XNextEvent
блокирует и очищает буфер запроса, если в очереди нет события.
Другие библиотеки
Xlib не поддерживает кнопки, меню, полосы прокрутки и т. Д. виджеты предоставляются другими библиотеками, которые, в свою очередь, используют Xlib. Есть два вида таких библиотек:
- библиотеки, построенные на основе X Toolkit Intrinsics библиотека (Xt), которая обеспечивает поддержку виджетов, но не предоставляет никаких конкретных виджетов; определенные виджеты предоставляются набор виджетов библиотеки, использующие Xt, такие как Xaw и Мотив;
- библиотеки, которые предоставляют наборы виджетов с использованием Xlib напрямую, без библиотеки Xt, например X-версии GTK, Qt, ФЛТК и fpGUI.
Приложения, использующие любую из этих библиотек виджетов, обычно определяют содержимое окна перед входом в основной цикл и не нуждаются в явной обработке Разоблачать
события и перерисовать содержимое окна.
В XCB библиотека является альтернативой Xlib. Его две основные цели: уменьшение размера библиотеки и прямой доступ к протоколу X11. Создана модификация Xlib для использования XCB в качестве низкоуровневого уровня.
Рекомендации
- ^ "Принятие".
- ^ "Отображение структуры в CVS Freedesktop". Подсказка для поиска: typedef struct _XDisplay Display.
внешняя ссылка
- Официальная документация по программированию X.Org Foundation, включая самую последнюю версию Xlib - Язык C X Интерфейс в нескольких форматах.
- Краткое руководство по Xlib
- Страницы руководства для всех функций Xlib
- Страницы Кентона Ли о X Window и Motif
- Более подробное руководство по Xlib
- Использование Xlib для создания модуля заставки