一尘不染

如何优雅地退出X11事件循环?

linux

我发现几乎每个教程都告诉我针对事件循环执行此操作:

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应用程序的唯一方法吗?捕获结束事件似乎需要做很多工作。如何进行“适当的”事件循环?为什么关闭事件如此深埋?我想念什么?


阅读 829

收藏
2020-06-03

共1个答案

一尘不染

X11中没有“退出按钮”或“应用程序”或“关闭事件”之类的东西。这是设计使然。

X11并未内置窗口装饰,退出按钮以及我们依赖的许多其他功能。它们是在核心X11之上实现的。负责查找的特定约定集的名称wmDeleteMessage是ICCCM。

Xlib仅处理核心X11协议。那里没有内置的关闭事件。

有些工具包使处理ICCCM和X11中未内置的所有其他内容(GTK,wxWindows,Qt等)变得更加容易。您可能要使用其中一种。

2020-06-03