summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/kernel/qscreen.cpp31
-rw-r--r--src/gui/kernel/qwindow.cpp25
-rw-r--r--src/gui/kernel/qwindow.h3
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 *);