В этой статье слишком много ссылок на первоисточники . ( Ноябрь 2009 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) |
Автор (ы) оригинала | Барт Мэсси |
---|---|
Разработчики) | Джейми Шарп, Джош Триплетт, Барт Мэсси |
изначальный выпуск | 2001 |
Стабильный выпуск | 1.14 / февраль 2020 г . |
Репозиторий | |
Написано в | C |
Операционная система | POSIX |
Тип | Клиентская библиотека X11 |
Лицензия | Лицензия MIT |
Интернет сайт | xcb |
XCB ( привязка языка C протокола X ) - это библиотека, реализующая клиентскую сторону протокола сервера отображения X11 . XCB написан на языке программирования C и распространяется по лицензии MIT . Проект был запущен в 2001 году Барт Мэсси и направлен на замену Xlib .
Обзор [ править ]
XCB был разработан как небольшая модернизированная замена Xlib, ранее являвшейся основной библиотекой C для связи с оконной системой X, что совпало с более полным пересмотром реализации X, который произошел в начале 2000-х годов. [1] Основные цели XCB:
- уменьшить размер и сложность библиотеки
- обеспечить прямой доступ к протоколу X11
Требуемое уменьшение размера достигается, в первую очередь, за счет ограничения области действия XCB обработкой протокола X и исключения функций Xlib, таких как его обширная служебная библиотека, большая часть из которых мало используется приложениями. Это приводит к уменьшению размера скомпилированной библиотеки в тридцать раз (по состоянию на 2004 г.). [2] Вторичные цели включают в себя создание асинхронного интерфейса C , улучшение многопоточности и упрощение реализации расширений (через описания протоколов XML ).
Описания основных и расширенных протоколов представлены в формате XML , а программа, написанная на Python, создает привязки C. (В предыдущих версиях использовались XSLT и M4 .)
Еще одна цель - иметь возможность использовать эти описания протоколов для создания документации протокола, дополнительных языковых привязок и заглушек на стороне сервера.
Мэсси и другие работали, чтобы доказать формальную правильность ключевых частей XCB, используя Z-нотацию . [3] (Давно известно, что Xlib содержит ошибки. [4] )
Совместимость с Xlib [ править ]
Xlib / XCB обеспечивает совместимость двоичного интерфейса приложения как с Xlib, так и с XCB, обеспечивая путь инкрементного портирования. Xlib / XCB использует уровень протокола Xlib, но заменяет транспортный уровень Xlib на XCB и обеспечивает доступ к базовому соединению XCB для прямого использования XCB. Xlib / XCB позволяет приложению открывать одно соединение с сервером отображения X и использовать как XCB, так и Xlib, возможно, через смесь библиотек, предназначенных для одного или другого. [5] [6]
Пример [ править ]
// Простое приложение 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 [ 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_FAILURE ); } // получаем первый экран s = xcb_setup_roots_iterator ( xcb_get_setup ( c ) ). данные ; // создаем контекст черной графики g = xcb_generate_id ( c ); w = s -> корень ; маска = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES ; значения [ 0 ] = s -> black_pixel ; значения [ 1 ] = 0 ; xcb_create_gc ( c , g , w , маска , значения ); // создаем окно w = xcb_generate_id ( c ); маска = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK ; значения [ 0 ] = s -> white_pixel ; значения [ 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 , маска , значения ); // отображаем (отображаем) окно xcb_map_window ( c , w ); xcb_flush ( с ); // цикл обработки событий в то время как ( ! Сделано && ( е = xcb_wait_for_event ( с ))) { переключатель ( е -> response_type & ~ 0x80 ) { случай XCB_EXPOSE : // нарисовать или перерисовать окно xcb_poly_fill_rectangle ( с , ш , г , 1 , & r ); xcb_flush ( с ); перерыв ; case XCB_KEY_PRESS : // выход при нажатии клавиши done = 1 ; перерыв ; } бесплатно ( e ); } // закрываем соединение с сервером xcb_disconnect ( c ); выход ( EXIT_SUCCESS ); }
XCB имеет сопоставимый, но немного более низкого уровня , чем по API Xlib , [7] , как можно видеть на этом примере.
Описание протокола [ править ]
Создатели XCB изобрели специализированный язык описания интерфейсов для моделирования протокола X11 независящим от языка способом и облегчения создания привязок к другим языкам программирования. Сама libxcb реализована как генератор кода и крошечная заглушка служебных функций на языке Си.
Пример:
<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 был разработан Героидом Моллой, автором веб-комикса Neko the Kitty , и пожертвован проекту. [8]
Привязки других языков [ править ]
- XCB.pm - модуль Perl, реализующий привязку к XCB.
- xpyb - привязка Python к системе X Window с использованием XCB. По состоянию на июнь 2013 года он не поддерживает Python 3. Предоставлено freedesktop.org .
- xcffib - еще одна привязка Python, которая поддерживает Python 2 и 3, а также еще несколько расширений X, чем xpyb.
Заметки [ править ]
- ^ Геттис, Джеймс; Паккард, Кит (2004). (Ре) Архитектура X Window System (PDF) . Proc. Симпозиум по Linux. 1 .
- ^ Шарп, Джейми (2004). Как реализован Xlib (и что мы с этим делаем) (PDF) . Proc. Usenix Annual Techn. Конф., Freenix Track.
- Перейти ↑ Massey and Bauer, 2002 .
- ↑ Шарп и Мэсси, 2002 , §2.4. «Хотя Xlib был разработан для поддержки многопоточных приложений, и хотя эта поддержка не является бесполезной, существуют известные состояния гонки, которые нельзя устранить без изменения интерфейса Xlib».
- ^ "Xlib / XCB: Xlib с транспортом XCB" . 2008-01-11 . Проверено 11 сентября 2009 .
- ^ Джейми Шарп и Джош Триплетт (2006-11-26). «libx11 с Xlib / XCB сейчас в экспериментальном режиме; пожалуйста, проверьте свои пакеты» . debian-devel-announce (Список рассылки) . Проверено 11 сентября 2009 .
- ^ Джейми Шарп; Барт Мэсси (2002), XCL: уровень совместимости с Xlib для XCB , Ежегодная техническая конференция USENIX 2002, Freenix Track
- ^ KittyLogo (xcb.freedesktop.org)
Ссылки [ править ]
- Мэсси, Барт; Шарп, Джейми (2001-09-19). «XCB: Связывание протокола X C» (PDF) . Труды технической конференции XFree86 . Окленд, Калифорния: USENIX . Проверено 12 марта 2012 .
- Мэсси, Барт; Бауэр, Роберт (2002). «X встречает Z: проверка корректности при наличии потоков POSIX» . Материалы Freenix Track: 2002 USENIX ежегодной технической конференции . Монтерей, Калифорния: USENIX . С. 221–234 . Проверено 7 ноября 2008 .
- Шарп, Джейми; Мэсси, Барт (2002). «XCL: уровень совместимости для XCB» . Материалы Freenix Track: 2002 USENIX ежегодной технической конференции . Монтерей, Калифорния: USENIX . С. 71–83 . Проверено 7 ноября 2008 .
Внешние ссылки [ править ]
- XCB вики ( freedesktop.org )
- Справочник по API XCB , учебник
- руководство по libxcb
- Дальнейшие публикации
- Руководство X для нового разработчика: Xlib и XCB