X Window Systemプログラミングを勉強してみた〜ウィンドウを表示する〜
X Window Systemプログラミングを勉強したので備忘録も兼ねて勉強したことをまとめておこうと思います。
ウィンドウを表示するには
大まかに以下の4ステップでウィンドウを表示できる。
- Xサーバーに接続する
- ウィンドウを生成する
- ウィンドウをマップする
- 出力バッファをフラッシュする
Xサーバーに接続する
XOpenDisplay関数を使うことでXサーバーに接続できる。 接続を切るにはXCloseDisplayを使う。
ウィンドウを生成する
XCreateSimpleWindowを使うことでウィンドウ生成できる。XCreateWindowを使うとクラスやヴィジュアルを指定してウィンドウ生成できる。
ウィンドウをマップする
XMapWindowでマップできる。 マップをすることでウィンドウが有効化される。ただし、より上位のウィンドウがマップされていない場合はマップしても表示されない。
出力バッファをフラッシュする
XFlush,XSyncでフラッシュできる。 XNextEvent,XWindowEvent,XPendingでも自動的にフラッシュされる。 出力バッファをフラッシュすることでサーバーにリクエストが届き、処理されることでウィンドウが表示される。
サンプルコード
ウィンドウを5秒間表示して閉じる
#include<X11/Xlib.h> //XWindowSystemを扱うための関数群
#include<unistd.h>
int main(){
Display* d; //Xサーバーへの接続を表す
Window wr; //ウィンドウを表す
unsigned long black,white;
d=XOpenDisplay(NULL); //Xサーバーとの通信確立
black=BlackPixel(d,DefaultScreen(d)); //色の取得
white=WhitePixel(d,DefaultScreen(d));
wr=XCreateSimpleWindow(d,RootWindow(d,DefaultScreen(d)),100,50,800,530,1,black,white); //ウィンドウの生成
XMapWindow(d,wr); //ウィンドウのマップ
XFlush(d); //Xサーバーにイベントを送信する
sleep(5);
XCloseDisplay(d); //Xサーバーとの通信を切る
return(0);
}
関数リスト
XOpenDisplay
Xサーバーに接続する。返り値はXサーバーとの通信を表す。この値は頻繁に使う。
Display* XOpenDisplay(display_name);
-
char* display_name;
- Xサーバーへの接続を指定する。NULLを指定すると環境変数DISPLAYの値が使われる。
XCloseDisplay
Xサーバーとの接続を切る。
Display* XCloseDisplay(display);
-
Display* display;
- XOpenDisplayの返り値を指定する。
XCreateSimpleWindow
ウィンドウを生成する。返り値は生成したウィンドウを表す。
Window XCreateSimpleWindow(display,parent,x,y,width,height,border_width,border,background);
-
Display* display;
- XOpenDisplayの返り値を指定する
Window parent;
- 親ウィンドウを入れる。トップレベルウィンドウを作る場合はルートウィンドウを指定する。ルートウィンドウはRootWindowで取得できる。
int x,y;
- ウィンドウの位置を指定する
unsigned int width,height
- ウィンドウの横幅と高さを指定する
unsigned int border_width
- ウィンドウ境界の幅を指定する
unsigned long border;
- ウィンドウの境界の色を指定する
unsigned long background;
- ウィンドウの背景の色を指定する
- ※色はサンプルコード中のBlackPixelとWhitePixelで取得してる
XMapWindow
ウィンドウをマップする。
XMapWindow(display,w);
-
Display* display;
XOpenDisplayの返り値を指定する
Window w;
マップするウィンドウを指定する
XFlush
出力バッファをフラッシュする
XFlush(display);
-
Display* display;
- XOpenDisplayの返り値を指定する
RootWindow
ルートウィンドウを返す
RootWindow(display,screen_number);
-
Display* display;
- XOpenDisplayの返り値を指定する
int screen_number;
- スクリーン番号を指定。デフォルト値はDefaultScreenで取得できる
DefaultScreen
デフォルトのスクリーン番号を返す
DefaultScreen(display);
-
Display* display;
- XOpenDisplayの返り値を指定する
BlackPixel WhitePixel
黒、白の色を返す。
BlackPixel(display,screen_number);
-
Display* display;
- XOpenDisplayの返り値を指定する
int screen_number
- スクリーン番号を指定。デフォルト値はDefaultScreenで取得できる
- ※WhitePixelも同様