в qt4 работает:
// init:
m_isXDamageAvailable = XDamageQueryExtension(QX11Info::display(), &m_damageEvent, &m_damageError);
// add window:
XDamageCreate(QX11Info::display(), w.id, XDamageReportNonEmpty);
// x11EventFilter(XEvent* event):
if(event->type == m_damageEvent + XDamageNotify)
{
XDamageNotifyEvent* e = reinterpret_cast<XDamageNotifyEvent*>(event);
XDamageSubtract(QX11Info::display(), e->damage, None, None);
emit windowContentChanged(e->drawable);
}
в qt5 x11EventFilter удалили и нужно юзать xcb:
// init:
xcb_prefetch_extension_data(m_xcb_connection, &xcb_damage_id);
const auto* reply = xcb_get_extension_data(m_xcb_connection, &xcb_damage_id);
if(reply->present)
{
m_damageEventBase = reply->first_event;
xcb_damage_query_version_unchecked(m_xcb_connection, XCB_DAMAGE_MAJOR_VERSION, XCB_DAMAGE_MINOR_VERSION);
}
// add window:
const auto damageId = xcb_generate_id(m_xcb_connection);
m_damageWatches[w.id] = damageId;
xcb_damage_create(m_xcb_connection, damageId, w.id, XCB_DAMAGE_REPORT_LEVEL_NON_EMPTY);
xcb_flush(m_xcb_connection);
// nativeEventFilter(const QByteArray& eventType, void* message, long* result):
xcb_generic_event_t* ev = static_cast<xcb_generic_event_t *>(message);
const auto responseType = XCB_EVENT_RESPONSE_TYPE(ev);
if (responseType == app->m_damageEventBase + XCB_DAMAGE_NOTIFY)
{
// здесь можно размещать любой код, нужно не выполнять
}
В nativeEventFilter приходит куча событий, но XCB_DAMAGE_NOTIFY - никогда.
Так как c xcb впервые столкнулся сегодня, то очевидно, что я где-то допустил элементарную ошибку. Помогите, добрые люди.