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も同様