重新设置 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