Jump to content

XCB

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

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.

Примечания

[ редактировать ]
  1. ^ «libxcb-1.17.0» .
  2. ^ Геттис, Джеймс; Паккард, Кейт (2004). (Re) Архитектура X Window System (PDF) . Учеб. Симпозиум по Linux. Том. 1.
  3. ^ Шарп, Джейми (2004). Как реализован Xlib (и что мы с этим делаем) (PDF) . Учеб. Usenix Annual Techn. Конференция, Freenix Track.
  4. ^ Мэсси и Бауэр, 2002 .
  5. ^ Шарп и Мэсси, 2002 , §2.4. «Хотя Xlib был разработан для поддержки многопоточных приложений, и хотя эта поддержка не является непригодной, существуют известные состояния гонки, которые невозможно устранить без изменения интерфейса Xlib».
  6. ^ Мэлони, Росс Дж. (31 марта 2018 г.). Низкоуровневое программирование X Window: введение на примерах . Спрингер. стр. 225–244. ISBN  978-3-319-74250-2 . Проверено 17 мая 2022 г.
  7. ^ «Xlib/XCB: Xlib с транспортом XCB» . 11 января 2008 г. Проверено 11 сентября 2009 г.
  8. ^ Джейми Шарп и Джош Триплетт (26 ноября 2006 г.). «libx11 с Xlib/XCB сейчас находится в экспериментальной стадии; пожалуйста, протестируйте со своими пакетами» . debian-devel-announce (список рассылки) . Проверено 11 сентября 2009 г.
  9. ^ «Протокол X Window System» . X.Орг . Глава 1. Форматы протоколов . Проверено 22 марта 2024 г. Каждое событие содержит 8-битный код типа. Самый старший бит в этом коде устанавливается, если событие было сгенерировано по запросу SendEvent. {{cite web}}: CS1 maint: местоположение ( ссылка )
  10. ^ Джейми Шарп; Барт Мэсси (2002), XCL: уровень совместимости Xlib для XCB , Ежегодная техническая конференция USENIX 2002, Freenix Track
  11. ^ KittyLogo (xcb.freedesktop.org)
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 0ca2258333f908077e5debebe2c47347__1719600360
URL1:https://arc.ask3.ru/arc/aa/0c/47/0ca2258333f908077e5debebe2c47347.html
Заголовок, (Title) документа по адресу, URL1:
XCB - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)