X11 window-使用单线程服务多个时关闭按钮windows
X11 window-close button when using single thread serving multiple windows
在一个使用 X11 的大型应用程序中,我最近从每个 window 一个线程切换到一个线程服务所有 windows。
现在的问题是单击 window-关闭按钮会导致所有 windows 消失。
我知道完全禁用 window-manager 处理的选项 (XSetWMProtocols),但我不想这样做,因为我需要实现自己的 window-decoration, -调整大小...
我正在使用 XSetErrorHandler 和 XSetIOErrorHandler 设置回调,
之前只有一个thead的window消失了,我用上面提到的回调做了一个长跳转,适当清理资源,然后结束线程。另一个windows/threads继续运行。
然而,这些回调现在甚至都没有达到:
我在这些回调和 _XIOError 上有一个断点,但那时所有 windows 都已经消失了。
#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
来自 _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 调试构建。
可能是我忘记了将代码从庞大的旧部分移到代码的不那么庞大的新部分。是否需要一些 XSetWMProtocols 才能让上述回调在 windows 消失之前被调用?
经过两个多小时的搜索,我发现确实需要另一个 XSetWMProtocols 调用。对于 运行 遇到同样问题的人:将其与 WM_DELETE_WINDOW.
一起使用
在一个使用 X11 的大型应用程序中,我最近从每个 window 一个线程切换到一个线程服务所有 windows。
现在的问题是单击 window-关闭按钮会导致所有 windows 消失。
我知道完全禁用 window-manager 处理的选项 (XSetWMProtocols),但我不想这样做,因为我需要实现自己的 window-decoration, -调整大小...
我正在使用 XSetErrorHandler 和 XSetIOErrorHandler 设置回调,
之前只有一个thead的window消失了,我用上面提到的回调做了一个长跳转,适当清理资源,然后结束线程。另一个windows/threads继续运行。
然而,这些回调现在甚至都没有达到:
我在这些回调和 _XIOError 上有一个断点,但那时所有 windows 都已经消失了。
#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
来自 _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 调试构建。
可能是我忘记了将代码从庞大的旧部分移到代码的不那么庞大的新部分。是否需要一些 XSetWMProtocols 才能让上述回调在 windows 消失之前被调用?
经过两个多小时的搜索,我发现确实需要另一个 XSetWMProtocols 调用。对于 运行 遇到同样问题的人:将其与 WM_DELETE_WINDOW.
一起使用