diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/kernel/qscreen.cpp | 31 | ||||
-rw-r--r-- | src/gui/kernel/qwindow.cpp | 25 | ||||
-rw-r--r-- | src/gui/kernel/qwindow.h | 3 |
3 files changed, 30 insertions, 29 deletions
diff --git a/src/gui/kernel/qscreen.cpp b/src/gui/kernel/qscreen.cpp index 6594565c15..8357e14354 100644 --- a/src/gui/kernel/qscreen.cpp +++ b/src/gui/kernel/qscreen.cpp @@ -72,8 +72,35 @@ QScreen::QScreen(QPlatformScreen *screen) */ QScreen::~QScreen() { - if (qApp) - Q_EMIT qApp->screenRemoved(this); + if (!qApp) + return; + + // Allow clients to manage windows that are affected by the screen going + // away, before we fall back to moving them to the primary screen. + emit qApp->screenRemoved(this); + + if (QGuiApplication::closingDown()) + return; + + QScreen *primaryScreen = QGuiApplication::primaryScreen(); + if (this == primaryScreen) + return; + + bool movingFromVirtualSibling = primaryScreen->handle()->virtualSiblings().contains(handle()); + + // Move any leftover windows to the primary screen + foreach (QWindow *window, QGuiApplication::topLevelWindows()) { + if (window->screen() != this) + continue; + + const bool wasVisible = window->isVisible(); + window->setScreen(primaryScreen); + + // Re-show window if moved from a virtual sibling screen. Otherwise + // leave it up to the application developer to show the window. + if (movingFromVirtualSibling) + window->setVisible(wasVisible); + } } /*! diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index ced39bbe10..b679dd9bfc 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -344,20 +344,14 @@ inline bool QWindowPrivate::windowRecreationRequired(QScreen *newScreen) const inline void QWindowPrivate::disconnectFromScreen() { - if (topLevelScreen) { - Q_Q(QWindow); - QObject::disconnect(topLevelScreen, &QObject::destroyed, q, &QWindow::screenDestroyed); + if (topLevelScreen) topLevelScreen = 0; - } } void QWindowPrivate::connectToScreen(QScreen *screen) { - Q_Q(QWindow); disconnectFromScreen(); topLevelScreen = screen; - if (topLevelScreen) - QObject::connect(topLevelScreen, &QObject::destroyed, q, &QWindow::screenDestroyed); } void QWindowPrivate::emitScreenChangedRecursion(QScreen *newScreen) @@ -1712,23 +1706,6 @@ void QWindow::setScreen(QScreen *newScreen) d->setTopLevelScreen(newScreen, true /* recreate */); } -void QWindow::screenDestroyed(QObject *object) -{ - Q_D(QWindow); - if (d->parentWindow || QGuiApplication::closingDown()) - return; - if (object == static_cast<QObject *>(d->topLevelScreen)) { - const bool wasVisible = isVisible(); - setScreen(0); - // destroy() might have hidden our window, show it again. - // This might not be the best behavior if the new screen isn't a virtual sibling - // of the old one. This can be removed once platform plugins have the power to - // update the QScreen of its QWindows itself. - if (wasVisible && d->platformWindow) - setVisible(true); - } -} - /*! \fn QWindow::screenChanged(QScreen *screen) diff --git a/src/gui/kernel/qwindow.h b/src/gui/kernel/qwindow.h index 350cd8af24..1a43ac6fc2 100644 --- a/src/gui/kernel/qwindow.h +++ b/src/gui/kernel/qwindow.h @@ -314,9 +314,6 @@ Q_SIGNALS: Q_REVISION(1) void opacityChanged(qreal opacity); -private Q_SLOTS: - void screenDestroyed(QObject *screen); - protected: virtual void exposeEvent(QExposeEvent *); virtual void resizeEvent(QResizeEvent *); |