diff -up qt-everywhere-opensource-src-4.8.5/src/gui/kernel/qapplication_x11.cpp.QTBUG-21900 qt-everywhere-opensource-src-4.8.5/src/gui/kernel/qapplication_x11.cpp --- qt-everywhere-opensource-src-4.8.5/src/gui/kernel/qapplication_x11.cpp.QTBUG-21900 2013-05-30 16:18:05.000000000 -0500 +++ qt-everywhere-opensource-src-4.8.5/src/gui/kernel/qapplication_x11.cpp 2013-06-09 11:53:45.891771748 -0500 @@ -818,6 +818,27 @@ static Bool qt_sync_request_scanner(Disp #endif #endif // QT_NO_XSYNC +struct qt_configure_event_data +{ + WId window; + WId parent; +}; + +static Bool qt_configure_event_scanner(Display*, XEvent *event, XPointer arg) +{ + qt_configure_event_data *data = + reinterpret_cast(arg); + if (event->type == ConfigureNotify && + event->xconfigure.window == data->window) { + return true; + } else if (event->type == ReparentNotify && + event->xreparent.window == data->window) { + data->parent = event->xreparent.parent; + } + + return false; +} + static void qt_x11_create_intern_atoms() { const char *names[QX11Data::NAtoms]; @@ -5302,8 +5323,11 @@ bool QETWidget::translateConfigEvent(con if (d->extra->compress_events) { // ConfigureNotify compression for faster opaque resizing XEvent otherEvent; - while (XCheckTypedWindowEvent(X11->display, internalWinId(), ConfigureNotify, - &otherEvent)) { + qt_configure_event_data configureData; + configureData.window = internalWinId(); + configureData.parent = d->topData()->parentWinId; + while (XCheckIfEvent(X11->display, &otherEvent, + &qt_configure_event_scanner, (XPointer)&configureData)) { if (qt_x11EventFilter(&otherEvent)) continue; @@ -5316,13 +5340,19 @@ bool QETWidget::translateConfigEvent(con newSize.setWidth(otherEvent.xconfigure.width); newSize.setHeight(otherEvent.xconfigure.height); + trust = isVisible() + && (configureData.parent == XNone || + configureData.parent == QX11Info::appRootWindow()); + if (otherEvent.xconfigure.send_event || trust) { newCPos.rx() = otherEvent.xconfigure.x + otherEvent.xconfigure.border_width; newCPos.ry() = otherEvent.xconfigure.y + otherEvent.xconfigure.border_width; isCPos = true; - } + } else { + isCPos = false; + } } #ifndef QT_NO_XSYNC qt_sync_request_event_data sync_event; @@ -5335,9 +5365,14 @@ bool QETWidget::translateConfigEvent(con } if (!isCPos) { - // we didn't get an updated position of the toplevel. - // either we haven't moved or there is a bug in the window manager. - // anyway, let's query the position to be certain. + // If the last configure event didn't have a trustable position, + // it's necessary to query, see ICCCM 4.24: + // + // Any real ConfigureNotify event on a top-level window implies + // that the window’s position on the root may have changed, even + // though the event reports that the window’s position in its + // parent is unchanged because the window may have been reparented. + int x, y; Window child; XTranslateCoordinates(X11->display, internalWinId(),