使用XCB获取活动窗口(具有输入焦点的窗口)的正确方法是什么?使用XCB获取活动窗口的WId
reply = xcb_get_input_focus_reply(connection, xcb_get_input_focus(connection), nullptr);
std::cout << "WId: " << reply->focus;
这似乎是工作有时,有时不。
我还看到有人提到查询_NET_ACTIVE_WINDOW根窗口属性,但我无法弄清楚这是如何完成的,并且总是支持XCB?
编辑:该方法上面xcb_get_input_focus只是其中的一部分,得到了reply->焦点后,您需要通过xcb_query_tree跟进父窗口。
此代码是越野车。你应该抓住所有这些服务器,否则当你通过树时输入焦点可能会改变。请参阅XGrabServer/xcb_grab_server。 –
作为参考,可以看一下[this](https://github.com/i3/i3/blob/next/i3-input/main.c#L320),其中服务器是在输入焦点操作周围抓取的。 –
感谢您指出这一点,确实是一个有效的观点。 所以基本上我需要'xcb_grab_server(conn)'服务器在开始时和'xcb_ungrab_server(conn)'当我完成并找到父项? –