on xenial help sign in
Session can have multiple surfaces now

As a first step, we just display the latest surface for each application.

commitf1fcbbba7ffb62a9fdf2495613c18ba1f437748f authorDaniel d'Andrada <daniel.dandrada@canonical.com> dateTue 8 Dec 2015, 15:36 (11 years ago) parentec2dad3455f850
14 files changed+122−107
qml/Stages/DesktopSpreadDelegate.qml+2−2 qml/Stages/SessionContainer.qml+3−3 tests/mocks/Unity/Application/ApplicationInfo.cpp+3−3 tests/mocks/Unity/Application/ApplicationInfo.h+1−1 tests/mocks/Unity/Application/Session.cpp+27−17 tests/mocks/Unity/Application/Session.h+12−9 tests/qmltests/Stages/RecursingChildSessionControl.qml+4−4 tests/qmltests/Stages/tst_ApplicationWindow.qml+7−7 tests/qmltests/Stages/tst_DesktopStage.qml+25−23 tests/qmltests/Stages/tst_SessionContainer.qml+4−4 tests/qmltests/Stages/tst_TabletStage.qml+7−7 tests/qmltests/tst_OrientedShell.qml+6−6 tests/qmltests/tst_Shell.qml+20−20 tests/qmltests/tst_ShellWithPin.qml+1−1
qml/Stages/DesktopSpreadDelegate.qml+2−2
@@ -29,8 +29,8 @@ Item {
2929 property bool highlightShown: false
3030 property real shadowOpacity: 1
3131
32− property int windowWidth: application && application.session && application.session.surface ? application.session.surface.size.width : 0
33− property int windowHeight: application && application.session && application.session.surface ? application.session.surface.size.height : 0
32+ property int windowWidth: application && application.session && application.session.lastSurface ? application.session.lastSurface.size.width : 0
33+ property int windowHeight: application && application.session && application.session.lastSurface ? application.session.lastSurface.size.height : 0
3434
3535 state: "normal"
3636 states: [
qml/Stages/SessionContainer.qml+3−3
@@ -37,7 +37,7 @@ FocusScope {
3737 id: _surfaceContainer
3838 requestedWidth: root.requestedWidth
3939 requestedHeight: root.requestedHeight
40− surface: session ? session.surface : null
40+ surface: session ? session.lastSurface : null
4141 }
4242
4343 // SurfaceContainer size drives SessionContainer size
@@ -110,13 +110,13 @@ FocusScope {
110110 State {
111111 name: "childSession"
112112 when: root.session && root.session.parentSession !== null && root.session.live
113− && !root.session.surface
113+ && !root.session.lastSurface
114114 },
115115
116116 State {
117117 name: "childSessionReady"
118118 when: root.session && root.session.parentSession !== null && root.session.live
119− && root.session.surface !== null
119+ && root.session.lastSurface !== null
120120 },
121121
122122 State {
tests/mocks/Unity/Application/ApplicationInfo.cpp+3−3
@@ -101,8 +101,8 @@ void ApplicationInfo::setSession(Session* session)
101101 m_session->setApplication(this);
102102 m_session->setParent(this);
103103 SessionManager::singleton()->registerSession(m_session);
104− connect(m_session, &Session::surfaceChanged,
105− this, &ApplicationInfo::onSessionSurfaceChanged);
104+ connect(m_session, &Session::surfaceAdded,
105+ this, &ApplicationInfo::onSessionSurfaceAdded);
106106
107107 if (!m_manualSurfaceCreation) {
108108 QTimer::singleShot(500, m_session, &Session::createSurface);
@@ -253,7 +253,7 @@ void ApplicationInfo::setIsTouchApp(bool isTouchApp)
253253 m_isTouchApp = isTouchApp;
254254}
255255
256−void ApplicationInfo::onSessionSurfaceChanged(MirSurface* surface)
256+void ApplicationInfo::onSessionSurfaceAdded(MirSurface* surface)
257257{
258258 if (surface != nullptr && m_state == Starting) {
259259 if (m_requestedState == RequestedRunning) {
tests/mocks/Unity/Application/ApplicationInfo.h+1−1
@@ -106,7 +106,7 @@ public Q_SLOTS:
106106 Q_INVOKABLE void destroySession();
107107
108108private Q_SLOTS:
109− void onSessionSurfaceChanged(MirSurface*);
109+ void onSessionSurfaceAdded(MirSurface*);
110110
111111private:
112112 void setIcon(const QUrl &value);
tests/mocks/Unity/Application/Session.cpp+27−17
@@ -80,29 +80,25 @@ void Session::setApplication(ApplicationInfo* application)
8080 Q_EMIT applicationChanged(application);
8181}
8282
83−void Session::setSurface(MirSurface* surface)
83+void Session::appendSurface(MirSurface* surface)
8484{
85−// qDebug() << "Session::setSurface - session=" << name() << "surface=" << surface;
86− if (m_surface == surface)
87− return;
85+ // qDebug() << "Session::appendSurface - session=" << name() << "surface=" << surface;
8886
89− if (m_surface) {
90− disconnect(m_surface, nullptr, this, nullptr);
91− }
87+ m_surfaces.insert(m_surfaces.rowCount(), surface);
9288
93− m_surface = surface;
89+ connect(surface, &QObject::destroyed,
90+ this, [this, surface]() { this->removeSurface(surface); });
9491
95− if (m_surface) {
96− connect(m_surface, &QObject::destroyed, this, &Session::onSurfaceDestroyed);
97− }
98−
99− Q_EMIT surfaceChanged(m_surface);
92+ Q_EMIT lastSurfaceChanged(surface);
93+ Q_EMIT surfaceAdded(surface);
10094}
10195
102−void Session::onSurfaceDestroyed()
96+void Session::removeSurface(MirSurface* surface)
10397{
104− m_surface = nullptr;
105− Q_EMIT surfaceChanged(nullptr);
98+ disconnect(surface, nullptr, this, nullptr);
99+ if (m_surfaces.contains(surface)) {
100+ m_surfaces.remove(surface);
101+ }
106102}
107103
108104void Session::setScreenshot(const QUrl& screenshot)
@@ -136,7 +132,7 @@ void Session::createSurface()
136132{
137133 if (m_surface) return;
138134
139− setSurface(SurfaceManager::singleton()->createSurface(name(),
135+ appendSurface(SurfaceManager::singleton()->createSurface(name(),
140136 Mir::NormalType,
141137 m_application && m_application->fullscreen() ? Mir::FullscreenState :
142138 Mir::MaximizedState,
@@ -172,3 +168,17 @@ SessionModel* Session::childSessions() const
172168{
173169 return m_children;
174170}
171+
172+ObjectListModel<MirSurface>* Session::surfaces() const
173+{
174+ return const_cast<ObjectListModel<MirSurface>*>(&m_surfaces);
175+}
176+
177+MirSurface *Session::lastSurface() const
178+{
179+ if (m_surfaces.rowCount() > 0) {
180+ return m_surfaces.list().last();
181+ } else {
182+ return nullptr;
183+ }
184+}
tests/mocks/Unity/Application/Session.h+12−9
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2014,2015 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -17,6 +17,7 @@
1717#ifndef SESSION_H
1818#define SESSION_H
1919
20+#include "ObjectListModel.h"
2021#include "SessionModel.h"
2122
2223#include <QQuickItem>
@@ -28,7 +29,8 @@ class Session : public QObject
2829{
2930 Q_OBJECT
3031 Q_PROPERTY(QString name READ name CONSTANT)
31− Q_PROPERTY(MirSurface* surface READ surface NOTIFY surfaceChanged)
32+ Q_PROPERTY(MirSurface* lastSurface READ lastSurface NOTIFY lastSurfaceChanged)
33+ Q_PROPERTY(ObjectListModel<MirSurface>* surfaces READ surfaces CONSTANT)
3234 Q_PROPERTY(ApplicationInfo* application READ application NOTIFY applicationChanged)
3335 Q_PROPERTY(Session* parentSession READ parentSession NOTIFY parentSessionChanged DESIGNABLE false)
3436 Q_PROPERTY(SessionModel* childSessions READ childSessions DESIGNABLE false CONSTANT)
@@ -46,11 +48,13 @@ public:
4648 QString name() const { return m_name; }
4749 bool live() const { return m_live; }
4850 ApplicationInfo* application() const { return m_application; }
49− MirSurface* surface() const { return m_surface; }
51+ MirSurface *lastSurface() const;
52+ ObjectListModel<MirSurface>* surfaces() const;
5053 Session* parentSession() const { return m_parentSession; }
5154
5255 void setApplication(ApplicationInfo* item);
53− void setSurface(MirSurface* surface);
56+ void appendSurface(MirSurface* surface);
57+ void removeSurface(MirSurface* surface);
5458 void setScreenshot(const QUrl& m_screenshot);
5559 void setLive(bool live);
5660
@@ -60,9 +64,10 @@ public:
6064
6165Q_SIGNALS:
6266 void applicationChanged(ApplicationInfo*);
63− void surfaceChanged(MirSurface*);
6467 void parentSessionChanged(Session*);
6568 void liveChanged(bool live);
69+ void surfaceAdded(MirSurface *surface);
70+ void lastSurfaceChanged(MirSurface *surface);
6671
6772 // internal mock use
6873 void deregister();
@@ -70,10 +75,6 @@ Q_SIGNALS:
7075public Q_SLOTS:
7176 Q_INVOKABLE void createSurface();
7277
73−
74−private Q_SLOTS:
75− void onSurfaceDestroyed();
76−
7778private:
7879 SessionModel* childSessions() const;
7980 void setParentSession(Session* session);
@@ -85,10 +86,12 @@ private:
8586 MirSurface* m_surface;
8687 Session* m_parentSession;
8788 SessionModel* m_children;
89+ ObjectListModel<MirSurface> m_surfaces;
8890
8991 friend class ApplicationTestInterface;
9092};
9193
9294Q_DECLARE_METATYPE(Session*)
95+Q_DECLARE_METATYPE(ObjectListModel<MirSurface>*)
9396
9497#endif // SESSION_H
tests/qmltests/Stages/RecursingChildSessionControl.qml+4−4
@@ -94,15 +94,15 @@ ColumnLayout {
9494 onCheckedChanged: {
9595 if (checked) {
9696 root.session.createSurface();
97− } else if (root.session && root.session.surface) {
98− ApplicationTest.removeSurface(root.session.surface);
97+ } else if (root.session && root.session.lastSurface) {
98+ ApplicationTest.removeSurface(root.session.lastSurface);
9999 }
100100 }
101101
102102 Connections {
103103 target: root.session ? root.session : null
104104 onSurfaceChanged: {
105− surfaceCheckbox.checked = root.session.surface !== null
105+ surfaceCheckbox.checked = root.session.lastSurface !== null
106106 }
107107 }
108108 }
@@ -123,7 +123,7 @@ ColumnLayout {
123123 onClicked: {
124124 if (removable) {
125125 // release the surface first. simulates mir app closing
126− if (root.session.surface) ApplicationTest.removeSurface(root.session.surface);
126+ if (root.session.lastSurface) ApplicationTest.removeSurface(root.session.lastSurface);
127127 ApplicationTest.removeSession(root.session);
128128 } else {
129129 root.session.release();
tests/qmltests/Stages/tst_ApplicationWindow.qml+7−7
@@ -356,19 +356,19 @@ Rectangle {
356356 setApplicationState(appRunning);
357357 tryCompare(stateGroup, "state", "surface");
358358 waitUntilTransitionsEnd(stateGroup);
359− verify(fakeSession.surface !== null);
359+ verify(fakeSession.lastSurface !== null);
360360
361361 applicationWindowLoader.item.visible = false;
362362
363363 waitUntilTransitionsEnd(stateGroup);
364364 verify(stateGroup.state === "surface");
365− verify(fakeSession.surface !== null);
365+ verify(fakeSession.lastSurface !== null);
366366
367367 applicationWindowLoader.item.visible = true;
368368
369369 waitUntilTransitionsEnd(stateGroup);
370370 verify(stateGroup.state === "surface");
371− verify(fakeSession.surface !== null);
371+ verify(fakeSession.lastSurface !== null);
372372 }
373373
374374 function test_touchesReachSurfaceWhenItsShown() {
@@ -381,7 +381,7 @@ Rectangle {
381381
382382 var surfaceItem = findChild(applicationWindowLoader.item, "surfaceItem");
383383 verify(surfaceItem);
384− verify(surfaceItem.surface === fakeSession.surface);
384+ verify(surfaceItem.surface === fakeSession.lastSurface);
385385
386386 surfaceItem.touchPressCount = 0;
387387 surfaceItem.touchReleaseCount = 0;
@@ -410,13 +410,13 @@ Rectangle {
410410 applicationWindowLoader.item.interactive = true;
411411 fakeSession.createSurface();
412412
413− compare(fakeSession.surface.activeFocus, true);
413+ compare(fakeSession.lastSurface.activeFocus, true);
414414
415415 applicationWindowLoader.item.interactive = false;
416− compare(fakeSession.surface.activeFocus, false);
416+ compare(fakeSession.lastSurface.activeFocus, false);
417417
418418 applicationWindowLoader.item.interactive = true;
419− compare(fakeSession.surface.activeFocus, true);
419+ compare(fakeSession.lastSurface.activeFocus, true);
420420 }
421421 }
422422}
tests/qmltests/Stages/tst_DesktopStage.qml+25−23
@@ -98,7 +98,7 @@ Item {
9898 activeFocusOnPress: false
9999 onClicked: {
100100 if (ApplicationManager.focusedApplicationId) {
101− var surface = ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).session.surface;
101+ var surface = ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).session.lastSurface;
102102 surface.slowToResize = true;
103103 }
104104 }
@@ -170,7 +170,7 @@ Item {
170170 }
171171 verify(app);
172172 waitUntilAppSurfaceShowsUp(appId);
173− verify(app.session.surface);
173+ verify(app.session.lastSurface);
174174 return app;
175175 }
176176
@@ -185,10 +185,10 @@ Item {
185185 data.apps.forEach(startApplication);
186186
187187 ApplicationManager.requestFocusApplication(data.apps[data.focusfrom]);
188− tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.surface, "activeFocus", true);
188+ tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.lastSurface, "activeFocus", true);
189189
190190 ApplicationManager.requestFocusApplication(data.apps[data.focusTo]);
191− tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.surface, "activeFocus", true);
191+ tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.lastSurface, "activeFocus", true);
192192 }
193193
194194 function test_tappingOnWindowChangesFocusedApp_data() {
@@ -206,13 +206,13 @@ Item {
206206 var fromAppWindow = findChild(desktopStage, "appWindow_" + fromAppId);
207207 verify(fromAppWindow);
208208 tap(fromAppWindow);
209− compare(fromAppWindow.application.session.surface.activeFocus, true);
209+ compare(fromAppWindow.application.session.lastSurface.activeFocus, true);
210210 compare(ApplicationManager.focusedApplicationId, fromAppId);
211211
212212 var toAppWindow = findChild(desktopStage, "appWindow_" + toAppId);
213213 verify(toAppWindow);
214214 tap(toAppWindow);
215− compare(toAppWindow.application.session.surface.activeFocus, true);
215+ compare(toAppWindow.application.session.lastSurface.activeFocus, true);
216216 compare(ApplicationManager.focusedApplicationId, toAppId);
217217 }
218218
@@ -228,13 +228,13 @@ Item {
228228 var fromAppWindow = findChild(desktopStage, "appWindow_" + fromAppId);
229229 verify(fromAppWindow);
230230 mouseClick(fromAppWindow);
231− compare(fromAppWindow.application.session.surface.activeFocus, true);
231+ compare(fromAppWindow.application.session.lastSurface.activeFocus, true);
232232 compare(ApplicationManager.focusedApplicationId, fromAppId);
233233
234234 var toAppWindow = findChild(desktopStage, "appWindow_" + toAppId);
235235 verify(toAppWindow);
236236 mouseClick(toAppWindow);
237− compare(toAppWindow.application.session.surface.activeFocus, true);
237+ compare(toAppWindow.application.session.lastSurface.activeFocus, true);
238238 compare(ApplicationManager.focusedApplicationId, toAppId);
239239 }
240240
@@ -251,16 +251,18 @@ Item {
251251 var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
252252 verify(fromAppDecoration);
253253 tap(fromAppDecoration);
254+
254255 var fromApp = ApplicationManager.findApplication(data.apps[data.focusfrom]);
255256 verify(fromApp);
256− tryCompare(fromApp.session.surface, "activeFocus", true);
257+ tryCompare(fromApp.session.lastSurface, "activeFocus", true);
257258
258259 var toAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusTo]);
259260 verify(toAppDecoration);
260261 tap(toAppDecoration);
262+
261263 var toApp = ApplicationManager.findApplication(data.apps[data.focusTo]);
262264 verify(toApp);
263− tryCompare(toApp.session.surface, "activeFocus", true);
265+ tryCompare(toApp.session.lastSurface, "activeFocus", true);
264266 }
265267
266268 function test_clickingOnDecorationFocusesApplication_data() {
@@ -273,12 +275,12 @@ Item {
273275 var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
274276 verify(fromAppDecoration);
275277 mouseClick(fromAppDecoration);
276− tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.surface, "activeFocus", true);
278+ tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.lastSurface, "activeFocus", true);
277279
278280 var toAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusTo]);
279281 verify(toAppDecoration);
280282 mouseClick(toAppDecoration);
281− tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.surface, "activeFocus", true);
283+ tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.lastSurface, "activeFocus", true);
282284 }
283285
284286 function test_windowMaximize() {
@@ -374,7 +376,7 @@ Item {
374376 verify(dashDelegate);
375377
376378 findChild(dashDelegate, "decoratedWindow").minimize();
377− tryCompare(dashApp.session.surface, "visible", false);
379+ tryCompare(dashApp.session.lastSurface, "visible", false);
378380 }
379381
380382 function test_maximizeApplicationHidesSurfacesBehindIt() {
@@ -393,13 +395,13 @@ Item {
393395 dialerDelegate.maximize();
394396 tryCompare(dialerDelegate, "visuallyMaximized", true);
395397
396− tryCompare(dashApp.session.surface, "visible", false);
397− compare(gmailApp.session.surface.visible, true);
398+ tryCompare(dashApp.session.lastSurface, "visible", false);
399+ compare(gmailApp.session.lastSurface.visible, true);
398400
399401 // restore
400402 dialerDelegate.restoreFromMaximized();
401− compare(dashApp.session.surface.visible, true);
402− compare(gmailApp.session.surface.visible, true);
403+ compare(dashApp.session.lastSurface.visible, true);
404+ compare(gmailApp.session.lastSurface.visible, true);
403405 }
404406
405407 function test_applicationsBecomeVisibleWhenOccludingAppRemoved() {
@@ -430,15 +432,15 @@ Item {
430432 tryCompare(dialerDelegate, "visuallyMaximized", true);
431433 tryCompare(gmailDelegate, "visuallyMaximized", true);
432434
433− tryCompare(dashApp.session.surface, "visible", false);
434− tryCompare(dialerApp.session.surface, "visible", false);
435− tryCompare(mapApp.session.surface, "visible", false);
435+ tryCompare(dashApp.session.lastSurface, "visible", false);
436+ tryCompare(dialerApp.session.lastSurface, "visible", false);
437+ tryCompare(mapApp.session.lastSurface, "visible", false);
436438
437439 ApplicationManager.stopApplication("gmail-webapp");
438440
439− compare(mapApp.session.surface.visible, true);
440− tryCompare(dialerApp.session.surface, "visible", true);
441− tryCompare(dashApp.session.surface, "visible", false); // still occluded by maximised dialer
441+ compare(mapApp.session.lastSurface.visible, true);
442+ tryCompare(dialerApp.session.lastSurface, "visible", true);
443+ tryCompare(dashApp.session.lastSurface, "visible", false); // still occluded by maximised dialer
442444 }
443445
444446 function test_maximisedAppStaysVisibleWhenAppStarts() {
tests/qmltests/Stages/tst_SessionContainer.qml+4−4
@@ -192,18 +192,18 @@ Rectangle {
192192
193193 var a_session;
194194 while(a_session = sessions.pop()) {
195− compare(a_session.surface.activeFocus, true);
195+ compare(a_session.lastSurface.activeFocus, true);
196196
197− ApplicationTest.removeSurface(a_session.surface);
197+ ApplicationTest.removeSurface(a_session.lastSurface);
198198 ApplicationTest.removeSession(a_session);
199199
200200 if (sessions.length > 0) {
201201 // active focus should have gone to the yongest remaining sibling
202− var previousSiblingSurface = sessions[sessions.length - 1].surface
202+ var previousSiblingSurface = sessions[sessions.length - 1].lastSurface
203203 tryCompare(previousSiblingSurface, "activeFocus", true);
204204 } else {
205205 // active focus should have gone to the parent surface
206− tryCompare(sessionContainer.session.surface, "activeFocus", true);
206+ tryCompare(sessionContainer.session.lastSurface, "activeFocus", true);
207207 }
208208 }
209209 }
tests/qmltests/Stages/tst_TabletStage.qml+7−7
@@ -181,14 +181,14 @@ Rectangle {
181181 waitUntilAppSurfaceShowsUp(webbrowserCheckBox.appId);
182182 var webbrowserApp = ApplicationManager.findApplication(webbrowserCheckBox.appId);
183183 compare(webbrowserApp.stage, ApplicationInfoInterface.MainStage);
184− tryCompare(webbrowserApp.session.surface, "activeFocus", true);
184+ tryCompare(webbrowserApp.session.lastSurface, "activeFocus", true);
185185
186186 dialerCheckBox.checked = true;
187187 waitUntilAppSurfaceShowsUp(dialerCheckBox.appId);
188188 var dialerApp = ApplicationManager.findApplication(dialerCheckBox.appId);
189189 compare(dialerApp.stage, ApplicationInfoInterface.SideStage);
190− tryCompare(dialerApp.session.surface, "activeFocus", true);
191− tryCompare(webbrowserApp.session.surface, "activeFocus", false);
190+ tryCompare(dialerApp.session.lastSurface, "activeFocus", true);
191+ tryCompare(webbrowserApp.session.lastSurface, "activeFocus", false);
192192
193193 // Tap on the main stage application and check if the focus
194194 // has been passed to it.
@@ -197,8 +197,8 @@ Rectangle {
197197 verify(webbrowserWindow);
198198 tap(webbrowserWindow);
199199
200− tryCompare(dialerApp.session.surface, "activeFocus", false);
201− tryCompare(webbrowserApp.session.surface, "activeFocus", true);
200+ tryCompare(dialerApp.session.lastSurface, "activeFocus", false);
201+ tryCompare(webbrowserApp.session.lastSurface, "activeFocus", true);
202202
203203 // Now tap on the side stage application and check if the focus
204204 // has been passed back to it.
@@ -207,8 +207,8 @@ Rectangle {
207207 verify(dialerWindow);
208208 tap(dialerWindow);
209209
210− tryCompare(dialerApp.session.surface, "activeFocus", true);
211− tryCompare(webbrowserApp.session.surface, "activeFocus", false);
210+ tryCompare(dialerApp.session.lastSurface, "activeFocus", true);
211+ tryCompare(webbrowserApp.session.lastSurface, "activeFocus", false);
212212 }
213213
214214 function test_closeAppInSideStage() {
tests/qmltests/tst_OrientedShell.qml+6−6
@@ -486,7 +486,7 @@ Rectangle {
486486 compare(dashApp.supportedOrientations, Qt.PrimaryOrientation);
487487 compare(dashApp.stage, ApplicationInfoInterface.MainStage);
488488
489− tryCompareFunction(function(){return dashApp.session.surface != null;}, true);
489+ tryCompareFunction(function(){return dashApp.session.lastSurface != null;}, true);
490490 verify(checkAppSurfaceOrientation(dashAppWindow, dashApp, root.primaryOrientationAngle));
491491
492492 compare(shell.transformRotationAngle, root.primaryOrientationAngle);
@@ -563,7 +563,7 @@ Rectangle {
563563
564564 waitUntilAppSurfaceShowsUp("camera-app")
565565
566− var cameraSurface = cameraApp.session.surface;
566+ var cameraSurface = cameraApp.session.lastSurface;
567567 verify(cameraSurface);
568568
569569 var focusChangedSpy = signalSpy;
@@ -964,9 +964,9 @@ Rectangle {
964964 verify(gmailApp);
965965 waitUntilAppSurfaceShowsUp("gmail-webapp")
966966
967− verify(gmailApp.session.surface);
967+ verify(gmailApp.session.lastSurface);
968968
969− tryCompare(gmailApp.session.surface, "activeFocus", true);
969+ tryCompare(gmailApp.session.lastSurface, "activeFocus", true);
970970 }
971971
972972 function test_launchLandscapeOnlyAppOverPortraitOnlyDashThenSwitchToDash() {
@@ -1351,7 +1351,7 @@ Rectangle {
13511351
13521352 // expectedAngle is in orientedShell's coordinate system
13531353 function checkAppSurfaceOrientation(item, app, expectedAngle) {
1354− var surface = app.session.surface;
1354+ var surface = app.session.lastSurface;
13551355 if (!surface) {
13561356 console.warn("no surface");
13571357 return false;
@@ -1439,7 +1439,7 @@ Rectangle {
14391439 var app = ApplicationManager.findApplication(appId);
14401440 verify(app);
14411441
1442− var surface = app.session.surface;
1442+ var surface = app.session.lastSurface;
14431443 verify(surface);
14441444
14451445 var surfaceItem = findSurfaceItem(appWindow, surface);
tests/qmltests/tst_Shell.qml+20−20
@@ -414,7 +414,7 @@ Rectangle {
414414 // Open an application and focus
415415 waitUntilApplicationWindowIsFullyVisible(app);
416416 ApplicationManager.focusApplication(app);
417− tryCompare(app.session.surface, "activeFocus", true);
417+ tryCompare(app.session.lastSurface, "activeFocus", true);
418418
419419 notifications.model = mockNotificationsModel;
420420
@@ -436,7 +436,7 @@ Rectangle {
436436 waitForRendering(notification);
437437
438438 // Make sure activeFocus went away from the app window
439− tryCompare(app.session.surface, "activeFocus", false);
439+ tryCompare(app.session.lastSurface, "activeFocus", false);
440440 tryCompare(stage, "interactive", false);
441441
442442 // Clicking the button should dismiss the notification and return focus
@@ -444,7 +444,7 @@ Rectangle {
444444 mouseClick(buttonAccept);
445445
446446 // Make sure we're back to normal
447− tryCompare(app.session.surface, "activeFocus", true);
447+ tryCompare(app.session.lastSurface, "activeFocus", true);
448448 compare(stage.interactive, true, "Stages not interactive again after modal notification has closed");
449449 }
450450
@@ -776,7 +776,7 @@ Rectangle {
776776 var app = ApplicationManager.startApplication("dialer-app");
777777 waitUntilAppWindowIsFullyLoaded(app);
778778
779− tryCompare(app.session.surface, "activeFocus", true);
779+ tryCompare(app.session.lastSurface, "activeFocus", true);
780780
781781 // Drag the indicators panel half-open
782782 var touchX = shell.width / 2;
@@ -787,7 +787,7 @@ Rectangle {
787787 true /* beginTouch */, false /* endTouch */);
788788 verify(indicators.partiallyOpened);
789789
790− tryCompare(app.session.surface, "activeFocus", false);
790+ tryCompare(app.session.lastSurface, "activeFocus", false);
791791
792792 // And finish getting it open
793793 touchFlick(indicators,
@@ -796,11 +796,11 @@ Rectangle {
796796 false /* beginTouch */, true /* endTouch */);
797797 tryCompare(indicators, "fullyOpened", true);
798798
799− tryCompare(app.session.surface, "activeFocus", false);
799+ tryCompare(app.session.lastSurface, "activeFocus", false);
800800
801801 dragToCloseIndicatorsPanel();
802802
803− tryCompare(app.session.surface, "activeFocus", true);
803+ tryCompare(app.session.lastSurface, "activeFocus", true);
804804 }
805805
806806 function test_launchedAppHasActiveFocus_data() {
@@ -821,9 +821,9 @@ Rectangle {
821821 verify(webApp);
822822 waitUntilAppSurfaceShowsUp("webbrowser-app")
823823
824− verify(webApp.session.surface);
824+ verify(webApp.session.lastSurface);
825825
826− tryCompare(webApp.session.surface, "activeFocus", true);
826+ tryCompare(webApp.session.lastSurface, "activeFocus", true);
827827 }
828828
829829 function test_launchedAppKeepsActiveFocusOnUsageModeChange() {
@@ -834,9 +834,9 @@ Rectangle {
834834 verify(webApp);
835835 waitUntilAppSurfaceShowsUp("webbrowser-app")
836836
837− verify(webApp.session.surface);
837+ verify(webApp.session.lastSurface);
838838
839− tryCompare(webApp.session.surface, "activeFocus", true);
839+ tryCompare(webApp.session.lastSurface, "activeFocus", true);
840840
841841 shell.usageScenario = "desktop";
842842
@@ -846,7 +846,7 @@ Rectangle {
846846 verify(desktopWindow);
847847 }
848848
849− tryCompare(webApp.session.surface, "activeFocus", true);
849+ tryCompare(webApp.session.lastSurface, "activeFocus", true);
850850
851851 shell.usageScenario = "tablet";
852852
@@ -856,7 +856,7 @@ Rectangle {
856856 verify(desktopWindow);
857857 }
858858
859− tryCompare(webApp.session.surface, "activeFocus", true);
859+ tryCompare(webApp.session.lastSurface, "activeFocus", true);
860860 }
861861
862862 function waitUntilAppSurfaceShowsUp(appId) {
@@ -977,7 +977,7 @@ Rectangle {
977977
978978 var app = ApplicationManager.startApplication("dialer-app");
979979 // wait until the app is fully loaded (ie, real surface replaces splash screen)
980− tryCompareFunction(function() { return app.session !== null && app.session.surface !== null }, true);
980+ tryCompareFunction(function() { return app.session !== null && app.session.lastSurface !== null }, true);
981981
982982 // Minimize the application we just launched
983983 swipeFromLeftEdge(shell.width * 0.75);
@@ -1414,9 +1414,9 @@ Rectangle {
14141414 waitUntilAppWindowIsFullyLoaded(app3);
14151415
14161416 // Do a quick alt-tab and see if focus changes
1417− tryCompare(app3.session.surface, "activeFocus", true)
1417+ tryCompare(app3.session.lastSurface, "activeFocus", true)
14181418 keyClick(Qt.Key_Tab, Qt.ControlModifier)
1419− tryCompare(app2.session.surface, "activeFocus", true)
1419+ tryCompare(app2.session.lastSurface, "activeFocus", true)
14201420
14211421 var desktopSpread = findChild(shell, "spread")
14221422
@@ -1432,7 +1432,7 @@ Rectangle {
14321432 tryCompare(desktopSpread, "state", "")
14331433
14341434 // Focus should have switched back now
1435− tryCompare(app3.session.surface, "activeFocus", true)
1435+ tryCompare(app3.session.lastSurface, "activeFocus", true)
14361436 }
14371437
14381438 function test_altTabWrapAround() {
@@ -1481,7 +1481,7 @@ Rectangle {
14811481 tryCompare(desktopSpread, "state", "")
14821482
14831483 // Make sure that after wrapping around once, we have the same one focused as at the beginning
1484− tryCompare(focused.session.surface, "activeFocus", true)
1484+ tryCompare(focused.session.lastSurface, "activeFocus", true)
14851485 }
14861486
14871487 function test_altBackTabNavigation() {
@@ -1863,7 +1863,7 @@ Rectangle {
18631863 waitUntilAppWindowIsFullyLoaded(app2);
18641864
18651865 // Make sure app1 is unfocused but still running
1866− compare(app1.session.surface.activeFocus, false);
1866+ compare(app1.session.lastSurface.activeFocus, false);
18671867 compare(app1.isTouchApp, false); // sanity check our mock, which sets this for us
18681868 compare(app1.requestedState, ApplicationInfoInterface.RequestedRunning);
18691869 }
@@ -1887,7 +1887,7 @@ Rectangle {
18871887 waitUntilAppWindowIsFullyLoaded(app2);
18881888
18891889 // Make sure app1 is unfocused but still running
1890− compare(app1.session.surface.activeFocus, false);
1890+ compare(app1.session.lastSurface.activeFocus, false);
18911891 compare(app1.requestedState, ApplicationInfoInterface.RequestedRunning);
18921892 }
18931893
tests/qmltests/tst_ShellWithPin.qml+1−1
@@ -479,7 +479,7 @@ Item {
479479
480480 var app = ApplicationManager.startApplication("gallery-app");
481481 // wait until the app is fully loaded (ie, real surface replaces splash screen)
482− tryCompareFunction(function() { return app.session !== null && app.session.surface !== null }, true);
482+ tryCompareFunction(function() { return app.session !== null && app.session.lastSurface !== null }, true);
483483
484484 // New app hides coverPage?
485485 var greeter = findChild(shell, "greeter");