summaryrefslogtreecommitdiffstats
path: root/src/widgets/kernel/qdesktopwidget.cpp
diff options
context:
space:
mode:
authorVolker Hilsheimer <volker.hilsheimer@qt.io>2020-08-12 13:21:42 +0200
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2020-08-17 15:08:39 +0200
commitc54a5b83804c00474d141b485b752a7c54169ebf (patch)
tree9016e1579b219072547a4d6892f500929e01e3c8 /src/widgets/kernel/qdesktopwidget.cpp
parentc4366ff0183a9a4a5c6eff0312b713e9c5eb97ea (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.cpp32
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;