我正在为X11桌面构建任务栏,到目前为止,我已经成功检测到新窗口和已删除窗口以及窗口标题和图标的更改。
但是,尽管在客户端窗口上设置了我能想到的每个事件掩码,但是当测试应用程序将_NET_WM_STATE_DEMANDS_ATTENTION
原子添加到其_NET_WM_STATE
属性时,我仍然无法获得任何事件。 / p>
我正在使用Qt5并使用installNativeEventFilter
捕获传入的X11事件。但是,我也尝试过使用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()
来声明注意力标记。
原子列表属性是否有必要进行特殊处理?我注定要调查更改吗?我曾尝试查看其他窗口管理器的源代码,但无法识别任何特定的差异。
答案 0 :(得分:0)
事实证明,Xt11上Qt5的本机事件过滤器无法始终传递所有内容。我还没有隔离那个错误,但是我在一个单独的连接上编写了自己的极简主义xcb事件循环以处理窗口管理活动,并且工作正常。