Merge lp:~dandrader/qtmir/fixSurfaceFocus-lp1491034 into lp:qtmir

Proposed by Daniel d'Andrada
Status: Merged
Approved by: Gerry Boland
Approved revision: 372
Merged at revision: 376
Proposed branch: lp:~dandrader/qtmir/fixSurfaceFocus-lp1491034
Merge into: lp:qtmir
Diff against target: 236 lines (+53/-32)
6 files modified
src/modules/Unity/Application/mirsurface.cpp (+21/-6)
src/modules/Unity/Application/mirsurface.h (+2/-2)
src/modules/Unity/Application/mirsurfaceinterface.h (+2/-2)
src/modules/Unity/Application/mirsurfaceitem.cpp (+24/-18)
src/modules/Unity/Application/mirsurfaceitem.h (+2/-2)
tests/modules/common/fake_mirsurface.h (+2/-2)
To merge this branch: bzr merge lp:~dandrader/qtmir/fixSurfaceFocus-lp1491034
Reviewer Review Type Date Requested Status
Gerry Boland (community) Approve
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+271040@code.launchpad.net

Commit message

Update surface focus when a surface enters or leaves a MirSurfaceItem

+ Refactor MirSurfaceItem so that it talks to a MirSurfaceInterface
  instead of the concrete MirSurface class
+ Make MirSurface::setFocus() more robust

Description of the change

* Are there any related MPs required for this MP to build/function as expected? Please list.

No

* Did you perform an exploratory manual test run of your code change and any related functionality?

Yes

* If you changed the packaging (debian), did you subscribe the ubuntu-unity team to this MP?

Not applicable

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Gerry Boland (gerboland) wrote :

You know I dislike refactoring in a bug fix commit. I'll accept this time, but please resist the temptation in future.

Code change makes sense, and I can't reproduce the bug with it.

+ qCDebug(QTMIR_SURFACES).nospace() << "MirSurface[" << appId() << "]::setFocus(" << (focus ? "true" : "false") << ")";
Do you really need to interpret a bool into true/false for qDebug?

review: Approve
373. By Daniel d'Andrada

qDebug is smarter than printf

Revision history for this message
Daniel d'Andrada (dandrader) wrote :

On 15/09/15 08:16, Gerry Boland wrote:
> + qCDebug(QTMIR_SURFACES).nospace() << "MirSurface[" << appId() << "]::setFocus(" << (focus ? "true" : "false") << ")";
> Do you really need to interpret a bool into true/false for qDebug?
>

