summaryrefslogtreecommitdiffstats
path: root/src/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/.prev_CMakeLists.txt2
-rw-r--r--src/widgets/CMakeLists.txt2
-rw-r--r--src/widgets/dialogs/qcolordialog.cpp3
-rw-r--r--src/widgets/dialogs/qdialog.cpp1
-rw-r--r--src/widgets/dialogs/qmessagebox.cpp1
-rw-r--r--src/widgets/dialogs/qwizard.cpp1
-rw-r--r--src/widgets/dialogs/qwizard_win.cpp1
-rw-r--r--src/widgets/graphicsview/qgraphicsscene.cpp1
-rw-r--r--src/widgets/graphicsview/qgraphicsview.cpp2
-rw-r--r--src/widgets/kernel/kernel.pri1
-rw-r--r--src/widgets/kernel/qapplication.cpp22
-rw-r--r--src/widgets/kernel/qapplication.h3
-rw-r--r--src/widgets/kernel/qdesktopwidget.cpp182
-rw-r--r--src/widgets/kernel/qdesktopwidget.h72
-rw-r--r--src/widgets/kernel/qdesktopwidget_p.h100
-rw-r--r--src/widgets/kernel/qtooltip.cpp32
-rw-r--r--src/widgets/kernel/qwhatsthis.cpp1
-rw-r--r--src/widgets/kernel/qwidget.cpp45
-rw-r--r--src/widgets/kernel/qwidget_p.h36
-rw-r--r--src/widgets/util/qcompleter.cpp3
-rw-r--r--src/widgets/util/qscroller.cpp1
-rw-r--r--src/widgets/util/qsystemtrayicon.cpp5
-rw-r--r--src/widgets/widgets/qcombobox.cpp10
-rw-r--r--src/widgets/widgets/qcombobox_p.h2
-rw-r--r--src/widgets/widgets/qdatetimeedit.cpp1
-rw-r--r--src/widgets/widgets/qdockarealayout.cpp3
-rw-r--r--src/widgets/widgets/qdockwidget.cpp1
-rw-r--r--src/widgets/widgets/qeffects.cpp14
-rw-r--r--src/widgets/widgets/qfontcombobox.cpp3
-rw-r--r--src/widgets/widgets/qmdiarea.cpp3
-rw-r--r--src/widgets/widgets/qmenu.cpp14
-rw-r--r--src/widgets/widgets/qmenu_p.h2
-rw-r--r--src/widgets/widgets/qmenubar.cpp3
-rw-r--r--src/widgets/widgets/qpushbutton.cpp3
-rw-r--r--src/widgets/widgets/qsizegrip.cpp3
-rw-r--r--src/widgets/widgets/qsplashscreen.cpp14
-rw-r--r--src/widgets/widgets/qtabwidget.cpp1
-rw-r--r--src/widgets/widgets/qtextbrowser.cpp1
-rw-r--r--src/widgets/widgets/qtoolbutton.cpp1
-rw-r--r--src/widgets/widgets/qwidgetresizehandler.cpp3
-rw-r--r--src/widgets/widgets/qwidgettextcontrol.cpp6
41 files changed, 207 insertions, 398 deletions
diff --git a/src/widgets/.prev_CMakeLists.txt b/src/widgets/.prev_CMakeLists.txt
index 0e7aaaf793..971791c363 100644
--- a/src/widgets/.prev_CMakeLists.txt
+++ b/src/widgets/.prev_CMakeLists.txt
@@ -12,7 +12,7 @@ qt_add_module(Widgets
itemviews/qfileiconprovider.cpp itemviews/qfileiconprovider.h itemviews/qfileiconprovider_p.h
kernel/qapplication.cpp kernel/qapplication.h kernel/qapplication_p.h
kernel/qboxlayout.cpp kernel/qboxlayout.h
- kernel/qdesktopwidget.cpp kernel/qdesktopwidget.h kernel/qdesktopwidget_p.h
+ kernel/qdesktopwidget.cpp kernel/qdesktopwidget_p.h
kernel/qgesture.cpp kernel/qgesture.h kernel/qgesture_p.h
kernel/qgesturemanager.cpp kernel/qgesturemanager_p.h
kernel/qgesturerecognizer.cpp kernel/qgesturerecognizer.h
diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt
index 400df76d70..84ed6f7fa9 100644
--- a/src/widgets/CMakeLists.txt
+++ b/src/widgets/CMakeLists.txt
@@ -12,7 +12,7 @@ qt_add_module(Widgets
itemviews/qfileiconprovider.cpp itemviews/qfileiconprovider.h itemviews/qfileiconprovider_p.h
kernel/qapplication.cpp kernel/qapplication.h kernel/qapplication_p.h
kernel/qboxlayout.cpp kernel/qboxlayout.h
- kernel/qdesktopwidget.cpp kernel/qdesktopwidget.h kernel/qdesktopwidget_p.h
+ kernel/qdesktopwidget.cpp kernel/qdesktopwidget_p.h
kernel/qgesture.cpp kernel/qgesture.h kernel/qgesture_p.h
kernel/qgesturemanager.cpp kernel/qgesturemanager_p.h
kernel/qgesturerecognizer.cpp kernel/qgesturerecognizer.h
diff --git a/src/widgets/dialogs/qcolordialog.cpp b/src/widgets/dialogs/qcolordialog.cpp
index a605c35b05..8e5895f48b 100644
--- a/src/widgets/dialogs/qcolordialog.cpp
+++ b/src/widgets/dialogs/qcolordialog.cpp
@@ -40,7 +40,6 @@
#include "qcolordialog.h"
#include "qapplication.h"
-#include "qdesktopwidget.h"
#include <private/qdesktopwidget_p.h>
#include "qdrawutil.h"
#include "qevent.h"
@@ -1565,7 +1564,7 @@ bool QColorDialogPrivate::selectColor(const QColor &col)
QColor QColorDialogPrivate::grabScreenColor(const QPoint &p)
{
- const QDesktopWidget *desktop = QApplication::desktop();
+ const QWidget *desktop = QApplication::desktop();
const QPixmap pixmap = QGuiApplication::primaryScreen()->grabWindow(desktop->winId(), p.x(), p.y(), 1, 1);
QImage i = pixmap.toImage();
return i.pixel(0, 0);
diff --git a/src/widgets/dialogs/qdialog.cpp b/src/widgets/dialogs/qdialog.cpp
index 14cfe6800c..0f0e213e71 100644
--- a/src/widgets/dialogs/qdialog.cpp
+++ b/src/widgets/dialogs/qdialog.cpp
@@ -49,7 +49,6 @@
#endif
#include "qevent.h"
-#include "qdesktopwidget.h"
#include <private/qdesktopwidget_p.h>
#include "qapplication.h"
#include "qlayout.h"
diff --git a/src/widgets/dialogs/qmessagebox.cpp b/src/widgets/dialogs/qmessagebox.cpp
index c65d91cf9e..e0edc2f755 100644
--- a/src/widgets/dialogs/qmessagebox.cpp
+++ b/src/widgets/dialogs/qmessagebox.cpp
@@ -47,7 +47,6 @@
#include <QtWidgets/qstyle.h>
#include <QtWidgets/qstyleoption.h>
#include <QtWidgets/qgridlayout.h>
-#include <QtWidgets/qdesktopwidget.h>
#include <QtWidgets/qpushbutton.h>
#include <QtWidgets/qcheckbox.h>
#include <QtGui/qaccessible.h>
diff --git a/src/widgets/dialogs/qwizard.cpp b/src/widgets/dialogs/qwizard.cpp
index c7aac8b9da..ff2f202bb4 100644
--- a/src/widgets/dialogs/qwizard.cpp
+++ b/src/widgets/dialogs/qwizard.cpp
@@ -47,7 +47,6 @@
#include "qapplication.h"
#include "qboxlayout.h"
#include "qlayoutitem.h"
-#include "qdesktopwidget.h"
#include <private/qdesktopwidget_p.h>
#include "qevent.h"
#include "qframe.h"
diff --git a/src/widgets/dialogs/qwizard_win.cpp b/src/widgets/dialogs/qwizard_win.cpp
index e87d117a3c..1ec8fe8d91 100644
--- a/src/widgets/dialogs/qwizard_win.cpp
+++ b/src/widgets/dialogs/qwizard_win.cpp
@@ -52,7 +52,6 @@
#include <QtCore/QDebug>
#include <QtGui/QMouseEvent>
#include <QtGui/QWindow>
-#include <QtWidgets/QDesktopWidget>
#include <uxtheme.h>
#include <vssym32.h>
diff --git a/src/widgets/graphicsview/qgraphicsscene.cpp b/src/widgets/graphicsview/qgraphicsscene.cpp
index f093dc1644..e64f7cda9d 100644
--- a/src/widgets/graphicsview/qgraphicsscene.cpp
+++ b/src/widgets/graphicsview/qgraphicsscene.cpp
@@ -226,7 +226,6 @@
#include <QtCore/qvarlengtharray.h>
#include <QtCore/QMetaMethod>
#include <QtWidgets/qapplication.h>
-#include <QtWidgets/qdesktopwidget.h>
#include <QtGui/qevent.h>
#include <QtWidgets/qgraphicslayout.h>
#include <QtWidgets/qgraphicsproxywidget.h>
diff --git a/src/widgets/graphicsview/qgraphicsview.cpp b/src/widgets/graphicsview/qgraphicsview.cpp
index 43ee163591..be097447e5 100644
--- a/src/widgets/graphicsview/qgraphicsview.cpp
+++ b/src/widgets/graphicsview/qgraphicsview.cpp
@@ -285,8 +285,6 @@ static const int QGRAPHICSVIEW_PREALLOC_STYLE_OPTIONS = 503; // largest prime <
#include <QtCore/qmath.h>
#include <QtCore/qscopedvaluerollback.h>
#include <QtWidgets/qapplication.h>
-#include <QtWidgets/qdesktopwidget.h>
-#include <private/qdesktopwidget_p.h>
#include <QtGui/qevent.h>
#include <QtWidgets/qlayout.h>
#include <QtGui/qtransform.h>
diff --git a/src/widgets/kernel/kernel.pri b/src/widgets/kernel/kernel.pri
index b9dfdef5ee..462897b886 100644
--- a/src/widgets/kernel/kernel.pri
+++ b/src/widgets/kernel/kernel.pri
@@ -11,7 +11,6 @@ HEADERS += \
kernel/qapplication_p.h \
kernel/qwidgetrepaintmanager_p.h \
kernel/qboxlayout.h \
- kernel/qdesktopwidget.h \
kernel/qgridlayout.h \
kernel/qlayout.h \
kernel/qlayout_p.h \
diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp
index 0e96e8bc69..1af94efdf9 100644
--- a/src/widgets/kernel/qapplication.cpp
+++ b/src/widgets/kernel/qapplication.cpp
@@ -42,7 +42,7 @@
#include "qapplication.h"
#include "qclipboard.h"
#include "qcursor.h"
-#include "qdesktopwidget.h"
+#include "qdesktopwidget_p.h"
#include "qdir.h"
#include "qevent.h"
#include "qfile.h"
@@ -2521,22 +2521,30 @@ void QApplicationPrivate::sendSyntheticEnterLeave(QWidget *widget)
/*!
\internal
- Returns the desktop widget (also called the root window).
+ Returns the desktop widget (also called the root window) for \a screen.
+
+ If \a screen is nullptr, then the widget that represents the entire virtual
+ desktop is returned, and its geometry will be the union of all screens.
+
+ Use the desktop widget for a specific screen as the parent of a new toplevel
+ widget to position the widget on a specific screen.
The desktop may be composed of multiple screens, so it would be incorrect,
for example, to attempt to \e center some widget in the desktop's geometry.
- QDesktopWidget has various functions for obtaining useful geometries upon
- the desktop, such as QDesktopWidget::screenGeometry() and
- QDesktopWidget::availableGeometry().
+ Use QScreen::geometry() and QScreen::availableGeometry() to get the dimensions
+ of a specific screen instead.
*/
-QDesktopWidget *QApplication::desktop()
+QWidget *QApplication::desktop(QScreen *screen)
{
CHECK_QAPP_INSTANCE(nullptr)
if (!qt_desktopWidget || // not created yet
!(qt_desktopWidget->windowType() == Qt::Desktop)) { // reparented away
qt_desktopWidget = new QDesktopWidget();
}
- return qt_desktopWidget;
+ if (!screen)
+ return qt_desktopWidget;
+ QDesktopWidgetPrivate *dwp = static_cast<QDesktopWidgetPrivate*>(qt_widget_private(qt_desktopWidget));
+ return dwp->widgetForScreen(screen);
}
/*
diff --git a/src/widgets/kernel/qapplication.h b/src/widgets/kernel/qapplication.h
index 1903aa48dc..36a7576c2d 100644
--- a/src/widgets/kernel/qapplication.h
+++ b/src/widgets/kernel/qapplication.h
@@ -51,7 +51,6 @@
QT_BEGIN_NAMESPACE
-class QDesktopWidget;
class QStyle;
class QEventLoop;
class QIcon;
@@ -106,7 +105,7 @@ public:
static QWidgetList allWidgets();
static QWidgetList topLevelWidgets();
- static QDesktopWidget *desktop();
+ static QWidget *desktop(QScreen *screen = nullptr);
static QWidget *activePopupWidget();
static QWidget *activeModalWidget();
diff --git a/src/widgets/kernel/qdesktopwidget.cpp b/src/widgets/kernel/qdesktopwidget.cpp
index dd74fbf53e..797980c7c5 100644
--- a/src/widgets/kernel/qdesktopwidget.cpp
+++ b/src/widgets/kernel/qdesktopwidget.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWidgets module of the Qt Toolkit.
@@ -38,7 +38,6 @@
****************************************************************************/
#include "qglobal.h"
-#include "qdesktopwidget.h"
#include "qdesktopwidget_p.h"
#include "qscreen.h"
#include "qwidget_p.h"
@@ -50,109 +49,66 @@
QT_BEGIN_NAMESPACE
QDesktopScreenWidget::QDesktopScreenWidget(QScreen *screen, const QRect &geometry)
- : QWidget(nullptr, Qt::Desktop), m_screen(screen)
+ : QWidget(nullptr, Qt::Desktop)
{
setVisible(false);
if (QWindow *winHandle = windowHandle())
winHandle->setScreen(screen);
- setScreenGeometry(geometry);
-}
-
-void QDesktopScreenWidget::setScreenGeometry(const QRect &geometry)
-{
- m_geometry = geometry;
setGeometry(geometry);
}
-int QDesktopScreenWidget::screenNumber() const
+QScreen *QDesktopScreenWidget::screen() const
{
const QDesktopWidgetPrivate *desktopWidgetP
= static_cast<const QDesktopWidgetPrivate *>(qt_widget_private(QApplication::desktop()));
- return desktopWidgetP->screens.indexOf(const_cast<QDesktopScreenWidget *>(this));
-}
-
-const QRect QDesktopWidgetPrivate::screenGeometry(const QWidget *widget)
-{
- if (Q_UNLIKELY(!widget)) {
- qWarning("QDesktopWidget::screenGeometry(): Attempt "
- "to get the screen geometry of a null widget");
- return QRect();
+ for (auto it : qAsConst(desktopWidgetP->screenWidgets)) {
+ if (it.second == this)
+ return it.first;
}
- QRect rect = QWidgetPrivate::screenGeometry(widget);
- if (rect.isNull())
- return screenGeometry(screenNumber(widget));
- else return rect;
+ return nullptr;
}
-const QRect QDesktopWidgetPrivate::availableGeometry(const QWidget *widget)
+QDesktopWidgetPrivate::~QDesktopWidgetPrivate()
{
- if (Q_UNLIKELY(!widget)) {
- qWarning("QDesktopWidget::availableGeometry(): Attempt "
- "to get the available geometry of a null widget");
- return QRect();
- }
- QRect rect = QWidgetPrivate::screenGeometry(widget);
- if (rect.isNull())
- return availableGeometry(screenNumber(widget));
- else
- return rect;
+ qDeleteAll(screenWidgets.values());
}
-QDesktopScreenWidget *QDesktopWidgetPrivate::widgetForScreen(QScreen *qScreen) const
-{
- foreach (QDesktopScreenWidget *widget, screens) {
- if (widget->assignedScreen() == qScreen)
- return widget;
- }
- return nullptr;
-}
-
-void QDesktopWidgetPrivate::_q_updateScreens()
+void QDesktopWidgetPrivate::updateScreens()
{
Q_Q(QDesktopWidget);
const QList<QScreen *> screenList = QGuiApplication::screens();
- const int targetLength = screenList.length();
// Re-build our screens list. This is the easiest way to later compute which signals to emit.
- // Create new screen widgets as necessary. While iterating, keep the old list in place so
- // that widgetForScreen works.
+ // Create new screen widgets as necessary.
// Furthermore, we note which screens have changed, and compute the overall virtual geometry.
- QList<QDesktopScreenWidget *> newScreens;
- QList<int> changedScreens;
+ QFlatMap<QScreen*, QDesktopScreenWidget*> newScreenWidgets;
QRegion virtualGeometry;
- for (int i = 0; i < targetLength; ++i) {
- QScreen *qScreen = screenList.at(i);
- const QRect screenGeometry = qScreen->geometry();
- QDesktopScreenWidget *screenWidget = widgetForScreen(qScreen);
- if (screenWidget) {
- // an old screen. update geometry and remember the index in the *new* list
- if (screenGeometry != screenWidget->screenGeometry()) {
- screenWidget->setScreenGeometry(screenGeometry);
- changedScreens.push_back(i);
- }
- } else {
+ for (QScreen *screen : screenList) {
+ const QRect screenGeometry = screen->geometry();
+ QDesktopScreenWidget *screenWidget = screenWidgets.value(screen);
+ if (!screenWidget) {
// a new screen, create a widget and connect the signals.
- screenWidget = new QDesktopScreenWidget(qScreen, screenGeometry);
- QObject::connect(qScreen, SIGNAL(geometryChanged(QRect)),
- q, SLOT(_q_updateScreens()), Qt::QueuedConnection);
- QObject::connect(qScreen, SIGNAL(destroyed()),
- q, SLOT(_q_updateScreens()), Qt::QueuedConnection);
+ screenWidget = new QDesktopScreenWidget(screen, screenGeometry);
+ QObjectPrivate::connect(screen, &QScreen::geometryChanged,
+ this, &QDesktopWidgetPrivate::updateScreens, Qt::QueuedConnection);
+ QObjectPrivate::connect(screen, &QObject::destroyed,
+ this, &QDesktopWidgetPrivate::updateScreens, Qt::QueuedConnection);
}
// record all the screens and the overall geometry.
- newScreens.push_back(screenWidget);
+ newScreenWidgets.insert(screen, screenWidget);
virtualGeometry += screenGeometry;
}
// Now we apply the accumulated updates.
- screens.swap(newScreens); // now [newScreens] is the old screen list
- Q_ASSERT(screens.size() == targetLength);
+ qSwap(screenWidgets, newScreenWidgets); // now [newScreenWidgets] is the old screen list
+ Q_ASSERT(screenWidgets.size() == screenList.length());
q->setGeometry(virtualGeometry.boundingRect());
// Delete the QDesktopScreenWidget that are not used any more.
- foreach (QDesktopScreenWidget *screen, newScreens) {
- if (!screens.contains(screen))
- delete screen;
+ for (auto it : qAsConst(newScreenWidgets)) {
+ if (!screenWidgets.contains(it.first))
+ delete it.second;
}
}
@@ -161,90 +117,12 @@ QDesktopWidget::QDesktopWidget()
{
Q_D(QDesktopWidget);
setObjectName(QLatin1String("desktop"));
- d->_q_updateScreens();
- connect(qApp, SIGNAL(screenAdded(QScreen*)), this, SLOT(_q_updateScreens()));
-}
-
-QDesktopWidget::~QDesktopWidget()
-{
+ d->updateScreens();
+ QObjectPrivate::connect(qApp, &QApplication::screenAdded, d, &QDesktopWidgetPrivate::updateScreens);
}
-QWidget *QDesktopWidget::screen(int screen)
-{
- Q_D(QDesktopWidget);
- if (screen < 0 || screen >= d->screens.length())
- return d->screens.at(0);
- return d->screens.at(screen);
-}
-
-const QRect QDesktopWidgetPrivate::availableGeometry(int screenNo)
-{
- const QScreen *screen = QDesktopWidgetPrivate::screen(screenNo);
- return screen ? screen->availableGeometry() : QRect();
-}
-
-const QRect QDesktopWidgetPrivate::screenGeometry(int screenNo)
-{
- const QScreen *screen = QDesktopWidgetPrivate::screen(screenNo);
- return screen ? screen->geometry() : QRect();
-}
-
-int QDesktopWidgetPrivate::screenNumber(const QWidget *w)
-{
- if (!w)
- return 0;
-
- const QList<QScreen *> allScreens = QGuiApplication::screens();
- QList<QScreen *> screens = allScreens;
- if (screens.isEmpty()) // This should never happen
- return 0;
-
- // If there is more than one virtual desktop
- if (screens.count() != screens.constFirst()->virtualSiblings().count()) {
- // Find the root widget, get a QScreen from it and use the
- // virtual siblings for checking the window position.
- if (const QScreen *winScreen = qt_widget_private(const_cast<QWidget *>(w))->associatedScreen())
- screens = winScreen->virtualSiblings();
- }
-
- // Get the screen number from window position using screen geometry
- // and proper screens.
- QRect frame = w->frameGeometry();
- if (!w->isWindow())
- frame.moveTopLeft(w->mapToGlobal(QPoint(0, 0)));
-
- QScreen *widgetScreen = nullptr;
- int largestArea = 0;
- foreach (QScreen *screen, screens) {
- const QRect deviceIndependentScreenGeometry =
- QHighDpi::fromNativePixels(screen->handle()->geometry(), screen);
- const QRect intersected = deviceIndependentScreenGeometry.intersected(frame);
- int area = intersected.width() * intersected.height();
- if (largestArea < area) {
- widgetScreen = screen;
- largestArea = area;
- }
- }
- return allScreens.indexOf(widgetScreen);
-}
-
-int QDesktopWidgetPrivate::screenNumber(const QPoint &p)
-{
- QScreen *screen = QGuiApplication::screenAt(p);
- return screen ? QGuiApplication::screens().indexOf(screen) : 0;
-}
-
-QScreen *QDesktopWidgetPrivate::screen(int screenNo)
-{
- QList<QScreen *> screens = QGuiApplication::screens();
- if (screenNo == -1)
- screenNo = 0;
- if (screenNo < 0 || screenNo >= screens.size())
- return nullptr;
- return screens.at(screenNo);
-}
+QDesktopWidget::~QDesktopWidget() = default;
QT_END_NAMESPACE
-#include "moc_qdesktopwidget.cpp"
#include "moc_qdesktopwidget_p.cpp"
diff --git a/src/widgets/kernel/qdesktopwidget.h b/src/widgets/kernel/qdesktopwidget.h
deleted file mode 100644
index 265f320b1f..0000000000
--- a/src/widgets/kernel/qdesktopwidget.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDESKTOPWIDGET_H
-#define QDESKTOPWIDGET_H
-
-#include <QtWidgets/qtwidgetsglobal.h>
-#include <QtWidgets/qwidget.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QApplication;
-class QDesktopWidgetPrivate;
-
-class Q_WIDGETS_EXPORT QDesktopWidget : public QWidget
-{
- Q_OBJECT
-public:
- QDesktopWidget();
- ~QDesktopWidget();
-
- QT_DEPRECATED_X("Use QScreen") QWidget *screen(int screen = -1);
-
-private:
- Q_DISABLE_COPY(QDesktopWidget)
- Q_DECLARE_PRIVATE(QDesktopWidget)
- Q_PRIVATE_SLOT(d_func(), void _q_updateScreens())
-
- friend class QApplication;
- friend class QApplicationPrivate;
-};
-
-QT_END_NAMESPACE
-
-#endif // QDESKTOPWIDGET_H
diff --git a/src/widgets/kernel/qdesktopwidget_p.h b/src/widgets/kernel/qdesktopwidget_p.h
index b0ac13808d..d2845af17c 100644
--- a/src/widgets/kernel/qdesktopwidget_p.h
+++ b/src/widgets/kernel/qdesktopwidget_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWidgets module of the Qt Toolkit.
@@ -52,56 +52,96 @@
#define QDESKTOPWIDGET_P_H
#include <QtWidgets/private/qtwidgetsglobal_p.h>
-#include "QDesktopWidget"
#include "private/qwidget_p.h"
-#include <QtCore/qalgorithms.h>
#include <QtGui/qscreen.h>
+#include <QtCore/private/qflatmap_p.h>
QT_BEGIN_NAMESPACE
-class QDesktopScreenWidget : public QWidget {
+class QDesktopWidgetPrivate;
+
+class Q_WIDGETS_EXPORT QDesktopWidget : public QWidget
+{
Q_OBJECT
public:
- explicit QDesktopScreenWidget(QScreen *screen, const QRect &geometry);
+ QDesktopWidget();
+ ~QDesktopWidget();
- int screenNumber() const;
- void setScreenGeometry(const QRect &geometry);
-
- QScreen *assignedScreen() const { return m_screen.data(); }
- QRect screenGeometry() const { return m_geometry; }
private:
- // The widget updates its screen and geometry automatically. We need to save them separately
- // to detect changes, and trigger the appropriate signals.
- const QPointer<QScreen> m_screen;
- QRect m_geometry;
-};
+ Q_DISABLE_COPY(QDesktopWidget)
+ Q_DECLARE_PRIVATE(QDesktopWidget)
-class QDesktopWidgetPrivate : public QWidgetPrivate {
- Q_DECLARE_PUBLIC(QDesktopWidget)
+ friend class QApplication;
+ friend class QApplicationPrivate;
+};
+class QDesktopScreenWidget : public QWidget {
+ Q_OBJECT
public:
- ~QDesktopWidgetPrivate() { qDeleteAll(screens); }
- void _q_updateScreens();
- QDesktopScreenWidget *widgetForScreen(QScreen *qScreen) const;
+ explicit QDesktopScreenWidget(QScreen *, const QRect &geometry);
- static int screenNumber(const QWidget *widget = nullptr);
- static int screenNumber(const QPoint &);
+ QScreen *screen() const;
+};
- static QScreen *screen(int screenNo = -1);
+class QDesktopWidgetPrivate : public QWidgetPrivate {
+ Q_DECLARE_PUBLIC(QDesktopWidget)
- static const QRect screenGeometry(int screen = -1);
- static const QRect screenGeometry(const QWidget *widget);
- static const QRect screenGeometry(const QPoint &point)
+public:
+ ~QDesktopWidgetPrivate();
+ void updateScreens();
+ QDesktopScreenWidget *widgetForScreen(QScreen *qScreen) const
+ {
+ return screenWidgets.value(qScreen);
+ }
+
+ static inline int screenNumber(const QWidget *widget = nullptr)
+ {
+ if (!widget)
+ return 0;
+ return QGuiApplication::screens().indexOf(widget->screen());
+ }
+
+ static inline int screenNumber(const QPoint &point)
+ {
+ int screenNo = 0;
+ if (QScreen *screen = QGuiApplication::screenAt(point))
+ screenNo = QGuiApplication::screens().indexOf(screen);
+ return screenNo;
+ }
+
+ static inline QScreen *screen(int screenNo = -1)
+ {
+ const QList<QScreen *> screens = QGuiApplication::screens();
+ if (screenNo == -1)
+ screenNo = 0;
+ if (screenNo < 0 || screenNo >= screens.size())
+ return nullptr;
+ return screens.at(screenNo);
+ }
+
+ static inline QRect screenGeometry(int screenNo = -1)
+ {
+ QRect rect;
+ if (const QScreen *s = screen(screenNo))
+ rect = s->geometry();
+ return rect;
+ }
+ static inline QRect screenGeometry(const QPoint &point)
{ return screenGeometry(screenNumber(point)); }
- static const QRect availableGeometry(int screen = -1);
- static const QRect availableGeometry(const QWidget *widget);
- static const QRect availableGeometry(const QPoint &point)
+ static inline QRect availableGeometry(int screenNo = -1)
+ {
+ QRect rect;
+ if (const QScreen *s = screen(screenNo))
+ rect = s->availableGeometry();
+ return rect;
+ }
+ static inline QRect availableGeometry(const QPoint &point)
{ return availableGeometry(screenNumber(point)); }
- QList<QDesktopScreenWidget *> screens;
+ QFlatMap<QScreen*, QDesktopScreenWidget*> screenWidgets;
};
QT_END_NAMESPACE
diff --git a/src/widgets/kernel/qtooltip.cpp b/src/widgets/kernel/qtooltip.cpp
index 80a87bb3cd..8aca4db58a 100644
--- a/src/widgets/kernel/qtooltip.cpp
+++ b/src/widgets/kernel/qtooltip.cpp
@@ -40,7 +40,6 @@
#include <QtWidgets/private/qtwidgetsglobal_p.h>
#include <qapplication.h>
-#include <qdesktopwidget.h>
#include <private/qdesktopwidget_p.h>
#include <qevent.h>
#include <qpointer.h>
@@ -139,7 +138,7 @@ public:
bool tipChanged(const QPoint &pos, const QString &text, QObject *o);
void placeTip(const QPoint &pos, QWidget *w);
- static int getTipScreen(const QPoint &pos, QWidget *w);
+ static QScreen *getTipScreen(const QPoint &pos, QWidget *w);
protected:
void timerEvent(QTimerEvent *e) override;
void paintEvent(QPaintEvent *e) override;
@@ -366,12 +365,12 @@ bool QTipLabel::eventFilter(QObject *o, QEvent *e)
return false;
}
-int QTipLabel::getTipScreen(const QPoint &pos, QWidget *w)
+QScreen *QTipLabel::getTipScreen(const QPoint &pos, QWidget *w)
{
- if (QGuiApplication::primaryScreen()->virtualSiblings().size() > 1)
- return QDesktopWidgetPrivate::screenNumber(pos);
- else
- return QDesktopWidgetPrivate::screenNumber(w);
+ int screenNo = QGuiApplication::primaryScreen()->virtualSiblings().size() > 1
+ ? QDesktopWidgetPrivate::screenNumber(pos)
+ : QDesktopWidgetPrivate::screenNumber(w);
+ return QDesktopWidgetPrivate::screen(screenNo);
}
void QTipLabel::placeTip(const QPoint &pos, QWidget *w)
@@ -396,8 +395,7 @@ void QTipLabel::placeTip(const QPoint &pos, QWidget *w)
#endif //QT_NO_STYLE_STYLESHEET
QPoint p = pos;
- const QScreen *screen = QGuiApplication::screens().value(getTipScreen(pos, w),
- QGuiApplication::primaryScreen());
+ const QScreen *screen = getTipScreen(pos, w);
// a QScreen's handle *should* never be null, so this is a bit paranoid
if (const QPlatformScreen *platformScreen = screen ? screen->handle() : nullptr) {
const QSize cursorSize = QHighDpi::fromNativePixels(platformScreen->cursor()->size(),
@@ -494,16 +492,18 @@ void QToolTip::showText(const QPoint &pos, const QString &text, QWidget *w, cons
}
if (!text.isEmpty()){ // no tip can be reused, create new tip:
+ QWidget *tipLabelParent = [pos, w]() -> QWidget* {
#ifdef Q_OS_WIN32
- // On windows, we can't use the widget as parent otherwise the window will be
- // raised when the tooltip will be shown
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- new QTipLabel(text, pos, QApplication::desktop()->screen(QTipLabel::getTipScreen(pos, w)), msecDisplayTime);
-QT_WARNING_POP
+ // On windows, we can't use the widget as parent otherwise the window will be
+ // raised when the tooltip will be shown
+ QScreen *screen = QTipLabel::getTipScreen(pos, w);
+ return QApplication::desktop(screen);
#else
- new QTipLabel(text, pos, w, msecDisplayTime); // sets QTipLabel::instance to itself
+ Q_UNUSED(pos);
+ return w;
#endif
+ }();
+ new QTipLabel(text, pos, tipLabelParent, msecDisplayTime); // sets QTipLabel::instance to itself
QTipLabel::instance->setTipRect(w, rect);
QTipLabel::instance->placeTip(pos, w);
QTipLabel::instance->setObjectName(QLatin1String("qtooltip_label"));
diff --git a/src/widgets/kernel/qwhatsthis.cpp b/src/widgets/kernel/qwhatsthis.cpp
index fdf90acccc..c5a9989837 100644
--- a/src/widgets/kernel/qwhatsthis.cpp
+++ b/src/widgets/kernel/qwhatsthis.cpp
@@ -41,7 +41,6 @@
#include "qpointer.h"
#include "qapplication.h"
#include <private/qguiapplication_p.h>
-#include "qdesktopwidget.h"
#include <private/qdesktopwidget_p.h>
#include "qevent.h"
#include "qpixmap.h"
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index 56e558eca0..c7303dde66 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -990,10 +990,10 @@ void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f)
if (allWidgets)
allWidgets->insert(q);
- int targetScreen = -1;
+ QScreen *targetScreen = nullptr;
if (parentWidget && parentWidget->windowType() == Qt::Desktop) {
const QDesktopScreenWidget *sw = qobject_cast<const QDesktopScreenWidget *>(parentWidget);
- targetScreen = sw ? sw->screenNumber() : 0;
+ targetScreen = sw ? sw->screen() : nullptr;
parentWidget = nullptr;
}
@@ -1006,10 +1006,10 @@ void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f)
}
#endif
- if (targetScreen >= 0) {
- topData()->initialScreenIndex = targetScreen;
+ if (targetScreen) {
+ topData()->initialScreen = targetScreen;
if (QWindow *window = q->windowHandle())
- window->setScreen(QGuiApplication::screens().value(targetScreen, nullptr));
+ window->setScreen(targetScreen);
}
data.fstrut_dirty = true;
@@ -1293,13 +1293,13 @@ void QWidgetPrivate::create()
else
win->resize(q->size());
if (win->isTopLevel()) {
- int screenNumber = topData()->initialScreenIndex;
- topData()->initialScreenIndex = -1;
- if (screenNumber < 0) {
- screenNumber = q->windowType() != Qt::Desktop
- ? QDesktopWidgetPrivate::screenNumber(q) : 0;
+ QScreen *targetScreen = topData()->initialScreen;
+ topData()->initialScreen = nullptr;
+ if (!targetScreen) {
+ targetScreen = q->windowType() != Qt::Desktop
+ ? q->screen() : nullptr;
}
- win->setScreen(QGuiApplication::screens().value(screenNumber, nullptr));
+ win->setScreen(targetScreen);
}
QSurfaceFormat format = win->requestedFormat();
@@ -1602,7 +1602,7 @@ void QWidgetPrivate::createTLExtra()
x->sizeAdjusted = false;
x->embedded = 0;
x->window = nullptr;
- x->initialScreenIndex = -1;
+ x->initialScreen = nullptr;
#ifdef QWIDGET_EXTRA_DEBUG
static int count = 0;
@@ -2507,8 +2507,8 @@ QScreen *QWidget::screen() const
return associatedScreen;
if (auto topLevel = window()) {
if (auto topData = qt_widget_private(topLevel)->topData()) {
- if (auto initialScreen = QGuiApplicationPrivate::screen_list.value(topData->initialScreenIndex))
- return initialScreen;
+ if (topData->initialScreen)
+ return topData->initialScreen;
}
if (auto screenByPos = QGuiApplication::screenAt(topLevel->geometry().center()))
return screenByPos;
@@ -3472,8 +3472,7 @@ QPoint QWidget::pos() const
issues with windows.
\note Do not use this function to find the width of a screen on
- a \l{QDesktopWidget}{multiple screen desktop}. Read
- \l{QDesktopWidget#Screen Geometry}{this note} for details.
+ a multi-screen desktop. See QScreen for details.
By default, this property contains a value that depends on the user's
platform and screen geometry.
@@ -10487,13 +10486,13 @@ void QWidgetPrivate::setParent_sys(QWidget *newparent, Qt::WindowFlags f)
Qt::WindowFlags oldFlags = data.window_flags;
bool wasCreated = q->testAttribute(Qt::WA_WState_Created);
- int targetScreen = -1;
+ QScreen *targetScreen = nullptr;
// Handle a request to move the widget to a particular screen
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->screenNumber() : 0;
+ targetScreen = sw ? sw->screen() : nullptr;
newparent = nullptr;
}
@@ -10523,9 +10522,9 @@ void QWidgetPrivate::setParent_sys(QWidget *newparent, Qt::WindowFlags f)
if (!newparent) {
f |= Qt::Window;
- if (targetScreen == -1) {
+ if (!targetScreen) {
if (parent)
- targetScreen = QDesktopWidgetPrivate::screenNumber(q->parentWidget()->window());
+ targetScreen = q->parentWidget()->window()->screen();
}
}
@@ -10568,12 +10567,12 @@ void QWidgetPrivate::setParent_sys(QWidget *newparent, Qt::WindowFlags f)
q->setAttribute(Qt::WA_WState_ExplicitShowHide, explicitlyHidden);
// move the window to the selected screen
- if (!newparent && targetScreen != -1) {
+ if (!newparent && targetScreen) {
// only if it is already created
if (q->testAttribute(Qt::WA_WState_Created))
- q->windowHandle()->setScreen(QGuiApplication::screens().value(targetScreen, 0));
+ q->windowHandle()->setScreen(targetScreen);
else
- topData()->initialScreenIndex = targetScreen;
+ topData()->initialScreen = targetScreen;
}
}
diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h
index 3e52a6ad2f..08954cc778 100644
--- a/src/widgets/kernel/qwidget_p.h
+++ b/src/widgets/kernel/qwidget_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWidgets module of the Qt Toolkit.
@@ -61,6 +61,7 @@
#include "QtGui/qinputmethod.h"
#include "QtGui/qopengl.h"
#include "QtGui/qsurfaceformat.h"
+#include "QtGui/qscreen.h"
#include "QtWidgets/qsizepolicy.h"
#include "QtWidgets/qstyle.h"
#include "QtWidgets/qapplication.h"
@@ -144,8 +145,7 @@ struct QTLWExtra {
QRect frameStrut;
QRect normalGeometry; // used by showMin/maximized/FullScreen
Qt::WindowFlags savedFlags; // Save widget flags while showing fullscreen
- // ### TODO replace initialScreenIndex with QScreen *, in case the screens change at runtime
- int initialScreenIndex; // Screen number when passing a QDesktop[Screen]Widget as parent.
+ QScreen *initialScreen; // Screen when passing a QDesktop[Screen]Widget as parent.
#ifndef QT_NO_OPENGL
std::vector<std::unique_ptr<QPlatformTextureList>> widgetTextures;
@@ -476,13 +476,11 @@ public:
void setModal_sys();
- // This is an helper function that return the available geometry for
- // a widget and takes care is this one is in QGraphicsView.
- // If the widget is not embed in a scene then the geometry available is
- // null, we let QDesktopWidget decide for us.
- static QRect screenGeometry(const QWidget *widget)
+ // These helper functions return the (available) geometry for the screen
+ // the widget is on, and takes care if this one is embedded in a QGraphicsView.
+ static QRect graphicsViewParentRect(const QWidget *widget)
{
- QRect screen;
+ QRect rect;
#if QT_CONFIG(graphicsview)
QGraphicsProxyWidget *ancestorProxy = widget->d_func()->nearestGraphicsProxyWidget(widget);
//It's embedded if it has an ancestor
@@ -491,16 +489,30 @@ public:
// One view, let be smart and return the viewport rect then the popup is aligned
if (ancestorProxy->scene()->views().size() == 1) {
QGraphicsView *view = ancestorProxy->scene()->views().at(0);
- screen = view->mapToScene(view->viewport()->rect()).boundingRect().toRect();
+ rect = view->mapToScene(view->viewport()->rect()).boundingRect().toRect();
} else {
- screen = ancestorProxy->scene()->sceneRect().toRect();
+ rect = ancestorProxy->scene()->sceneRect().toRect();
}
}
}
#else
Q_UNUSED(widget);
#endif
- return screen;
+ return rect;
+ }
+ static QRect screenGeometry(const QWidget *widget)
+ {
+ QRect rect = graphicsViewParentRect(widget);
+ if (rect.isNull())
+ rect = widget->screen()->geometry();
+ return rect;
+ }
+ static QRect availableScreenGeometry(const QWidget *widget)
+ {
+ QRect rect = graphicsViewParentRect(widget);
+ if (rect.isNull())
+ rect = widget->screen()->availableGeometry();
+ return rect;
}
inline void setRedirected(QPaintDevice *replacement, const QPoint &offset)
diff --git a/src/widgets/util/qcompleter.cpp b/src/widgets/util/qcompleter.cpp
index 926eee26f3..72084ebd8f 100644
--- a/src/widgets/util/qcompleter.cpp
+++ b/src/widgets/util/qcompleter.cpp
@@ -157,7 +157,6 @@
#endif
#include "QtWidgets/qapplication.h"
#include "QtGui/qevent.h"
-#include "QtWidgets/qdesktopwidget.h"
#include <private/qapplication_p.h>
#include <private/qdesktopwidget_p.h>
#if QT_CONFIG(lineedit)
@@ -921,7 +920,7 @@ void QCompleterPrivate::_q_autoResizePopup()
void QCompleterPrivate::showPopup(const QRect& rect)
{
- const QRect screen = QDesktopWidgetPrivate::availableGeometry(widget);
+ const QRect screen = QWidgetPrivate::availableScreenGeometry(widget);
Qt::LayoutDirection dir = widget->layoutDirection();
QPoint pos;
int rh, w;
diff --git a/src/widgets/util/qscroller.cpp b/src/widgets/util/qscroller.cpp
index fec373d45c..003f27de56 100644
--- a/src/widgets/util/qscroller.cpp
+++ b/src/widgets/util/qscroller.cpp
@@ -57,7 +57,6 @@
#include <QGraphicsScene>
#include <QGraphicsView>
#endif
-#include <QDesktopWidget>
#include <private/qdesktopwidget_p.h>
#include <QVector2D>
#include <QtCore/qmath.h>
diff --git a/src/widgets/util/qsystemtrayicon.cpp b/src/widgets/util/qsystemtrayicon.cpp
index e4ee5770f1..170eba7514 100644
--- a/src/widgets/util/qsystemtrayicon.cpp
+++ b/src/widgets/util/qsystemtrayicon.cpp
@@ -60,7 +60,6 @@
#include "qstyle.h"
#include "qgridlayout.h"
#include "qapplication.h"
-#include "qdesktopwidget.h"
#include <private/qdesktopwidget_p.h>
#include "qbitmap.h"
@@ -132,7 +131,7 @@ static QIcon messageIcon2qIcon(QSystemTrayIcon::MessageIcon icon)
of type QEvent::ToolTip. Additionally, the QSystemTrayIcon receives wheel events of
type QEvent::Wheel. These are not supported on any other platform.
- \sa QDesktopServices, QDesktopWidget, {Desktop Integration}, {System Tray Icon Example}
+ \sa QDesktopServices, {Desktop Integration}, {System Tray Icon Example}
*/
/*!
@@ -533,7 +532,7 @@ QBalloonTip::QBalloonTip(const QIcon &icon, const QString &title,
msgLabel->setAlignment(Qt::AlignTop | Qt::AlignLeft);
// smart size for the message label
- int limit = QDesktopWidgetPrivate::availableGeometry(msgLabel).size().width() / 3;
+ int limit = QWidgetPrivate::availableScreenGeometry(msgLabel).width() / 3;
if (msgLabel->sizeHint().width() > limit) {
msgLabel->setWordWrap(true);
if (msgLabel->sizeHint().width() > limit) {
diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp
index 3125e001d9..042e702987 100644
--- a/src/widgets/widgets/qcombobox.cpp
+++ b/src/widgets/widgets/qcombobox.cpp
@@ -44,7 +44,6 @@
#include <qpa/qplatformmenu.h>
#include <qlineedit.h>
#include <qapplication.h>
-#include <qdesktopwidget.h>
#include <private/qdesktopwidget_p.h>
#include <qlistview.h>
#if QT_CONFIG(tableview)
@@ -321,11 +320,12 @@ void QComboBoxPrivate::trySetValidIndex()
setCurrentIndex(QModelIndex());
}
-QRect QComboBoxPrivate::popupGeometry(int screen) const
+QRect QComboBoxPrivate::popupGeometry() const
{
+ Q_Q(const QComboBox);
return QStylePrivate::useFullScreenForPopup()
- ? QDesktopWidgetPrivate::screenGeometry(screen)
- : QDesktopWidgetPrivate::availableGeometry(screen);
+ ? QWidgetPrivate::screenGeometry(q)
+ : QWidgetPrivate::availableScreenGeometry(q);
}
bool QComboBoxPrivate::updateHoverControl(const QPoint &pos)
@@ -2613,7 +2613,7 @@ void QComboBox::showPopup()
QComboBoxPrivateContainer* container = d->viewContainer();
QRect listRect(style->subControlRect(QStyle::CC_ComboBox, &opt,
QStyle::SC_ComboBoxListBoxPopup, this));
- QRect screen = d->popupGeometry(QDesktopWidgetPrivate::screenNumber(this));
+ QRect screen = d->popupGeometry();
QPoint below = mapToGlobal(listRect.bottomLeft());
int belowHeight = screen.bottom() - below.y();
diff --git a/src/widgets/widgets/qcombobox_p.h b/src/widgets/widgets/qcombobox_p.h
index c1771a8958..4bcc741615 100644
--- a/src/widgets/widgets/qcombobox_p.h
+++ b/src/widgets/widgets/qcombobox_p.h
@@ -372,7 +372,7 @@ public:
void updateArrow(QStyle::StateFlag state);
bool updateHoverControl(const QPoint &pos);
void trySetValidIndex();
- QRect popupGeometry(int screen = -1) const;
+ QRect popupGeometry() const;
QStyle::SubControl newHoverControl(const QPoint &pos);
int computeWidthHint() const;
QSize recomputeSizeHint(QSize &sh) const;
diff --git a/src/widgets/widgets/qdatetimeedit.cpp b/src/widgets/widgets/qdatetimeedit.cpp
index a438555183..60ed4b4798 100644
--- a/src/widgets/widgets/qdatetimeedit.cpp
+++ b/src/widgets/widgets/qdatetimeedit.cpp
@@ -42,7 +42,6 @@
#include <qabstractspinbox.h>
#include <qapplication.h>
#include <qdatetimeedit.h>
-#include <qdesktopwidget.h>
#include <private/qdesktopwidget_p.h>
#include <qdebug.h>
#include <qevent.h>
diff --git a/src/widgets/widgets/qdockarealayout.cpp b/src/widgets/widgets/qdockarealayout.cpp
index 3d2396c4a6..eedd0725cd 100644
--- a/src/widgets/widgets/qdockarealayout.cpp
+++ b/src/widgets/widgets/qdockarealayout.cpp
@@ -44,7 +44,6 @@
#include "QtWidgets/qtabbar.h"
#endif
#include "QtWidgets/qstyle.h"
-#include "QtWidgets/qdesktopwidget.h"
#include <private/qdesktopwidget_p.h>
#include "QtWidgets/qapplication.h"
#include "QtCore/qvariant.h"
@@ -3024,7 +3023,7 @@ QRect QDockAreaLayout::constrainedRect(QRect rect, QWidget* widget)
if (QGuiApplication::primaryScreen()->virtualSiblings().size() > 1)
desktop = QDesktopWidgetPrivate::screenGeometry(rect.topLeft());
else
- desktop = QDesktopWidgetPrivate::screenGeometry(widget);
+ desktop = QWidgetPrivate::screenGeometry(widget);
if (desktop.isValid()) {
rect.setWidth(qMin(rect.width(), desktop.width()));
diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp
index 8ffb0a3b9e..2dbc35457a 100644
--- a/src/widgets/widgets/qdockwidget.cpp
+++ b/src/widgets/widgets/qdockwidget.cpp
@@ -41,7 +41,6 @@
#include <qaction.h>
#include <qapplication.h>
-#include <qdesktopwidget.h>
#include <qdrawutil.h>
#include <qevent.h>
#include <qfontmetrics.h>
diff --git a/src/widgets/widgets/qeffects.cpp b/src/widgets/widgets/qeffects.cpp
index 1f2d3517e8..cdfad40760 100644
--- a/src/widgets/widgets/qeffects.cpp
+++ b/src/widgets/widgets/qeffects.cpp
@@ -38,7 +38,6 @@
****************************************************************************/
#include "qapplication.h"
-#include "qdesktopwidget.h"
#include "qeffects_p.h"
#include "qevent.h"
#include "qimage.h"
@@ -54,15 +53,6 @@
QT_BEGIN_NAMESPACE
-static QWidget *effectParent(const QWidget* w)
-{
- const int screenNumber = w ? QGuiApplication::screens().indexOf(w->screen()) : 0;
- QT_WARNING_PUSH // ### Qt 6: Find a replacement for QDesktopWidget::screen()
- QT_WARNING_DISABLE_DEPRECATED
- return QApplication::desktop()->screen(screenNumber);
- QT_WARNING_POP
-}
-
/*
Internal class QAlphaWidget.
@@ -108,7 +98,7 @@ static QAlphaWidget* q_blend = nullptr;
Constructs a QAlphaWidget.
*/
QAlphaWidget::QAlphaWidget(QWidget* w, Qt::WindowFlags f)
- : QWidget(effectParent(w), f)
+ : QWidget(QApplication::desktop(w ? w->screen() : nullptr), f)
{
#ifndef Q_OS_WIN
setEnabled(false);
@@ -389,7 +379,7 @@ static QRollEffect* q_roll = nullptr;
Construct a QRollEffect widget.
*/
QRollEffect::QRollEffect(QWidget* w, Qt::WindowFlags f, DirFlags orient)
- : QWidget(effectParent(w), f), orientation(orient)
+ : QWidget(QApplication::desktop(w ? w->screen() : nullptr), f), orientation(orient)
{
#ifndef Q_OS_WIN
setEnabled(false);
diff --git a/src/widgets/widgets/qfontcombobox.cpp b/src/widgets/widgets/qfontcombobox.cpp
index cb665de889..a4ac34b51a 100644
--- a/src/widgets/widgets/qfontcombobox.cpp
+++ b/src/widgets/widgets/qfontcombobox.cpp
@@ -46,7 +46,6 @@
#include <qevent.h>
#include <qapplication.h>
#include <private/qcombobox_p.h>
-#include <QDesktopWidget>
#include <private/qdesktopwidget_p.h>
#include <qdebug.h>
@@ -545,7 +544,7 @@ bool QFontComboBox::event(QEvent *e)
QListView *lview = qobject_cast<QListView*>(view());
if (lview) {
lview->window()->setFixedWidth(qMin(width() * 5 / 3,
- QDesktopWidgetPrivate::availableGeometry(lview).width()));
+ QWidgetPrivate::availableScreenGeometry(lview).width()));
}
}
return QComboBox::event(e);
diff --git a/src/widgets/widgets/qmdiarea.cpp b/src/widgets/widgets/qmdiarea.cpp
index dc65317de8..953d25088e 100644
--- a/src/widgets/widgets/qmdiarea.cpp
+++ b/src/widgets/widgets/qmdiarea.cpp
@@ -165,7 +165,6 @@
#include <QPainter>
#include <QFontMetrics>
#include <QStyleOption>
-#include <QDesktopWidget>
#include <private/qdesktopwidget_p.h>
#include <QDebug>
#include <qmath.h>
@@ -1733,7 +1732,7 @@ QMdiArea::~QMdiArea()
*/
QSize QMdiArea::sizeHint() const
{
- // Calculate a proper scale factor for QDesktopWidget::size().
+ // Calculate a proper scale factor for the desktop's size.
// This also takes into account that we can have nested workspaces.
int nestedCount = 0;
QWidget *widget = this->parentWidget();
diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp
index fdfa9b327f..b578f476e9 100644
--- a/src/widgets/widgets/qmenu.cpp
+++ b/src/widgets/widgets/qmenu.cpp
@@ -54,7 +54,6 @@
#include "qmacnativewidget_mac.h"
#endif
#include "qapplication.h"
-#include "qdesktopwidget.h"
#ifndef QT_NO_ACCESSIBILITY
# include "qaccessible.h"
#endif
@@ -324,8 +323,8 @@ QRect QMenuPrivate::popupGeometry() const
{
Q_Q(const QMenu);
return useFullScreenForPopup()
- ? QDesktopWidgetPrivate::screenGeometry(q)
- : QDesktopWidgetPrivate::availableGeometry(q);
+ ? QWidgetPrivate::screenGeometry(q)
+ : QWidgetPrivate::availableScreenGeometry(q);
}
QRect QMenuPrivate::popupGeometry(int screen) const
@@ -2385,15 +2384,12 @@ void QMenuPrivate::popup(const QPoint &p, QAction *atAction, PositionFunction po
// 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,
// then initialScreenIndex was set, so we should respect that for the lifetime of this menu.
- // Use d->popupScreen to remember, because initialScreenIndex will be reset after the first showing.
// However if eventLoop exists, then exec() already did this by calling createWinId(); so leave it alone. (QTBUG-76162)
if (!eventLoop) {
bool screenSet = false;
- const int screenIndex = topData()->initialScreenIndex;
- if (screenIndex >= 0)
- popupScreen = screenIndex;
- if (auto s = QGuiApplication::screens().value(popupScreen)) {
- if (setScreen(s))
+ QScreen *screen = topData()->initialScreen;
+ if (screen) {
+ if (setScreen(screen))
itemsDirty = true;
screenSet = true;
} else if (QMenu *parentMenu = qobject_cast<QMenu *>(parent)) {
diff --git a/src/widgets/widgets/qmenu_p.h b/src/widgets/widgets/qmenu_p.h
index e735052507..3e49f0780d 100644
--- a/src/widgets/widgets/qmenu_p.h
+++ b/src/widgets/widgets/qmenu_p.h
@@ -522,8 +522,6 @@ public:
bool tearoffHighlighted : 1;
//menu fading/scrolling effects
bool doChildEffects : 1;
-
- int popupScreen = -1;
};
QT_END_NAMESPACE
diff --git a/src/widgets/widgets/qmenubar.cpp b/src/widgets/widgets/qmenubar.cpp
index b7c071bfcd..b0731df50a 100644
--- a/src/widgets/widgets/qmenubar.cpp
+++ b/src/widgets/widgets/qmenubar.cpp
@@ -42,7 +42,6 @@
#include <qstyle.h>
#include <qlayout.h>
#include <qapplication.h>
-#include <qdesktopwidget.h>
#ifndef QT_NO_ACCESSIBILITY
# include <qaccessible.h>
#endif
@@ -355,7 +354,7 @@ void QMenuBarPrivate::popupAction(QAction *action, bool activateFirst)
if(!defaultPopDown || (fitUp && !fitDown))
pos.setY(qMax(screenRect.y(), q->mapToGlobal(QPoint(0, adjustedActionRect.top()-popup_size.height())).y()));
- QMenuPrivate::get(activeMenu)->topData()->initialScreenIndex = QGuiApplication::screens().indexOf(popupScreen);
+ QMenuPrivate::get(activeMenu)->topData()->initialScreen = popupScreen;
activeMenu->popup(pos);
if(activateFirst)
activeMenu->d_func()->setFirstActionActive();
diff --git a/src/widgets/widgets/qpushbutton.cpp b/src/widgets/widgets/qpushbutton.cpp
index bb2848aa43..8657eb4174 100644
--- a/src/widgets/widgets/qpushbutton.cpp
+++ b/src/widgets/widgets/qpushbutton.cpp
@@ -39,7 +39,6 @@
#include "qapplication.h"
#include "qbitmap.h"
-#include "qdesktopwidget.h"
#include <private/qdesktopwidget_p.h>
#if QT_CONFIG(dialog)
#include <private/qdialog_p.h>
@@ -622,7 +621,7 @@ QPoint QPushButtonPrivate::adjustedMenuPosition()
QPoint globalPos = q->mapToGlobal(rect.topLeft());
int x = globalPos.x();
int y = globalPos.y();
- const QRect availableGeometry = QDesktopWidgetPrivate::availableGeometry(q);
+ const QRect availableGeometry = QWidgetPrivate::availableScreenGeometry(q);
if (horizontal) {
if (globalPos.y() + rect.height() + menuSize.height() <= availableGeometry.bottom()) {
y += rect.height();
diff --git a/src/widgets/widgets/qsizegrip.cpp b/src/widgets/widgets/qsizegrip.cpp
index 396503566c..baebd009e4 100644
--- a/src/widgets/widgets/qsizegrip.cpp
+++ b/src/widgets/widgets/qsizegrip.cpp
@@ -48,7 +48,6 @@
#include "qstyleoption.h"
#include "qlayout.h"
#include "qdebug.h"
-#include <QDesktopWidget>
#include <private/qwidget_p.h>
#include <private/qdesktopwidget_p.h>
@@ -304,7 +303,7 @@ void QSizeGrip::mousePressEvent(QMouseEvent * e)
bool hasVerticalSizeConstraint = true;
bool hasHorizontalSizeConstraint = true;
if (tlw->isWindow())
- availableGeometry = QDesktopWidgetPrivate::availableGeometry(tlw);
+ availableGeometry = QWidgetPrivate::availableScreenGeometry(tlw);
else {
const QWidget *tlwParent = tlw->parentWidget();
// Check if tlw is inside QAbstractScrollArea/QScrollArea.
diff --git a/src/widgets/widgets/qsplashscreen.cpp b/src/widgets/widgets/qsplashscreen.cpp
index b6fa97eaed..1f1c71dcb8 100644
--- a/src/widgets/widgets/qsplashscreen.cpp
+++ b/src/widgets/widgets/qsplashscreen.cpp
@@ -40,7 +40,6 @@
#include "qsplashscreen.h"
#include "qapplication.h"
-#include "qdesktopwidget.h"
#include <private/qdesktopwidget_p.h>
#include "qpainter.h"
#include "qpixmap.h"
@@ -294,25 +293,14 @@ void QSplashScreen::setPixmap(const QPixmap &pixmap)
// 3) If a widget with associated QWindow is found, use that
// 4) When nothing can be found, try to center it over the cursor
-#if QT_DEPRECATED_SINCE(5, 15)
-static inline int screenNumberOf(const QDesktopScreenWidget *dsw)
-{
- auto desktopWidgetPrivate =
- static_cast<QDesktopWidgetPrivate *>(qt_widget_private(QApplication::desktop()));
- return desktopWidgetPrivate->screens.indexOf(const_cast<QDesktopScreenWidget *>(dsw));
-}
-#endif
-
const QScreen *QSplashScreenPrivate::screenFor(const QWidget *w)
{
if (w && w->screen())
return w->screen();
for (const QWidget *p = w; p !=nullptr ; p = p->parentWidget()) {
-#if QT_DEPRECATED_SINCE(5, 15)
if (auto dsw = qobject_cast<const QDesktopScreenWidget *>(p))
- return QGuiApplication::screens().value(screenNumberOf(dsw));
-#endif
+ return dsw->screen();
if (QWindow *window = p->windowHandle())
return window->screen();
}
diff --git a/src/widgets/widgets/qtabwidget.cpp b/src/widgets/widgets/qtabwidget.cpp
index 6f9e51cf4a..e054156995 100644
--- a/src/widgets/widgets/qtabwidget.cpp
+++ b/src/widgets/widgets/qtabwidget.cpp
@@ -44,7 +44,6 @@
#include "private/qtabbar_p.h"
#include "qapplication.h"
#include "qbitmap.h"
-#include "qdesktopwidget.h"
#include <private/qdesktopwidget_p.h>
#include "qevent.h"
#include "qlayout.h"
diff --git a/src/widgets/widgets/qtextbrowser.cpp b/src/widgets/widgets/qtextbrowser.cpp
index c9c5c3f190..a7fe0ad2d5 100644
--- a/src/widgets/widgets/qtextbrowser.cpp
+++ b/src/widgets/widgets/qtextbrowser.cpp
@@ -44,7 +44,6 @@
#include <qapplication.h>
#include <private/qapplication_p.h>
#include <qevent.h>
-#include <qdesktopwidget.h>
#include <qdebug.h>
#include <qabstracttextdocumentlayout.h>
#include "private/qtextdocumentlayout_p.h"
diff --git a/src/widgets/widgets/qtoolbutton.cpp b/src/widgets/widgets/qtoolbutton.cpp
index d350e1731e..edd4788806 100644
--- a/src/widgets/widgets/qtoolbutton.cpp
+++ b/src/widgets/widgets/qtoolbutton.cpp
@@ -40,7 +40,6 @@
#include "qtoolbutton.h"
#include <qapplication.h>
-#include <qdesktopwidget.h>
#include <private/qdesktopwidget_p.h>
#include <qdrawutil.h>
#include <qevent.h>
diff --git a/src/widgets/widgets/qwidgetresizehandler.cpp b/src/widgets/widgets/qwidgetresizehandler.cpp
index 1c850741bb..4f6541f509 100644
--- a/src/widgets/widgets/qwidgetresizehandler.cpp
+++ b/src/widgets/widgets/qwidgetresizehandler.cpp
@@ -41,7 +41,6 @@
#include "qframe.h"
#include "qapplication.h"
-#include "qdesktopwidget.h"
#include <private/qdesktopwidget_p.h>
#include "qcursor.h"
#if QT_CONFIG(sizegrip)
@@ -221,7 +220,7 @@ void QWidgetResizeHandler::mouseMoveEvent(QMouseEvent *e)
// Workaround for window managers which refuse to move a tool window partially offscreen.
if (QGuiApplication::platformName() == QLatin1String("xcb")) {
- const QRect desktop = QDesktopWidgetPrivate::availableGeometry(widget);
+ const QRect desktop = QWidgetPrivate::availableScreenGeometry(widget);
pp.rx() = qMax(pp.x(), desktop.left());
pp.ry() = qMax(pp.y(), desktop.top());
p.rx() = qMin(p.x(), desktop.right());
diff --git a/src/widgets/widgets/qwidgettextcontrol.cpp b/src/widgets/widgets/qwidgettextcontrol.cpp
index ff82b1d37c..a4823ca8dd 100644
--- a/src/widgets/widgets/qwidgettextcontrol.cpp
+++ b/src/widgets/widgets/qwidgettextcontrol.cpp
@@ -1943,10 +1943,8 @@ void QWidgetTextControlPrivate::contextMenuEvent(const QPoint &screenPos, const
if (!menu)
return;
menu->setAttribute(Qt::WA_DeleteOnClose);
- if (auto *window = static_cast<QWidget *>(parent)->window()->windowHandle()) {
- QMenuPrivate::get(menu)->topData()->initialScreenIndex =
- QGuiApplication::screens().indexOf(window->screen());
- }
+ if (auto *window = static_cast<QWidget *>(parent)->window()->windowHandle())
+ QMenuPrivate::get(menu)->topData()->initialScreen = window->screen();
menu->popup(screenPos);
#endif
}