summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/corelib/global/qnamespace.qdoc2
-rw-r--r--src/gui/accessible/qaccessible.cpp2
-rw-r--r--src/widgets/accessible/qaccessiblewidgetfactory.cpp2
-rw-r--r--src/widgets/kernel/qdesktopwidget.cpp32
-rw-r--r--src/widgets/kernel/qdesktopwidget_p.h12
-rw-r--r--src/widgets/kernel/qwidget.cpp44
-rw-r--r--src/widgets/kernel/qwidget.h3
-rw-r--r--src/widgets/widgets/qmenu.cpp2
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) {