Оригинальный автор(ы) | Барт Мэсси |
---|---|
Разработчик(и) | Джейми Шарп, Джош Триплетт, Барт Мэсси |
Первоначальный выпуск | 2001 ( 2001 ) |
Стабильный релиз | 1.17.0 [1] / 15 апреля 2024 г. ( 15 апреля 2024 ) |
Репозиторий |
|
Написано в | С |
Операционная система | POSIX |
Тип | Клиентская библиотека X11 |
Лицензия | Лицензия Массачусетского технологического института |
Веб-сайт | xcb.freedesktop.org |
XCB ( X protocol C-language Binding ) — библиотека, реализующая клиентскую часть протокола сервера отображения X11 . XCB написана на языке программирования C и распространяется по лицензии MIT . Проект был начат в 2001 году Бартом Мэсси и направлен на замену Xlib .
XCB был разработан как меньшая, модернизированная замена Xlib, ранее основной библиотеки C для взаимодействия с системой X Window, что совпало с более полной переработкой реализации X, которая произошла в начале 2000-х годов. [2] Основными целями XCB являются:
Требуемое уменьшение размера достигается в первую очередь за счет ограничения области действия XCB до обработки протокола X и исключения функциональности Xlib, такой как его обширная библиотека утилит, большая часть которой мало использовалась приложениями. Это приводит к сокращению размера скомпилированной библиотеки в тридцать раз (по состоянию на 2004 год). [3] Вторичные цели включают в себя асинхронизацию интерфейса C , содействие лучшей многопоточности и упрощение реализации расширений (через описания протокола XML ).
Описания основных и расширенных протоколов представлены в формате XML , а привязки на языке C создаются программой, написанной на Python . (В предыдущих версиях использовались XSLT и M4 .)
Дальнейшая цель — иметь возможность использовать эти описания протоколов для создания документации протоколов, дополнительных языковых привязок и заглушек на стороне сервера.
Мэсси и другие работали над тем, чтобы доказать, что ключевые части XCB формально корректны , используя нотацию Z. [4] (Xlib давно известен тем, что содержит ошибки. [5] )
Xlib/XCB обеспечивает совместимость двоичного интерфейса приложения как с Xlib, так и с XCB, предоставляя инкрементный путь портирования. [6] Xlib/XCB использует уровень протокола Xlib, но заменяет транспортный уровень Xlib на XCB и обеспечивает доступ к базовому соединению XCB для прямого использования XCB. Xlib/XCB позволяет приложению открывать одно соединение с сервером отображения X и использовать как XCB, так и Xlib, возможно, через смесь библиотек, разработанных для одного или другого. [7] [8]
// Простое приложение XCB для открытия окна и рисования в нем рамки// Чтобы скомпилировать его с помощью GNU, используйте: // gcc xc -lxcb#include <stdio.h> #include <stdlib.h> #include <xcb/xcb.h> int main ( void ) { xcb_connection_t * c ; xcb_screen_t * s ; xcb_window_t w ; xcb_gcontext_t g ; xcb_generic_event_t * e ; uint32_t mask ; uint32_t values [ 2 ]; int done = 0 ; xcb_rectangle_t r = { 20 , 20 , 60 , 60 }; // открыть соединение с сервером c = xcb_connect ( NULL , NULL ); if ( xcb_connection_has_error ( c )) { printf ( "Невозможно открыть дисплей \n " ); exit ( EXIT_FAILURE ); } // получить первый экран s = xcb_setup_roots_iterator ( xcb_get_setup ( c ) ). data ; // создать черный графический контекст g = xcb_generate_id ( c ); w = s -> root ; mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES ; values [ 0 ] = s -> black_pixel ; values [ 1 ] = 0 ; xcb_create_gc ( c , g , w , mask , values ); // создать окно w = xcb_generate_id ( c ); mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK ; values [ 0 ] = s -> white_pixel ; values [ 1 ] = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_KEY_PRESS ; xcb_create_window ( c , s -> root_depth , w , s -> root , 10 , 10 , 100 , 100 , 1 , XCB_WINDOW_CLASS_INPUT_OUTPUT , s -> root_visual , mask , values ); // отобразить (показать) окно xcb_map_window ( c , w ); xcb_flush ( c ); // цикл событий while ( ! done && ( e = xcb_wait_for_event ( c ))) { switch ( e -> response_type & ~ 0x80 ) { case XCB_EXPOSE : // нарисовать или перерисовать окно xcb_poly_fill_rectangle ( c , w , g , 1 , & r ); xcb_flush ( c ); break ; case XCB_KEY_PRESS : // выйти по нажатию клавиши done = 1 ; break ; } free ( e ); } // закрыть соединение с сервером xcb_disconnect ( c ); выход ( EXIT_SUCCESS ); }
Побитовая операция «И» удаляет бит, указывающий, откуда произошло событие. [9]a->response_type & ~0x80
XCB имеет сопоставимый, но немного более низкоуровневый API, чем Xlib , [10], как можно увидеть в этом примере.
Создатели XCB изобрели специализированный язык описания интерфейсов для моделирования протокола X11 нейтральным по отношению к языку способом и упрощения создания привязок к другим языкам программирования. [ сомнительно – обсудить ] Сама libxcb реализована как генератор кода и небольшая заглушка C-функций утилит.
Пример:
<xcb header= "bigreq" extension-xname= "BIG-REQUESTS" extension-name= "BigRequests" extension-multiword= "true" major-version= "0" minor-version= "0" > < имя запроса = "Включить" код операции= "0" > <ответ> < байты pad = "1" /> < тип поля = "CARD32" имя= "максимальная_длина_запроса" /> </ответ > < /запрос > </xcb>
Логотип XCB был создан Gearóid Molloy, автором веб-комикса Neko the Kitty , и передан в дар проекту. [11]
событие содержит 8-битный код типа. Самый старший бит в этом коде устанавливается, если событие было сгенерировано из запроса SendEvent.
{{cite web}}
: CS1 maint: местоположение ( ссылка )