X11客户端设置_NET_WM_STATE_DEMANDS_ATTENTION

时间:2019-05-13 20:34:48

标签: x11 window-managers xcb ewmh

我正在为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()来声明注意力标记。

原子列表属性是否有必要进行特殊处理?我注定要调查更改吗?我曾尝试查看其他窗口管理器的源代码,但无法识别任何特定的差异。

1 个答案:

答案 0 :(得分:0)

事实证明,Xt11上Qt5的本机事件过滤器无法始终传递所有内容。我还没有隔离那个错误,但是我在一个单独的连接上编写了自己的极简主义xcb事件循环以处理窗口管理活动,并且工作正常。