@@ -32,7 +32,6 @@ MirSurface::MirSurface(const QString& name,
3232 , m_qmlFilePath(qmlFilePath)
3333 , m_live(true)
3434 , m_visible(true)
35− , m_viewCount(0)
3635 , m_activeFocus(false)
3736 , m_width(-1)
3837 , m_height(-1)
@@ -88,7 +87,7 @@ void MirSurface::setLive(bool live)
8887 m_live = live;
8988 Q_EMIT liveChanged(live);
9089
91− if (!m_live && m_viewCount == 0) {
90+ if (!m_live && m_views.count() == 0) {
9291 deleteLater();
9392 }
9493}
@@ -126,27 +125,49 @@ void MirSurface::setOrientationAngle(Mir::OrientationAngle angle)
126125 Q_EMIT orientationAngleChanged(angle);
127126}
128127
129−void MirSurface::incrementViewCount()
128+
129+
130+void MirSurface::registerView(qintptr viewId)
130131{
131− ++m_viewCount;
132−// qDebug().nospace() << "MirSurface::incrementViewCount() viewCount(after)=" << m_viewCount << " " << name();
132+ m_views.insert(viewId, MirSurface::View{false});
133+ qDebug().nospace() << "MirSurface[" << name() << "]::registerView(" << viewId << ")"
134+ << " after=" << m_views.count();
133135}
134136
135−void MirSurface::decrementViewCount()
137+void MirSurface::unregisterView(qintptr viewId)
136138{
137− --m_viewCount;
138−// qDebug().nospace() << "MirSurface::decrementViewCount() viewCount(after)=" << m_viewCount << " " << name();
139−
140− Q_ASSERT(m_viewCount >= 0);
141−
142− if (!m_live && m_viewCount == 0) {
139+ qDebug().nospace() << "MirSurface[" << name() << "]::unregisterView(" << viewId << ")"
140+ << " after=" << m_views.count() << " live=" << m_live;
141+ m_views.remove(viewId);
142+ if (!m_live && m_views.count() == 0) {
143143 deleteLater();
144144 }
145+ updateVisibility();
145146}
146147
147−int MirSurface::viewCount() const
148+void MirSurface::setViewVisibility(qintptr viewId, bool visible)
148149{
149− return m_viewCount;
150+ if (!m_views.contains(viewId)) return;
151+
152+ m_views[viewId].visible = visible;
153+ updateVisibility();
154+}
155+
156+void MirSurface::updateVisibility()
157+{
158+ bool newVisible = false;
159+ QHashIterator<qintptr, View> i(m_views);
160+ while (i.hasNext()) {
161+ i.next();
162+ newVisible |= i.value().visible;
163+ }
164+
165+ if (newVisible != visible()) {
166+// qDebug().nospace() << "MirSurface[" << name() << "]::updateVisibility(" << newVisible << ")";
167+
168+ m_visible = newVisible;
169+ Q_EMIT visibleChanged(m_visible);
170+ }
150171}
151172
152173bool MirSurface::activeFocus() const
@@ -164,18 +185,6 @@ void MirSurface::setActiveFocus(bool value)
164185 Q_EMIT activeFocusChanged(value);
165186}
166187
167−void MirSurface::setVisible(bool visible)
168−{
169− qDebug() << "MirSurface::setVisible(visible=" << visible << ")";
170−
171− if (m_visible == visible)
172− return;
173−
174− m_visible = visible;
175−
176− Q_EMIT visibleChanged(m_visible);
177−}
178−
179188int MirSurface::width() const
180189{
181190 return m_width;