on xenial help sign in
plugins/Cursor: properly register to the screen's QPlatformCursor when screen changes
commit92c9102f87824cc12418148e493fc4d4562b2011 authorDaniel d'Andrada <daniel.dandrada@canonical.com> dateTue 10 May 2016, 18:48 (10 years ago) parentb0fad55
2 files changed+34−5
plugins/Cursor/MousePointer.cpp+29−5 plugins/Cursor/MousePointer.h+5
plugins/Cursor/MousePointer.cpp+29−5
@@ -89,8 +89,32 @@ void MousePointer::itemChange(ItemChange change, const ItemChangeData &value)
8989
9090void MousePointer::registerWindow(QWindow *window)
9191{
92− if (m_registeredWindow && window != m_registeredWindow) {
93− auto previousCursor = dynamic_cast<MirPlatformCursor*>(m_registeredWindow->screen()->handle()->cursor());
92+ if (window == m_registeredWindow) {
93+ return;
94+ }
95+
96+ if (m_registeredWindow) {
97+ m_registeredWindow->disconnect(this);
98+ }
99+
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) {
117+ auto previousCursor = dynamic_cast<MirPlatformCursor*>(m_registeredScreen->handle()->cursor());
94118 if (previousCursor) {
95119 previousCursor->setMousePointer(nullptr);
96120 } else {
@@ -98,10 +122,10 @@ void MousePointer::registerWindow(QWindow *window)
98122 }
99123 }
100124
101− m_registeredWindow = window;
125+ m_registeredScreen = screen;
102126
103− if (m_registeredWindow) {
104− auto cursor = dynamic_cast<MirPlatformCursor*>(window->screen()->handle()->cursor());
127+ if (m_registeredScreen) {
128+ auto cursor = dynamic_cast<MirPlatformCursor*>(m_registeredScreen->handle()->cursor());
105129 if (cursor) {
106130 cursor->setMousePointer(this);
107131 } else {
plugins/Cursor/MousePointer.h+5
@@ -20,6 +20,7 @@
2020// Qt
2121#include <QPointer>
2222#include <QWindow>
23+#include <QScreen>
2324
2425// Unity API
2526#include <unity/shell/application/MirMousePointerInterface.h>
@@ -53,11 +54,15 @@ Q_SIGNALS:
5354protected:
5455 void itemChange(ItemChange change, const ItemChangeData &value) override;
5556
57+private Q_SLOTS:
58+ void registerScreen(QScreen *screen);
59+
5660private:
5761 void registerWindow(QWindow *window);
5862 void updateHotspot();
5963
6064 QPointer<QWindow> m_registeredWindow;
65+ QPointer<QScreen> m_registeredScreen;
6166 QString m_cursorName;
6267 QString m_themeName;
6368 int m_hotspotX;