summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/kernel/qwidget.cpp21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp
index 53c1d3f64d..de7a4a1852 100644
--- a/src/gui/kernel/qwidget.cpp
+++ b/src/gui/kernel/qwidget.cpp
@@ -7139,12 +7139,25 @@ bool QWidget::restoreGeometry(const QByteArray &geometry)
if (maximized || fullScreen) {
// set geomerty before setting the window state to make
// sure the window is maximized to the right screen.
- // Skip on windows: the window is restored into a broken
- // half-maximized state.
+ Qt::WindowStates ws = windowState();
#ifndef Q_WS_WIN
setGeometry(restoredNormalGeometry);
-#endif
- Qt::WindowStates ws = windowState();
+#else
+ if (ws & Qt::WindowFullScreen) {
+ // Full screen is not a real window state on Windows.
+ move(availableGeometry.topLeft());
+ } else if (ws & Qt::WindowMaximized) {
+ // Setting a geometry on an already maximized window causes this to be
+ // restored into a broken, half-maximized state, non-resizable state (QTBUG-4397).
+ // Move the window in normal state if needed.
+ if (restoredScreenNumber != desktop->screenNumber(this)) {
+ setWindowState(Qt::WindowNoState);
+ setGeometry(restoredNormalGeometry);
+ }
+ } else {
+ setGeometry(restoredNormalGeometry);
+ }
+#endif // Q_WS_WIN
if (maximized)
ws |= Qt::WindowMaximized;
if (fullScreen)