当前位置: 首页 > 面试题库 >

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

曹骞仕
2023-03-14
问题内容

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

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等)变得更加容易。您可能要使用其中一种。



 类似资料:
  • 问题内容: 我正在阅读出色的在线书籍http://nodebeginner.org/,并尝试了简单的代码 现在我不知道(而且我仍然不知道!)如何优雅地关闭node.js,所以我就去了。现在,每次我尝试运行时,都会收到以下错误消息。 因此,有两个问题: 1)如何正常关闭node.js? 2)如何修复我创建的混乱? 问题答案: 使用+ 优雅地退出节点进程 清理混乱取决于您的平台,但基本上,您需要找到运

  • 我有一个顶级核心.异步运行循环。我想让它无限期地运行,至少直到我用CTRL-C或kill或类似的方式示意它停止。我当前正在使用java.lang.runtime/AddShutDownHook,如下所示: 我想要的也不是。 我不一定期望找到一个适用于所有JVM的解决方案。我在Mac上开发并部署到Ubuntu上,所以我想找到一个同时适用于两者的解决方案: > Mac JVM:java版本“1.7.0

  • 人生太短,不能写没人会读的废话,如果你写了废话,没人会去读。所以好一点的文档是最好的。经理不会去理解这些东西,因为不好的文档会给他们错误的安全感以至于他们不敢依赖他们的程序员。如果一些人绝对坚持你真的在写没用的文档,就告诉他们“是的”,然后安静的找一份更好的工作。 没有其他事情比精确估计 把好的文档转为放松文档要求的估计 更为有效率。真相是冷酷而艰难的:文档,就像测试,会花比开发代码多几倍的时间。

  • 如果您能帮助我完成Java类的任务,我将不胜感激。问题提示如下: 编写一个程序来读取非负整数列表并显示最大整数、最小整数和所有整数的平均值。用户通过输入一个不用于查找最大值、最小值和平均值的负哨兵值来指示输入的结束。平均值应该是双精度类型的值,以便用小数部分计算。 我在代码中遇到的问题是,运行时,循环不会完成,除非输入的第一个值为负值,在这种情况下它返回: 输入的最大数字是:0输入的最小数字是:0

  • 相关zulip聊天 我正在试图弄清楚,在quarkus中启动应用程序时,您应该如何优雅地失败。 我尝试将其添加到应用程序启动代码中。如果我运行一个单元测试,现在就不会调用它。仅当我直接启动应用程序时才会调用它。我希望返回一个非零值,以防抛出异常。这可能是推荐的方法。我不确定 我不确定这是一个功能请求还是一个bug,或者我遗漏了什么,这是正常的行为。 编辑1:我想说清楚: 当我使用“/gradlew