コンテンツにスキップ

「XCB」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
TXiKiBoT (会話 | 投稿記録)
m ロボットによる 追加: es:XCB
m 211.35.139.233 (会話) による ID:93863646 の版を取り消し
タグ: 取り消し
 
(18人の利用者による、間の25版が非表示)
1行目: 1行目:
{{Infobox_Software
{{Infobox_Software
|ロゴ=[[ファイル:Xcb logo.svg|160px|XCBロゴ]]
|名称 = XCB
|名称 = XCB
|開発元 = Jamey Sharp, Josh Triplett, Bart Massey
|開発元 = Jamey Sharp, Josh Triplett, Bart Massey
|最新版 = 1.0
|最新版 = 1.13
|最新版発表日 = {{release date and age|2018|03|05}}<ref>{{cite web |url=https://lists.freedesktop.org/archives/xcb/2018-March/011091.html |title=[Xcb][ANNOUNCE] libxcb 1.13 |date=2018-03-05 |accessdate=2018-12-23}}</ref>
|最新版発表日 = [[2006年]][[11月24日]]
|対応OS = [[POSIX]]
|対応OS = [[POSIX]]
|ライセンス = [[MIT License|MIT]]
|ライセンス = [[MIT License|MIT]]
|種別 = [[X Window System コアプロトコル|Xコアプロトコル]] 開発ライブラリ
|種別 = [[X Window System コアプロトコル|Xプロトコル]] 開発ライブラリ
|公式サイト = [http://xcb.freedesktop.org xcb.freedesktop.org]
|公式サイト = {{conditionalURL}}
}}
}}


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


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


== XCB の目的 ==
== XCB の目的 ==
18行目: 19行目:


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


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


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


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


== 例 ==
== 例 ==
<syntaxhighlight lang="c">

/* ウィンドウ内に四角形を描画する単純な XCB アプリケーション */
/* ウィンドウ内に四角形を描画する単純な XCB アプリケーション */
96行目: 97行目:
return 0;
return 0;
}
}
</syntaxhighlight>

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

== プロトコルの記述 ==
XCB の作者はX11プロトコルを記述するプログラミング言語に中立であり、他のプログラミング言語とのバインディングを可能にする、専用のインターフェイス記述言語を XML で作った。libxcb 自身はコードジェネレーターと小さなC言語のユーティリティー関数からなる。

例:
<syntaxhighlight lang="xml">
<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>
</syntaxhighlight>


== 参考文献 ==
== 参考文献 ==
103行目: 122行目:
*[http://www.usenix.org/events/usenix02/tech/freenix/full_papers/sharp/sharp_html/index.html XCL: An Xlib Compatibility Layer For XCB] (Jamey Sharp and Bart Massey、[[2002年]][[4月15日]]、[[USENIX]] [[2002年]]技術会議)
*[http://www.usenix.org/events/usenix02/tech/freenix/full_papers/sharp/sharp_html/index.html XCL: An Xlib Compatibility Layer For XCB] (Jamey Sharp and Bart Massey、[[2002年]][[4月15日]]、[[USENIX]] [[2002年]]技術会議)
*[http://www.usenix.org/events/usenix02/tech/freenix/full_papers/massey/massey_html/index.html X Meets Z: Verifying Correctness In The Presence Of POSIX Threads] (Bart Massey and Robert Bauer、[[2002年]][[4月15日]]、[[USENIX]] [[2002年]]技術会議)
*[http://www.usenix.org/events/usenix02/tech/freenix/full_papers/massey/massey_html/index.html X Meets Z: Verifying Correctness In The Presence Of POSIX Threads] (Bart Massey and Robert Bauer、[[2002年]][[4月15日]]、[[USENIX]] [[2002年]]技術会議)

==脚注==
{{reflist}}


== 外部リンク ==
== 外部リンク ==
* {{official website}}
*[http://xcb.freedesktop.org/ XCB公式サイト] ([[freedesktop.org]])
* [http://xcb.freedesktop.org/XcbApi/ XCB API リファレンス] - [http://xcb.freedesktop.org/tutorial/ チュートリアル]
* [http://www.x.org/releases/current/doc/libxcb/tutorial/index.html libxcb チュートリアル]
* [http://xcb.freedesktop.org/Publications 論文等]

{{Freedesktop.org}}
{{Widget toolkits}}


[[Category:X Window System]]
[[Category:X Window System]]
[[Category:Freedesktop.org]]
[[Category:Freedesktop.org]]

{{Template:Freedesktop.org}}

[[de:XCB]]
[[en:XCB]]
[[es:XCB]]
[[fr:XCB]]

2023年2月17日 (金) 09:55時点における最新版

XCB
XCBロゴ
開発元 Jamey Sharp, Josh Triplett, Bart Massey
最新版
1.13 / 2018年3月5日 (6年前) (2018-03-05)[1]
リポジトリ ウィキデータを編集
対応OS POSIX
種別 Xプロトコル 開発ライブラリ
ライセンス MIT
公式サイト xcb.freedesktop.org ウィキデータを編集
テンプレートを表示

XCBX C Binding)は、X Window SystemC言語バインディングである。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>

参考文献

[編集]

脚注

[編集]
  1. ^ [Xcb][ANNOUNCE] libxcb 1.13” (2018年3月5日). 2018年12月23日閲覧。

外部リンク

[編集]