Merge lp:~gerboland/miral/qt-distinguish-visible-exposure into lp:miral

Proposed by Gerry Boland
Status: Merged
Approved by: Daniel d'Andrada
Approved revision: 348
Merged at revision: 353
Proposed branch: lp:~gerboland/miral/qt-distinguish-visible-exposure
Merge into: lp:miral
Diff against target: 190 lines (+25/-22)
8 files modified
miral-qt/demos/qml-demo-shell/windowModel.qml (+1/-0)
miral-qt/src/modules/Unity/Application/mirsurface.cpp (+13/-11)
miral-qt/src/modules/Unity/Application/mirsurface.h (+3/-3)
miral-qt/src/modules/Unity/Application/mirsurfaceinterface.h (+1/-1)
miral-qt/src/modules/Unity/Application/mirsurfaceitem.cpp (+4/-4)
miral-qt/src/modules/Unity/Application/mirsurfaceitem.h (+1/-1)
miral-qt/tests/framework/fake_mirsurface.cpp (+1/-1)
miral-qt/tests/framework/fake_mirsurface.h (+1/-1)
To merge this branch: bzr merge lp:~gerboland/miral/qt-distinguish-visible-exposure
Reviewer Review Type Date Requested Status
Daniel d'Andrada (community) Approve
Review via email: mp+306218@code.launchpad.net

Commit message

[miral-qt] Distinguish visible from exposure: miral sets surface visibility, qml should apply that and set the exposure

visible = miral has decided the surface can be visible
exposed = surface is not occluded, so compositor will draw the surface, therefore client should keep generating frames

To post a comment you must log in.
Revision history for this message
Daniel d'Andrada (dandrader) wrote :

What's the motivation (use case) for this division?

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

I see. WindowInfo::is_visible() is defined by mir_surface_state (hidden || minimized).

Looks like redundant API to me since we have state already. Unless there are future plans for "visible" that involves more than surface state.

unity8/qml/Components/InputMethod.qml could make use of this helper property.

review: Approve
Revision history for this message
Gerry Boland (gerboland) wrote :

They have different purposes.

Clients set their surface state, and can use those states to inform Mir/Shell if a surface should be visible not. That is what WindowInfo::is_visible decides for us.

But the mir_surface_attrib_visibility is how Mir/Shell tells the client that its surface is occluded or not. Then client can decide to stop drawing useless frames.

