don't change a widget's active state in QWindowsWindow::setWindowState

QWindow::setWindowState is not supposed to set the window active.
The method requestActivateWindow() should be used for that.

When switching from and to fullscreen mode we're always passing
SWP_NOACTIVATE to SetWindowPos to not change the activation state
of the window. This is inverse to the old behaviour, which did not
have an effect.

Change-Id: I339337935cdad76b3ef252202e92177f37543038
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
This commit is contained in:
Joerg Bornemann 2012-07-02 12:36:18 +02:00 committed by Qt by Nokia
parent 30ec535cb6
commit a992a12bec
2 changed files with 18 additions and 35 deletions

View File

@ -1192,34 +1192,25 @@ bool QWindowsWindow::isFullScreen_sys() const
void QWindowsWindow::setWindowState_sys(Qt::WindowState newState) void QWindowsWindow::setWindowState_sys(Qt::WindowState newState)
{ {
const Qt::WindowStates oldStates = m_windowState; const Qt::WindowState &oldState = m_windowState;
// Maintain the active flag as the platform window API does not if (oldState == newState)
// use it.
Qt::WindowStates newStates = newState;
if (isActive())
newStates |= Qt::WindowActive;
if (oldStates == newStates)
return; return;
if (QWindowsContext::verboseWindows) if (QWindowsContext::verboseWindows)
qDebug() << '>' << __FUNCTION__ << this << window() qDebug() << '>' << __FUNCTION__ << this << window()
<< " from " << debugWindowStates(oldStates) << " from " << debugWindowStates(oldState)
<< " to " << debugWindowStates(newStates); << " to " << debugWindowStates(newState);
const bool isActive = newStates & Qt::WindowActive;
const int max = isActive ? SW_SHOWMAXIMIZED : SW_MAXIMIZE;
const int normal = isActive ? SW_SHOWNORMAL : SW_SHOWNOACTIVATE;
const int min = isActive ? SW_SHOWMINIMIZED : SW_MINIMIZE;
const bool visible = isVisible(); const bool visible = isVisible();
setFlag(FrameDirty); setFlag(FrameDirty);
if ((oldStates & Qt::WindowMaximized) != (newStates & Qt::WindowMaximized)) { if ((oldState == Qt::WindowMaximized) != (newState == Qt::WindowMaximized)) {
if (visible && !(newStates & Qt::WindowMinimized)) if (visible && !(newState == Qt::WindowMinimized))
ShowWindow(m_data.hwnd, (newStates & Qt::WindowMaximized) ? max : normal); ShowWindow(m_data.hwnd, (newState == Qt::WindowMaximized) ? SW_MAXIMIZE : SW_SHOWNOACTIVATE);
} }
if ((oldStates & Qt::WindowFullScreen) != (newStates & Qt::WindowFullScreen)) { if ((oldState == Qt::WindowFullScreen) != (newState == Qt::WindowFullScreen)) {
if (newStates & Qt::WindowFullScreen) { if (newState == Qt::WindowFullScreen) {
#ifndef Q_FLATTEN_EXPOSE #ifndef Q_FLATTEN_EXPOSE
UINT newStyle = WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_POPUP; UINT newStyle = WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_POPUP;
#else #else
@ -1231,7 +1222,7 @@ void QWindowsWindow::setWindowState_sys(Qt::WindowState newState)
if (!m_savedStyle) { if (!m_savedStyle) {
m_savedStyle = style(); m_savedStyle = style();
#ifndef Q_OS_WINCE #ifndef Q_OS_WINCE
if (oldStates & Qt::WindowMinimized) { if (oldState == Qt::WindowMinimized) {
WINDOWPLACEMENT wp; WINDOWPLACEMENT wp;
wp.length = sizeof(WINDOWPLACEMENT); wp.length = sizeof(WINDOWPLACEMENT);
if (GetWindowPlacement(m_data.hwnd, &wp)) if (GetWindowPlacement(m_data.hwnd, &wp))
@ -1250,25 +1241,21 @@ void QWindowsWindow::setWindowState_sys(Qt::WindowState newState)
setStyle(newStyle); setStyle(newStyle);
const QRect r = window()->screen()->geometry(); const QRect r = window()->screen()->geometry();
UINT swpf = SWP_FRAMECHANGED; const UINT swpf = SWP_FRAMECHANGED | SWP_NOACTIVATE;
if (newStates & Qt::WindowActive)
swpf |= SWP_NOACTIVATE;
const bool wasSync = testFlag(SynchronousGeometryChangeEvent); const bool wasSync = testFlag(SynchronousGeometryChangeEvent);
setFlag(SynchronousGeometryChangeEvent); setFlag(SynchronousGeometryChangeEvent);
SetWindowPos(m_data.hwnd, HWND_TOP, r.left(), r.top(), r.width(), r.height(), swpf); SetWindowPos(m_data.hwnd, HWND_TOP, r.left(), r.top(), r.width(), r.height(), swpf);
if (!wasSync) if (!wasSync)
clearFlag(SynchronousGeometryChangeEvent); clearFlag(SynchronousGeometryChangeEvent);
QWindowSystemInterface::handleSynchronousGeometryChange(window(), r); QWindowSystemInterface::handleSynchronousGeometryChange(window(), r);
} else if (!(newStates & Qt::WindowMinimized)) { } else if (newState != Qt::WindowMinimized) {
// Restore saved state. // Restore saved state.
unsigned newStyle = m_savedStyle ? m_savedStyle : style(); unsigned newStyle = m_savedStyle ? m_savedStyle : style();
if (visible) if (visible)
newStyle |= WS_VISIBLE; newStyle |= WS_VISIBLE;
setStyle(newStyle); setStyle(newStyle);
UINT swpf = SWP_FRAMECHANGED | SWP_NOZORDER; UINT swpf = SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOACTIVATE;
if (newStates & Qt::WindowActive)
swpf |= SWP_NOACTIVATE;
if (!m_savedFrameGeometry.isValid()) if (!m_savedFrameGeometry.isValid())
swpf |= SWP_NOSIZE | SWP_NOMOVE; swpf |= SWP_NOSIZE | SWP_NOMOVE;
const bool wasSync = testFlag(SynchronousGeometryChangeEvent); const bool wasSync = testFlag(SynchronousGeometryChangeEvent);
@ -1279,20 +1266,20 @@ void QWindowsWindow::setWindowState_sys(Qt::WindowState newState)
clearFlag(SynchronousGeometryChangeEvent); clearFlag(SynchronousGeometryChangeEvent);
// preserve maximized state // preserve maximized state
if (visible) if (visible)
ShowWindow(m_data.hwnd, (newStates & Qt::WindowMaximized) ? max : normal); ShowWindow(m_data.hwnd, (newState == Qt::WindowMaximized) ? SW_MAXIMIZE : SW_SHOWNOACTIVATE);
m_savedStyle = 0; m_savedStyle = 0;
m_savedFrameGeometry = QRect(); m_savedFrameGeometry = QRect();
} }
} }
if ((oldStates & Qt::WindowMinimized) != (newStates & Qt::WindowMinimized)) { if ((oldState == Qt::WindowMinimized) != (newState == Qt::WindowMinimized)) {
if (visible) if (visible)
ShowWindow(m_data.hwnd, (newStates & Qt::WindowMinimized) ? min : ShowWindow(m_data.hwnd, (newState == Qt::WindowMinimized) ? SW_MINIMIZE :
(newStates & Qt::WindowMaximized) ? max : normal); (newState == Qt::WindowMaximized) ? SW_MAXIMIZE : SW_SHOWNOACTIVATE);
} }
if (QWindowsContext::verboseWindows) if (QWindowsContext::verboseWindows)
qDebug() << '<' << __FUNCTION__ << this << window() qDebug() << '<' << __FUNCTION__ << this << window()
<< debugWindowStates(newStates); << debugWindowStates(newState);
} }
void QWindowsWindow::setStyle(unsigned s) const void QWindowsWindow::setStyle(unsigned s) const

View File

@ -1701,22 +1701,18 @@ void tst_QWidget::activation()
widget2.showMinimized(); widget2.showMinimized();
QTest::qWait(waitTime); QTest::qWait(waitTime);
QEXPECT_FAIL("", "QTBUG-26418", Continue);
QVERIFY(qApp->activeWindow() == &widget1); QVERIFY(qApp->activeWindow() == &widget1);
widget2.showMaximized(); widget2.showMaximized();
QTest::qWait(waitTime); QTest::qWait(waitTime);
QVERIFY(qApp->activeWindow() == &widget2); QVERIFY(qApp->activeWindow() == &widget2);
widget2.showMinimized(); widget2.showMinimized();
QTest::qWait(waitTime); QTest::qWait(waitTime);
QEXPECT_FAIL("", "QTBUG-26418", Continue);
QVERIFY(qApp->activeWindow() == &widget1); QVERIFY(qApp->activeWindow() == &widget1);
widget2.showNormal(); widget2.showNormal();
QTest::qWait(waitTime); QTest::qWait(waitTime);
#if 0 // QTBUG-26418, widget2 is always set to active
#ifndef Q_OS_WINCE #ifndef Q_OS_WINCE
if (QSysInfo::WindowsVersion >= QSysInfo::WV_VISTA) if (QSysInfo::WindowsVersion >= QSysInfo::WV_VISTA)
QEXPECT_FAIL("", "MS introduced new behavior after XP", Continue); QEXPECT_FAIL("", "MS introduced new behavior after XP", Continue);
#endif
#endif #endif
QTest::qWait(waitTime); QTest::qWait(waitTime);
QVERIFY(qApp->activeWindow() == &widget2); QVERIFY(qApp->activeWindow() == &widget2);