Right, qDebug() is smarter than printf(). Fixed.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/modules/Unity/Application/mirsurface.cpp'
2--- src/modules/Unity/Application/mirsurface.cpp 2015-08-26 11:38:50 +0000
3+++ src/modules/Unity/Application/mirsurface.cpp 2015-09-15 19:10:17 +0000
4@@ -222,11 +222,6 @@
5 }
6 }
7
8-SessionInterface* MirSurface::session() const
9-{
10- return m_session.data();
11-}
12-
13 Mir::Type MirSurface::type() const
14 {
15 switch (m_surface->type()) {
16@@ -358,12 +353,20 @@
17
18 void MirSurface::setFocus(bool focus)
19 {
20+ if (!m_session) {
21+ return;
22+ }
23+
24 // Temporary hotfix for http://pad.lv/1483752
25- if (session() && session()->childSessions()->rowCount() > 0) {
26+ if (m_session->childSessions()->rowCount() > 0) {
27 // has child trusted session, ignore any focus change attempts
28+ qCDebug(QTMIR_SURFACES).nospace() << "MirSurface[" << appId() << "]::setFocus(" << focus
29+ << ") - has child trusted session, ignore any focus change attempts";
30 return;
31 }
32
33+ qCDebug(QTMIR_SURFACES).nospace() << "MirSurface[" << appId() << "]::setFocus(" << focus << ")";
34+
35 if (focus) {
36 m_shell->set_surface_attribute(m_session->session(), m_surface, mir_surface_attrib_focus, mir_surface_focused);
37 } else {
38@@ -635,3 +638,15 @@
39 {
40 Q_EMIT sizeChanged(m_size);
41 }
42+
43+QString MirSurface::appId() const
44+{
45+ QString appId;
46+
47+ if (m_session && m_session->application()) {
48+ appId = m_session->application()->appId();
49+ } else {
50+ appId.append("-");
51+ }
52+ return appId;
53+}
54
55=== modified file 'src/modules/Unity/Application/mirsurface.h'
56--- src/modules/Unity/Application/mirsurface.h 2015-08-24 12:43:01 +0000
57+++ src/modules/Unity/Application/mirsurface.h 2015-09-15 19:10:17 +0000
58@@ -77,8 +77,6 @@
59
60 bool isFirstFrameDrawn() const override { return m_firstFrameDrawn; }
61
62- SessionInterface *session() const override;
63-
64 void stopFrameDropper() override;
65 void startFrameDropper() override;
66
67@@ -110,6 +108,8 @@
68 Qt::TouchPointStates qtTouchPointStates,
69 ulong qtTimestamp) override;
70
71+ QString appId() const override;
72+
73 public Q_SLOTS:
74 void onCompositorSwappedBuffers() override;
75
76
77=== modified file 'src/modules/Unity/Application/mirsurfaceinterface.h'
78--- src/modules/Unity/Application/mirsurfaceinterface.h 2015-08-24 12:43:01 +0000
79+++ src/modules/Unity/Application/mirsurfaceinterface.h 2015-09-15 19:10:17 +0000
80@@ -43,8 +43,6 @@
81
82 virtual bool isFirstFrameDrawn() const = 0;
83
84- virtual SessionInterface *session() const = 0;
85-
86 virtual void stopFrameDropper() = 0;
87 virtual void startFrameDropper() = 0;
88
89@@ -76,6 +74,8 @@
90 Qt::TouchPointStates qtTouchPointStates,
91 ulong qtTimestamp) = 0;
92
93+ virtual QString appId() const = 0;
94+
95 public Q_SLOTS:
96 virtual void onCompositorSwappedBuffers() = 0;
97
98
99=== modified file 'src/modules/Unity/Application/mirsurfaceitem.cpp'
100--- src/modules/Unity/Application/mirsurfaceitem.cpp 2015-08-24 12:43:01 +0000
101+++ src/modules/Unity/Application/mirsurfaceitem.cpp 2015-09-15 19:10:17 +0000
102@@ -33,6 +33,7 @@
103 #include <QScreen>
104 #include <private/qsgdefaultimagenode_p.h>
105 #include <QTimer>
106+#include <QSGTextureProvider>
107
108 #include <QRunnable>
109
110@@ -333,16 +334,11 @@
111
112 QString MirSurfaceItem::appId() const
113 {
114- QString appId;
115-
116- SessionInterface *session = m_surface ? m_surface->session() : nullptr;
117-
118- if (session && session->application()) {
119- appId = session->application()->appId();
120+ if (m_surface) {
121+ return m_surface->appId();
122 } else {
123- appId.append("-");
124+ return QString("-");
125 }
126- return appId;
127 }
128
129 void MirSurfaceItem::endCurrentTouchSequence(ulong timestamp)
130@@ -571,7 +567,7 @@
131 {
132 QMutexLocker mutexLocker(&m_mutex);
133
134- qtmir::MirSurface *surface = static_cast<qtmir::MirSurface*>(unitySurface);
135+ auto surface = static_cast<qtmir::MirSurfaceInterface*>(unitySurface);
136 qCDebug(QTMIR_SURFACES).nospace() << "MirSurfaceItem::setSurface surface=" << surface;
137
138 if (surface == m_surface) {
139@@ -580,7 +576,13 @@
140
141 if (m_surface) {
142 disconnect(m_surface, nullptr, this, nullptr);
143+
144+ if (hasActiveFocus() && m_consumesInput && m_surface->live()) {
145+ m_surface->setFocus(false);
146+ }
147+
148 m_surface->decrementViewCount();
149+
150 if (!m_surface->isBeingDisplayed() && window()) {
151 disconnect(window(), nullptr, m_surface, nullptr);
152 }
153@@ -596,13 +598,13 @@
154
155 // When a new mir frame gets posted we notify the QML engine that this item needs redrawing,
156 // schedules call to updatePaintNode() from the rendering thread
157- connect(m_surface, &MirSurface::framesPosted, this, &QQuickItem::update);
158-
159- connect(m_surface, &MirSurface::stateChanged, this, &MirSurfaceItem::surfaceStateChanged);
160- connect(m_surface, &MirSurface::liveChanged, this, &MirSurfaceItem::liveChanged);
161- connect(m_surface, &MirSurface::sizeChanged, this, &MirSurfaceItem::onActualSurfaceSizeChanged);
162-
163- connect(window(), &QQuickWindow::frameSwapped, m_surface, &MirSurface::onCompositorSwappedBuffers,
164+ connect(m_surface, &MirSurfaceInterface::framesPosted, this, &QQuickItem::update);
165+
166+ connect(m_surface, &MirSurfaceInterface::stateChanged, this, &MirSurfaceItem::surfaceStateChanged);
167+ connect(m_surface, &MirSurfaceInterface::liveChanged, this, &MirSurfaceItem::liveChanged);
168+ connect(m_surface, &MirSurfaceInterface::sizeChanged, this, &MirSurfaceItem::onActualSurfaceSizeChanged);
169+
170+ connect(window(), &QQuickWindow::frameSwapped, m_surface, &MirSurfaceInterface::onCompositorSwappedBuffers,
171 (Qt::ConnectionType) (Qt::DirectConnection | Qt::UniqueConnection));
172
173 Q_EMIT typeChanged(m_surface->type());
174@@ -614,13 +616,17 @@
175
176 if (m_orientationAngle) {
177 m_surface->setOrientationAngle(*m_orientationAngle);
178- connect(m_surface, &MirSurface::orientationAngleChanged, this, &MirSurfaceItem::orientationAngleChanged);
179+ connect(m_surface, &MirSurfaceInterface::orientationAngleChanged, this, &MirSurfaceItem::orientationAngleChanged);
180 delete m_orientationAngle;
181 m_orientationAngle = nullptr;
182 } else {
183- connect(m_surface, &MirSurface::orientationAngleChanged, this, &MirSurfaceItem::orientationAngleChanged);
184+ connect(m_surface, &MirSurfaceInterface::orientationAngleChanged, this, &MirSurfaceItem::orientationAngleChanged);
185 Q_EMIT orientationAngleChanged(m_surface->orientationAngle());
186 }
187+
188+ if (m_consumesInput) {
189+ m_surface->setFocus(hasActiveFocus());
190+ }
191 }
192
193 Q_EMIT surfaceChanged(m_surface);
194
195=== modified file 'src/modules/Unity/Application/mirsurfaceitem.h'
196--- src/modules/Unity/Application/mirsurfaceitem.h 2015-08-24 12:43:01 +0000
197+++ src/modules/Unity/Application/mirsurfaceitem.h 2015-09-15 19:10:17 +0000
198@@ -26,7 +26,7 @@
199 // Unity API
200 #include <unity/shell/application/MirSurfaceItemInterface.h>
201
202-#include "mirsurface.h"
203+#include "mirsurfaceinterface.h"
204 #include "session_interface.h"
205
206 namespace qtmir {
207@@ -129,7 +129,7 @@
208 const QList<QTouchEvent::TouchPoint> &touchPoints,
209 Qt::TouchPointStates touchPointStates);
210
211- MirSurface* m_surface;
212+ MirSurfaceInterface* m_surface;
213
214 QMutex m_mutex;
215 MirTextureProvider *m_textureProvider;
216
217=== modified file 'tests/modules/common/fake_mirsurface.h'
218--- tests/modules/common/fake_mirsurface.h 2015-08-24 12:43:01 +0000
219+++ tests/modules/common/fake_mirsurface.h 2015-09-15 19:10:17 +0000
220@@ -102,8 +102,6 @@
221 return m_isFirstFrameDrawn;
222 }
223
224- SessionInterface *session() const override { return m_session; }
225-
226 void stopFrameDropper() override {
227 m_isFrameDropperRunning = false;
228 }
229@@ -158,6 +156,8 @@
230 m_touchesReceived.append(TouchEvent(mods, points, states, timestamp));
231 }
232
233+ QString appId() const override { return "foo-app"; }
234+
235 public Q_SLOTS:
236 void onCompositorSwappedBuffers() override {}
237

Subscribers

People subscribed via source and target branches