| 原作者 | バート・マッシー |
|---|---|
| 開発者 | ジェイミー・シャープ、ジョシュ・トリプレット、バート・マッセイ |
| 初回リリース | 2001年 |
| 安定リリース | 1.17.0 [1]
/ 2024年4月15日 |
| リポジトリ |
|
| 書かれた | C |
| オペレーティング·システム | POSIX |
| タイプ | X11 クライアント ライブラリ |
| ライセンス | MITライセンス |
| Webサイト | フリーデスクトップ |




XCB ( X プロトコル C 言語バインディング) は、 X11ディスプレイ サーバー プロトコルのクライアント側を実装するライブラリです。XCB はC プログラミング言語で記述されており、MIT ライセンスの下で配布されています。このプロジェクトは 2001 年に Bart Massey によって開始され、Xlibの置き換えを目的としています。
概要
XCBは、以前はXウィンドウシステムと通信するための主要なCライブラリであったXlibのより小さく近代化された代替品として設計され、2000年代初頭に行われたX実装のより完全なオーバーホールと一致しました。[2] XCBの主な目標は次のとおりです。
- ライブラリのサイズと複雑さを軽減
- X11プロトコルへの直接アクセスを提供する
必要なサイズ削減は、主にXCBの範囲をXプロトコルの処理に限定し、アプリケーションでほとんど使用されない広範なユーティリティライブラリなどのXlib機能を省略することによって達成されます。これにより、コンパイルされたライブラリのサイズが30分の1に削減されます(2004年現在)。[3] 二次的な目標には、Cインターフェイスを非同期にすること、より優れたマルチスレッドを容易にすること、および拡張機能の実装を容易にすること(XMLプロトコル記述経由)が含まれます。
コアおよび拡張プロトコルの記述はXMLで行われ、 Pythonで記述されたプログラムがC バインディングを作成します。(以前のバージョンではXSLTとM4が使用されていました。)
さらなる目標は、これらのプロトコル記述を使用して、プロトコル ドキュメント、より多くの言語バインディング、およびサーバー側スタブを作成できるようにすることです。
Masseyらは、 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]
例
// ウィンドウを開いてその中にボックスを描画するシンプルな 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 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 ( "ディスプレイを開けません\n " ); exit ( EXIT_FAILURE ); } // 最初の画面を取得します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 : // キーが押されたら終了done = 1 ; break ; } free ( e ); } // サーバーへの接続を閉じるxcb_disconnect ( c );
終了( EXIT_SUCCESS );
}
ビット演算はイベントの発生元を示すビットを削除します。[9]a->response_type & ~0x80
XCBは、この例からもわかるように、 Xlibと同等ではあるが、わずかに低レベルのAPIを持っています[10] 。
プロトコルの説明
XCB の作成者は、言語に依存しない方法で X11 プロトコルをモデル化し、他のプログラミング言語へのバインディングの生成を容易にする特殊なインターフェイス記述言語を発明しました。 [疑わしい–議論] libxcb 自体は、コード ジェネレーターとユーティリティ関数の小さな C スタブとして実装されています。
例:
<xcbヘッダー = "bigreq"拡張機能 xname = "BIG-REQUESTS"拡張機能名 = "BigRequests"拡張機能マルチワード = "true"メジャーバージョン = "0"マイナーバージョン = "0" >
<request name= "Enable" opcode= "0" > <reply> <pad bytes= "1" /> <field type= "CARD32" name= "maximum_request_length" /> </reply> </request> </xcb>
ロゴ
XCBのロゴは、ウェブコミック 『ネコ・ザ・キティ』の作者であるギアロイド・モロイによって制作され、プロジェクトに寄贈されました。[11]
他の言語バインディング
- XCB.pm - XCB へのバインディングを実装する Perl モジュール。
- xpyb - XCB を使用した X ウィンドウ システムへの Python バインディング。2013 年 6 月現在、Python 3 はサポートされていません。freedesktop.orgによって提供されています。
- xcffib - Python 2 と 3 に加え、xpyb よりも多くの X 拡張機能をサポートする別の Python バインディング。
注記
- ^ "libxcb-1.17.0"。
- ^ Gettys, James; Packard, Keith (2004). X Window System の (再) アーキテクチャ(PDF) . Proc. Linux Symposium. Vol. 1.
- ^ Sharp, Jamey (2004). Xlib の実装方法 (およびそれに対する取り組み) (PDF)。Proc. Usenix Annual Techn. Conf.、Freenix Track。
- ^ マッシーとバウアー、2002年。
- ^ Sharp and Massey、2002、§2.4。「Xlib はスレッド アプリケーションをサポートするように設計されており、そのサポートは使用できないわけではありませんが、Xlib インターフェイスを変更しないと排除できない既知の競合状態があります。」
- ^ マロニー、ロス J. (2018 年 3 月 31 日)。低レベル X ウィンドウ プログラミング: 例による入門。シュプリンガー。pp. 225–244。ISBN 978-3-319-74250-2. 2022年5月17日閲覧。
- ^ 「Xlib/XCB: XCB トランスポートを備えた Xlib」 2008 年 1 月 11 日. 2009 年 9 月 11 日閲覧。
- ^ Jamey Sharp および Josh Triplett ( 2006-11-26 )。「libx11 with Xlib/XCB now in experimental; please test with your packages」。debian-devel-announce (メーリング リスト) 。2009-09-11 に取得。
- ^ 「X Window System Protocol」。X.Org。第 1 章 プロトコル形式。2024年3 月 22 日閲覧。
すべてのイベントには 8 ビットのタイプ コードが含まれています。イベントが SendEvent 要求から生成された場合、このコードの最上位ビットが設定されます。
{{cite web}}: CS1 メンテナンス: 場所 (リンク) - ^ Jamey Sharp、Bart Massey (2002)、XCL: XCB 用の Xlib 互換レイヤー、USENIX 2002 年次技術会議、Freenix トラック
- ^ キティロゴ (xcb.freedesktop.org)
参考文献
- Massey, Bart; Sharp, Jamey ( 2001-09-19 )。「XCB: X プロトコル C バインディング」(PDF) 。XFree86 技術会議の議事録。カリフォルニア州オークランド: USENIX。2012-03-12に取得。
- Massey, Bart; Bauer, Robert (2002)。「X と Z の出会い: POSIX スレッドが存在する場合の正確性の検証」。FREENIXトラックの議事録: 2002 USENIX 年次技術会議。カリフォルニア州モントレー: USENIX。pp . 221–234。2008年 11 月 7 日に取得。
- Sharp, Jamey; Massey, Bart (2002)。「XCL: XCB の互換性レイヤー」。FREENIXトラックの議事録: 2002 USENIX 年次技術会議。カリフォルニア州モントレー: USENIX。pp . 71–83。2008年 11 月 7 日に取得。
外部リンク
- XCB ウィキ ( freedesktop.org )
- XCB API リファレンス、チュートリアル
- libxcb チュートリアル
- その他の出版物
- X 新開発者ガイド: Xlib と XCB
