diff options
Diffstat (limited to 'src/widgets')
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 } |