1

我正在为 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()计时器来声明注意标志。

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

4

1 回答 1

0

事实证明,Qt5 在 X11 上的原生事件过滤器并没有始终如一地通过所有内容。我还没有隔离那个错误,但是我在一个单独的连接上编写了我自己的极简 xcb 事件循环来处理窗口管理活动,它工作正常。

于 2019-05-16T23:14:24.110 回答