
Xlib ( libX11とも呼ばれる)は、C言語で記述されたX Window Systemプロトコルのクライアントライブラリです。Xサーバーとやり取りするための関数が含まれています。これらの関数を使用することで、プログラマはXプロトコルの詳細を知らなくてもプログラムを作成できます。
Xlibを直接使用するアプリケーションは少なく、むしろXlibの関数を利用してウィジェットツールキットを提供する他のライブラリを利用しています。
1985年9月に初めて一般公開されたXlib [ 1 ]は、多くのUnix系オペレーティングシステムのGUIで使用されています。2007年にはXCBを使用してXlibの再実装が導入されました[ 3 ]。
Xlib の主なデータタイプはDisplay[ 4 ]構造体と識別子の型です。
非公式には、ディスプレイとは、グラフィック操作が行われる物理的または仮想的なデバイスのことです。XlibDisplayライブラリの構造にはディスプレイに関する情報が含まれていますが、より重要なのは、クライアントとサーバー間のチャネルに関する情報が含まれていることです。たとえば、Unixライクなオペレーティングシステムでは、この構造体にはこのチャネルのソケットDisplayのファイルハンドルが含まれています(これはマクロを使用して取得できます)。ほとんどのXlib関数は、チャネルを操作するか、特定のチャネルに関連するため、引数として構造体を持ちます。特に、サーバーとやり取りするすべてのXlib関数は、チャネルにアクセスするためにこの構造体を必要とします。ローカルで操作する場合でも、特定のチャネルに関連するデータを操作するため、この構造体を必要とする関数もあります。このような操作には、たとえば、後述するイベントキューに対する操作が含まれます。ConnectionNumberDisplay
ウィンドウやカラーマップなどはサーバーによって管理されるため、それらの実際の実装に関するデータはすべてサーバーに保存されます。クライアントはこれらのオブジェクトを識別子を使用して操作します。クライアントはオブジェクトを直接操作することはできず、オブジェクトの識別子を指定してサーバーに操作の実行を要求することしかできません。
型Windows、Pixmap、Font、Colormapなどはすべて識別子であり、32ビット整数です(X11プロトコル自体と同様)。クライアントは、サーバーにウィンドウの作成を要求することでウィンドウを「作成」します。これは、ウィンドウの識別子(つまり数値)を返すXlib関数を呼び出すことによって行われます。この識別子は、クライアントが同じウィンドウに対してサーバーに他の操作を要求する際に使用できます。
識別子はサーバー固有のものです。ほとんどの場合、異なるアプリケーションが同じオブジェクトを参照するために使用できます。たとえば、同じサーバーに接続する2つのアプリケーションは、同じ識別子を使用して同じウィンドウを参照します。これらの2つのアプリケーションは異なるチャネルを使用するため、表示構造も異なりますが、同じ識別子に対して操作を要求すると、同じオブジェクトに対して操作が実行されます。
サーバーにリクエストを送信する Xlib 関数は、通常、これらのリクエストをすぐに送信するのではなく、リクエスト バッファと呼ばれるバッファに格納します。この場合の「リクエスト」という用語は、クライアントからサーバーに送信されるリクエストを指します。リクエスト バッファには、画面に視覚的な影響を与えるリクエストだけでなく、サーバーへのあらゆる種類のリクエストを含めることができます。リクエスト バッファは、関数XSyncまたは関数の呼び出し後XFlush、サーバーから値を返す関数の呼び出し後 (これらの関数は応答が受信されるまでブロックします)、およびその他のいくつかの条件でフラッシュ (つまり、これまでに行われたすべてのリクエストがサーバーに送信される) されることが保証されています。
Xlibは受信したイベントをキューに格納します。クライアントアプリケーションはキューからイベントを検査および取得できます。Xサーバーはイベントを非同期で送信しますが、Xlibライブラリを使用するアプリケーションは、キュー内のイベントにアクセスするためにXlib関数を明示的に呼び出す必要があります。これらの関数の中にはブロックするものがあり、その場合はリクエストバッファもフラッシュされます。
エラーは非同期的に受信および処理されます。アプリケーションは、サーバーからエラーメッセージを受信するたびに呼び出されるエラーハンドラを提供できます。
ウィンドウまたはその一部が非表示になった場合、ウィンドウの内容が保持される保証はありません。この場合、Exposeウィンドウまたはその一部が再び表示されたときに、アプリケーションにイベントが送信されます。アプリケーションは、その後、ウィンドウの内容を再描画する必要があります。
Xlibライブラリの関数は、以下のように分類できます。
XOpenDisplay、、XCloseDisplay…)XCreateWindow、、XCreateGC…)および情報リクエスト(XGetWindowProperty、…)を含む)XNextEvent)XPeekEventおよびローカルデータに対するその他の操作(、、、、、XLookupKeysym… )XParseGeometryXSetRegionXCreateImageXSaveContext

以下のプログラムは、小さな黒い四角形が表示されたウィンドウを作成します。
/* ウィンドウを作成してその中にボックスを描画するシンプルな 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プロトコルへの直接アクセスです。XCBを低レベルレイヤーとして使用するために、Xlibの改良版が作成されました。