Xlib

Xlib
開発者X.Org財団
初回リリース1985年9月[ 1 ]
安定版リリース
1.8.12 [ 2 ] ウィキデータで編集する / 2025年3月9日 (2025年3月9日
リポジトリ
書かれたC
タイプ図書館
Webサイトwww .x .org、ドキュメント: www .x .org /releases /current /doc /libX11 /libX11 /libX11 .html
X11 クライアントは xlib を使用してディスプレイ サーバーと通信します。

Xlib ( libX11とも呼ばれる)は、Cプログラミング言語で記述されたX Window Systemプロトコルクライアントライブラリです。Xサーバーとやり取りするための関数が含まれています。これらの関数により、プログラマーはXプロトコルの詳細を知らなくてもプログラムを作成できます。

Xlib を直接使用するアプリケーションはほとんどなく、むしろ、Xlib 関数を使用してウィジェット ツールキットを提供する他のライブラリを採用しています。

Xlibは1985年9月に初めて公開され、[ 1 ]多くのUnix系オペレーティングシステムのGUIで使用されています。Xlibの再実装は2007年にXCBを使用して導入されました。[ 3 ]

データ型

KMS(カーネルモード設定)の役割、Linuxの例
Linuxグラフィックスタック
2013年8月24日現在のLinuxグラフィックスタックを示します。
スキーム: Humane-machine_interaction
XCBとXlibはディスプレイサーバ通信プロトコルを実装するクライアントライブラリである。
特定のLinuxカーネルモジュールの位置
ディスプレイサーバーはカーネルここではLinuxカーネル)とクライアントの間に位置します。ディスプレイサーバーは、指定されたプロトコルを介してクライアントと通信します。
特定のLinuxカーネルモジュールの位置
シンプルなDirectMedia LayerはXlibを回避し、フレームバッファに直接書き込むことができます。EGLへの追加ポートも利用可能です

Xlibの主なデータタイプはDisplay[ 4 ]構造体と識別子の型である。

非公式には、ディスプレイはグラフィカル操作が行われる物理デバイスまたは仮想デバイスです。XlibDisplayライブラリの構造体にはディスプレイに関する情報も含まれていますが、さらに重要なのは、クライアントとサーバー間のチャネルに相対的な情報が含まれていることです。たとえば、Unix 系のオペレーティング システムでは、構造体にはこのチャネルのソケットDisplayのファイル ハンドルが含まれています(これは、マクロを使用して取得できます)。ほとんどの Xlib 関数は、チャネルを操作するか、特定のチャネルに関連しているために、引数として構造体を持ちます。特に、サーバーと対話するすべての Xlib 関数は、チャネルにアクセスするためにこの構造体を必要とします。他の一部の関数は、ローカルで操作する場合でも、特定のチャネルに関連するデータを操作するため、この構造体を必要とします。この種の操作には、たとえば、以下で説明するイベント キューの操作が含まれます。 ConnectionNumberDisplay

ウィンドウやカラーマップなどはサーバーによって管理されます。つまり、それらの実際の実装に関するデータはすべてサーバーに保存されます。クライアントはこれらのオブジェクトを、それぞれの識別子を用いて操作します。クライアントはオブジェクトを直接操作することはできず、オブジェクトの識別子を指定してサーバーに操作の実行を要求することしかできません。

Windows、、、、などの型はすべて識別子であり、X11プロトコル自体と同様に32ビット整数です。クライアントはPixmap、サーバーにウィンドウの作成を要求することでウィンドウを「作成」します。これはFontColormapウィンドウの識別子(つまり数値)を返すXlib関数の呼び出しによって行われます。クライアントはこの識別子を使用して、同じウィンドウに対する他の操作をサーバーに要求できます。

識別子はサーバー固有のものです。ほとんどの識別子は、異なるアプリケーションから同じオブジェクトを参照するために使用できます。例えば、同じサーバーに接続する2つのアプリケーションは、同じ識別子を使用して同じウィンドウを参照します。これらの2つのアプリケーションは異なるチャネルを使用しているため、それぞれ異なるDisplay構造体を持ちます。しかし、同じ識別子に対して操作を要求すると、それらの操作は同じオブジェクトに対して実行されます。

プロトコルとイベント

サーバーにリクエストを送信する Xlib 関数は、通常、これらのリクエストをすぐに送信せず、リクエスト バッファと呼ばれるバッファに格納します。この場合の「リクエスト」という用語は、サーバーに送信されるクライアントからのリクエストを指します。リクエスト バッファには、画面に視覚的な効果をもたらすリクエストだけでなく、サーバーへのあらゆる種類のリクエストを含めることができます。リクエスト バッファは、関数またはの呼び出し後、サーバーから値を返す関数の呼び出し後 (これらの関数は応答を受信するまでブロックします)、およびその他の状況で、必ずフラッシュされます (つまり、それまでに行われたすべてのリクエストがサーバーに送信さXSyncXFlushます)。

Xlibは受信したイベントをキューに保存します。クライアントアプリケーションはキューからイベントを検査し、取得することができます。Xサーバーはイベントを非同期に送信しますが、Xlibライブラリを使用するアプリケーションは、キュー内のイベントにアクセスするためにXlib関数を明示的に呼び出す必要があります。これらの関数の中にはブロックするものもあります。ブロックされた場合、リクエストバッファもフラッシュされます。

