几乎我找到的每个教程都告诉我为我的事件循环执行此操作:
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 应用程序的唯一方法吗?仅仅为了捕捉关闭事件似乎需要做很多工作。如何制作“正确”的事件循环?为什么近距离事件被埋得如此之深?我错过了什么?