首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >X11窗口-使用单线程为多个窗口提供服务时的关闭按钮

X11窗口-使用单线程为多个窗口提供服务时的关闭按钮
EN

Stack Overflow用户
提问于 2021-08-29 09:51:35
回答 1查看 55关注 0票数 0

在一个使用X11的大型应用程序中,我最近从每个窗口一个线程切换到为所有窗口服务的单个线程。

现在的问题是,单击window-close按钮会导致所有窗口消失。

我知道可以完全禁用窗口管理器的处理(XSetWMProtocols),但我不想这样做,因为我需要实现自己的窗口装饰-resize...

我正在用XSetErrorHandler和XSetIOErrorHandler设置回调,

以前只有一个头部的窗口消失了,我使用上面提到的回调做了一个长时间跳转,适当地清理了资源,然后结束了线程。其他窗口/线程继续运行。

然而,这些回调现在甚至还没有到达:

我在这些回调函数和_XIOError上有一个断点,但在这一点上,所有的窗口都已经消失了。

代码语言:javascript
复制
#0  0x00007ffff7a62300 in _XIOError () from /lib/x86_64-linux-gnu/libX11.so.6.3.0
#1  0x00007ffff7a5fa0d in _XEventsQueued () from /lib/x86_64-linux-gnu/libX11.so.6.3.0
#2  0x00007ffff7a51211 in XPending () from /lib/x86_64-linux-gnu/libX11.so.6.3.0
#3  0x00005555555dcf54 in xwin4gRunI (T=0x7ffff7b832e8, Xwin4g=0x7ffff7b831b0) at ../xwin4/xwin4.c:257

From _XEventsQueued的来源:

代码语言:javascript
复制
while((response = poll_for_response(dpy)))
    handle_response(dpy, response, False);
if(xcb_connection_has_error(dpy->xcb->connection)) {
    _XIOError(dpy);
    return 0;
}

我已经安装了libx11-dev和libx11-xcb-dev,但我猜它没有被使用:

代码语言:javascript
复制
(gdb) f 1
#1  0x00007ffff7a5fa0d in _XEventsQueued () from /lib/x86_64-linux-gnu/libX11.so.6.3.0
(gdb) p response
No symbol "response" in current context.

所以我看了一下poll_for_response:看起来不像window-unmap/destroy。

并进入handle_response。它有:

代码语言:javascript
复制
case X_Error:
    handle_error(...)...

未到达handle_error中的断点。但这可能是因为它没有使用libx11-xcb-dev debug-build。

可能是我忘了把一些东西从庞大的旧代码部分移到不太庞大的新代码部分。是否需要一些XSetWMProtocols来让上述回调在窗口消失之前被调用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-29 14:05:01

经过两个多小时的搜索,我发现确实需要另一个XSetWMProtocols调用。对于那些遇到同样问题的人:在WM_DELETE_WINDOW中使用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68971734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档