diff options
author | Olivier Goffart <ogoffart@woboq.com> | 2017-02-01 17:21:33 +0100 |
---|---|---|
committer | Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com> | 2017-03-16 12:55:19 +0000 |
commit | a02959bb5b43a3f9d881e5213ceedf535202b6a1 (patch) | |
tree | ff807a77cb12d327cc306fa0559455679d9f0802 /src/widgets/kernel | |
parent | 44f406ce95c340b24604ee6e61d9f8428b5c2cb4 (diff) |
Make QWindow's windowState a QFlags of the WindowState
This reflects QWidget API, and restores some behavior from Qt4.
Some WM can have several state at the same time. On Plasma for example,
when a window is both maximized and minimized, the "maximized" checkbox
is checked from the taskbar entry.
The API of QPlatformWindow was changed to take a QFlag and the platform
plugins were adapted.
- On XCB: Always send the full state to the WM. And read the full state.
- On Windows: The code was originally written with '&' in Qt4, and was changed
to == when porting. Some adaptation had to be made so the states would be
preserved.
- On macOS: Only a single state can be set and is reported back for now,
with the possibly to expand this in the future.
- Other platforms: Just do as before with the effective state.
Task-number: QTBUG-57882
Task-number: QTBUG-52616
Task-number: QTBUG-52555
Change-Id: I7a1f7cac64236bbd4c591f796374315639233dad
Reviewed-by: Gunnar Sletta <gunnar@crimson.no>
Reviewed-by: Robin Burchell <robin.burchell@crimson.no>
Diffstat (limited to 'src/widgets/kernel')
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 19 | ||||
-rw-r--r-- | src/widgets/kernel/qwidgetwindow.cpp | 28 |
2 files changed, 10 insertions, 37 deletions
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 8d5c3e415a..62d723bea5 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -3037,17 +3037,6 @@ void QWidget::overrideWindowState(Qt::WindowStates newstate) QApplication::sendEvent(this, &e); } -Qt::WindowState effectiveState(Qt::WindowStates state) -{ - if (state & Qt::WindowMinimized) - return Qt::WindowMinimized; - else if (state & Qt::WindowFullScreen) - return Qt::WindowFullScreen; - else if (state & Qt::WindowMaximized) - return Qt::WindowMaximized; - return Qt::WindowNoState; -} - /*! \fn void QWidget::setWindowState(Qt::WindowStates windowState) @@ -3089,19 +3078,17 @@ void QWidget::setWindowState(Qt::WindowStates newstate) data->window_state = newstate; data->in_set_window_state = 1; - Qt::WindowState newEffectiveState = effectiveState(newstate); - Qt::WindowState oldEffectiveState = effectiveState(oldstate); - if (isWindow() && newEffectiveState != oldEffectiveState) { + if (isWindow()) { // Ensure the initial size is valid, since we store it as normalGeometry below. if (!testAttribute(Qt::WA_Resized) && !isVisible()) adjustSize(); d->createTLExtra(); - if (oldEffectiveState == Qt::WindowNoState) + if (!(oldstate & (Qt::WindowMinimized | Qt::WindowMaximized | Qt::WindowFullScreen))) d->topData()->normalGeometry = geometry(); Q_ASSERT(windowHandle()); - windowHandle()->setWindowState(newEffectiveState); + windowHandle()->setWindowStates(newstate & ~Qt::WindowActive); } data->in_set_window_state = 0; diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp index 31f2d672bb..44fd4b6a80 100644 --- a/src/widgets/kernel/qwidgetwindow.cpp +++ b/src/widgets/kernel/qwidgetwindow.cpp @@ -726,8 +726,6 @@ void QWidgetWindow::repaintWindow() QWidgetBackingStore::UpdateNow, QWidgetBackingStore::BufferInvalid); } -Qt::WindowState effectiveState(Qt::WindowStates state); - // Store normal geometry used for saving application settings. void QWidgetWindow::updateNormalGeometry() { @@ -738,7 +736,7 @@ void QWidgetWindow::updateNormalGeometry() QRect normalGeometry; if (const QPlatformWindow *pw = handle()) normalGeometry = QHighDpi::fromNativePixels(pw->normalGeometry(), this); - if (!normalGeometry.isValid() && effectiveState(m_widget->windowState()) == Qt::WindowNoState) + if (!normalGeometry.isValid() && !(m_widget->windowState() & ~Qt::WindowActive)) normalGeometry = m_widget->geometry(); if (normalGeometry.isValid()) tle->normalGeometry = normalGeometry; @@ -930,30 +928,18 @@ void QWidgetWindow::handleWindowStateChangedEvent(QWindowStateChangeEvent *event // QWindow does currently not know 'active'. Qt::WindowStates eventState = event->oldState(); Qt::WindowStates widgetState = m_widget->windowState(); + Qt::WindowStates windowState = windowStates(); if (widgetState & Qt::WindowActive) eventState |= Qt::WindowActive; // Determine the new widget state, remember maximized/full screen // during minimized. - switch (windowState()) { - case Qt::WindowNoState: - widgetState &= ~(Qt::WindowMinimized | Qt::WindowMaximized | Qt::WindowFullScreen); - break; - case Qt::WindowMinimized: + if (windowState & Qt::WindowMinimized) { widgetState |= Qt::WindowMinimized; - break; - case Qt::WindowMaximized: - updateNormalGeometry(); - widgetState |= Qt::WindowMaximized; - widgetState &= ~(Qt::WindowMinimized | Qt::WindowFullScreen); - break; - case Qt::WindowFullScreen: - updateNormalGeometry(); - widgetState |= Qt::WindowFullScreen; - widgetState &= ~(Qt::WindowMinimized); - break; - case Qt::WindowActive: // Not handled by QWindow - break; + } else { + widgetState = windowState | (widgetState & Qt::WindowActive); + if (windowState) // Maximized or FullScreen + updateNormalGeometry(); } // Sent event if the state changed (that is, it is not triggered by |