on xenial help sign in
better surface/session registration
commit936f3af29d30e3f842f2e1ecd36f755c88337c39 authorNick Dedekind <nicholas.dedekind@gmail.com> dateFri 29 Aug 2014, 00:16 (12 years ago) parent241ac41
11 files changed+39−15
qml/Shell.qml+9 tests/mocks/Unity/Application/ApplicationInfo.cpp+2 tests/mocks/Unity/Application/MirObjectModel.h+1−1 tests/mocks/Unity/Application/MirSurfaceItem.cpp−2 tests/mocks/Unity/Application/MirSurfaceItem.h+2−1 tests/mocks/Unity/Application/Session.cpp+5−1 tests/mocks/Unity/Application/Session.h+2−1 tests/mocks/Unity/Application/SessionManager.cpp+11−4 tests/mocks/Unity/Application/SessionManager.h+2 tests/mocks/Unity/Application/SurfaceManager.cpp+5−4 tests/mocks/Unity/Application/SurfaceManager.h−1
qml/Shell.qml+9
@@ -233,6 +233,15 @@ Item {
233233 }
234234 }
235235 }
236+ Connections {
237+ target: SessionManager
238+ onSessionStopping: {
239+ if (!session.parent) {
240+ // there's no one displaying it. delete it right away
241+ session.release();
242+ }
243+ }
244+ }
236245
237246 Lockscreen {
238247 id: lockscreen
tests/mocks/Unity/Application/ApplicationInfo.cpp+2
@@ -72,6 +72,7 @@ void ApplicationInfo::setSession(Session* session)
7272 disconnect(this, 0, m_session, 0);
7373 m_session->setApplication(nullptr);
7474 m_session->setParent(nullptr);
75+ Q_EMIT m_session->deregister();
7576 }
7677
7778 m_session = session;
@@ -79,6 +80,7 @@ void ApplicationInfo::setSession(Session* session)
7980 if (m_session) {
8081 m_session->setApplication(this);
8182 m_session->setParent(this);
83+ SessionManager::singleton()->registerSession(m_session);
8284
8385 if (!m_manualSurfaceCreation) {
8486 QTimer::singleShot(500, m_session, SLOT(createSurface()));
tests/mocks/Unity/Application/MirObjectModel.h+1−1
@@ -43,7 +43,7 @@ public:
4343
4444 int existingIndex = m_items.indexOf(item);
4545 if (existingIndex != -1) {
46− move(existingIndex, index);
46+ move(existingIndex, qMin(index, (uint)(m_items.count()-1)));
4747 } else {
4848 beginInsertRows(QModelIndex(), index, index);
4949 m_items.insert(index, item);
tests/mocks/Unity/Application/MirSurfaceItem.cpp−2
@@ -82,8 +82,6 @@ MirSurfaceItem::MirSurfaceItem(const QString& name,
8282MirSurfaceItem::~MirSurfaceItem()
8383{
8484 qDebug() << "MirSurfaceItem::~MirSurfaceItem() " << name();
85− Q_EMIT aboutToBeDestroyed();
86−
8785 if (m_session) {
8886 m_session->setSurface(nullptr);
8987 }
tests/mocks/Unity/Application/MirSurfaceItem.h+2−1
@@ -79,7 +79,8 @@ Q_SIGNALS:
7979 void inputMethodRequested();
8080 void inputMethodDismissed();
8181
82− void aboutToBeDestroyed();
82+ // internal mock use
83+ void deregister();
8384
8485private Q_SLOTS:
8586 void onFocusChanged();
tests/mocks/Unity/Application/Session.cpp+5−1
@@ -16,6 +16,7 @@
1616
1717#include "Session.h"
1818#include "ApplicationInfo.h"
19+#include "SessionManager.h"
1920#include "SurfaceManager.h"
2021
2122#include <QPainter>
@@ -59,7 +60,6 @@ Session::~Session()
5960void Session::release()
6061{
6162 qDebug() << "Session::release " << name();
62− Q_EMIT aboutToBeDestroyed();
6363
6464 if (m_parentSession) {
6565 m_parentSession->removeChildSession(this);
@@ -89,6 +89,7 @@ void Session::setSurface(MirSurfaceItem* surface)
8989 if (m_surface) {
9090 m_surface->setSession(nullptr);
9191 m_surface->setParent(nullptr);
92+ Q_EMIT m_surface->deregister();
9293 }
9394
9495 m_surface = surface;
@@ -96,6 +97,7 @@ void Session::setSurface(MirSurfaceItem* surface)
9697 if (m_surface) {
9798 m_surface->setSession(this);
9899 m_surface->setParent(this);
100+ SurfaceManager::singleton()->registerSurface(m_surface);
99101 }
100102
101103 Q_EMIT surfaceChanged(m_surface);
@@ -141,6 +143,7 @@ void Session::insertChildSession(uint index, Session* session)
141143
142144 session->setParentSession(this);
143145 m_children->insert(index, session);
146+ SessionManager::singleton()->registerSession(session);
144147}
145148
146149void Session::removeChildSession(Session* session)
@@ -150,6 +153,7 @@ void Session::removeChildSession(Session* session)
150153 if (m_children->contains(session)) {
151154 m_children->remove(session);
152155 session->setParentSession(nullptr);
156+ Q_EMIT session->deregister();
153157 }
154158}
155159
tests/mocks/Unity/Application/Session.h+2−1
@@ -57,7 +57,8 @@ Q_SIGNALS:
5757 void surfaceChanged(MirSurfaceItem*);
5858 void parentSessionChanged(Session*);
5959 void removed();
60− void aboutToBeDestroyed();
60+ // internal mock use
61+ void deregister();
6162
6263public Q_SLOTS:
6364 Q_INVOKABLE void createSurface();
tests/mocks/Unity/Application/SessionManager.cpp+11−4
@@ -38,10 +38,17 @@ Session *SessionManager::createSession(const QString& name,
3838 const QUrl& screenshot)
3939{
4040 Session* session = new Session(name, screenshot);
41− connect(session, &Session::aboutToBeDestroyed, this, [&] {
42− Q_EMIT sessionStopping(qobject_cast<Session*>(sender()));
43− });
44−
4541 Q_EMIT sessionStarting(session);
4642 return session;
4743}
44+
45+void SessionManager::registerSession(Session *session)
46+{
47+ connect(session, &Session::deregister, this, [this] {
48+ Session* session = qobject_cast<Session*>(sender());
49+
50+ disconnect(session, 0, this, 0);
51+ Q_EMIT sessionStopping(session);
52+ });
53+}
54+
tests/mocks/Unity/Application/SessionManager.h+2
@@ -31,6 +31,8 @@ public:
3131
3232 Q_INVOKABLE Session* createSession(const QString& name, const QUrl& screenshot);
3333
34+ void registerSession(Session *session);
35+
3436Q_SIGNALS:
3537 void sessionStarting(Session *session);
3638 void sessionStopping(Session *session);
tests/mocks/Unity/Application/SurfaceManager.cpp+5−4
@@ -44,16 +44,17 @@ MirSurfaceItem *SurfaceManager::createSurface(const QString& name,
4444 type,
4545 state,
4646 screenshot);
47− registerSurface(surface);
48− connect(surface, &MirSurfaceItem::aboutToBeDestroyed, this, [&] {
49− Q_EMIT surfaceDestroyed(qobject_cast<MirSurfaceItem*>(sender()));
50− });
5147 Q_EMIT surfaceCreated(surface);
5248 return surface;
5349}
5450
5551void SurfaceManager::registerSurface(MirSurfaceItem *surface)
5652{
53+ connect(surface, &MirSurfaceItem::deregister, this, [this] {
54+ MirSurfaceItem* surface = qobject_cast<MirSurfaceItem*>(sender());
55+ disconnect(surface, 0, this, 0);
56+ Q_EMIT surfaceDestroyed(surface);
57+ });
5758 connect(surface, &MirSurfaceItem::inputMethodRequested,
5859 this, &SurfaceManager::showInputMethod);
5960 connect(surface, &MirSurfaceItem::inputMethodDismissed,
tests/mocks/Unity/Application/SurfaceManager.h−1
@@ -36,7 +36,6 @@ public:
3636
3737 // Internal mock use
3838 void registerSurface(MirSurfaceItem *surface);
39− void unregisterSurface(MirSurfaceItem *surface);
4039
4140 // To be used in the tests
4241 Q_INVOKABLE MirSurfaceItem *inputMethodSurface();