在一个使用X11的大型应用程序中,我最近从每个窗口一个线程切换到为所有窗口服务的单个线程。
现在的问题是,单击window-close按钮会导致所有窗口消失。
我知道可以完全禁用窗口管理器的处理(XSetWMProtocols),但我不想这样做,因为我需要实现自己的窗口装饰-resize...
我正在用XSetErrorHandler和XSetIOErrorHandler设置回调,
以前只有一个头部的窗口消失了,我使用上面提到的回调做了一个长时间跳转,适当地清理了资源,然后结束了线程。其他窗口/线程继续运行。
然而,这些回调现在甚至还没有到达:
我在这些回调函数和_XIOError上有一个断点,但在这一点上,所有的窗口都已经消失了。
#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:257From _XEventsQueued的来源:
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,但我猜它没有被使用:
(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。它有:
case X_Error:
handle_error(...)...未到达handle_error中的断点。但这可能是因为它没有使用libx11-xcb-dev debug-build。
可能是我忘了把一些东西从庞大的旧代码部分移到不太庞大的新代码部分。是否需要一些XSetWMProtocols来让上述回调在窗口消失之前被调用?
发布于 2021-08-29 14:05:01
经过两个多小时的搜索,我发现确实需要另一个XSetWMProtocols调用。对于那些遇到同样问题的人:在WM_DELETE_WINDOW中使用它。
https://stackoverflow.com/questions/68971734
复制相似问题