diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/global/qnamespace.qdoc | 2 | ||||
-rw-r--r-- | src/gui/accessible/qaccessible.cpp | 2 | ||||
-rw-r--r-- | src/widgets/accessible/qaccessiblewidgetfactory.cpp | 2 | ||||
-rw-r--r-- | src/widgets/kernel/qdesktopwidget.cpp | 32 | ||||
-rw-r--r-- | src/widgets/kernel/qdesktopwidget_p.h | 12 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 44 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.h | 3 | ||||
-rw-r--r-- | src/widgets/widgets/qmenu.cpp | 2 |
8 files changed, 36 insertions, 63 deletions
diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc index f63b58f515..ad79e279be 100644 --- a/src/corelib/global/qnamespace.qdoc +++ b/src/corelib/global/qnamespace.qdoc @@ -2173,7 +2173,7 @@ \value SplashScreen Indicates that the window is a splash screen. This is the default type for QSplashScreen. - \value Desktop Indicates that this widget is the desktop. This + \omitvalue Desktop Indicates that this widget is the desktop. This is the type for QDesktopWidget. \value SubWindow Indicates that this widget is a sub-window, such diff --git a/src/gui/accessible/qaccessible.cpp b/src/gui/accessible/qaccessible.cpp index 22d94fad79..7fca4fb0f7 100644 --- a/src/gui/accessible/qaccessible.cpp +++ b/src/gui/accessible/qaccessible.cpp @@ -707,7 +707,7 @@ QAccessibleInterface *QAccessible::queryAccessibleInterface(QObject *object) QAccessiblePlugin *factory = qAccessiblePlugins()->value(cn); if (factory) { QAccessibleInterface *result = factory->create(cn, object); - if (result) { // Need this condition because of QDesktopScreenWidget + if (result) { QAccessibleCache::instance()->insert(object, result); Q_ASSERT(QAccessibleCache::instance()->containsObject(object)); } diff --git a/src/widgets/accessible/qaccessiblewidgetfactory.cpp b/src/widgets/accessible/qaccessiblewidgetfactory.cpp index d59da86076..4c6a6fdecb 100644 --- a/src/widgets/accessible/qaccessiblewidgetfactory.cpp +++ b/src/widgets/accessible/qaccessiblewidgetfactory.cpp @@ -222,8 +222,6 @@ QAccessibleInterface *qAccessibleFactory(const QString &classname, QObject *obje iface = new QAccessibleDockWidget(widget); #endif - } else if (classname == QLatin1String("QDesktopScreenWidget")) { - iface = nullptr; } else if (classname == QLatin1String("QWidget")) { iface = new QAccessibleWidget(widget); } else if (classname == QLatin1String("QWindowContainer")) { 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; diff --git a/src/widgets/kernel/qdesktopwidget_p.h b/src/widgets/kernel/qdesktopwidget_p.h index f0664794bc..c17036b9d0 100644 --- a/src/widgets/kernel/qdesktopwidget_p.h +++ b/src/widgets/kernel/qdesktopwidget_p.h @@ -77,26 +77,18 @@ private: friend class QApplicationPrivate; }; -class QDesktopScreenWidget : public QWidget { - Q_OBJECT -public: - explicit QDesktopScreenWidget(QScreen *, const QRect &geometry); - - QScreen *screen() const; -}; - class QDesktopWidgetPrivate : public QWidgetPrivate { Q_DECLARE_PUBLIC(QDesktopWidget) public: ~QDesktopWidgetPrivate(); void updateScreens(); - QDesktopScreenWidget *widgetForScreen(QScreen *qScreen) const + QWidget *widgetForScreen(QScreen *qScreen) const { return screenWidgets.value(qScreen); } - QFlatMap<QScreen*, QDesktopScreenWidget*> screenWidgets; + QFlatMap<QScreen*, QWidget*> screenWidgets; }; QT_END_NAMESPACE diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 2bfb4c3096..38f51e270e 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -42,7 +42,6 @@ #include "qapplication_p.h" #include "qbrush.h" #include "qcursor.h" -#include "qdesktopwidget_p.h" #include "qevent.h" #include "qlayout.h" #if QT_CONFIG(menu) @@ -990,13 +989,6 @@ void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f) if (allWidgets) allWidgets->insert(q); - QScreen *targetScreen = nullptr; - if (parentWidget && parentWidget->windowType() == Qt::Desktop) { - const QDesktopScreenWidget *sw = qobject_cast<const QDesktopScreenWidget *>(parentWidget); - targetScreen = sw ? sw->screen() : nullptr; - parentWidget = nullptr; - } - q->data = &data; #if QT_CONFIG(thread) @@ -1006,12 +998,6 @@ void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f) } #endif - if (targetScreen) { - topData()->initialScreen = targetScreen; - if (QWindow *window = q->windowHandle()) - window->setScreen(targetScreen); - } - data.fstrut_dirty = true; data.winid = 0; @@ -2424,8 +2410,7 @@ bool QWidgetPrivate::setScreen(QScreen *screen) return false; const QScreen *currentScreen = windowHandle() ? windowHandle()->screen() : nullptr; if (currentScreen != screen) { - if (!windowHandle()) // Try to create a window handle if not created. - createWinId(); + topData()->initialScreen = screen; if (windowHandle()) windowHandle()->setScreen(screen); return true; @@ -2514,6 +2499,24 @@ QScreen *QWidget::screen() const return QGuiApplication::primaryScreen(); } +/*! + Sets the screen on which the widget should be shown to \a screen. + + Setting the screen only makes sense for windows. If necessary, the widget's + window will get recreated on \a screen. + + \note If the screen is part of a virtual desktop of multiple screens, + the window will not move automatically to \a newScreen. To place the + window relative to the screen, use the screen's topLeft() position. + + \sa QWindow::setScreen +*/ +void QWidget::setScreen(QScreen *screen) +{ + Q_D(QWidget); + d->setScreen(screen); +} + #ifndef QT_NO_STYLE_STYLESHEET /*! @@ -10508,8 +10511,7 @@ void QWidgetPrivate::setParent_sys(QWidget *newparent, Qt::WindowFlags f) if (newparent && newparent->windowType() == Qt::Desktop) { // make sure the widget is created on the same screen as the // programmer specified desktop widget - const QDesktopScreenWidget *sw = qobject_cast<const QDesktopScreenWidget *>(newparent); - targetScreen = sw ? sw->screen() : nullptr; + targetScreen = newparent->screen(); newparent = nullptr; } @@ -10539,10 +10541,8 @@ void QWidgetPrivate::setParent_sys(QWidget *newparent, Qt::WindowFlags f) if (!newparent) { f |= Qt::Window; - if (!targetScreen) { - if (parent) - targetScreen = q->parentWidget()->window()->screen(); - } + if (parent) + targetScreen = q->parentWidget()->window()->screen(); } bool explicitlyHidden = q->testAttribute(Qt::WA_WState_Hidden) && q->testAttribute(Qt::WA_WState_ExplicitShowHide); diff --git a/src/widgets/kernel/qwidget.h b/src/widgets/kernel/qwidget.h index 2bfff96252..6f4c709c10 100644 --- a/src/widgets/kernel/qwidget.h +++ b/src/widgets/kernel/qwidget.h @@ -598,11 +598,10 @@ public: QWindow *windowHandle() const; QScreen *screen() const; + void setScreen(QScreen *); static QWidget *createWindowContainer(QWindow *window, QWidget *parent=nullptr, Qt::WindowFlags flags=Qt::WindowFlags()); - friend class QDesktopScreenWidget; - Q_SIGNALS: void windowTitleChanged(const QString &title); void windowIconChanged(const QIcon &icon); diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp index 74420ecb2c..9528be17b7 100644 --- a/src/widgets/widgets/qmenu.cpp +++ b/src/widgets/widgets/qmenu.cpp @@ -2377,7 +2377,7 @@ void QMenuPrivate::popup(const QPoint &p, QAction *atAction, PositionFunction po updateLayoutDirection(); // Ensure that we get correct sizeHints by placing this window on the correct screen. - // However if the QMenu was constructed with a QDesktopScreenWidget as its parent, + // However if the QMenu was constructed with a Qt::Desktop widget as its parent, // then initialScreenIndex was set, so we should respect that for the lifetime of this menu. // However if eventLoop exists, then exec() already did this by calling createWinId(); so leave it alone. (QTBUG-76162) if (!eventLoop) { |