XCB
![]() | |
Оригинальный автор(ы) | Барт Мэсси |
---|---|
Разработчик(и) | Джейми Шарп, Джош Триплетт, Барт Мэсси |
Первоначальный выпуск | 2001 год |
Стабильная версия | 1.17.0 [1] ![]() |
Репозиторий | |
Написано в | С |
Операционная система | ПОСИКС |
Тип | Клиентская библиотека X11 |
Лицензия | МОЯ лицензия |
Веб-сайт | xcb |




XCB ( X-протокол C-language Binding ) — это библиотека, реализующая клиентскую часть протокола сервера отображения X11 . XCB написан на языке программирования C и распространяется по лицензии MIT . Проект был начат в 2001 году Бартом Мэсси и призван заменить Xlib .
Обзор
[ редактировать ]XCB был разработан как меньшая, модернизированная замена Xlib, ранее являвшейся основной библиотекой C для взаимодействия с оконной системой X, что совпало с более полным пересмотром реализации X, произошедшим в начале 2000-х годов. [2] Основными целями XCB являются:
- уменьшить размер и сложность библиотеки
- обеспечить прямой доступ к протоколу X11
Требуемое уменьшение размера достигается главным образом за счет ограничения возможностей XCB обработкой протокола X и исключения таких функций Xlib, как обширная библиотека утилит, большая часть которых мало используется приложениями. Это приводит к уменьшению размера скомпилированной библиотеки в тридцать раз (по состоянию на 2004 год). [3] интерфейса C Вторичные цели включают в себя создание асинхронного , улучшение многопоточности и упрощение реализации расширений (через описания протоколов XML ).
Описания основного и расширенного протоколов представлены в формате XML программой, написанной на Python , а привязки C создаются . (Предыдущие версии использовали XSLT и M4 .)
Дальнейшая цель — иметь возможность использовать эти описания протоколов для создания документации по протоколам, дополнительных языковых привязок и заглушек на стороне сервера.
Мэсси и другие работали над доказательством формальной корректности используя обозначение Z. ключевых частей XCB , [4] (Давно известно, что Xlib содержит ошибки. [5] )
Xlib-совместимость
[ редактировать ]Xlib/XCB обеспечивает совместимость двоичного интерфейса приложения как с Xlib, так и с XCB, обеспечивая возможность постепенного портирования. [6] Xlib/XCB использует уровень протокола Xlib, но заменяет транспортный уровень Xlib на XCB и обеспечивает доступ к базовому соединению XCB для прямого использования XCB. Xlib/XCB позволяет приложению открывать одно соединение с сервером отображения X и использовать как XCB, так и Xlib, возможно, через смесь библиотек, предназначенных для того или другого. [7] [8]
Пример
[ редактировать ]// Simple XCB application for opening a window and drawing a box in it
// To compile it using GNU, use:
// gcc x.c -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 };
// open connection to the server
c = xcb_connect(NULL, NULL);
if (xcb_connection_has_error(c)) {
printf("Cannot open display\n");
exit(EXIT_FAILURE);
}
// get the first screen
s = xcb_setup_roots_iterator( xcb_get_setup(c) ).data;
// create black graphics context
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);
// create window
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);
// map (show) the window
xcb_map_window(c, w);
xcb_flush(c);
// event loop
while (!done && (e = xcb_wait_for_event(c))) {
switch (e->response_type & ~0x80) {
case XCB_EXPOSE: // draw or redraw the window
xcb_poly_fill_rectangle(c, w, g, 1, &r);
xcb_flush(c);
break;
case XCB_KEY_PRESS: // exit on key press
done = 1;
break;
}
free(e);
}
// close connection to server
xcb_disconnect(c);
exit(EXIT_SUCCESS);
}
Побитовое и операции a->response_type & ~0x80
удаляет бит, указывающий, откуда произошло событие. [9]
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">
<request name="Enable" opcode="0">
<reply>
<pad bytes="1" />
<field type="CARD32" name="maximum_request_length" />
</reply>
</request>
</xcb>
Логотип
[ редактировать ]Логотип XCB был создан Gearóid Molloy, автором веб-комикса Neko the Kitty , и передан в дар проекту. [11]
Другие языковые привязки
[ редактировать ]- XCB.pm — модуль Perl, реализующий привязки к XCB.
- xpyb — привязка Python к системе X Window с использованием XCB. По состоянию на июнь 2013 года он не поддерживает Python 3. Предоставлено freedesktop.org .
- xcffib — еще одна привязка Python, которая поддерживает Python 2 и 3, а также еще несколько расширений X, чем xpyb.
Примечания
[ редактировать ]- ^ «libxcb-1.17.0» .
- ^ Геттис, Джеймс; Паккард, Кейт (2004). (Re) Архитектура X Window System (PDF) . Учеб. Симпозиум по Linux. Том. 1.
- ^ Шарп, Джейми (2004). Как реализован Xlib (и что мы с этим делаем) (PDF) . Учеб. Usenix Annual Techn. Конференция, Freenix Track.
- ^ Мэсси и Бауэр, 2002 .
- ^ Шарп и Мэсси, 2002 , §2.4. «Хотя Xlib был разработан для поддержки многопоточных приложений, и хотя эта поддержка не является непригодной, существуют известные состояния гонки, которые невозможно устранить без изменения интерфейса Xlib».
- ^ Мэлони, Росс Дж. (31 марта 2018 г.). Низкоуровневое программирование X Window: введение на примерах . Спрингер. стр. 225–244. ISBN 978-3-319-74250-2 . Проверено 17 мая 2022 г.
- ^ «Xlib/XCB: Xlib с транспортом XCB» . 11 января 2008 г. Проверено 11 сентября 2009 г.
- ^ Джейми Шарп и Джош Триплетт (26 ноября 2006 г.). «libx11 с Xlib/XCB сейчас находится в экспериментальной стадии; пожалуйста, протестируйте со своими пакетами» . debian-devel-announce (список рассылки) . Проверено 11 сентября 2009 г.
- ^ «Протокол X Window System» . X.Орг . Глава 1. Форматы протоколов . Проверено 22 марта 2024 г.
Каждое событие содержит 8-битный код типа. Самый старший бит в этом коде устанавливается, если событие было сгенерировано по запросу SendEvent.
{{cite web}}
: CS1 maint: местоположение ( ссылка ) - ^ Джейми Шарп; Барт Мэсси (2002), XCL: уровень совместимости Xlib для XCB , Ежегодная техническая конференция USENIX 2002, Freenix Track
- ^ KittyLogo (xcb.freedesktop.org)
Ссылки
[ редактировать ]- Мэсси, Барт; Шарп, Джейми (19 сентября 2001 г.). «XCB: привязка X-протокола C» (PDF) . Материалы технической конференции XFree86 . Окленд, Калифорния: USENIX . Проверено 12 марта 2012 г.
- Мэсси, Барт; Бауэр, Роберт (2002). «X встречает Z: проверка правильности при наличии потоков POSIX» . Материалы программы FREENIX Track: Ежегодная техническая конференция USENIX 2002 г. Монтерей, Калифорния: USENIX . стр. 221–234 . Проверено 7 ноября 2008 г.
- Шарп, Джейми; Мэсси, Барт (2002). «XCL: уровень совместимости для XCB» . Материалы программы FREENIX Track: Ежегодная техническая конференция USENIX 2002 г. Монтерей, Калифорния: USENIX . стр. 71–83 . Проверено 7 ноября 2008 г.