重新设置 wm 和 BadWindow 错误
Reparenting wm and BadWindow errors
我正在用 XCB 和 C++ 编写一个重命名的 window 管理器:http://ix.io/3yNo
目前它运行良好,但偶尔当我关闭 window 时,该应用程序的所有 windows 都会关闭,因为进程退出时出现 BadWindow。例如,如果我打开了几个 xfce4-terminal windows,全部由一个进程管理,然后我关闭了一个,应用程序偶尔会关闭,我会收到 BadWindow (invalid window parameter)
错误(在应用程序中,不是我的wm)。非常有趣的是,这不是可重现的,但有点罕见,可能是报告错误和关闭 window 之间的竞争条件,因为 X11 的异步 nature.I 不知道从哪里开始调试这个,任何提示?我有点怀疑它可能是 Unmap O
中的东西
您的 link 包含将近 500 行代码。我不会试图完全理解这一点。相反,我只是随机猜测。
auto window_manager::handle_unmap_notify(xcb_unmap_notify_event_t *ev) -> void {
if (unmap_ignore > 0) {
unmap_ignore--;
return;
}
client *cl = nullptr;
size_t idx = 0;
for (client &c : clients) {
if (c.window == ev->window) {
cl = &c;
break;
}
idx++;
}
if (not cl)
return;
xcb_destroy_window(conn, cl->frame);
clients.erase(clients.begin() + idx);
}
你正在摧毁不属于你的 windows。当 window 的所有者下次访问它时,它将得到 BadWindow
错误。
相反,您应该检查 window 的 WM_PROTOCOLS
属性 并检查 WM_DELETE_WINDOW
。如果存在,您应该向 window 发送一条 WM_DELETE_WINDOW
消息。参见 ICCCM § 4.2.8.1:https://tronche.com/gui/x/icccm/sec-4.html#s-4.2.8.1
我正在用 XCB 和 C++ 编写一个重命名的 window 管理器:http://ix.io/3yNo
目前它运行良好,但偶尔当我关闭 window 时,该应用程序的所有 windows 都会关闭,因为进程退出时出现 BadWindow。例如,如果我打开了几个 xfce4-terminal windows,全部由一个进程管理,然后我关闭了一个,应用程序偶尔会关闭,我会收到 BadWindow (invalid window parameter)
错误(在应用程序中,不是我的wm)。非常有趣的是,这不是可重现的,但有点罕见,可能是报告错误和关闭 window 之间的竞争条件,因为 X11 的异步 nature.I 不知道从哪里开始调试这个,任何提示?我有点怀疑它可能是 Unmap O
您的 link 包含将近 500 行代码。我不会试图完全理解这一点。相反,我只是随机猜测。
auto window_manager::handle_unmap_notify(xcb_unmap_notify_event_t *ev) -> void {
if (unmap_ignore > 0) {
unmap_ignore--;
return;
}
client *cl = nullptr;
size_t idx = 0;
for (client &c : clients) {
if (c.window == ev->window) {
cl = &c;
break;
}
idx++;
}
if (not cl)
return;
xcb_destroy_window(conn, cl->frame);
clients.erase(clients.begin() + idx);
}
你正在摧毁不属于你的 windows。当 window 的所有者下次访问它时,它将得到 BadWindow
错误。
相反,您应该检查 window 的 WM_PROTOCOLS
属性 并检查 WM_DELETE_WINDOW
。如果存在,您应该向 window 发送一条 WM_DELETE_WINDOW
消息。参见 ICCCM § 4.2.8.1:https://tronche.com/gui/x/icccm/sec-4.html#s-4.2.8.1