on xenial help sign in
plugins/Cursor: properly register to the screen's QPlatformCursor when screen changes Fixes: #1579742
4e3068cDaniel d'Andrada
plugins/Cursor/MousePointer.cpp+29−5
@@ -89,8 +89,32 @@ void MousePointer::itemChange(ItemChange change, const ItemChangeData &value)
89
89
90void MousePointer::registerWindow(QWindow *window)
90void MousePointer::registerWindow(QWindow *window)
91{
91{
92+ if (window == m_registeredWindow) {
93+ return;
94+ }
95+
96+ if (m_registeredWindow) {
97+ m_registeredWindow->disconnect(this);
98+ }
99+
92− if (m_registeredWindow && window != m_registeredWindow) {
100+ m_registeredWindow = window;
101+
102+ if (m_registeredWindow) {
103+ connect(window, &QWindow::screenChanged, this, &MousePointer::registerScreen);
104+ registerScreen(window->screen());
105+ } else {
106+ registerScreen(nullptr);
107+ }
108+}
109+
110+void MousePointer::registerScreen(QScreen *screen)
111+{
112+ if (m_registeredScreen == screen) {
113+ return;
114+ }
115+
116+ if (m_registeredScreen) {
93− auto previousCursor = dynamic_cast<MirPlatformCursor*>(m_registeredWindow->screen()->handle()->cursor());
117+ auto previousCursor = dynamic_cast<MirPlatformCursor*>(m_registeredScreen->handle()->cursor());
94 if (previousCursor) {
118 if (previousCursor) {
95 previousCursor->setMousePointer(nullptr);
119 previousCursor->setMousePointer(nullptr);
96 } else {
120 } else {
@@ -98,10 +122,10 @@ void MousePointer::registerWindow(QWindow *window)
98 }
122 }
99 }
123 }
100
124
101− m_registeredWindow = window;
125+ m_registeredScreen = screen;
102
126
103− if (m_registeredWindow) {
127+ if (m_registeredScreen) {
104− auto cursor = dynamic_cast<MirPlatformCursor*>(window->screen()->handle()->cursor());
128+ auto cursor = dynamic_cast<MirPlatformCursor*>(m_registeredScreen->handle()->cursor());
105 if (cursor) {
129 if (cursor) {
106 cursor->setMousePointer(this);
130 cursor->setMousePointer(this);
107 } else {
131 } else {
plugins/Cursor/MousePointer.h+5
@@ -20,6 +20,7 @@
20// Qt
20// Qt
21#include <QPointer>
21#include <QPointer>
22#include <QWindow>
22#include <QWindow>
23+#include <QScreen>
23
24
24// Unity API
25// Unity API
25#include <unity/shell/application/MirMousePointerInterface.h>
26#include <unity/shell/application/MirMousePointerInterface.h>
@@ -53,11 +54,15 @@ Q_SIGNALS:
53protected:
54protected:
54 void itemChange(ItemChange change, const ItemChangeData &value) override;
55 void itemChange(ItemChange change, const ItemChangeData &value) override;
55
56
57+private Q_SLOTS:
58+ void registerScreen(QScreen *screen);
59+
56private:
60private:
57 void registerWindow(QWindow *window);
61 void registerWindow(QWindow *window);
58 void updateHotspot();
62 void updateHotspot();
59
63
60 QPointer<QWindow> m_registeredWindow;
64 QPointer<QWindow> m_registeredWindow;
65+ QPointer<QScreen> m_registeredScreen;
61 QString m_cursorName;
66 QString m_cursorName;
62 QString m_themeName;
67 QString m_themeName;
63 int m_hotspotX;
68 int m_hotspotX;