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

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

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

以上是 如何优雅地退出X11事件循环? 的全部内容, 来源链接: utcz.com/qa/428483.html

回到顶部