我正在为 X11 桌面构建一个任务栏,到目前为止,我已经成功地检测到新的和删除的窗口以及对窗口标题和图标的更改。
_NET_WM_STATE_DEMANDS_ATTENTION
然而,尽管在客户端窗口上设置了我能想到的每个事件掩码,但当测试应用程序将原子添加到其_NET_WM_STATE
属性时,我无法获得任何事件。
我正在使用 Qt5 并使用installNativeEventFilter
. 但是,我也尝试过使用xprop -spy
,在那里我看到了同样的问题:即使轮询_NET_WM_STATE
属性显示正在添加和删除原子,也没有收到任何属性更改事件。Fluxbox 似乎也没有注意到它,直到有其他东西导致它重新查询窗口。
我的事件过滤器代码类似于:
xcb_generic_event_t* ev = static_cast<xcb_generic_event_t*>(message);
uint32_t type = ev->response_type;
switch (type) {
case XCB_PROPERTY_NOTIFY: {
xcb_property_notify_event_t* pev =
reinterpret_cast<xcb_property_notify_event_t*>(ev);
qDebug() << "property" << pev->window << pev->atom << (int)pev->state;
break;
/* snip */
default:
qDebug() << "unrecognized event" << type;
};
我的测试应用程序使用QApplication::alert()
计时器来声明注意标志。
原子列表属性是否需要一些特殊处理?我注定要轮询变化吗?我已经尝试查看其他窗口管理器的源代码,但我无法确定任何具体差异。