From 49a55be9730bb30f36ba0e031717cc1f709ddd20 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 3 Jul 2013 12:28:56 +0200 Subject: [PATCH] Windows: Synthesize expose event for shrinking windows. Synthesize expose events for all Windows except ANGLE-windows. Task-number: QTBUG-32121 Change-Id: Ifbff2730ec8f2e8cfe23eeb4022b76a6e432598e Reviewed-by: Oliver Wolff Reviewed-by: Gunnar Sletta --- .../platforms/windows/qwindowswindow.cpp | 13 +++++++++- .../platforms/windows/qwindowswindow.h | 25 ++++++++++--------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index c3ec949eef..dc51dbfc88 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -808,8 +808,12 @@ QWindowsWindow::QWindowsWindow(QWindow *aWindow, const WindowData &data) : const Qt::WindowType type = aWindow->type(); if (type == Qt::Desktop) return; // No further handling for Qt::Desktop - if (aWindow->surfaceType() == QWindow::OpenGLSurface) + if (aWindow->surfaceType() == QWindow::OpenGLSurface) { setFlag(OpenGLSurface); +#ifdef QT_OPENGL_ES_2 + setFlag(OpenGL_ES2); +#endif + } if (aWindow->isTopLevel()) { switch (type) { case Qt::Window: @@ -1233,9 +1237,16 @@ void QWindowsWindow::handleGeometryChange() //Prevent recursive resizes for Windows CE if (testFlag(WithinSetStyle)) return; + const QRect previousGeometry = m_data.geometry; m_data.geometry = geometry_sys(); QPlatformWindow::setGeometry(m_data.geometry); QWindowSystemInterface::handleGeometryChange(window(), m_data.geometry); + // QTBUG-32121: OpenGL/normal windows (with exception of ANGLE) do not receive + // expose events when shrinking, synthesize. + if (!testFlag(OpenGL_ES2) && isExposed() + && !(m_data.geometry.width() > previousGeometry.width() || m_data.geometry.height() > previousGeometry.height())) { + fireExpose(QRegion(m_data.geometry), true); + } if (testFlag(SynchronousGeometryChangeEvent)) QWindowSystemInterface::flushWindowSystemEvents(); diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h index 07f3976d87..996542f92a 100644 --- a/src/plugins/platforms/windows/qwindowswindow.h +++ b/src/plugins/platforms/windows/qwindowswindow.h @@ -124,18 +124,19 @@ public: WithinSetParent = 0x2, FrameDirty = 0x4, //! Frame outdated by setStyle, recalculate in next query. OpenGLSurface = 0x10, - OpenGLDoubleBuffered = 0x20, - OpenGlPixelFormatInitialized = 0x40, - BlockedByModal = 0x80, - SizeGripOperation = 0x100, - FrameStrutEventsEnabled = 0x200, - SynchronousGeometryChangeEvent = 0x400, - WithinSetStyle = 0x800, - WithinDestroy = 0x1000, - TouchRegistered = 0x2000, - AlertState = 0x4000, - Exposed = 0x08000, - WithinCreate = 0x10000 + OpenGL_ES2 = 0x20, + OpenGLDoubleBuffered = 0x40, + OpenGlPixelFormatInitialized = 0x80, + BlockedByModal = 0x100, + SizeGripOperation = 0x200, + FrameStrutEventsEnabled = 0x400, + SynchronousGeometryChangeEvent = 0x800, + WithinSetStyle = 0x1000, + WithinDestroy = 0x2000, + TouchRegistered = 0x4000, + AlertState = 0x8000, + Exposed = 0x10000, + WithinCreate = 0x20000 }; struct WindowData