我找到的几乎每一个教程都告诉我要在事件循环中这样做:

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,请查找.

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

有一些工具包使处理ICCCM和X11中未内置的所有其他东西变得更容易(GTK、wxWindows、Qt等)你可能想用其中一个.

Linux相关问答推荐

无法在Raspberry PI 3 Model B上分配256TB的虚拟内存

PERF显示不应该执行指令的内核的用户空间周期

如何限制SLURM中并行执行的程序数量

如果在两种模式之间找到文本,则使用sed删除它们之间的所有行

如何在不进行轮询且不吃掉其他人子进程的退出代码的情况下等待一组子进程(并且只有它们)?

构建 python 映像时 Docker compose 问题,访问被拒绝或存储库不存在

awk 不打印所需的 df 输出

Azure Nvidia 中的 apt-update 给出公钥错误

编译过度对齐的动态分配变量时出现 icpc 错误

如何为 Linux 构建 Visual C++ 项目?

为什么导入 SQL 这么慢?

如何在 Linux 中查找所有以 .rb 结尾的文件?

NGINX:connect() 到 unix:/var/run/php7.0-fpm.sock 失败(2:没有这样的文件或目录)

使用 ssh 判断远程主机上是否存在文件

在 Linux 上的进程之间传递消息的最快技术?

比较文件的日期 bash

基于shell中正则表达式的 colored颜色 突出显示输出

`cd //` 中的双斜杠 // 在 Linux 中是什么意思?

如何将 ISO8859-15 转换为 UTF8?

未找到版本CXXABI_1.3.8(...要求)