Jump to content

Xlib

Xlib
Разработчик(и) Фонд X.Org
Первоначальный выпуск ~1985 [ нужна ссылка ]
Стабильная версия
1.8.10 [1]  Отредактируйте это в Викиданных / 28 июля 2024 г .; 8 дней назад ( 28 июля 2024 г. )
Репозиторий
Написано в С
Тип Библиотека
Веб-сайт www .x .org , документация: www . .x .org /релизы /текущий /док /libX11 /libX11 /libX11 .html
X11-клиенты используют xlib для связи с дисплей-сервером .

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

Лишь немногие приложения используют Xlib напрямую; скорее, они используют другие библиотеки, которые используют функции Xlib для предоставления наборов инструментов для виджетов :

Xlib появился примерно в 1985 году. [ нужна ссылка ] и используется в графических интерфейсах многих Unix-подобных операционных систем . Повторная реализация Xlib была представлена ​​в 2007 году с использованием XCB . [2]

Типы данных

[ редактировать ]
Роль KMS (настройка режима ядра), пример Linux
Графический стек Linux
Иллюстрирует графический стек Linux по состоянию на 24 августа 2013 г.
Схема: Гуманно-машинное_взаимодействие
XCB и Xlib — это клиентские библиотеки, реализующие с сервером отображения. протокол связи
Место некоторых модулей ядра Linux
Сервер отображения находится между ядром ( здесь: ядро ​​Linux ) и его клиентами. Он общается со своими клиентами по заданному протоколу.
Место некоторых модулей ядра Linux
Простой уровень DirectMedia может обойти Xlib и писать непосредственно в фреймбуфер . дополнительный порт для EGL. Также доступен

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

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

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

/*
    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 в качестве низкоуровневого уровня.

  1. ^ Алан Куперсмит. «[АНОНС] libX11 1.8.10» . Проверено 29 июля 2024 г.
  2. ^ «Примечания XDC2007» . 9 февраля 2007 г.
  3. ^ «Структура отображения на Freedesktop CVS» . Совет по поиску: typedef struct _XDisplay Display .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 94b92b55bf55231ebcc5749b56f5ff9e__1711383960
URL1:https://arc.ask3.ru/arc/aa/94/9e/94b92b55bf55231ebcc5749b56f5ff9e.html
Заголовок, (Title) документа по адресу, URL1:
Xlib - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)