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 <oliver.wolff@digia.com>
Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
This commit is contained in:
Friedemann Kleint 2013-07-03 12:28:56 +02:00 committed by The Qt Project
parent e4484bb15b
commit 49a55be973
2 changed files with 25 additions and 13 deletions

View File

@ -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();

View File

@ -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