summaryrefslogtreecommitdiffstats
path: root/src/widgets/kernel/qdesktopwidget_p.h
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2016-03-24 10:40:32 +0100
committerBłażej Szczygieł <spaz16@wp.pl>2016-05-19 18:13:33 +0000
commitcdf1e67de1c462a59b71ee0b14bab73dc3391b65 (patch)
tree31636e6c486ee40ff01293d87e96df2ced20f1c4 /src/widgets/kernel/qdesktopwidget_p.h
parent9c0a7cac83a511141e8dc91825dc5f9da64a1d69 (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.h16
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;
};