on xenial help sign in
Session can have multiple surfaces now
455f850Daniel d'Andrada
qml/Stages/DesktopSpreadDelegate.qml+2−2
@@ -29,8 +29,8 @@ Item {
29 property bool highlightShown: false
29 property bool highlightShown: false
30 property real shadowOpacity: 1
30 property real shadowOpacity: 1
31
31
32− property int windowWidth: application && application.session && application.session.surface ? application.session.surface.size.width : 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.surface ? application.session.surface.size.height : 0
33+ property int windowHeight: application && application.session && application.session.lastSurface ? application.session.lastSurface.size.height : 0
34
34
35 state: "normal"
35 state: "normal"
36 states: [
36 states: [
qml/Stages/SessionContainer.qml+3−3
@@ -37,7 +37,7 @@ FocusScope {
37 id: _surfaceContainer
37 id: _surfaceContainer
38 requestedWidth: root.requestedWidth
38 requestedWidth: root.requestedWidth
39 requestedHeight: root.requestedHeight
39 requestedHeight: root.requestedHeight
40− surface: session ? session.surface : null
40+ surface: session ? session.lastSurface : null
41 }
41 }
42
42
43 // SurfaceContainer size drives SessionContainer size
43 // SurfaceContainer size drives SessionContainer size
@@ -110,13 +110,13 @@ FocusScope {
110 State {
110 State {
111 name: "childSession"
111 name: "childSession"
112 when: root.session && root.session.parentSession !== null && root.session.live
112 when: root.session && root.session.parentSession !== null && root.session.live
113− && !root.session.surface
113+ && !root.session.lastSurface
114 },
114 },
115
115
116 State {
116 State {
117 name: "childSessionReady"
117 name: "childSessionReady"
118 when: root.session && root.session.parentSession !== null && root.session.live
118 when: root.session && root.session.parentSession !== null && root.session.live
119− && root.session.surface !== null
119+ && root.session.lastSurface !== null
120 },
120 },
121
121
122 State {
122 State {
tests/mocks/Unity/Application/ApplicationInfo.cpp+3−3
@@ -101,8 +101,8 @@ void ApplicationInfo::setSession(Session* session)
101 m_session->setApplication(this);
101 m_session->setApplication(this);
102 m_session->setParent(this);
102 m_session->setParent(this);
103 SessionManager::singleton()->registerSession(m_session);
103 SessionManager::singleton()->registerSession(m_session);
104− connect(m_session, &Session::surfaceChanged,
104+ connect(m_session, &Session::surfaceAdded,
105− this, &ApplicationInfo::onSessionSurfaceChanged);
105+ this, &ApplicationInfo::onSessionSurfaceAdded);
106
106
107 if (!m_manualSurfaceCreation) {
107 if (!m_manualSurfaceCreation) {
108 QTimer::singleShot(500, m_session, &Session::createSurface);
108 QTimer::singleShot(500, m_session, &Session::createSurface);
@@ -253,7 +253,7 @@ void ApplicationInfo::setIsTouchApp(bool isTouchApp)
253 m_isTouchApp = isTouchApp;
253 m_isTouchApp = isTouchApp;
254}
254}
255
255
256−void ApplicationInfo::onSessionSurfaceChanged(MirSurface* surface)
256+void ApplicationInfo::onSessionSurfaceAdded(MirSurface* surface)
257{
257{
258 if (surface != nullptr && m_state == Starting) {
258 if (surface != nullptr && m_state == Starting) {
259 if (m_requestedState == RequestedRunning) {
259 if (m_requestedState == RequestedRunning) {
tests/mocks/Unity/Application/ApplicationInfo.h+1−1
@@ -106,7 +106,7 @@ public Q_SLOTS:
106 Q_INVOKABLE void destroySession();
106 Q_INVOKABLE void destroySession();
107
107
108private Q_SLOTS:
108private Q_SLOTS:
109− void onSessionSurfaceChanged(MirSurface*);
109+ void onSessionSurfaceAdded(MirSurface*);
110
110
111private:
111private:
112 void setIcon(const QUrl &value);
112 void setIcon(const QUrl &value);
tests/mocks/Unity/Application/Session.cpp+27−17
@@ -80,29 +80,25 @@ void Session::setApplication(ApplicationInfo* application)
80 Q_EMIT applicationChanged(application);
80 Q_EMIT applicationChanged(application);
81}
81}
82
82
83−void Session::setSurface(MirSurface* surface)
83+void Session::appendSurface(MirSurface* surface)
84{
84{
85−// qDebug() << "Session::setSurface - session=" << name() << "surface=" << surface;
85+ // qDebug() << "Session::appendSurface - session=" << name() << "surface=" << surface;
86− if (m_surface == surface)
87− return;
88
86
89− if (m_surface) {
87+ m_surfaces.insert(m_surfaces.rowCount(), surface);
90− disconnect(m_surface, nullptr, this, nullptr);
91− }
92
88
93− m_surface = surface;
89+ connect(surface, &QObject::destroyed,
90+ this, [this, surface]() { this->removeSurface(surface); });
94
91
95− if (m_surface) {
92+ Q_EMIT lastSurfaceChanged(surface);
96− connect(m_surface, &QObject::destroyed, this, &Session::onSurfaceDestroyed);
93+ Q_EMIT surfaceAdded(surface);
97− }
98−
99− Q_EMIT surfaceChanged(m_surface);
100}
94}
101
95
102−void Session::onSurfaceDestroyed()
96+void Session::removeSurface(MirSurface* surface)
103{
97{
104− m_surface = nullptr;
98+ disconnect(surface, nullptr, this, nullptr);
105− Q_EMIT surfaceChanged(nullptr);
99+ if (m_surfaces.contains(surface)) {
100+ m_surfaces.remove(surface);
101+ }
106}
102}
107
103
108void Session::setScreenshot(const QUrl& screenshot)
104void Session::setScreenshot(const QUrl& screenshot)
@@ -136,7 +132,7 @@ void Session::createSurface()
136{
132{
137 if (m_surface) return;
133 if (m_surface) return;
138
134
139− setSurface(SurfaceManager::singleton()->createSurface(name(),
135+ appendSurface(SurfaceManager::singleton()->createSurface(name(),
140 Mir::NormalType,
136 Mir::NormalType,
141 m_application && m_application->fullscreen() ? Mir::FullscreenState :
137 m_application && m_application->fullscreen() ? Mir::FullscreenState :
142 Mir::MaximizedState,
138 Mir::MaximizedState,
@@ -172,3 +168,17 @@ SessionModel* Session::childSessions() const
172{
168{
173 return m_children;
169 return m_children;
174}
170}
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 @@
1/*
1/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2014,2015 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -17,6 +17,7 @@
17#ifndef SESSION_H
17#ifndef SESSION_H
18#define SESSION_H
18#define SESSION_H
19
19
20+#include "ObjectListModel.h"
20#include "SessionModel.h"
21#include "SessionModel.h"
21
22
22#include <QQuickItem>
23#include <QQuickItem>
@@ -28,7 +29,8 @@ class Session : public QObject
28{
29{
29 Q_OBJECT
30 Q_OBJECT
30 Q_PROPERTY(QString name READ name CONSTANT)
31 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)
32 Q_PROPERTY(ApplicationInfo* application READ application NOTIFY applicationChanged)
34 Q_PROPERTY(ApplicationInfo* application READ application NOTIFY applicationChanged)
33 Q_PROPERTY(Session* parentSession READ parentSession NOTIFY parentSessionChanged DESIGNABLE false)
35 Q_PROPERTY(Session* parentSession READ parentSession NOTIFY parentSessionChanged DESIGNABLE false)
34 Q_PROPERTY(SessionModel* childSessions READ childSessions DESIGNABLE false CONSTANT)
36 Q_PROPERTY(SessionModel* childSessions READ childSessions DESIGNABLE false CONSTANT)
@@ -46,11 +48,13 @@ public:
46 QString name() const { return m_name; }
48 QString name() const { return m_name; }
47 bool live() const { return m_live; }
49 bool live() const { return m_live; }
48 ApplicationInfo* application() const { return m_application; }
50 ApplicationInfo* application() const { return m_application; }
49− MirSurface* surface() const { return m_surface; }
51+ MirSurface *lastSurface() const;
52+ ObjectListModel<MirSurface>* surfaces() const;
50 Session* parentSession() const { return m_parentSession; }
53 Session* parentSession() const { return m_parentSession; }
51
54
52 void setApplication(ApplicationInfo* item);
55 void setApplication(ApplicationInfo* item);
56+ void appendSurface(MirSurface* surface);
53− void setSurface(MirSurface* surface);
57+ void removeSurface(MirSurface* surface);
54 void setScreenshot(const QUrl& m_screenshot);
58 void setScreenshot(const QUrl& m_screenshot);
55 void setLive(bool live);
59 void setLive(bool live);
56
60
@@ -60,9 +64,10 @@ public:
60
64
61Q_SIGNALS:
65Q_SIGNALS:
62 void applicationChanged(ApplicationInfo*);
66 void applicationChanged(ApplicationInfo*);
63− void surfaceChanged(MirSurface*);
64 void parentSessionChanged(Session*);
67 void parentSessionChanged(Session*);
65 void liveChanged(bool live);
68 void liveChanged(bool live);
69+ void surfaceAdded(MirSurface *surface);
70+ void lastSurfaceChanged(MirSurface *surface);
66
71
67 // internal mock use
72 // internal mock use
68 void deregister();
73 void deregister();
@@ -70,10 +75,6 @@ Q_SIGNALS:
70public Q_SLOTS:
75public Q_SLOTS:
71 Q_INVOKABLE void createSurface();
76 Q_INVOKABLE void createSurface();
72
77
73−
74−private Q_SLOTS:
75− void onSurfaceDestroyed();
76−
77private:
78private:
78 SessionModel* childSessions() const;
79 SessionModel* childSessions() const;
79 void setParentSession(Session* session);
80 void setParentSession(Session* session);
@@ -85,10 +86,12 @@ private:
85 MirSurface* m_surface;
86 MirSurface* m_surface;
86 Session* m_parentSession;
87 Session* m_parentSession;
87 SessionModel* m_children;
88 SessionModel* m_children;
89+ ObjectListModel<MirSurface> m_surfaces;
88
90
89 friend class ApplicationTestInterface;
91 friend class ApplicationTestInterface;
90};
92};
91
93
92Q_DECLARE_METATYPE(Session*)
94Q_DECLARE_METATYPE(Session*)
95+Q_DECLARE_METATYPE(ObjectListModel<MirSurface>*)
93
96
94#endif // SESSION_H
97#endif // SESSION_H
tests/qmltests/Stages/RecursingChildSessionControl.qml+4−4
@@ -94,15 +94,15 @@ ColumnLayout {
94 onCheckedChanged: {
94 onCheckedChanged: {
95 if (checked) {
95 if (checked) {
96 root.session.createSurface();
96 root.session.createSurface();
97− } else if (root.session && root.session.surface) {
97+ } else if (root.session && root.session.lastSurface) {
98− ApplicationTest.removeSurface(root.session.surface);
98+ ApplicationTest.removeSurface(root.session.lastSurface);
99 }
99 }
100 }
100 }
101
101
102 Connections {
102 Connections {
103 target: root.session ? root.session : null
103 target: root.session ? root.session : null
104 onSurfaceChanged: {
104 onSurfaceChanged: {
105− surfaceCheckbox.checked = root.session.surface !== null
105+ surfaceCheckbox.checked = root.session.lastSurface !== null
106 }
106 }
107 }
107 }
108 }
108 }
@@ -123,7 +123,7 @@ ColumnLayout {
123 onClicked: {
123 onClicked: {
124 if (removable) {
124 if (removable) {
125 // release the surface first. simulates mir app closing
125 // 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);
127 ApplicationTest.removeSession(root.session);
127 ApplicationTest.removeSession(root.session);
128 } else {
128 } else {
129 root.session.release();
129 root.session.release();
tests/qmltests/Stages/tst_ApplicationWindow.qml+7−7
@@ -356,19 +356,19 @@ Rectangle {
356 setApplicationState(appRunning);
356 setApplicationState(appRunning);
357 tryCompare(stateGroup, "state", "surface");
357 tryCompare(stateGroup, "state", "surface");
358 waitUntilTransitionsEnd(stateGroup);
358 waitUntilTransitionsEnd(stateGroup);
359− verify(fakeSession.surface !== null);
359+ verify(fakeSession.lastSurface !== null);
360
360
361 applicationWindowLoader.item.visible = false;
361 applicationWindowLoader.item.visible = false;
362
362
363 waitUntilTransitionsEnd(stateGroup);
363 waitUntilTransitionsEnd(stateGroup);
364 verify(stateGroup.state === "surface");
364 verify(stateGroup.state === "surface");
365− verify(fakeSession.surface !== null);
365+ verify(fakeSession.lastSurface !== null);
366
366
367 applicationWindowLoader.item.visible = true;
367 applicationWindowLoader.item.visible = true;
368
368
369 waitUntilTransitionsEnd(stateGroup);
369 waitUntilTransitionsEnd(stateGroup);
370 verify(stateGroup.state === "surface");
370 verify(stateGroup.state === "surface");
371− verify(fakeSession.surface !== null);
371+ verify(fakeSession.lastSurface !== null);
372 }
372 }
373
373
374 function test_touchesReachSurfaceWhenItsShown() {
374 function test_touchesReachSurfaceWhenItsShown() {
@@ -381,7 +381,7 @@ Rectangle {
381
381
382 var surfaceItem = findChild(applicationWindowLoader.item, "surfaceItem");
382 var surfaceItem = findChild(applicationWindowLoader.item, "surfaceItem");
383 verify(surfaceItem);
383 verify(surfaceItem);
384− verify(surfaceItem.surface === fakeSession.surface);
384+ verify(surfaceItem.surface === fakeSession.lastSurface);
385
385
386 surfaceItem.touchPressCount = 0;
386 surfaceItem.touchPressCount = 0;
387 surfaceItem.touchReleaseCount = 0;
387 surfaceItem.touchReleaseCount = 0;
@@ -410,13 +410,13 @@ Rectangle {
410 applicationWindowLoader.item.interactive = true;
410 applicationWindowLoader.item.interactive = true;
411 fakeSession.createSurface();
411 fakeSession.createSurface();
412
412
413− compare(fakeSession.surface.activeFocus, true);
413+ compare(fakeSession.lastSurface.activeFocus, true);
414
414
415 applicationWindowLoader.item.interactive = false;
415 applicationWindowLoader.item.interactive = false;
416− compare(fakeSession.surface.activeFocus, false);
416+ compare(fakeSession.lastSurface.activeFocus, false);
417
417
418 applicationWindowLoader.item.interactive = true;
418 applicationWindowLoader.item.interactive = true;
419− compare(fakeSession.surface.activeFocus, true);
419+ compare(fakeSession.lastSurface.activeFocus, true);
420 }
420 }
421 }
421 }
422}
422}
tests/qmltests/Stages/tst_DesktopStage.qml+25−23
@@ -98,7 +98,7 @@ Item {
98 activeFocusOnPress: false
98 activeFocusOnPress: false
99 onClicked: {
99 onClicked: {
100 if (ApplicationManager.focusedApplicationId) {
100 if (ApplicationManager.focusedApplicationId) {
101− var surface = ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).session.surface;
101+ var surface = ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).session.lastSurface;
102 surface.slowToResize = true;
102 surface.slowToResize = true;
103 }
103 }
104 }
104 }
@@ -170,7 +170,7 @@ Item {
170 }
170 }
171 verify(app);
171 verify(app);
172 waitUntilAppSurfaceShowsUp(appId);
172 waitUntilAppSurfaceShowsUp(appId);
173− verify(app.session.surface);
173+ verify(app.session.lastSurface);
174 return app;
174 return app;
175 }
175 }
176
176
@@ -185,10 +185,10 @@ Item {
185 data.apps.forEach(startApplication);
185 data.apps.forEach(startApplication);
186
186
187 ApplicationManager.requestFocusApplication(data.apps[data.focusfrom]);
187 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);
189
189
190 ApplicationManager.requestFocusApplication(data.apps[data.focusTo]);
190 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);
192 }
192 }
193
193
194 function test_tappingOnWindowChangesFocusedApp_data() {
194 function test_tappingOnWindowChangesFocusedApp_data() {
@@ -206,13 +206,13 @@ Item {
206 var fromAppWindow = findChild(desktopStage, "appWindow_" + fromAppId);
206 var fromAppWindow = findChild(desktopStage, "appWindow_" + fromAppId);
207 verify(fromAppWindow);
207 verify(fromAppWindow);
208 tap(fromAppWindow);
208 tap(fromAppWindow);
209− compare(fromAppWindow.application.session.surface.activeFocus, true);
209+ compare(fromAppWindow.application.session.lastSurface.activeFocus, true);
210 compare(ApplicationManager.focusedApplicationId, fromAppId);
210 compare(ApplicationManager.focusedApplicationId, fromAppId);
211
211
212 var toAppWindow = findChild(desktopStage, "appWindow_" + toAppId);
212 var toAppWindow = findChild(desktopStage, "appWindow_" + toAppId);
213 verify(toAppWindow);
213 verify(toAppWindow);
214 tap(toAppWindow);
214 tap(toAppWindow);
215− compare(toAppWindow.application.session.surface.activeFocus, true);
215+ compare(toAppWindow.application.session.lastSurface.activeFocus, true);
216 compare(ApplicationManager.focusedApplicationId, toAppId);
216 compare(ApplicationManager.focusedApplicationId, toAppId);
217 }
217 }
218
218
@@ -228,13 +228,13 @@ Item {
228 var fromAppWindow = findChild(desktopStage, "appWindow_" + fromAppId);
228 var fromAppWindow = findChild(desktopStage, "appWindow_" + fromAppId);
229 verify(fromAppWindow);
229 verify(fromAppWindow);
230 mouseClick(fromAppWindow);
230 mouseClick(fromAppWindow);
231− compare(fromAppWindow.application.session.surface.activeFocus, true);
231+ compare(fromAppWindow.application.session.lastSurface.activeFocus, true);
232 compare(ApplicationManager.focusedApplicationId, fromAppId);
232 compare(ApplicationManager.focusedApplicationId, fromAppId);
233
233
234 var toAppWindow = findChild(desktopStage, "appWindow_" + toAppId);
234 var toAppWindow = findChild(desktopStage, "appWindow_" + toAppId);
235 verify(toAppWindow);
235 verify(toAppWindow);
236 mouseClick(toAppWindow);
236 mouseClick(toAppWindow);
237− compare(toAppWindow.application.session.surface.activeFocus, true);
237+ compare(toAppWindow.application.session.lastSurface.activeFocus, true);
238 compare(ApplicationManager.focusedApplicationId, toAppId);
238 compare(ApplicationManager.focusedApplicationId, toAppId);
239 }
239 }
240
240
@@ -251,16 +251,18 @@ Item {
251 var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
251 var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
252 verify(fromAppDecoration);
252 verify(fromAppDecoration);
253 tap(fromAppDecoration);
253 tap(fromAppDecoration);
254+
254 var fromApp = ApplicationManager.findApplication(data.apps[data.focusfrom]);
255 var fromApp = ApplicationManager.findApplication(data.apps[data.focusfrom]);
255 verify(fromApp);
256 verify(fromApp);
256− tryCompare(fromApp.session.surface, "activeFocus", true);
257+ tryCompare(fromApp.session.lastSurface, "activeFocus", true);
257
258
258 var toAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusTo]);
259 var toAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusTo]);
259 verify(toAppDecoration);
260 verify(toAppDecoration);
260 tap(toAppDecoration);
261 tap(toAppDecoration);
262+
261 var toApp = ApplicationManager.findApplication(data.apps[data.focusTo]);
263 var toApp = ApplicationManager.findApplication(data.apps[data.focusTo]);
262 verify(toApp);
264 verify(toApp);
263− tryCompare(toApp.session.surface, "activeFocus", true);
265+ tryCompare(toApp.session.lastSurface, "activeFocus", true);
264 }
266 }
265
267
266 function test_clickingOnDecorationFocusesApplication_data() {
268 function test_clickingOnDecorationFocusesApplication_data() {
@@ -273,12 +275,12 @@ Item {
273 var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
275 var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
274 verify(fromAppDecoration);
276 verify(fromAppDecoration);
275 mouseClick(fromAppDecoration);
277 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);
277
279
278 var toAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusTo]);
280 var toAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusTo]);
279 verify(toAppDecoration);
281 verify(toAppDecoration);
280 mouseClick(toAppDecoration);
282 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);
282 }
284 }
283
285
284 function test_windowMaximize() {
286 function test_windowMaximize() {
@@ -374,7 +376,7 @@ Item {
374 verify(dashDelegate);
376 verify(dashDelegate);
375
377
376 findChild(dashDelegate, "decoratedWindow").minimize();
378 findChild(dashDelegate, "decoratedWindow").minimize();
377− tryCompare(dashApp.session.surface, "visible", false);
379+ tryCompare(dashApp.session.lastSurface, "visible", false);
378 }
380 }
379
381
380 function test_maximizeApplicationHidesSurfacesBehindIt() {
382 function test_maximizeApplicationHidesSurfacesBehindIt() {
@@ -393,13 +395,13 @@ Item {
393 dialerDelegate.maximize();
395 dialerDelegate.maximize();
394 tryCompare(dialerDelegate, "visuallyMaximized", true);
396 tryCompare(dialerDelegate, "visuallyMaximized", true);
395
397
396− tryCompare(dashApp.session.surface, "visible", false);
398+ tryCompare(dashApp.session.lastSurface, "visible", false);
397− compare(gmailApp.session.surface.visible, true);
399+ compare(gmailApp.session.lastSurface.visible, true);
398
400
399 // restore
401 // restore
400 dialerDelegate.restoreFromMaximized();
402 dialerDelegate.restoreFromMaximized();
401− compare(dashApp.session.surface.visible, true);
403+ compare(dashApp.session.lastSurface.visible, true);
402− compare(gmailApp.session.surface.visible, true);
404+ compare(gmailApp.session.lastSurface.visible, true);
403 }
405 }
404
406
405 function test_applicationsBecomeVisibleWhenOccludingAppRemoved() {
407 function test_applicationsBecomeVisibleWhenOccludingAppRemoved() {
@@ -430,15 +432,15 @@ Item {
430 tryCompare(dialerDelegate, "visuallyMaximized", true);
432 tryCompare(dialerDelegate, "visuallyMaximized", true);
431 tryCompare(gmailDelegate, "visuallyMaximized", true);
433 tryCompare(gmailDelegate, "visuallyMaximized", true);
432
434
433− tryCompare(dashApp.session.surface, "visible", false);
435+ tryCompare(dashApp.session.lastSurface, "visible", false);
434− tryCompare(dialerApp.session.surface, "visible", false);
436+ tryCompare(dialerApp.session.lastSurface, "visible", false);
435− tryCompare(mapApp.session.surface, "visible", false);
437+ tryCompare(mapApp.session.lastSurface, "visible", false);
436
438
437 ApplicationManager.stopApplication("gmail-webapp");
439 ApplicationManager.stopApplication("gmail-webapp");
438
440
439− compare(mapApp.session.surface.visible, true);
441+ compare(mapApp.session.lastSurface.visible, true);
440− tryCompare(dialerApp.session.surface, "visible", true);
442+ tryCompare(dialerApp.session.lastSurface, "visible", true);
441− tryCompare(dashApp.session.surface, "visible", false); // still occluded by maximised dialer
443+ tryCompare(dashApp.session.lastSurface, "visible", false); // still occluded by maximised dialer
442 }
444 }
443
445
444 function test_maximisedAppStaysVisibleWhenAppStarts() {
446 function test_maximisedAppStaysVisibleWhenAppStarts() {
tests/qmltests/Stages/tst_SessionContainer.qml+4−4
@@ -192,18 +192,18 @@ Rectangle {
192
192
193 var a_session;
193 var a_session;
194 while(a_session = sessions.pop()) {
194 while(a_session = sessions.pop()) {
195− compare(a_session.surface.activeFocus, true);
195+ compare(a_session.lastSurface.activeFocus, true);
196
196
197− ApplicationTest.removeSurface(a_session.surface);
197+ ApplicationTest.removeSurface(a_session.lastSurface);
198 ApplicationTest.removeSession(a_session);
198 ApplicationTest.removeSession(a_session);
199
199
200 if (sessions.length > 0) {
200 if (sessions.length > 0) {
201 // active focus should have gone to the yongest remaining sibling
201 // 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
203 tryCompare(previousSiblingSurface, "activeFocus", true);
203 tryCompare(previousSiblingSurface, "activeFocus", true);
204 } else {
204 } else {
205 // active focus should have gone to the parent surface
205 // active focus should have gone to the parent surface
206− tryCompare(sessionContainer.session.surface, "activeFocus", true);
206+ tryCompare(sessionContainer.session.lastSurface, "activeFocus", true);
207 }
207 }
208 }
208 }
209 }
209 }
tests/qmltests/Stages/tst_TabletStage.qml+7−7
@@ -181,14 +181,14 @@ Rectangle {
181 waitUntilAppSurfaceShowsUp(webbrowserCheckBox.appId);
181 waitUntilAppSurfaceShowsUp(webbrowserCheckBox.appId);
182 var webbrowserApp = ApplicationManager.findApplication(webbrowserCheckBox.appId);
182 var webbrowserApp = ApplicationManager.findApplication(webbrowserCheckBox.appId);
183 compare(webbrowserApp.stage, ApplicationInfoInterface.MainStage);
183 compare(webbrowserApp.stage, ApplicationInfoInterface.MainStage);
184− tryCompare(webbrowserApp.session.surface, "activeFocus", true);
184+ tryCompare(webbrowserApp.session.lastSurface, "activeFocus", true);
185
185
186 dialerCheckBox.checked = true;
186 dialerCheckBox.checked = true;
187 waitUntilAppSurfaceShowsUp(dialerCheckBox.appId);
187 waitUntilAppSurfaceShowsUp(dialerCheckBox.appId);
188 var dialerApp = ApplicationManager.findApplication(dialerCheckBox.appId);
188 var dialerApp = ApplicationManager.findApplication(dialerCheckBox.appId);
189 compare(dialerApp.stage, ApplicationInfoInterface.SideStage);
189 compare(dialerApp.stage, ApplicationInfoInterface.SideStage);
190− tryCompare(dialerApp.session.surface, "activeFocus", true);
190+ tryCompare(dialerApp.session.lastSurface, "activeFocus", true);
191− tryCompare(webbrowserApp.session.surface, "activeFocus", false);
191+ tryCompare(webbrowserApp.session.lastSurface, "activeFocus", false);
192
192
193 // Tap on the main stage application and check if the focus
193 // Tap on the main stage application and check if the focus
194 // has been passed to it.
194 // has been passed to it.
@@ -197,8 +197,8 @@ Rectangle {
197 verify(webbrowserWindow);
197 verify(webbrowserWindow);
198 tap(webbrowserWindow);
198 tap(webbrowserWindow);
199
199
200− tryCompare(dialerApp.session.surface, "activeFocus", false);
200+ tryCompare(dialerApp.session.lastSurface, "activeFocus", false);
201− tryCompare(webbrowserApp.session.surface, "activeFocus", true);
201+ tryCompare(webbrowserApp.session.lastSurface, "activeFocus", true);
202
202
203 // Now tap on the side stage application and check if the focus
203 // Now tap on the side stage application and check if the focus
204 // has been passed back to it.
204 // has been passed back to it.
@@ -207,8 +207,8 @@ Rectangle {
207 verify(dialerWindow);
207 verify(dialerWindow);
208 tap(dialerWindow);
208 tap(dialerWindow);
209
209
210− tryCompare(dialerApp.session.surface, "activeFocus", true);
210+ tryCompare(dialerApp.session.lastSurface, "activeFocus", true);
211− tryCompare(webbrowserApp.session.surface, "activeFocus", false);
211+ tryCompare(webbrowserApp.session.lastSurface, "activeFocus", false);
212 }
212 }
213
213
214 function test_closeAppInSideStage() {
214 function test_closeAppInSideStage() {
tests/qmltests/tst_OrientedShell.qml+6−6
@@ -486,7 +486,7 @@ Rectangle {
486 compare(dashApp.supportedOrientations, Qt.PrimaryOrientation);
486 compare(dashApp.supportedOrientations, Qt.PrimaryOrientation);
487 compare(dashApp.stage, ApplicationInfoInterface.MainStage);
487 compare(dashApp.stage, ApplicationInfoInterface.MainStage);
488
488
489− tryCompareFunction(function(){return dashApp.session.surface != null;}, true);
489+ tryCompareFunction(function(){return dashApp.session.lastSurface != null;}, true);
490 verify(checkAppSurfaceOrientation(dashAppWindow, dashApp, root.primaryOrientationAngle));
490 verify(checkAppSurfaceOrientation(dashAppWindow, dashApp, root.primaryOrientationAngle));
491
491
492 compare(shell.transformRotationAngle, root.primaryOrientationAngle);
492 compare(shell.transformRotationAngle, root.primaryOrientationAngle);
@@ -563,7 +563,7 @@ Rectangle {
563
563
564 waitUntilAppSurfaceShowsUp("camera-app")
564 waitUntilAppSurfaceShowsUp("camera-app")
565
565
566− var cameraSurface = cameraApp.session.surface;
566+ var cameraSurface = cameraApp.session.lastSurface;
567 verify(cameraSurface);
567 verify(cameraSurface);
568
568
569 var focusChangedSpy = signalSpy;
569 var focusChangedSpy = signalSpy;
@@ -964,9 +964,9 @@ Rectangle {
964 verify(gmailApp);
964 verify(gmailApp);
965 waitUntilAppSurfaceShowsUp("gmail-webapp")
965 waitUntilAppSurfaceShowsUp("gmail-webapp")
966
966
967− verify(gmailApp.session.surface);
967+ verify(gmailApp.session.lastSurface);
968
968
969− tryCompare(gmailApp.session.surface, "activeFocus", true);
969+ tryCompare(gmailApp.session.lastSurface, "activeFocus", true);
970 }
970 }
971
971
972 function test_launchLandscapeOnlyAppOverPortraitOnlyDashThenSwitchToDash() {
972 function test_launchLandscapeOnlyAppOverPortraitOnlyDashThenSwitchToDash() {
@@ -1351,7 +1351,7 @@ Rectangle {
1351
1351
1352 // expectedAngle is in orientedShell's coordinate system
1352 // expectedAngle is in orientedShell's coordinate system
1353 function checkAppSurfaceOrientation(item, app, expectedAngle) {
1353 function checkAppSurfaceOrientation(item, app, expectedAngle) {
1354− var surface = app.session.surface;
1354+ var surface = app.session.lastSurface;
1355 if (!surface) {
1355 if (!surface) {
1356 console.warn("no surface");
1356 console.warn("no surface");
1357 return false;
1357 return false;
@@ -1439,7 +1439,7 @@ Rectangle {
1439 var app = ApplicationManager.findApplication(appId);
1439 var app = ApplicationManager.findApplication(appId);
1440 verify(app);
1440 verify(app);
1441
1441
1442− var surface = app.session.surface;
1442+ var surface = app.session.lastSurface;
1443 verify(surface);
1443 verify(surface);
1444
1444
1445 var surfaceItem = findSurfaceItem(appWindow, surface);
1445 var surfaceItem = findSurfaceItem(appWindow, surface);
tests/qmltests/tst_Shell.qml+20−20
@@ -414,7 +414,7 @@ Rectangle {
414 // Open an application and focus
414 // Open an application and focus
415 waitUntilApplicationWindowIsFullyVisible(app);
415 waitUntilApplicationWindowIsFullyVisible(app);
416 ApplicationManager.focusApplication(app);
416 ApplicationManager.focusApplication(app);
417− tryCompare(app.session.surface, "activeFocus", true);
417+ tryCompare(app.session.lastSurface, "activeFocus", true);
418
418
419 notifications.model = mockNotificationsModel;
419 notifications.model = mockNotificationsModel;
420
420
@@ -436,7 +436,7 @@ Rectangle {
436 waitForRendering(notification);
436 waitForRendering(notification);
437
437
438 // Make sure activeFocus went away from the app window
438 // Make sure activeFocus went away from the app window
439− tryCompare(app.session.surface, "activeFocus", false);
439+ tryCompare(app.session.lastSurface, "activeFocus", false);
440 tryCompare(stage, "interactive", false);
440 tryCompare(stage, "interactive", false);
441
441
442 // Clicking the button should dismiss the notification and return focus
442 // Clicking the button should dismiss the notification and return focus
@@ -444,7 +444,7 @@ Rectangle {
444 mouseClick(buttonAccept);
444 mouseClick(buttonAccept);
445
445
446 // Make sure we're back to normal
446 // Make sure we're back to normal
447− tryCompare(app.session.surface, "activeFocus", true);
447+ tryCompare(app.session.lastSurface, "activeFocus", true);
448 compare(stage.interactive, true, "Stages not interactive again after modal notification has closed");
448 compare(stage.interactive, true, "Stages not interactive again after modal notification has closed");
449 }
449 }
450
450
@@ -776,7 +776,7 @@ Rectangle {
776 var app = ApplicationManager.startApplication("dialer-app");
776 var app = ApplicationManager.startApplication("dialer-app");
777 waitUntilAppWindowIsFullyLoaded(app);
777 waitUntilAppWindowIsFullyLoaded(app);
778
778
779− tryCompare(app.session.surface, "activeFocus", true);
779+ tryCompare(app.session.lastSurface, "activeFocus", true);
780
780
781 // Drag the indicators panel half-open
781 // Drag the indicators panel half-open
782 var touchX = shell.width / 2;
782 var touchX = shell.width / 2;
@@ -787,7 +787,7 @@ Rectangle {
787 true /* beginTouch */, false /* endTouch */);
787 true /* beginTouch */, false /* endTouch */);
788 verify(indicators.partiallyOpened);
788 verify(indicators.partiallyOpened);
789
789
790− tryCompare(app.session.surface, "activeFocus", false);
790+ tryCompare(app.session.lastSurface, "activeFocus", false);
791
791
792 // And finish getting it open
792 // And finish getting it open
793 touchFlick(indicators,
793 touchFlick(indicators,
@@ -796,11 +796,11 @@ Rectangle {
796 false /* beginTouch */, true /* endTouch */);
796 false /* beginTouch */, true /* endTouch */);
797 tryCompare(indicators, "fullyOpened", true);
797 tryCompare(indicators, "fullyOpened", true);
798
798
799− tryCompare(app.session.surface, "activeFocus", false);
799+ tryCompare(app.session.lastSurface, "activeFocus", false);
800
800
801 dragToCloseIndicatorsPanel();
801 dragToCloseIndicatorsPanel();
802
802
803− tryCompare(app.session.surface, "activeFocus", true);
803+ tryCompare(app.session.lastSurface, "activeFocus", true);
804 }
804 }
805
805
806 function test_launchedAppHasActiveFocus_data() {
806 function test_launchedAppHasActiveFocus_data() {
@@ -821,9 +821,9 @@ Rectangle {
821 verify(webApp);
821 verify(webApp);
822 waitUntilAppSurfaceShowsUp("webbrowser-app")
822 waitUntilAppSurfaceShowsUp("webbrowser-app")
823
823
824− verify(webApp.session.surface);
824+ verify(webApp.session.lastSurface);
825
825
826− tryCompare(webApp.session.surface, "activeFocus", true);
826+ tryCompare(webApp.session.lastSurface, "activeFocus", true);
827 }
827 }
828
828
829 function test_launchedAppKeepsActiveFocusOnUsageModeChange() {
829 function test_launchedAppKeepsActiveFocusOnUsageModeChange() {
@@ -834,9 +834,9 @@ Rectangle {
834 verify(webApp);
834 verify(webApp);
835 waitUntilAppSurfaceShowsUp("webbrowser-app")
835 waitUntilAppSurfaceShowsUp("webbrowser-app")
836
836
837− verify(webApp.session.surface);
837+ verify(webApp.session.lastSurface);
838
838
839− tryCompare(webApp.session.surface, "activeFocus", true);
839+ tryCompare(webApp.session.lastSurface, "activeFocus", true);
840
840
841 shell.usageScenario = "desktop";
841 shell.usageScenario = "desktop";
842
842
@@ -846,7 +846,7 @@ Rectangle {
846 verify(desktopWindow);
846 verify(desktopWindow);
847 }
847 }
848
848
849− tryCompare(webApp.session.surface, "activeFocus", true);
849+ tryCompare(webApp.session.lastSurface, "activeFocus", true);
850
850
851 shell.usageScenario = "tablet";
851 shell.usageScenario = "tablet";
852
852
@@ -856,7 +856,7 @@ Rectangle {
856 verify(desktopWindow);
856 verify(desktopWindow);
857 }
857 }
858
858
859− tryCompare(webApp.session.surface, "activeFocus", true);
859+ tryCompare(webApp.session.lastSurface, "activeFocus", true);
860 }
860 }
861
861
862 function waitUntilAppSurfaceShowsUp(appId) {
862 function waitUntilAppSurfaceShowsUp(appId) {
@@ -977,7 +977,7 @@ Rectangle {
977
977
978 var app = ApplicationManager.startApplication("dialer-app");
978 var app = ApplicationManager.startApplication("dialer-app");
979 // wait until the app is fully loaded (ie, real surface replaces splash screen)
979 // 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);
981
981
982 // Minimize the application we just launched
982 // Minimize the application we just launched
983 swipeFromLeftEdge(shell.width * 0.75);
983 swipeFromLeftEdge(shell.width * 0.75);
@@ -1414,9 +1414,9 @@ Rectangle {
1414 waitUntilAppWindowIsFullyLoaded(app3);
1414 waitUntilAppWindowIsFullyLoaded(app3);
1415
1415
1416 // Do a quick alt-tab and see if focus changes
1416 // Do a quick alt-tab and see if focus changes
1417− tryCompare(app3.session.surface, "activeFocus", true)
1417+ tryCompare(app3.session.lastSurface, "activeFocus", true)
1418 keyClick(Qt.Key_Tab, Qt.ControlModifier)
1418 keyClick(Qt.Key_Tab, Qt.ControlModifier)
1419− tryCompare(app2.session.surface, "activeFocus", true)
1419+ tryCompare(app2.session.lastSurface, "activeFocus", true)
1420
1420
1421 var desktopSpread = findChild(shell, "spread")
1421 var desktopSpread = findChild(shell, "spread")
1422
1422
@@ -1432,7 +1432,7 @@ Rectangle {
1432 tryCompare(desktopSpread, "state", "")
1432 tryCompare(desktopSpread, "state", "")
1433
1433
1434 // Focus should have switched back now
1434 // Focus should have switched back now
1435− tryCompare(app3.session.surface, "activeFocus", true)
1435+ tryCompare(app3.session.lastSurface, "activeFocus", true)
1436 }
1436 }
1437
1437
1438 function test_altTabWrapAround() {
1438 function test_altTabWrapAround() {
@@ -1481,7 +1481,7 @@ Rectangle {
1481 tryCompare(desktopSpread, "state", "")
1481 tryCompare(desktopSpread, "state", "")
1482
1482
1483 // Make sure that after wrapping around once, we have the same one focused as at the beginning
1483 // 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)
1485 }
1485 }
1486
1486
1487 function test_altBackTabNavigation() {
1487 function test_altBackTabNavigation() {
@@ -1863,7 +1863,7 @@ Rectangle {
1863 waitUntilAppWindowIsFullyLoaded(app2);
1863 waitUntilAppWindowIsFullyLoaded(app2);
1864
1864
1865 // Make sure app1 is unfocused but still running
1865 // Make sure app1 is unfocused but still running
1866− compare(app1.session.surface.activeFocus, false);
1866+ compare(app1.session.lastSurface.activeFocus, false);
1867 compare(app1.isTouchApp, false); // sanity check our mock, which sets this for us
1867 compare(app1.isTouchApp, false); // sanity check our mock, which sets this for us
1868 compare(app1.requestedState, ApplicationInfoInterface.RequestedRunning);
1868 compare(app1.requestedState, ApplicationInfoInterface.RequestedRunning);
1869 }
1869 }
@@ -1887,7 +1887,7 @@ Rectangle {
1887 waitUntilAppWindowIsFullyLoaded(app2);
1887 waitUntilAppWindowIsFullyLoaded(app2);
1888
1888
1889 // Make sure app1 is unfocused but still running
1889 // Make sure app1 is unfocused but still running
1890− compare(app1.session.surface.activeFocus, false);
1890+ compare(app1.session.lastSurface.activeFocus, false);
1891 compare(app1.requestedState, ApplicationInfoInterface.RequestedRunning);
1891 compare(app1.requestedState, ApplicationInfoInterface.RequestedRunning);
1892 }
1892 }
1893
1893
tests/qmltests/tst_ShellWithPin.qml+1−1
@@ -479,7 +479,7 @@ Item {
479
479
480 var app = ApplicationManager.startApplication("gallery-app");
480 var app = ApplicationManager.startApplication("gallery-app");
481 // wait until the app is fully loaded (ie, real surface replaces splash screen)
481 // 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);
483
483
484 // New app hides coverPage?
484 // New app hides coverPage?
485 var greeter = findChild(shell, "greeter");
485 var greeter = findChild(shell, "greeter");