XCB

Библиотека привязки языка C к протоколу X
Оригинальный автор(ы)Барт Мэсси
Разработчик(и)Джейми Шарп, Джош Триплетт, Барт Мэсси
Первоначальный выпуск2001 ; 23 года назад ( 2001 )
Стабильный релиз
1.17.0 [1]  / 15 апреля 2024 г. ; 5 месяцев назад ( 15 апреля 2024 )
Репозиторий
  • gitlab.freedesktop.org/xorg/lib/libxcb
Написано вС
Операционная системаPOSIX
ТипКлиентская библиотека X11
ЛицензияЛицензия Массачусетского технологического института
Веб-сайтxcb.freedesktop.org
X11-клиенты используют XCB для связи с X-сервером .
Более полный обзор графического стека Linux
Программы часто используют GTK , FLTK или Qt для своих графических интерфейсов .
Более полный обзор компонентов операционной системы для домашних компьютеров.

XCB ( X protocol C-language Binding ) — библиотека, реализующая клиентскую часть протокола сервера отображения X11 . XCB написана на языке программирования C и распространяется по лицензии MIT . Проект был начат в 2001 году Бартом Мэсси и направлен на замену Xlib .

Обзор

XCB был разработан как меньшая, модернизированная замена Xlib, ранее основной библиотеки C для взаимодействия с системой X Window, что совпало с более полной переработкой реализации X, которая произошла в начале 2000-х годов. [2] Основными целями XCB являются:

  • уменьшить размер и сложность библиотеки
  • обеспечить прямой доступ к протоколу X11

Требуемое уменьшение размера достигается в первую очередь за счет ограничения области действия XCB до обработки протокола X и исключения функциональности Xlib, такой как его обширная библиотека утилит, большая часть которой мало использовалась приложениями. Это приводит к сокращению размера скомпилированной библиотеки в тридцать раз (по состоянию на 2004 год). [3] Вторичные цели включают в себя асинхронизацию интерфейса C , содействие лучшей многопоточности и упрощение реализации расширений (через описания протокола XML ).

Описания основных и расширенных протоколов представлены в формате XML , а привязки на языке C создаются программой, написанной на Python . (В предыдущих версиях использовались XSLT и M4 .)

Дальнейшая цель — иметь возможность использовать эти описания протоколов для создания документации протоколов, дополнительных языковых привязок и заглушек на стороне сервера.

Мэсси и другие работали над тем, чтобы доказать, что ключевые части XCB формально корректны , используя нотацию Z. [4] (Xlib давно известен тем, что содержит ошибки. [5] )

Совместимость с Xlib

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]

Другие языковые привязки

  • XCB.pm — модуль Perl, реализующий привязки к XCB.
  • xpyb — привязка Python к X Window System с использованием XCB. По состоянию на июнь 2013 года не поддерживает Python 3. Предоставлено freedesktop.org .
  • xcffib — еще одна привязка Python, которая поддерживает Python 2 и 3, а также несколько дополнительных расширений X, чем xpyb.

Примечания

  1. ^ "libxcb-1.17.0".
  2. ^ Геттис, Джеймс; Паккард, Кейт (2004). (Пере)архитектура системы X Window (PDF) . Труды симпозиума Linux. Том 1.
  3. ^ Sharp, Jamey (2004). Как реализована Xlib (и что мы с этим делаем) (PDF) . Proc. Usenix Annual Techn. Conf., Freenix Track.
  4. ^ Мэсси и Бауэр, 2002.
  5. ^ Sharp and Massey, 2002, §2.4. «Хотя Xlib был разработан для поддержки потоковых приложений, и хотя эта поддержка не является бесполезной, существуют известные состояния гонки, которые нельзя устранить без изменения интерфейса Xlib».
  6. ^ Малони, Росс Дж. (31 марта 2018 г.). Низкоуровневое программирование X Window: введение в примерах. Springer. стр. 225–244. ISBN 978-3-319-74250-2. Получено 17 мая 2022 г. .
  7. ^ "Xlib/XCB: Xlib с транспортом XCB". 2008-01-11 . Получено 2009-09-11 .
  8. Джейми Шарп и Джош Триплетт (26.11.2006). "libx11 с Xlib/XCB сейчас в экспериментальной версии; пожалуйста, протестируйте с вашими пакетами". debian-devel-announce (список рассылки) . Получено 11.09.2009 .
  9. ^ "Протокол X Window System". X.Org . Глава 1. Форматы протоколов . Получено 22 марта 2024 г. Каждое событие содержит 8-битный код типа. Самый старший бит в этом коде устанавливается, если событие было сгенерировано из запроса SendEvent.{{cite web}}: CS1 maint: местоположение ( ссылка )
  10. ^ Джейми Шарп; Барт Мэсси (2002), XCL: уровень совместимости Xlib для XCB, Ежегодная техническая конференция USENIX 2002, Freenix Track
  11. ^ KittyLogo (xcb.freedesktop.org)

Ссылки

  • Massey, Bart; Sharp, Jamey (19.09.2001). "XCB: An X Protocol C Binding" (PDF) . Труды технической конференции XFree86 . Окленд, Калифорния: USENIX . Получено 12.03.2012 .
  • Massey, Bart; Bauer, Robert (2002). «X встречает Z: проверка корректности в присутствии потоков POSIX». Труды FREENIX Track: 2002 USENIX Annual Technical Conference . Монтерей, Калифорния: USENIX . стр. 221–234 . Получено 07.11.2008 .
  • Sharp, Jamey; Massey, Bart (2002). "XCL: Уровень совместимости для XCB". Труды FREENIX Track: Ежегодная техническая конференция USENIX 2002 года . Монтерей, Калифорния: USENIX . стр. 71–83 . Получено 07.11.2008 .
  • XCB вики ( freedesktop.org )
  • Справочник API XCB, руководство
  • учебник по libxcb
  • Дальнейшие публикации
  • Руководство разработчика X New: Xlib и XCB
Взято с "https://en.wikipedia.org/w/index.php?title=XCB&oldid=1231543598"