- 締切済み
Xlibでウィンドウを作る
https://ja.wikipedia.org/wiki/Xlibに載っているプログラムで質問です。 ただウィンドウを表示させたい場合に /*イベントループ*/ の部分は必要なのでしょうか? この部分をなくすとウィンドウが表示されません。 イベントループがなくてもウィンドウを表示させることはできますか? /* ウィンドウに四角形を描画する簡単な Xlib アプリケーション */ #include <X11/Xlib.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { Display *d; int s; Window w; XEvent e; /* サーバとのコネクションを開く */ d=XOpenDisplay(NULL); if(d==NULL) { printf("Cannot open display\n"); exit(1); } s=DefaultScreen(d); /* ウィンドウ生成 */ w=XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1, BlackPixel(d, s), WhitePixel(d, s)); /* 受け付けるイベントの種類を選択 */ XSelectInput(d, w, ExposureMask | KeyPressMask); /* ウィンドウを可視化 */ XMapWindow(d, w); /* イベントループ */ while(1) { XNextEvent(d, &e); /* ウィンドウの描画と再描画 */ if(e.type==Expose) { XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10); XDrawString(d, w, DefaultGC(d, s), 50, 50, "Hello, World!",strlen("Hello, World!")); } /* キー押下で終了 */ if(e.type==KeyPress) break; } /* サーバとのコネクションを閉じる */ XCloseDisplay(d); return 0; }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- tkf-
- ベストアンサー率58% (821/1398)
> ウィンドウを表示するには、XNextEventというのを書かないといけないということでしょうか? いくつものイベントが順次発生し、キューにたまります。それらをキューから取り出してやるのが、XNextEvent()です。
- tkf-
- ベストアンサー率58% (821/1398)
XWindowはイベント駆動型のウィンドウシステムです。 解説にある通り、Exposeイベントを受け取って、ウインドウを描画してあげなければいけません。 なぜループになっているかというと、ウィンドウ描画にはいくつものイベントが発行されます。そのうちのExposeイベントを見つけて、しょりをしないといけないからです。
お礼
XMapWindow(d, w); のあとに XFlush(d); でウィンドウを表示することが出来ました。
補足
/* イベントループ */ while(1) { /* XNextEvent(d, &e); */ } だとウィンドウは表示されませんが、 while(1) { XNextEvent(d, &e); } だとウィンドウは表示されます。 ウィンドウを表示するには、XNextEventというのを書かないといけないということでしょうか?