とりあえず開いてみます.ただ開いて,10秒後に消えます.メインループはあり ません.
0001: /* 0002: openwin-x.c 0003: gcc openwin-x.c -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 0004: */ 0005: 0006: #include <X11/Xlib.h> 0007: 0008: int main( int argc, char *argv[] ) 0009: { 0010: Display *dpy; 0011: int screen; 0012: Window win; 0013: 0014: dpy = XOpenDisplay( NULL ); /* Xサーバに接続する */ 0015: 0016: screen = DefaultScreen( dpy ); /* スクリーン設定 */ 0017: 0018: win = XCreateSimpleWindow( /* ウィンドウを開く */ 0019: dpy, /* Xサーバ */ 0020: RootWindow(dpy,screen), /* 親ウィンドウ */ 0021: 0, 0, /* 表示時の左上隅の座標 x, y */ 0022: 256, 256, /* ウィンドウの幅と高さ */ 0023: 1, BlackPixel(dpy,screen),/* ボーダーの幅と色 */ 0024: WhitePixel(dpy,screen) /* ウィンドウの背景色 */ 0025: ); 0026: 0027: XMapWindow( dpy, win ); /* ウィンドウのマッピング */ 0028: 0029: XFlush( dpy ); /* バッファのフラッシュ */ 0030: 0031: sleep( 10 ); /* 10秒間表示を保持 */ 0032: 0033: XDestroyWindow( dpy, win ); /* ウインドウの開放 */ 0034: 0035: XCloseDisplay( dpy ); /* Xサーバを切断する */ 0036: 0037: return 0; 0038: }
順に見て行きましょう.
まずはコンパイルについてです.3行目を見て下さい.
0003: gcc openwin-x.c -I/usr/X11R6/include -L/usr/X11R6/lib -lX11
Linux を始めとして,最近のディストリビューションでは大体決まって /usr/X11R6/以下にヘッダとライブラリが入るよ うです.違う場合はそこを参照するようにして下さい.そして,X lib を使う時 には-lX11を指定します.
コンパイラオプションの意味やMakefile については必要がない限り特に説明し ません.意味が分からない場合は調べましょう.何事も調べていくうちに身につ きます.
0014: dpy = XOpenDisplay( NULL ); /* Xサーバに接続する */
14行目.Xはサーバ・クライアントシステムですので,表示する先のサーバとの 接続を確立する必要があります.全てのXプログラムは,まず初めにこの作業が 必要です.
Display *XOpenDisplay(display_name) char *display_name;
XOpenDisplayは,サーバ名display_nameを引数として受け取り,Displayへのポインタを返します.サーバとの接続に失敗 した場合はNULLが返されます.この例のようにサー バ名としてNULLを指定した場合は環境変数DISPLAYの値を参照します.
0016: screen = DefaultScreen( dpy ); /* スクリーン設定 */
次はスクリーンの指定です.DisplayはIPアドレス に対応するサーバマシンを決定するためのものですが,Xサーバは複数のスク リーン(画面)を持つことができます.まあ,普通はひとつのスクリーンしか持っ ていません.
int DefaultScreen(display_name) char *display_name;
通常,標準のスクリーン番号は0なわけですが,このマクロを使うことによって そうでない環境でも正しい標準スクリーンを取得することができます.
さて,次がウインドウを開く関数です.
0018: win = XCreateSimpleWindow( /* ウィンドウを開く */ 0019: dpy, /* Xサーバ */ 0020: RootWindow(dpy,screen), /* 親ウィンドウ */ 0021: 0, 0, /* 表示時の左上隅の座標 x, y */ 0022: 256, 256, /* ウィンドウの幅と高さ */ 0023: 1, BlackPixel(dpy,screen),/* ボーダーの幅と色 */ 0024: WhitePixel(dpy,screen) /* ウィンドウの背景色 */ 0025: );
Window XCreateSimpleWindow(display, parent, x, y, width, height, border_width, border, background) Display *display; Window parent; int x, y; unsigned int width, height; unsigned int border_width; unsigned long border; unsigned long background;
XCreateSimpleWindowはウインドウのインスタ ンスを生成し,ウインドウを識別するためのIDを返します.ウインドウを開くた めの関数は他にXCreateWindowがあります. 違いは,XCreateSimpleWindowは親ウイ ンドウのプロパティをそのまま受け継ぐという点です. XCreateWindowでウインドウを開くについては別記し ます.
displayはウインドウを表示するサーバです. parentは親ウインドウを指定します.ウインドウ はルートウインドウを根とするツリー構造をしています.全てのウインドウの祖 先はルートウインドウになります.ここではルートウインドウの子ウインドウと して作成するので,ルートウインドウのIDを取得するためのマクロRootWindowを使用しています. x, yはウインドウを表示する際の左上隅の座標で す.しかし,通常はウインドウマネージャが介入するために,ここで指定したと おりの位置に表示されないことが多いです.width, heightはウインドウのサイズです.border_widthはウインドウの境界の幅,borderは境界の色,backgroundはウインドウの背景色を指定します.
ここで使われているBlackPixelとWhitePixelもマクロで,黒と白だけは簡単に取得でき ます.Xでのカラーは「ピクセル値」という番号で指定します.たまにここで 「黒は0」,「白は1」と決めかかって数値を指定している場合がありますが,逆 の場合,あるいはそれ以外の場合もあるので,白と黒の指定はこのマクロを使う ようにします.
0027: XMapWindow( dpy, win ); /* ウィンドウのマッピング */
int XMapWindow(display, win) Display *display; Window win;
XCreateSimpleWindowを呼んだ時点では,ウイ ンドウのインスタンスがメモリ上にできただけで,まだ画面上には現れていませ ん.XMapWindowを呼んで,始めて画面上に表示 できるようになります.
0029: XFlush( dpy ); /* バッファのフラッシュ */
int XFlush(display) Display *display;
Xのリクエストは一旦バッファI貯められてから送信されます.このバッファを強 制的に押し出すのがXFlushです.これで画面に 表示されます.
0033: XDestroyWindow( dpy, win ); /* ウインドウの開放 */
int XDestroyWindow(display, w) Display *display; Windoww;
XDestroyWindowが呼ばれるまでは,サーバ上に インスタンスが残っています.明示的に呼ばなくても,プログラムが終了すると インスタンスは開放されます.
0035: XCloseDisplay( dpy ); /* Xサーバを切断する */
int XCloseDisplay(display) Display *display;
XCloseDisplayによってサーバとの接続が切断 されます.明示的に指定しなくても,プ ログラムの終了時に自動的に切断されます.