【发布时间】:2012-06-03 06:37:29
【问题描述】:
我找到的几乎每个教程都告诉我为我的事件循环执行此操作:
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 应用程序的唯一方法吗?仅仅为了捕捉关闭事件似乎需要做很多工作。如何制作“正确”的事件循环?为什么近距离事件被埋得如此之深?我错过了什么?
【问题讨论】:
-
如果您认为这是“大量工作”,请等到您尝试在 X 中做任何有用的事情... :-)
-
嗯,我强调的并不是“工作”。我想它更公正:为什么那个特定的功能如此模糊?如何授予退出按钮“默认行为”?
-
整个 X11 库是默默无闻之上的,多层次的深度。就像有人拿了但丁的地狱并将其重写为 C API。我想,当它完成后,它的易用性仍然胜过它的前辈。
-
不得不评论但丁的地狱笑话。我第一次在同一个句子中阅读该参考资料和 C API