diff options
author | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-08-12 13:21:42 +0200 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-08-17 15:08:39 +0200 |
commit | c54a5b83804c00474d141b485b752a7c54169ebf (patch) | |
tree | 9016e1579b219072547a4d6892f500929e01e3c8 /src/widgets/kernel/qdesktopwidget.cpp | |
parent | c4366ff0183a9a4a5c6eff0312b713e9c5eb97ea (diff) |
Introduce QWidget::setScreen
Follows the QWindow semantics, and is a replacement for creating
a QWidget with a QDesktopScreenWidget as the parent.
We can now remove much of the special handling of QDesktopWidget and
the Qt::Desktop window type, and get rid of QDesktopScreenWidget.
Add a manual test that allows local testing. Our CI environments
only have a single screen, and no multi-head display server setup
which is the primary case where QWidget::setScreen is interesting.
For the more common case of a virtual desktop, QWidget::setScreen
has no real impact (just as QWindow::setScreen doesn't).
Change-Id: Id0099e069d316741bacd8c795c396ccad37be297
Fixes: QTBUG-85483
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src/widgets/kernel/qdesktopwidget.cpp')
-rw-r--r-- | src/widgets/kernel/qdesktopwidget.cpp | 32 |
1 files changed, 8 insertions, 24 deletions
diff --git a/src/widgets/kernel/qdesktopwidget.cpp b/src/widgets/kernel/qdesktopwidget.cpp index 797980c7c5..db8c33c498 100644 --- a/src/widgets/kernel/qdesktopwidget.cpp +++ b/src/widgets/kernel/qdesktopwidget.cpp @@ -48,26 +48,6 @@ QT_BEGIN_NAMESPACE -QDesktopScreenWidget::QDesktopScreenWidget(QScreen *screen, const QRect &geometry) - : QWidget(nullptr, Qt::Desktop) -{ - setVisible(false); - if (QWindow *winHandle = windowHandle()) - winHandle->setScreen(screen); - setGeometry(geometry); -} - -QScreen *QDesktopScreenWidget::screen() const -{ - const QDesktopWidgetPrivate *desktopWidgetP - = static_cast<const QDesktopWidgetPrivate *>(qt_widget_private(QApplication::desktop())); - for (auto it : qAsConst(desktopWidgetP->screenWidgets)) { - if (it.second == this) - return it.first; - } - return nullptr; -} - QDesktopWidgetPrivate::~QDesktopWidgetPrivate() { qDeleteAll(screenWidgets.values()); @@ -81,15 +61,19 @@ void QDesktopWidgetPrivate::updateScreens() // Re-build our screens list. This is the easiest way to later compute which signals to emit. // Create new screen widgets as necessary. // Furthermore, we note which screens have changed, and compute the overall virtual geometry. - QFlatMap<QScreen*, QDesktopScreenWidget*> newScreenWidgets; + QFlatMap<QScreen*, QWidget*> newScreenWidgets; QRegion virtualGeometry; for (QScreen *screen : screenList) { const QRect screenGeometry = screen->geometry(); - QDesktopScreenWidget *screenWidget = screenWidgets.value(screen); + QWidget *screenWidget = screenWidgets.value(screen); if (!screenWidget) { // a new screen, create a widget and connect the signals. - screenWidget = new QDesktopScreenWidget(screen, screenGeometry); + screenWidget = new QWidget(nullptr, Qt::Desktop); + screenWidget->setVisible(false); + screenWidget->setScreen(screen); + screenWidget->setGeometry(screenGeometry); + screenWidget->setObjectName(QLatin1String("qt_desktop_widget_%1").arg(screen->name())); QObjectPrivate::connect(screen, &QScreen::geometryChanged, this, &QDesktopWidgetPrivate::updateScreens, Qt::QueuedConnection); QObjectPrivate::connect(screen, &QObject::destroyed, @@ -105,7 +89,7 @@ void QDesktopWidgetPrivate::updateScreens() Q_ASSERT(screenWidgets.size() == screenList.length()); q->setGeometry(virtualGeometry.boundingRect()); - // Delete the QDesktopScreenWidget that are not used any more. + // Delete the screen widgets that are not used any more. for (auto it : qAsConst(newScreenWidgets)) { if (!screenWidgets.contains(it.first)) delete it.second; |