【发布时间】:2021-01-22 12:44:27
【问题描述】:
XCB 允许我们...
- 通过
WM_NAME和_NET_WM_NAME属性读取窗口的名称(标题) - 通过
XCB_EVENT_MASK_PROPERTY_CHANGE监控窗口属性的变化
我成功地做到了这两点。具体来说,这是我如何监视所有窗口的_NET_WM_NAME 属性的变化(通过订阅根窗口上的事件):
/* ... */
const uint32_t list[] = { XCB_EVENT_MASK_PROPERTY_CHANGE };
xcb_change_window_attributes(conn, root_window, XCB_CW_EVENT_MASK, &list);
xcb_flush(conn);
xcb_generic_event_t *evt;
while ((evt = xcb_wait_for_event(conn)))
{
if (evt->response_type == XCB_PROPERTY_NOTIFY)
{
xcb_property_notify_event_t *e = (void *) evt;
/* ... print the window name ... */
}
free(evt);
}
/* ... */
这在大多数情况下似乎工作正常,但我注意到当我在浏览器中更改选项卡时没有收到事件,即使这确实改变了浏览器窗口的标题。
是我做错了还是 XCB 不可能做到这一点?
以上代码的功劳大多归于this answer on a related question。
【问题讨论】: