ウインドウを開く

とりあえず開いてみます.ただ開いて,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はウインドウの背景色を指定します.

ここで使われているBlackPixelWhitePixelもマクロで,黒と白だけは簡単に取得でき ます.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によってサーバとの接続が切断 されます.明示的に指定しなくても,プ ログラムの終了時に自動的に切断されます.

Back to TOP