代わりに、エラーは非同期的に受信され、処理されます。アプリケーションは、サーバーからエラー メッセージを受信するたびに呼び出されるエラー ハンドラーを提供できます。

ウィンドウ全体またはその一部が非表示になった場合、ウィンドウの内容が保持される保証はありません。この場合、Exposeウィンドウ全体またはその一部が再び表示された際に、アプリケーションにイベントが送信されます。アプリケーションは、ウィンドウの内容を再度描画する必要があります。

機能

Xlib ライブラリ内の関数は、次のようにグループ化できます。

  1. 接続に対する操作 ( XOpenDisplayXCloseDisplay、 ... )。
  2. XCreateWindow操作要求( 、、XCreateGC...)や情報要求( 、...)などのサーバーへの要求XGetWindowProperty
  3. クライアントに対してローカルな操作: イベント キューに対する操作 ( 、、XNextEvent... XPeekEvent) およびローカル データに対するその他の操作( XLookupKeysym、、、、、、XParseGeometry... )XSetRegionXCreateImageXSaveContext

ウィンドウにボックスとテキストを描画するシンプルなXlibアプリケーション。ウィンドウマネージャーのデコレーションは不要です。
ウィンドウにボックスとテキストを描画するシンプルなXlibアプリケーション。IceWMウィンドウマネージャーのデコレーション付き。

次のプログラムは、小さな黒い四角形が入ったウィンドウを作成します。

/* ウィンドウを作成し、その中にボックスを描画するシンプルな Xlib アプリケーション。gcc  input.c -o output -lX11 */ #include <X11/Xlib.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main ( void ) { Display * display ; Window window ; XEvent event ; char * msg = "Hello, World!" ; int s ; // サーバーへの接続を開くdisplay = XOpenDisplay ( NULL ); if ( display == NULL ) { fprintf ( stderr , "Cannot open display \n " ); exit ( 1 ); } s = DefaultScreen ( display ); // ウィンドウを作成します。window = XCreateSimpleWindow ( display , RootWindow ( display , s ), 10 , 10 , 200 , 200 , 1 , BlackPixel ( display , s ), WhitePixel ( display , s )); // 関心のあるイベントの種類を選択します。XSelectInput ( display , window , ExposureMask | KeyPressMask ); // ウィンドウをマップ (表示) します。XMapWindow ( display , window ); // イベント ループfor (;;) { XNextEvent ( display , & event ); // ウィンドウを描画または再描画します。if ( event . type == Expose ) { XFillRectangle ( display , window , DefaultGC ( display , s ), 20 , 20 , 10 , 10 );XDrawString ( display , window , DefaultGC ( display , s ), 50 , 50 , msg , strlen ( msg )); } // キーが押されたら終了if ( event . type == KeyPress ) break ; } // サーバーへの接続を閉じるXCloseDisplay ( display ); return 0 ; }

クライアントは を呼び出してサーバーとの接続を確立しますXOpenDisplay。次に、 でウィンドウの作成を要求します。ウィンドウをマッピング、つまり画面上に表示するには、 XCreateSimpleWindowを別途呼び出す必要があります。XMapWindow

正方形は を呼び出すことで描画されますXFillRectangle。この操作はウィンドウの作成後にのみ実行できます。しかし、一度実行しただけでは十分ではない場合があります。実際、ウィンドウの内容が必ずしも保持されるとは限りません。例えば、ウィンドウが覆われてから再び覆われなくなった場合、その内容を再描画する必要があるかもしれません。プログラムは、イベントを受信することで、ウィンドウ全体またはその一部を描画する必要があることを通知されますExpose

したがって、ウィンドウコンテンツの描画は、イベントを処理するループ内で行われます。このループに入る前に、アプリケーションが関心を持つイベントが選択されます。この場合は、 によって選択されます。イベントループはイベントの受信を待機します。イベントがキー押下の場合、アプリケーションは終了します。イベントがエクスポーズイベントの場合、ウィンドウコンテンツが描画されます。キューにイベントがない場合、 XSelectInput関数はブロックし、リクエストバッファをフラッシュします。XNextEvent

その他の図書館

Xlibはボタン、メニュー、スクロールバーなどのウィジェットをサポートしていません。これらのウィジェットは、Xlibを使用する他のライブラリによって提供されます。このようなライブラリには2種類あります。

これらのウィジェット ライブラリを使用するアプリケーションは通常、メイン ループに入る前にウィンドウのコンテンツを指定するため、Exposeイベントを明示的に処理してウィンドウのコンテンツを再描画する必要はありません。

XCBライブラリはXlibの代替ライブラリです。その主な目的は、ライブラリサイズの縮小とX11プロトコルへの直接アクセスの2です。XCBを低レベルレイヤーとして使用するようにXlibを改変したものも開発されています。

参考文献

  1. ^ a b Scheifler, Robert W.; Gettys, James; Newman, Ron (1988). X Window System (PDF) . Digital Press. p. xxvi.
  2. ^ Alan Coopersmith (2025年3月9日). https://lists.x.org/archives/xorg-announce/2025-March/003587.html . 2025年3月10日閲覧{{cite web}}:欠落または空|title=(ヘルプ)
  3. ^ 「XDC2007 ノート」 2007年2月9日。
  4. ^ 「freedesktop CVSのディスプレイ構造」ヒント検索:typedef struct _XDisplay Display2008年1月31日時点のオリジナルからアーカイブ。 2007年8月24日閲覧