XCB

XCB（X C Binding）は、X Window System のC言語バインディングである。Xlibを置換することを目的としている。このプロジェクトは Bart Massey が2001年に開始した。

Xlib/XCB は Xlib と XCB のアプリケーションバイナリインタフェース互換性を提供することで、段階的な移植経路を提供するものである。Xlib/XCB は Xlib のプロトコル層を使うが、Xlib トランスポート層は XCB で置換しており、XCB を直接使うために XCB コネクションにアクセスできるようになっている。

 XCB の目的 
XCB の主な目的は以下の2つである。

 ライブラリサイズを小さくし、単純化する。
 Xプロトコルに直接アクセスする。

後者の目的には、C言語インタフェースを非同期にするという意味も含まれ、マルチスレッド化しやすくし、（XMLプロトコル記述により）拡張実装を容易にする。

コアプロトコルと拡張プロトコルはXML (xcb-proto) で記述され、CバインディングはPythonスクリプトによって生成される（以前のバージョンではXSLTあるいはm4を使っていた）。第三の目的は、このプロトコル記述をプロトコルに関する文書生成に再利用したり、C言語以外のバインディングやサーバサイドのスタブ生成に活用することである。

Massey らは XCB の主要部分の形式的検証をZ言語を使って行ってきた（Xlib にはマルチスレッドの同期処理にAPI仕様レベルで誤りがあることが以前から知られていた）。

 例 
 /* ウィンドウ内に四角形を描画する単純な XCB アプリケーション */

 #include <xcb/xcb.h>
 #include <stdio.h>
 #include <stdlib.h>

 int main()
 {
   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("Cannot open display\n");
     exit(1);
   }
                        /* 第一スクリーン取得 */
   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:  /* キー押下で exit */
       done = 1;
       break;
     }
     free(e);
   }
                        /* サーバとのコネクションをクローズ */
   xcb_disconnect(c);

   return 0;
 }
XCB はこの例からも分かるとおり、Xlibにほぼ相当するものの、API の抽象化レベルは若干低い。

 プロトコルの記述 
XCB の作者はX11プロトコルを記述するプログラミング言語に中立であり、他のプログラミング言語とのバインディングを可能にする、専用のインターフェイス記述言語を XML で作った。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: An X Protocol C Binding (PDF) （Bart Massey and Jamey Sharp、2001年9月19日、XFree86 2001年技術会議）
 XCL: An Xlib Compatibility Layer For XCB （Jamey Sharp and Bart Massey、2002年4月15日、USENIX 2002年技術会議）
 X Meets Z: Verifying Correctness In The Presence Of POSIX Threads （Bart Massey and Robert Bauer、2002年4月15日、USENIX 2002年技術会議）

脚注

 外部リンク 

 XCB API リファレンス - チュートリアル
 libxcb チュートリアル
 論文等

Category:X Window System
Category:Freedesktop.org