Событие не получено, когда клиент X11 устанавливает _NET_WM_STATE_DEMANDS_ATTENTION

Я создаю панель задач для рабочего стола X11, и до сих пор я успешно обнаруживал новые и удаленные окна и изменения заголовков и значков окон.

Однако, несмотря на установку каждой маски событий, которую я могу придумать в клиентских окнах, я не смог получить никаких событий, когда тестовое приложение добавляет _NET_WM_STATE_DEMANDS_ATTENTION атом его _NET_WM_STATE имущество.

Я использую Qt5 и фиксирую входящие события X11, используя 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() по таймеру, чтобы установить флаг внимания.

Есть ли какая-то особая обработка, необходимая для свойств списка атомов? Обречен ли я опросить изменения? Я пытался просмотреть исходный код других оконных менеджеров, но не смог выявить каких-либо конкретных отличий.

1 ответ

Решение

Оказывается, что собственный фильтр событий Qt5 на X11 не проходит все последовательно. Я еще не выделил эту ошибку, но я написал свой собственный минималистический цикл событий xcb для отдельного соединения, чтобы обрабатывать действия по управлению окнами, и он отлично работает.

Другие вопросы по тегам