我找到的几乎每一个教程都告诉我要在事件循环中这样做:
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应用程序的唯一方法吗?似乎要做很多工作才能捕捉到最后的事件.如何创建"正确的"事件循环?为什么这个亲密的事件会被如此深的掩埋?我错过了什么?