Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску
X11-клиенты используют XCB для связи с X-сервером .
Более полное представление о стеке графики Linux
Программы часто используют GTK или FLTK или Qt для их GUI виджетов .
Более полное представление о компонентах операционной системы для домашних компьютеров.

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.

Заметки [ править ]

  1. ^ Геттис, Джеймс; Паккард, Кит (2004). (Ре) Архитектура X Window System (PDF) . Proc. Симпозиум по Linux. 1 .
  2. ^ Шарп, Джейми (2004). Как реализован Xlib (и что мы с этим делаем) (PDF) . Proc. Usenix Annual Techn. Конф., Freenix Track.
  3. Перейти ↑ Massey and Bauer, 2002 .
  4. Шарп и Мэсси, 2002 , §2.4. «Хотя Xlib был разработан для поддержки многопоточных приложений, и хотя эта поддержка не является бесполезной, существуют известные состояния гонки, которые нельзя устранить без изменения интерфейса Xlib».
  5. ^ "Xlib / XCB: Xlib с транспортом XCB" . 2008-01-11 . Проверено 11 сентября 2009 .
  6. ^ Джейми Шарп и Джош Триплетт (2006-11-26). «libx11 с Xlib / XCB сейчас в экспериментальном режиме; пожалуйста, проверьте свои пакеты» . debian-devel-announce (Список рассылки) . Проверено 11 сентября 2009 .
  7. ^ Джейми Шарп; Барт Мэсси (2002), XCL: уровень совместимости с Xlib для XCB , Ежегодная техническая конференция USENIX 2002, Freenix Track
  8. ^ 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