Xlibは、
X Window Systemのクライアント側で動作する
ライブラリであり、
C言語で記述されています。この
ライブラリは、Xサーバとの通信を行うための
サブルーチン群を提供し、開発者はXプロトコルの複雑な詳細を意識することなく、グラフィカルなアプリケーションを開発できます。
Xlibの役割と構造
Xlibは、直接アプリケーションから利用されることは少なく、通常はウィジェットツールキットと呼ばれる、より高レベルな
ライブラリを介して利用されます。これらのツールキットは、ボタンやメニュー、スクロールバーといったGUIコンポーネントを提供し、開発者はXlibを直接操作することなく、アプリケーションのUIを構築できます。主なウィジェットツールキットには、Intrinsics (Xt), Athena widget set (Xaw), Motif, GTK,
Qt(X11 版), Tkなどが挙げられます。
Xlibの主要なデータ型として、`Display`構造体と各種識別子型があります。`Display`構造体は、グラフィカルな操作が行われるディスプレイに関する情報を保持し、特にクライアントとサーバ間の通信チャンネルに関する重要な情報を含みます。例えば、
Unix系OSでは、この構造体内にソケットのファイルハンドルが含まれており、`ConnectionNumber`マクロで取り出すことができます。Xlibの関数の多くは`Display`構造体を引数として受け取り、これは、これらの関数が特定のチャンネルを操作したり、そのチャンネルに関する情報を必要とするためです。特にサーバと直接通信を行う関数は、この構造体を介してチャンネルにアクセスします。
ウィンドウ、カラーマップといったオブジェクトはサーバ側で管理され、クライアントはこれらのオブジェクトを直接操作することはできません。代わりに、クライアントはオブジェクトの識別子(整数値)を使い、サーバに操作を要求します。例えば、ウィンドウを生成する際には、サーバに生成を要求し、返された識別子を使ってそのウィンドウに対する操作を行うことができます。これらの識別子はサーバ内で一意であり、異なるアプリケーションであっても同じ識別子で同じオブジェクトを参照できます。ただし、各アプリケーションは異なる`Display`構造体を持つため、それぞれが持つチャンネルは異なります。
Xlibの通信モデル
Xlibは、サーバへの要求を即座に送信するのではなく、一旦出力
バッファに格納します。この
バッファは、画面表示に関する要求だけでなく、あらゆる種類の要求を格納できます。
バッファの内容は、`XSync`や`XFlush`関数が呼び出されたとき、あるいはサーバからの応答を待つ関数が呼び出されたときにサーバに送信されます。これにより、効率的な通信が可能になります。
イベントは非同期にサーバから送られ、Xlibはこれらをキューに格納します。クライアントアプリケーションは、このキューからイベントを取り出すことで、ユーザーの操作やウィンドウの状態変化を検出します。イベントを取り出すには、明示的にXlib関数を呼び出す必要があり、その際、出力
バッファがフラッシュされることがあります。
エラーも非同期に扱われ、アプリケーションはエラーが発生した際にサーバからエラーメッセージを受け取るためのエラーハンドラを登録できます。ウィンドウの一部が見えない状態になった場合、その部分の描画内容は保持されない可能性があり、再び表示される際にはExposeイベントがアプリケーションに送られます。アプリケーションはこのイベントを受け、ウィンドウの内容を再描画する必要があります。
Xlibの関数分類
Xlibの関数は、大きく以下のカテゴリに分類できます。
- - コネクションに関する操作: `XOpenDisplay`, `XCloseDisplay`など、サーバとの接続を確立および切断するための関数。
- - サーバへの要求: `XCreateWindow`, `XCreateGC`といった、サーバに操作を要求する関数と、`XGetWindowProperty`といった、サーバから情報を取得する関数。
- - クライアント側での操作: イベントキュー操作を行う`XNextEvent`, `XPeekEvent`などの関数や、ローカルなデータを操作する`XLookupKeysym`, `XParseGeometry`, `XSetRegion`, `XCreateImage`, `XSaveContext`などの関数。
具体例
以下は、ウィンドウを表示し、その中に小さな黒い四角形を描画する簡単な例です。
1. `XOpenDisplay`関数を呼び出し、サーバとの接続を確立します。
2. `XCreateSimpleWindow`関数でウィンドウの生成をサーバに要求します。
3. `XMapWindow`関数を呼び出して、ウィンドウを画面に表示します。
4. `XFillRectangle`関数を呼び出し、四角形を描画します。
この例では、ウィンドウの再描画はExposeイベントが発生した際に行われます。イベントループ内で、アプリケーションは`XNextEvent`を呼び出し、イベントを待ち受けます。キー押下イベントを受け取ると終了し、Exposeイベントを受け取るとウィンドウの再描画を行います。この例では、`XSelectInput`関数でイベントの種類を選択しています。
Xlib自体は、ボタンやメニュー、スクロールバーといった具体的なウィジェットを提供しません。これらのウィジェットは、Xlibを基盤とする他の
ライブラリが提供します。
- - Intrinsics (Xt)ベースのライブラリ: Xtはウィジェットをサポートするためのライブラリですが、具体的なウィジェットは提供しません。ウィジェットは、Xtを基盤とするXawやMotifといったライブラリが提供します。
- - Xlibを直接利用するライブラリ: GTK, Qt(X11版), FLTK(X11版)のように、Xtを使用せずにXlibを直接利用してウィジェットを提供するライブラリも存在します。
これらのウィジェット
ライブラリを使用すると、アプリケーションはウィンドウの中身を事前に指定し、Exposeイベントによる再描画も自動的に行われます。
Xlibの代替として、
XCBという
ライブラリも存在します。
XCBは、X11プロトコルへのより直接的なアクセスを提供し、
ライブラリをより小さくすることを目的としています。Xlibのインターフェースを
XCB上に実装する試みも存在します。
Xlibは、
X Window Systemにおけるグラフィカルアプリケーション開発の基礎となる重要な
ライブラリです。
XCBのような新しい
ライブラリが登場しているものの、Xlibは依然として多くのアプリケーションで使用されています。