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:
parent
30ec535cb6
commit
a992a12bec
@ -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
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user