diff options
author | Joerg Bornemann <joerg.bornemann@nokia.com> | 2012-07-09 12:33:36 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-07-19 15:28:18 +0200 |
commit | af8e318b35498543107e7251324ccdc0c4152483 (patch) | |
tree | 5784e7e3fb0a586229203c1d0ecf21a3e533b57a | |
parent | 85d664c929250f9e6cc354a3104906a21b5dac15 (diff) |
QWidget/Win: fix restoreGeometry() from fullscreen mode
When turning off fullscreen mode and restoring the widget's geometry
we must inform the QWindow about the geometry change synchronously.
Otherwise QWidget::geometry() will return the old value.
Using the same technique for the state transition to fullscreen mode
without sending a separate resize event.
Autotest: tst_QWidget::saveRestoreGeometry
Task-number: QTBUG-26421
Change-Id: I869e36cd302d9a94e398f48949ab3cb7ee9cdf51
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
-rw-r--r-- | src/plugins/platforms/windows/qwindowswindow.cpp | 13 | ||||
-rw-r--r-- | src/plugins/platforms/windows/qwindowswindow.h | 3 | ||||
-rw-r--r-- | tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp | 3 |
3 files changed, 14 insertions, 5 deletions
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index bc886f077f..85c8a6951a 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -993,7 +993,10 @@ void QWindowsWindow::handleGeometryChange() { m_data.geometry = geometry_sys(); QPlatformWindow::setGeometry(m_data.geometry); - QWindowSystemInterface::handleGeometryChange(window(), m_data.geometry); + if (testFlag(SynchronousGeometryChangeEvent)) + QWindowSystemInterface::handleSynchronousGeometryChange(window(), m_data.geometry); + else + QWindowSystemInterface::handleGeometryChange(window(), m_data.geometry); if (QWindowsContext::verboseEvents || QWindowsContext::verboseWindows) qDebug() << __FUNCTION__ << this << window() << m_data.geometry; @@ -1246,7 +1249,11 @@ void QWindowsWindow::setWindowState_sys(Qt::WindowState newState) UINT swpf = SWP_FRAMECHANGED; if (newStates & Qt::WindowActive) swpf |= SWP_NOACTIVATE; + const bool wasSync = testFlag(SynchronousGeometryChangeEvent); + setFlag(SynchronousGeometryChangeEvent); SetWindowPos(m_data.hwnd, HWND_TOP, r.left(), r.top(), r.width(), r.height(), swpf); + if (!wasSync) + clearFlag(SynchronousGeometryChangeEvent); QWindowSystemInterface::handleSynchronousGeometryChange(window(), r); } else if (!(newStates & Qt::WindowMinimized)) { // Restore saved state. @@ -1260,8 +1267,12 @@ void QWindowsWindow::setWindowState_sys(Qt::WindowState newState) swpf |= SWP_NOACTIVATE; if (!m_savedFrameGeometry.isValid()) swpf |= SWP_NOSIZE | SWP_NOMOVE; + const bool wasSync = testFlag(SynchronousGeometryChangeEvent); + setFlag(SynchronousGeometryChangeEvent); SetWindowPos(m_data.hwnd, 0, m_savedFrameGeometry.x(), m_savedFrameGeometry.y(), m_savedFrameGeometry.width(), m_savedFrameGeometry.height(), swpf); + if (!wasSync) + clearFlag(SynchronousGeometryChangeEvent); // preserve maximized state if (visible) ShowWindow(m_data.hwnd, (newStates & Qt::WindowMaximized) ? max : normal); diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h index 176a02bc36..b2b33302f6 100644 --- a/src/plugins/platforms/windows/qwindowswindow.h +++ b/src/plugins/platforms/windows/qwindowswindow.h @@ -124,7 +124,8 @@ public: OpenGlPixelFormatInitialized = 0x40, BlockedByModal = 0x80, SizeGripOperation = 0x100, - FrameStrutEventsEnabled = 0x200 + FrameStrutEventsEnabled = 0x200, + SynchronousGeometryChangeEvent = 0x400 }; struct WindowData diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp index caaabe0e76..cf65556a1a 100644 --- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp +++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp @@ -2945,9 +2945,6 @@ void tst_QWidget::saveRestoreGeometry() QVERIFY(widget.restoreGeometry(savedGeometry)); QTest::qWait(120); QTRY_VERIFY(!(widget.windowState() & Qt::WindowFullScreen)); -#ifdef Q_OS_WIN - QEXPECT_FAIL("", "QTBUG-26421", Continue); -#endif QTRY_COMPARE(widget.geometry(), geom); //Restore to full screen |