私が見つけたほとんどすべてのチュートリアルは、イベントループに対してこれを行うように指示しています:
XEvent event;
while (true)
{
XNextEvent(display, &event);
switch (event.type)
{
case Expose:
printf("Expose\n");
break;
default:
break;
}
}
ただし、X をクリックしてプログラムを閉じると、このメッセージが表示されます。
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 10 requests (10 known processed) with 0 events remaining.
例が無限ループの使用を示唆していることは、私にとって本当に奇妙です。それは不自然に聞こえますが、私の他の X11 プログラムではそれができません。というわけでいろいろ探しました。ウィンドウを閉じるイベントをキャプチャする方法を見つけました。
Atom wmDeleteMessage = XInternAtom(mDisplay, "WM_DELETE_WINDOW", False);
XSetWMProtocols(display, window, &wmDeleteMessage, 1);
XEvent event;
bool running = true;
while (running)
{
XNextEvent(display, &event);
switch (event.type)
{
case Expose:
printf("Expose\n");
break;
case ClientMessage:
if (event.xclient.data.l[0] == wmDeleteMessage)
running = false;
break;
default:
break;
}
}
それはうまくいきます。エラーなしで終了します。...しかし、これが通常のやり方だとは信じられません。つまり、これが X11 アプリを適切に終了する唯一の方法ですか? クローズイベントをキャプチャするだけでも大変な作業のようです。「適切な」イベントループを作成するにはどうすればよいですか? クローズイベントが深く埋もれているのはなぜですか?私は何が欠けていますか?