diff options
author | Ralf Jung <post@ralfj.de> | 2016-03-24 10:40:32 +0100 |
---|---|---|
committer | Błażej Szczygieł <spaz16@wp.pl> | 2016-05-19 18:13:33 +0000 |
commit | cdf1e67de1c462a59b71ee0b14bab73dc3391b65 (patch) | |
tree | 31636e6c486ee40ff01293d87e96df2ced20f1c4 /src/widgets/kernel/qdesktopwidget_p.h | |
parent | 9c0a7cac83a511141e8dc91825dc5f9da64a1d69 (diff) |
QDesktopWidget: fix tracking QScreens.
The old code failed to reliably detect new QScreens and connect their signals to
its own slots. For example, if the QApplication added a new screen at the
beginning of the screen list (which happens if the new screen is primary), the
signal-connecting loop would actually instead add the now second screen to
QDesktopWidget's list *again*, and connect its signals, but not connect any
signal to the new, first screen.
Furthermore, QDesktopWidget would miss geometry changes because QWidget (and
hence QDesktopScreenWidget) automatically shrinks when the screen it is on gets
smaller.
To fix all of this, QDesktopScreenWidget now keeps its own record of the screen
and its geometry, and it always scans over the entire screen list without
relying on any ordering guarantees on behalf of QApplication.
Change-Id: I2ee8361adf643849f43b7dd9a95966920fd13528
Task-number: QTBUG-52101
Reviewed-by: Błażej Szczygieł <spaz16@wp.pl>
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Diffstat (limited to 'src/widgets/kernel/qdesktopwidget_p.h')
-rw-r--r-- | src/widgets/kernel/qdesktopwidget_p.h | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/widgets/kernel/qdesktopwidget_p.h b/src/widgets/kernel/qdesktopwidget_p.h index 1fcad7fa65..d5ae629c64 100644 --- a/src/widgets/kernel/qdesktopwidget_p.h +++ b/src/widgets/kernel/qdesktopwidget_p.h @@ -55,12 +55,19 @@ QT_BEGIN_NAMESPACE class QDesktopScreenWidget : public QWidget { Q_OBJECT public: - QDesktopScreenWidget() : QWidget(Q_NULLPTR, Qt::Desktop) - { - setVisible(false); - } + explicit QDesktopScreenWidget(QScreen *screen, const QRect &geometry); int screenNumber() const; + void setScreenGeometry(const QRect &geometry); + + QScreen *screen() 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; }; class QDesktopWidgetPrivate : public QWidgetPrivate { @@ -70,6 +77,7 @@ public: ~QDesktopWidgetPrivate() { qDeleteAll(screens); } void _q_updateScreens(); void _q_availableGeometryChanged(); + QDesktopScreenWidget *widgetForScreen(QScreen *qScreen) const; QList<QDesktopScreenWidget *> screens; }; |