我发现几乎每个教程都告诉我针对事件循环执行此操作:
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应用程序的唯一方法吗?捕获结束事件似乎需要做很多工作。如何进行“适当的”事件循环?为什么关闭事件如此深埋?我想念什么?
X11中没有“退出按钮”或“应用程序”或“关闭事件”之类的东西。这是设计使然。
X11并未内置窗口装饰,退出按钮以及我们依赖的许多其他功能。它们是在核心X11之上实现的。负责查找的特定约定集的名称wmDeleteMessage是ICCCM。
wmDeleteMessage
Xlib仅处理核心X11协议。那里没有内置的关闭事件。
有些工具包使处理ICCCM和X11中未内置的所有其他内容(GTK,wxWindows,Qt等)变得更加容易。您可能要使用其中一种。