They're different concepts, but with similar names, so I separated them and renamed the later to "exposed" to hopefully reduce the confusion.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'miral-qt/demos/qml-demo-shell/windowModel.qml'
2--- miral-qt/demos/qml-demo-shell/windowModel.qml 2016-09-20 12:01:17 +0000
3+++ miral-qt/demos/qml-demo-shell/windowModel.qml 2016-09-20 13:41:40 +0000
4@@ -26,6 +26,7 @@
5 width: surface.size.width
6 height: surface.size.height
7 focus: surface.focused
8+ visible: surface.visible
9
10 Rectangle {
11 anchors { top: parent.bottom; right: parent.right }
12
13=== modified file 'miral-qt/src/modules/Unity/Application/mirsurface.cpp'
14--- miral-qt/src/modules/Unity/Application/mirsurface.cpp 2016-09-16 10:12:17 +0000
15+++ miral-qt/src/modules/Unity/Application/mirsurface.cpp 2016-09-20 13:41:40 +0000
16@@ -623,7 +623,7 @@
17
18 bool MirSurface::visible() const
19 {
20- return m_surface->query(mir_surface_attrib_visibility) == mir_surface_visibility_exposed;
21+ return m_windowInfo.is_visible();
22 }
23 #include <mir_toolkit/event.h>
24 void MirSurface::mousePressEvent(QMouseEvent *event)
25@@ -741,32 +741,34 @@
26 deleteLater();
27 }
28 }
29- updateVisibility();
30+ updateExposure();
31 setViewActiveFocus(viewId, false);
32 }
33
34-void MirSurface::setViewVisibility(qintptr viewId, bool visible)
35+void MirSurface::setViewExposure(qintptr viewId, bool exposed)
36 {
37 if (!m_views.contains(viewId)) return;
38
39- m_views[viewId].visible = visible;
40- updateVisibility();
41+ m_views[viewId].exposed = exposed;
42+ updateExposure();
43 }
44
45-void MirSurface::updateVisibility()
46+void MirSurface::updateExposure()
47 {
48- bool newVisible = false;
49+ bool newExposed = false;
50 QHashIterator<qintptr, View> i(m_views);
51 while (i.hasNext()) {
52 i.next();
53- newVisible |= i.value().visible;
54+ newExposed |= i.value().exposed;
55 }
56
57- if (newVisible != visible()) {
58- DEBUG_MSG << "(" << newVisible << ")";
59+ const bool oldExposed = (m_surface->query(mir_surface_attrib_visibility) == mir_surface_visibility_exposed);
60+
61+ if (newExposed != oldExposed) {
62+ DEBUG_MSG << "(" << newExposed << ")";
63
64 m_surface->configure(mir_surface_attrib_visibility,
65- newVisible ? mir_surface_visibility_exposed : mir_surface_visibility_occluded);
66+ newExposed ? mir_surface_visibility_exposed : mir_surface_visibility_occluded);
67 }
68 }
69
70
71=== modified file 'miral-qt/src/modules/Unity/Application/mirsurface.h'
72--- miral-qt/src/modules/Unity/Application/mirsurface.h 2016-09-16 10:12:17 +0000
73+++ miral-qt/src/modules/Unity/Application/mirsurface.h 2016-09-20 13:41:40 +0000
74@@ -108,7 +108,7 @@
75
76 void registerView(qintptr viewId) override;
77 void unregisterView(qintptr viewId) override;
78- void setViewVisibility(qintptr viewId, bool visible) override;
79+ void setViewExposure(qintptr viewId, bool exposed) override;
80
81 // methods called from the rendering (scene graph) thread:
82 QSharedPointer<QSGTexture> texture() override;
83@@ -181,7 +181,7 @@
84 private:
85 void syncSurfaceSizeWithItemSize();
86 bool clientIsRunning() const;
87- void updateVisibility();
88+ void updateExposure();
89 void applyKeymap();
90 void updateActiveFocus();
91
92@@ -206,7 +206,7 @@
93
94 bool m_live;
95 struct View {
96- bool visible;
97+ bool exposed;
98 };
99 QHash<qintptr, View> m_views;
100
101
102=== modified file 'miral-qt/src/modules/Unity/Application/mirsurfaceinterface.h'
103--- miral-qt/src/modules/Unity/Application/mirsurfaceinterface.h 2016-09-15 16:18:13 +0000
104+++ miral-qt/src/modules/Unity/Application/mirsurfaceinterface.h 2016-09-20 13:41:40 +0000
105@@ -64,7 +64,7 @@
106
107 virtual void registerView(qintptr viewId) = 0;
108 virtual void unregisterView(qintptr viewId) = 0;
109- virtual void setViewVisibility(qintptr viewId, bool visible) = 0;
110+ virtual void setViewExposure(qintptr viewId, bool exposed) = 0;
111
112 // methods called from the rendering (scene graph) thread:
113 virtual QSharedPointer<QSGTexture> texture() = 0;
114
115=== modified file 'miral-qt/src/modules/Unity/Application/mirsurfaceitem.cpp'
116--- miral-qt/src/modules/Unity/Application/mirsurfaceitem.cpp 2016-08-16 14:15:26 +0000
117+++ miral-qt/src/modules/Unity/Application/mirsurfaceitem.cpp 2016-09-20 13:41:40 +0000
118@@ -104,7 +104,7 @@
119 connect(&m_updateMirSurfaceSizeTimer, &QTimer::timeout, this, &MirSurfaceItem::updateMirSurfaceSize);
120
121 connect(this, &QQuickItem::activeFocusChanged, this, &MirSurfaceItem::updateMirSurfaceActiveFocus);
122- connect(this, &QQuickItem::visibleChanged, this, &MirSurfaceItem::updateMirSurfaceVisibility);
123+ connect(this, &QQuickItem::visibleChanged, this, &MirSurfaceItem::updateMirSurfaceExposure);
124 connect(this, &QQuickItem::windowChanged, this, &MirSurfaceItem::onWindowChanged);
125 }
126
127@@ -511,13 +511,13 @@
128 m_surface->resize(width, height);
129 }
130
131-void MirSurfaceItem::updateMirSurfaceVisibility()
132+void MirSurfaceItem::updateMirSurfaceExposure()
133 {
134 if (!m_surface || !m_surface->live()) {
135 return;
136 }
137
138- m_surface->setViewVisibility((qintptr)this, isVisible());
139+ m_surface->setViewExposure((qintptr)this, isVisible());
140 }
141
142 void MirSurfaceItem::updateMirSurfaceActiveFocus()
143@@ -620,7 +620,7 @@
144
145 updateMirSurfaceSize();
146 setImplicitSize(m_surface->size().width(), m_surface->size().height());
147- updateMirSurfaceVisibility();
148+ updateMirSurfaceExposure();
149
150 // Qt::ArrowCursor is the default when no cursor has been explicitly set, so no point forwarding it.
151 if (m_surface->cursor().shape() != Qt::ArrowCursor) {
152
153=== modified file 'miral-qt/src/modules/Unity/Application/mirsurfaceitem.h'
154--- miral-qt/src/modules/Unity/Application/mirsurfaceitem.h 2016-09-08 23:57:22 +0000
155+++ miral-qt/src/modules/Unity/Application/mirsurfaceitem.h 2016-09-20 13:41:40 +0000
156@@ -115,7 +115,7 @@
157 void updateMirSurfaceSize();
158
159 void updateMirSurfaceActiveFocus();
160- void updateMirSurfaceVisibility();
161+ void updateMirSurfaceExposure();
162
163 void onActualSurfaceSizeChanged(QSize size);
164 void onCompositorSwappedBuffers();
165
166=== modified file 'miral-qt/tests/framework/fake_mirsurface.cpp'
167--- miral-qt/tests/framework/fake_mirsurface.cpp 2016-09-15 16:18:13 +0000
168+++ miral-qt/tests/framework/fake_mirsurface.cpp 2016-09-20 13:41:40 +0000
169@@ -131,7 +131,7 @@
170 }
171 }
172
173-void FakeMirSurface::setViewVisibility(qintptr viewId, bool visible) {
174+void FakeMirSurface::setViewExposure(qintptr viewId, bool visible) {
175 if (!m_views.contains(viewId)) return;
176
177 m_views[viewId] = visible;
178
179=== modified file 'miral-qt/tests/framework/fake_mirsurface.h'
180--- miral-qt/tests/framework/fake_mirsurface.h 2016-09-15 16:18:13 +0000
181+++ miral-qt/tests/framework/fake_mirsurface.h 2016-09-20 13:41:40 +0000
182@@ -100,7 +100,7 @@
183 void stopFrameDropper() override;
184 void startFrameDropper() override;
185 void setLive(bool value) override;
186- void setViewVisibility(qintptr viewId, bool visible) override;
187+ void setViewExposure(qintptr viewId, bool visible) override;
188 bool isBeingDisplayed() const override;
189 void registerView(qintptr viewId) override;
190 void unregisterView(qintptr viewId) override;

Subscribers

People subscribed via source and target branches