diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2016-05-25 11:51:17 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2017-01-25 09:44:12 +0000 |
commit | 0c415793b9622eef2148fdd21a2f3c2394a78d99 (patch) | |
tree | 864ef67508680894de20921cd1fd532d328171eb /src/plugins/platforms | |
parent | dfa8894bd3fde2dd0276a13e7bf4baa36d150230 (diff) |
Windows QPA: More fine-grained suppression of geometry/state change events
When switching windows from fullscreen to maximized, move and resize events are
triggered when changing the window decorations, ending up in
QWindowsWindow::handleResized(), QWindowsWindow::handleMoved() which then may
call handleGeometryChange().
Change 917ef5787444403ce0f7f035e27b1740c7672e34 blocks the emission of events
depending on flag WithinSetStyle from handleGeometryChange() for Windows CE.
This has issues which become visible when switching from fullscreen to
maximized repeatedly:
- State change events are still sent from QWindowsWindow::handleResized(),
QWindowsWindow::handleMoved() when changing the window style programmatically
causing the maximized state to be lost after a few cycles(QTBUG-53368).
- Geometry change events are actually needed on the desktop for proper redrawing
(QTBUG-53577).
Make this more fine-grained by suppressing all state changed events while
WithinSetStyle is set and allowing geometry changes.
Amends 917ef5787444403ce0f7f035e27b1740c7672e34.
Task-number: QTBUG-53368
Task-number: QTBUG-53577
Change-Id: Icc8dc935cfc29b314aab2d6fac02c97174c79c3e
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Diffstat (limited to 'src/plugins/platforms')
-rw-r--r-- | src/plugins/platforms/windows/qwindowswindow.cpp | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 5edf40b886..fb69936772 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -1488,18 +1488,22 @@ void QWindowsWindow::handleResized(int wParam) case SIZE_MAXHIDE: // Some other window affected. case SIZE_MAXSHOW: return; - case SIZE_MINIMIZED: - handleWindowStateChange(Qt::WindowMinimized); + case SIZE_MINIMIZED: // QTBUG-53577, prevent state change events during programmatic state change + if (!testFlag(WithinSetStyle)) + handleWindowStateChange(Qt::WindowMinimized); return; case SIZE_MAXIMIZED: - handleWindowStateChange(Qt::WindowMaximized); + if (!testFlag(WithinSetStyle)) + handleWindowStateChange(Qt::WindowMaximized); handleGeometryChange(); break; case SIZE_RESTORED: - if (isFullScreen_sys()) - handleWindowStateChange(Qt::WindowFullScreen); - else if (m_windowState != Qt::WindowNoState && !testFlag(MaximizeToFullScreen)) - handleWindowStateChange(Qt::WindowNoState); + if (!testFlag(WithinSetStyle)) { + if (isFullScreen_sys()) + handleWindowStateChange(Qt::WindowFullScreen); + else if (m_windowState != Qt::WindowNoState && !testFlag(MaximizeToFullScreen)) + handleWindowStateChange(Qt::WindowNoState); + } handleGeometryChange(); break; } @@ -1507,9 +1511,6 @@ void QWindowsWindow::handleResized(int wParam) 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); |