diff options
author | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-05-16 20:43:34 +0200 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-06-08 20:29:49 +0200 |
commit | 44fb925f50471ebc23dcccfaa4e9d9873b05d205 (patch) | |
tree | e4e212052b66242ff94aa98f6df7b15dbeb945f7 /src/widgets/widgets | |
parent | a061a646429c6e9d695458fc0ecb0021a30e12ee (diff) |
Phase 2 of removing QDesktopWidget
Remove QDestopWidget public header, simplify the implementation that
maintains a Qt::Desktop type QWidget for each QScreen, and turn
QWidget's initial target screen into a QScreen pointer.
QApplication::desktop() now takes an optional QScreen pointer, and
returns a QWidget pointer, so that applications and widgets can get
access to the root widget for a specific screen without having to
resort to private APIs.
QDesktopWidgetPrivate implementations to look up a screen for an index,
widget, or point are now all inline functions that thinly wrap
QGuiApplication::screens/screenAt calls. We should consider adding those
as convenience APIs to QScreen instead.
Note that QWidget::screen is assumed to return a valid pointer; there is
code that handles the case that it returns nullptr (but also code that
trusts that it never is nullptr), so this needs to be defined, verified
with tests, and asserted. We can then simplify the code further.
Change-Id: Ifc89be65a0dce265b6729feaf54121c35137cb94
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'src/widgets/widgets')
-rw-r--r-- | src/widgets/widgets/qcombobox.cpp | 10 | ||||
-rw-r--r-- | src/widgets/widgets/qcombobox_p.h | 2 | ||||
-rw-r--r-- | src/widgets/widgets/qdatetimeedit.cpp | 1 | ||||
-rw-r--r-- | src/widgets/widgets/qdockarealayout.cpp | 3 | ||||
-rw-r--r-- | src/widgets/widgets/qdockwidget.cpp | 1 | ||||
-rw-r--r-- | src/widgets/widgets/qeffects.cpp | 14 | ||||
-rw-r--r-- | src/widgets/widgets/qfontcombobox.cpp | 3 | ||||
-rw-r--r-- | src/widgets/widgets/qmdiarea.cpp | 3 | ||||
-rw-r--r-- | src/widgets/widgets/qmenu.cpp | 14 | ||||
-rw-r--r-- | src/widgets/widgets/qmenu_p.h | 2 | ||||
-rw-r--r-- | src/widgets/widgets/qmenubar.cpp | 3 | ||||
-rw-r--r-- | src/widgets/widgets/qpushbutton.cpp | 3 | ||||
-rw-r--r-- | src/widgets/widgets/qsizegrip.cpp | 3 | ||||
-rw-r--r-- | src/widgets/widgets/qsplashscreen.cpp | 14 | ||||
-rw-r--r-- | src/widgets/widgets/qtabwidget.cpp | 1 | ||||
-rw-r--r-- | src/widgets/widgets/qtextbrowser.cpp | 1 | ||||
-rw-r--r-- | src/widgets/widgets/qtoolbutton.cpp | 1 | ||||
-rw-r--r-- | src/widgets/widgets/qwidgetresizehandler.cpp | 3 | ||||
-rw-r--r-- | src/widgets/widgets/qwidgettextcontrol.cpp | 6 |
19 files changed, 23 insertions, 65 deletions
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 } |