X Window Programming

Index Prev. Step Next Step

Step3:ウィンドウの基本操作


1. ウィンドウの生成

全てのウィンドウはルートウィンドウをトップとする階層(ツリー)構造を構成します。ルート以外の各ウィンドウはただ1つの親ウィンドウを持ちます。
親ウィンドウは子のウィンドウをクリップします。兄弟どうしはスタックオーダにより上下関係が決まります。
各ウィンドウは Window 型の ID によって識別されます。

アプリケーション(クライアント)は普通、ルートの子としてウィンドウを生成するため、ルートウィンドウの ID が必要になります。

Window DefaultRootWindow (Display *display)
Window RootWindow (Display *display, int screen_number)
これらはマクロで、上はデフォルトスクリーンに対して使用します。

色の指定はピクセル値(実際の色ではなく、パレットのようなもの)で指定します。詳しくはあとのほうで述べるので、ここでは黒と白のピクセル値を入手するマクロを示します。

unsigned long BlackPixel (Display *display, int screen_number)
unsigned long WhitePixel (Display *display, int screen_number)
ウィンドウは生成してもマップしない限りスクリーンには表示されません。
Window XCreateSimpleWindow (display, parent, x, y, width, height,
                            border_width, border, background)

Display *display
Window parent
int x, y
unsigned int width, height, border_width
unsigned long border, background
x, y はウィンドウを生成する、親ウィンドウの枠の内側での位置を表します。
border, background は枠とウィンドウ本体の色を指定するピクセル値を表します。

2. ウィンドウの可視/不可視制御

あるウィンドウが画面に表示されるためには、そのウィンドウおよび先祖ウィンドウが全てマップされていることが条件になります。マップ、アンマップは以下の関数で行ないます。
XMapWindow (display, window)
XMapSubwindows (display, parent)
XMapRaised (display, window)
XMapSubWindowsparent の子ウィンドウ(子孫ではない)を全てマップします。
XUnmapWindow (display, window)
XUnmapSubwindows (display, parent)
また、ウィンドウを消滅させることもできます。
XDestroyWindow (display, window)
XDestroySubwindows (display, parent)
これらは指定されたウィンドウの子孫もすべて消滅させます。
クライアントからのリクエストを掃き出す (flush) には以下の関数を使用します。
XFlush (display)

3. ウィンドウの生成、表示

では実際にウィンドウを作成して表示するプログラムを作ってみます(0302.c)。
/* 0302.c ; make windows and map them */

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>

void
main()
{
  Display *d;
  Window w0, w1, w2, w3;
  unsigned long black, white;

  d = XOpenDisplay(NULL);

  black = BlackPixel(d, 0);
  white = WhitePixel(d, 0);

  w0 = XCreateSimpleWindow(d, RootWindow(d,0), 100, 100,
			   600, 400, 2, black, white);
  w1 = XCreateSimpleWindow(d, w0,               50,  50,
			   200, 150, 2, black, white);
  w1 = XCreateSimpleWindow(d, w0,              200, 100,
			   200, 150, 2, black, white);
  w2 = XCreateSimpleWindow(d, w0,              350, 200,
			   200, 150, 2, black, white);

  getchar();

  XMapWindow(d, w0);
  XMapSubwindows(d, w0);
  XFlush(d);

  getchar();
  XCloseDisplay(d);
}
実行結果は以下のようになります。ウィンドウマネージャの枠が邪魔ですが我慢して下さい。


Index Prev. Step Next Step
Technical Resource Title Page
Shin SAITO: shin@yl.is.s.u-tokyo.ac.jp