diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2017-08-13 15:19:20 +0200 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2017-08-18 13:10:23 +0000 |
commit | 23697466cae8f1a49537fed1e60db8cea79207b4 (patch) | |
tree | de527385caf854ddd810b39369370c8730c5306e /src/widgets/kernel | |
parent | 52ad5afe1c1d8f8d47fccbdf474f8c6119b94608 (diff) |
Reduce usage of QDesktopWidget to resolve screen properties in QtWidgets
Removes the need to initialize QDesktopWidget, just to look up which
screen a widget would map to, the geometry of a screen, number of
screens, etc.
Change-Id: Ieb153b9ff6d3fba645fc528d6e430e8392f990bf
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@qt.io>
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src/widgets/kernel')
-rw-r--r-- | src/widgets/kernel/qdesktopwidget.cpp | 65 | ||||
-rw-r--r-- | src/widgets/kernel/qdesktopwidget_p.h | 23 | ||||
-rw-r--r-- | src/widgets/kernel/qtooltip.cpp | 13 | ||||
-rw-r--r-- | src/widgets/kernel/qwhatsthis.cpp | 9 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 25 |
5 files changed, 112 insertions, 23 deletions
diff --git a/src/widgets/kernel/qdesktopwidget.cpp b/src/widgets/kernel/qdesktopwidget.cpp index 1e6fbfd239..6077ac38db 100644 --- a/src/widgets/kernel/qdesktopwidget.cpp +++ b/src/widgets/kernel/qdesktopwidget.cpp @@ -73,6 +73,11 @@ int QDesktopScreenWidget::screenNumber() const const QRect QDesktopWidget::screenGeometry(const QWidget *widget) const { + return QDesktopWidgetPrivate::screenGeometry(widget); +} + +const QRect QDesktopWidgetPrivate::screenGeometry(const QWidget *widget) +{ if (Q_UNLIKELY(!widget)) { qWarning("QDesktopWidget::screenGeometry(): Attempt " "to get the screen geometry of a null widget"); @@ -86,6 +91,11 @@ const QRect QDesktopWidget::screenGeometry(const QWidget *widget) const const QRect QDesktopWidget::availableGeometry(const QWidget *widget) const { + return QDesktopWidgetPrivate::availableGeometry(widget); +} + +const QRect QDesktopWidgetPrivate::availableGeometry(const QWidget *widget) +{ if (Q_UNLIKELY(!widget)) { qWarning("QDesktopWidget::availableGeometry(): Attempt " "to get the available geometry of a null widget"); @@ -195,16 +205,51 @@ QDesktopWidget::~QDesktopWidget() bool QDesktopWidget::isVirtualDesktop() const { + return QDesktopWidgetPrivate::isVirtualDesktop(); +} + +bool QDesktopWidgetPrivate::isVirtualDesktop() +{ return QGuiApplication::primaryScreen()->virtualSiblings().size() > 1; } +QRect QDesktopWidgetPrivate::geometry() +{ + return QGuiApplication::primaryScreen()->virtualGeometry(); +} + +QSize QDesktopWidgetPrivate::size() +{ + return geometry().size(); +} + +int QDesktopWidgetPrivate::width() +{ + return geometry().width(); +} + +int QDesktopWidgetPrivate::height() +{ + return geometry().height(); +} + int QDesktopWidget::primaryScreen() const { + return QDesktopWidgetPrivate::primaryScreen(); +} + +int QDesktopWidgetPrivate::primaryScreen() +{ return 0; } int QDesktopWidget::numScreens() const { + return QDesktopWidgetPrivate::numScreens(); +} + +int QDesktopWidgetPrivate::numScreens() +{ return qMax(QGuiApplication::screens().size(), 1); } @@ -218,6 +263,11 @@ QWidget *QDesktopWidget::screen(int screen) const QRect QDesktopWidget::availableGeometry(int screenNo) const { + return QDesktopWidgetPrivate::availableGeometry(screenNo); +} + +const QRect QDesktopWidgetPrivate::availableGeometry(int screenNo) +{ QList<QScreen *> screens = QGuiApplication::screens(); if (screenNo == -1) screenNo = 0; @@ -229,6 +279,11 @@ const QRect QDesktopWidget::availableGeometry(int screenNo) const const QRect QDesktopWidget::screenGeometry(int screenNo) const { + return QDesktopWidgetPrivate::screenGeometry(screenNo); +} + +const QRect QDesktopWidgetPrivate::screenGeometry(int screenNo) +{ QList<QScreen *> screens = QGuiApplication::screens(); if (screenNo == -1) screenNo = 0; @@ -240,6 +295,11 @@ const QRect QDesktopWidget::screenGeometry(int screenNo) const int QDesktopWidget::screenNumber(const QWidget *w) const { + return QDesktopWidgetPrivate::screenNumber(w); +} + +int QDesktopWidgetPrivate::screenNumber(const QWidget *w) +{ if (!w) return primaryScreen(); @@ -287,6 +347,11 @@ int QDesktopWidget::screenNumber(const QWidget *w) const int QDesktopWidget::screenNumber(const QPoint &p) const { + return QDesktopWidgetPrivate::screenNumber(p); +} + +int QDesktopWidgetPrivate::screenNumber(const QPoint &p) +{ const QList<QScreen *> screens = QGuiApplication::screens(); if (!screens.isEmpty()) { const QList<QScreen *> primaryScreens = screens.first()->virtualSiblings(); diff --git a/src/widgets/kernel/qdesktopwidget_p.h b/src/widgets/kernel/qdesktopwidget_p.h index dade4fe45e..7a66661771 100644 --- a/src/widgets/kernel/qdesktopwidget_p.h +++ b/src/widgets/kernel/qdesktopwidget_p.h @@ -87,6 +87,29 @@ public: void _q_availableGeometryChanged(); QDesktopScreenWidget *widgetForScreen(QScreen *qScreen) const; + static bool isVirtualDesktop(); + + static QRect geometry(); + static QSize size(); + static int width(); + static int height(); + + static int numScreens(); + static int primaryScreen(); + + static int screenNumber(const QWidget *widget = nullptr); + static int screenNumber(const QPoint &); + + static const QRect screenGeometry(int screen = -1); + static const QRect screenGeometry(const QWidget *widget); + static const 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) + { return availableGeometry(screenNumber(point)); } + QList<QDesktopScreenWidget *> screens; }; diff --git a/src/widgets/kernel/qtooltip.cpp b/src/widgets/kernel/qtooltip.cpp index 830a328948..813b64b2dd 100644 --- a/src/widgets/kernel/qtooltip.cpp +++ b/src/widgets/kernel/qtooltip.cpp @@ -42,6 +42,7 @@ #include <qapplication.h> #include <qdesktopwidget.h> +#include <private/qdesktopwidget_p.h> #include <qevent.h> #include <qpointer.h> #include <qstyle.h> @@ -362,10 +363,10 @@ bool QTipLabel::eventFilter(QObject *o, QEvent *e) int QTipLabel::getTipScreen(const QPoint &pos, QWidget *w) { - if (QApplication::desktop()->isVirtualDesktop()) - return QApplication::desktop()->screenNumber(pos); + if (QDesktopWidgetPrivate::isVirtualDesktop()) + return QDesktopWidgetPrivate::screenNumber(pos); else - return QApplication::desktop()->screenNumber(w); + return QDesktopWidgetPrivate::screenNumber(w); } void QTipLabel::placeTip(const QPoint &pos, QWidget *w) @@ -395,11 +396,11 @@ void QTipLabel::placeTip(const QPoint &pos, QWidget *w) extern bool qt_mac_app_fullscreen; //qapplication_mac.mm QRect screen; if(qt_mac_app_fullscreen) - screen = QApplication::desktop()->screenGeometry(getTipScreen(pos, w)); + screen = QDesktopWidgetPrivate::screenGeometry(getTipScreen(pos, w)); else - screen = QApplication::desktop()->availableGeometry(getTipScreen(pos, w)); + screen = QDesktopWidgetPrivate::availableGeometry(getTipScreen(pos, w)); #else - QRect screen = QApplication::desktop()->screenGeometry(getTipScreen(pos, w)); + QRect screen = QDesktopWidgetPrivate::screenGeometry(getTipScreen(pos, w)); #endif QPoint p = pos; diff --git a/src/widgets/kernel/qwhatsthis.cpp b/src/widgets/kernel/qwhatsthis.cpp index e2cfebb8a1..91d2b503e0 100644 --- a/src/widgets/kernel/qwhatsthis.cpp +++ b/src/widgets/kernel/qwhatsthis.cpp @@ -42,6 +42,7 @@ #include "qapplication.h" #include <private/qguiapplication_p.h> #include "qdesktopwidget.h" +#include <private/qdesktopwidget_p.h> #include "qevent.h" #include "qpixmap.h" #include "qscreen.h" @@ -209,7 +210,7 @@ QWhatsThat::QWhatsThat(const QString& txt, QWidget* parent, QWidget *showTextFor } else { - int sw = QApplication::desktop()->width() / 3; + int sw = QDesktopWidgetPrivate::width() / 3; if (sw < 200) sw = 200; else if (sw > 300) @@ -582,14 +583,14 @@ void QWhatsThisPrivate::say(QWidget * widget, const QString &text, int x, int y) // okay, now to find a suitable location int scr = (widget ? - QApplication::desktop()->screenNumber(widget) : + QDesktopWidgetPrivate::screenNumber(widget) : #if 0 /* Used to be included in Qt4 for Q_WS_X11 */ && !defined(QT_NO_CURSOR) QCursor::x11Screen() #else - QApplication::desktop()->screenNumber(QPoint(x,y)) + QDesktopWidgetPrivate::screenNumber(QPoint(x,y)) #endif ); - QRect screen = QApplication::desktop()->screenGeometry(scr); + QRect screen = QDesktopWidgetPrivate::screenGeometry(scr); int w = whatsThat->width(); int h = whatsThat->height(); diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 2b4c70ed2b..4dcee2771b 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -1454,7 +1454,7 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO topData()->initialScreenIndex = -1; if (screenNumber < 0) { screenNumber = q->windowType() != Qt::Desktop - ? QApplication::desktop()->screenNumber(q) : 0; + ? QDesktopWidgetPrivate::screenNumber(q) : 0; } win->setScreen(QGuiApplication::screens().value(screenNumber, Q_NULLPTR)); } @@ -7162,7 +7162,7 @@ void QWidgetPrivate::fixPosIncludesFrame() if (q->testAttribute(Qt::WA_DontShowOnScreen)) { te->posIncludesFrame = 0; } else { - if (q->windowHandle()) { + if (q->windowHandle() && q->windowHandle()->handle()) { updateFrameStrut(); if (!q->data->fstrut_dirty) { data.crect.translate(te->frameStrut.x(), te->frameStrut.y()); @@ -7358,7 +7358,7 @@ QByteArray QWidget::saveGeometry() const // - Qt 4.8.6 - today, 5.4 - today: Version 2.0, save screen width in addition to check for high DPI scaling. quint16 majorVersion = 2; quint16 minorVersion = 0; - const int screenNumber = QApplication::desktop()->screenNumber(this); + const int screenNumber = QDesktopWidgetPrivate::screenNumber(this); stream << magicNumber << majorVersion << minorVersion @@ -7372,7 +7372,7 @@ QByteArray QWidget::saveGeometry() const << qint32(screenNumber) << quint8(windowState() & Qt::WindowMaximized) << quint8(windowState() & Qt::WindowFullScreen) - << qint32(QApplication::desktop()->screenGeometry(screenNumber).width()); // 1.1 onwards + << qint32(QDesktopWidgetPrivate::screenGeometry(screenNumber).width()); // 1.1 onwards return array; } @@ -7438,10 +7438,9 @@ bool QWidget::restoreGeometry(const QByteArray &geometry) if (majorVersion > 1) stream >> restoredScreenWidth; - const QDesktopWidget * const desktop = QApplication::desktop(); - if (restoredScreenNumber >= desktop->numScreens()) - restoredScreenNumber = desktop->primaryScreen(); - const qreal screenWidthF = qreal(desktop->screenGeometry(restoredScreenNumber).width()); + if (restoredScreenNumber >= QDesktopWidgetPrivate::numScreens()) + restoredScreenNumber = QDesktopWidgetPrivate::primaryScreen(); + const qreal screenWidthF = qreal(QDesktopWidgetPrivate::screenGeometry(restoredScreenNumber).width()); // Sanity check bailing out when large variations of screen sizes occur due to // high DPI scaling or different levels of DPI awareness. if (restoredScreenWidth) { @@ -7468,7 +7467,7 @@ bool QWidget::restoreGeometry(const QByteArray &geometry) .expandedTo(d_func()->adjustedSize())); } - const QRect availableGeometry = desktop->availableGeometry(restoredScreenNumber); + const QRect availableGeometry = QDesktopWidgetPrivate::availableGeometry(restoredScreenNumber); // Modify the restored geometry if we are about to restore to coordinates // that would make the window "lost". This happens if: @@ -7509,7 +7508,7 @@ bool QWidget::restoreGeometry(const QByteArray &geometry) // Setting a geometry on an already maximized window causes this to be // restored into a broken, half-maximized state, non-resizable state (QTBUG-4397). // Move the window in normal state if needed. - if (restoredScreenNumber != desktop->screenNumber(this)) { + if (restoredScreenNumber != QDesktopWidgetPrivate::screenNumber(this)) { setWindowState(Qt::WindowNoState); setGeometry(restoredNormalGeometry); } @@ -8573,9 +8572,9 @@ QSize QWidgetPrivate::adjustedSize() const if (exp & Qt::Vertical) s.setHeight(qMax(s.height(), 100)); #if 0 // Used to be included in Qt4 for Q_WS_X11 - QRect screen = QApplication::desktop()->screenGeometry(q->x11Info().screen()); + QRect screen = QDesktopWidgetPrivate::screenGeometry(q->x11Info().screen()); #else // all others - QRect screen = QApplication::desktop()->screenGeometry(q->pos()); + QRect screen = QDesktopWidgetPrivate::screenGeometry(q->pos()); #endif s.setWidth(qMin(s.width(), screen.width()*2/3)); s.setHeight(qMin(s.height(), screen.height()*2/3)); @@ -10719,7 +10718,7 @@ void QWidgetPrivate::setParent_sys(QWidget *newparent, Qt::WindowFlags f) f |= Qt::Window; if (targetScreen == -1) { if (parent) - targetScreen = QApplication::desktop()->screenNumber(q->parentWidget()->window()); + targetScreen = QDesktopWidgetPrivate::screenNumber(q->parentWidget()->window()); } } |