X11 客户端设置 _NET_WM_STATE_DEMANDS_ATTENTION 时未收到事件

No event received when X11 client sets _NET_WM_STATE_DEMANDS_ATTENTION

我正在为 X11 桌面构建任务栏,到目前为止,我已成功检测到新的和已删除的 windows 以及对 window 标题和图标的更改。

然而,尽管在客户端 windows 上设置了我能想到的每个事件掩码,但当测试应用程序将 _NET_WM_STATE_DEMANDS_ATTENTION 原子添加到其 _NET_WM_STATE 属性.

我正在使用 Qt5 并使用 installNativeEventFilter 捕获传入的 X11 事件。但是,我也尝试过使用 xprop -spy,我在那里看到了同样的问题:即使轮询 _NET_WM_STATE 属性 显示正在添加和删除原子,但 属性 没有变化曾经收到过事件。 Fluxbox 似乎也没有注意到它,直到其他原因导致它 re-query window.

我的事件过滤器代码类似于:

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() 来声明注意力标志。

是否需要对原子列表属性进行一些特殊处理?我注定要轮询更改吗?我已经尝试查看其他 window 管理器的源代码,但我无法确定任何具体差异。

事实证明,Qt5 在 X11 上的本机事件过滤器并没有始终如一地传递所有内容。我还没有隔离 那个 错误,但我在单独的连接上编写了我自己的极简主义 xcb 事件循环来处理 window-management 活动并且它工作正常。