@@ -138,92 +138,105 @@ Rectangle {
138138 }
139139 }
140140
141− Rectangle {
141+ Flickable {
142142 id: controls
143− color: "darkgrey"
144− width: units.gu(30)
143+ contentHeight: controlRect.height
144+
145145 anchors.top: root.top
146146 anchors.bottom: root.bottom
147147 anchors.right: root.right
148+ width: units.gu(30)
148149
149− Column {
150− anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
151− spacing: units.gu(1)
152− Row {
153− Button {
154− text: "Show Greeter"
155− activeFocusOnPress: false
156− onClicked: {
157− if (shellLoader.status !== Loader.Ready)
158− return;
150+ Rectangle {
151+ id: controlRect
152+ anchors { left: parent.left; right: parent.right }
153+ color: "darkgrey"
154+ height: childrenRect.height + units.gu(2)
159155
160− var greeter = testCase.findChild(shellLoader.item, "greeter");
161− if (!greeter.shown) {
162− LightDM.Greeter.showGreeter();
156+ Column {
157+ anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
158+ spacing: units.gu(1)
159+
160+ Row {
161+ spacing: units.gu(1)
162+ Button {
163+ text: "Show Greeter"
164+ activeFocusOnPress: false
165+ onClicked: {
166+ if (shellLoader.status !== Loader.Ready)
167+ return;
168+
169+ var greeter = testCase.findChild(shellLoader.item, "greeter");
170+ if (!greeter.shown) {
171+ LightDM.Greeter.showGreeter();
172+ }
173+ }
174+ }
175+ Button {
176+ text: "Hide Greeter"
177+ activeFocusOnPress: false
178+ onClicked: {
179+ if (shellLoader.status !== Loader.Ready)
180+ return;
181+
182+ var greeter = testCase.findChild(shellLoader.item, "greeter");
183+ if (greeter.shown) {
184+ greeter.hide()
185+ }
163186 }
164187 }
165188 }
166− Button {
167− text: "Hide Greeter"
189+ ListItem.ItemSelector {
190+ anchors { left: parent.left; right: parent.right }
168191 activeFocusOnPress: false
169− onClicked: {
170− if (shellLoader.status !== Loader.Ready)
171− return;
172−
173− var greeter = testCase.findChild(shellLoader.item, "greeter");
174− if (greeter.shown) {
175− greeter.hide()
176− }
192+ text: "LightDM mock mode"
193+ model: ["single", "single-passphrase", "single-pin", "full"]
194+ onSelectedIndexChanged: {
195+ shellLoader.active = false;
196+ LightDM.Greeter.mockMode = model[selectedIndex];
197+ LightDM.Users.mockMode = model[selectedIndex];
198+ shellLoader.active = true;
177199 }
178200 }
179− }
180− ListItem.ItemSelector {
181− anchors { left: parent.left; right: parent.right }
182− activeFocusOnPress: false
183− text: "LightDM mock mode"
184− model: ["single", "single-passphrase", "single-pin", "full"]
185− onSelectedIndexChanged: {
186− shellLoader.active = false;
187− LightDM.Greeter.mockMode = model[selectedIndex];
188− LightDM.Users.mockMode = model[selectedIndex];
189− shellLoader.active = true;
201+ ListItem.ItemSelector {
202+ anchors { left: parent.left; right: parent.right }
203+ activeFocusOnPress: false
204+ text: "Size"
205+ model: ["phone", "tablet", "desktop"]
206+ onSelectedIndexChanged: {
207+ shellLoader.active = false;
208+ shellLoader.state = model[selectedIndex];
209+ shellLoader.active = true;
210+ }
190211 }
191− }
192− ListItem.ItemSelector {
193− anchors { left: parent.left; right: parent.right }
194− activeFocusOnPress: false
195− text: "Size"
196− model: ["phone", "tablet", "desktop"]
197− onSelectedIndexChanged: {
198− shellLoader.active = false;
199− shellLoader.state = model[selectedIndex];
200− shellLoader.active = true;
212+ ListItem.ItemSelector {
213+ id: usageModeSelector
214+ anchors { left: parent.left; right: parent.right }
215+ activeFocusOnPress: false
216+ text: "Usage mode"
217+ model: ["Staged", "Windowed"]
218+ onSelectedIndexChanged: {
219+ GSettingsController.setUsageMode(model[selectedIndex]);
220+ }
201221 }
202− }
203− MouseTouchEmulationCheckbox {
204− id: mouseEmulation
205− checked: true
206− color: "white"
207− }
222+ MouseTouchEmulationCheckbox {
223+ id: mouseEmulation
224+ checked: true
225+ color: "white"
226+ }
227+
228+ Label { text: "Applications"; font.bold: true }
208229
209− Button {
210− anchors { left: parent.left; right: parent.right }
211− text: "Start all apps"
212− onClicked: {
213− for (var i = 0; i < appRepeater.count; i++) {
214− var appId = ApplicationManager.availableApplications[i]
215− if (!ApplicationManager.findApplication(appId)) {
230+ Button {
231+ text: "Start all apps"
232+ width: parent.width
233+ onClicked: {
234+ for (var i = 0; i < ApplicationManager.availableApplications.length; i++) {
235+ var appId = ApplicationManager.availableApplications[i];
216236 ApplicationManager.startApplication(appId)
217237 }
218238 }
219239 }
220− }
221−
222− Column {
223− anchors { left: parent.left; right: parent.right }
224− spacing: units.gu(1)
225−
226− Label { text: "Applications"; font.bold: true }
227240
228241 Repeater {
229242 id: appRepeater
@@ -313,6 +326,7 @@ Rectangle {
313326 mouseEmulation.checked = true;
314327 tryCompare(shell, "enabled", true); // make sure greeter didn't leave us in disabled state
315328 tearDown();
329+ GSettingsController.setUsageMode("Staged");
316330 }
317331
318332 function loadShell(formFactor) {
@@ -759,23 +773,57 @@ Rectangle {
759773
760774 function test_launchedAppHasActiveFocus_data() {
761775 return [
762− {tag: "phone", formFactor: "phone"},
763− {tag: "tablet", formFactor: "tablet"},
764− {tag: "desktop", formFactor: "desktop"}
765− ];
776+ {tag: "phone", formFactor: "phone", usageMode: "Staged"},
777+ {tag: "tablet", formFactor: "tablet", usageMode: "Staged"},
778+ {tag: "desktop", formFactor: "tablet", usageMode: "Windowed"}
779+ ]
766780 }
767781
768782 function test_launchedAppHasActiveFocus(data) {
783+ GSettingsController.setUsageMode(data.usageMode);
769784 loadShell(data.formFactor);
770785 swipeAwayGreeter();
771786
772− var dialerApp = ApplicationManager.startApplication("webbrowser-app");
773− verify(dialerApp);
787+ var webApp = ApplicationManager.startApplication("webbrowser-app");
788+ verify(webApp);
789+ waitUntilAppSurfaceShowsUp("webbrowser-app")
790+
791+ verify(webApp.session.surface);
792+
793+ tryCompare(webApp.session.surface, "activeFocus", true);
794+ }
795+
796+ function test_launchedAppKeepsActiveFocusOnUsageModeChange() {
797+ loadShell("tablet");
798+ swipeAwayGreeter();
799+
800+ var webApp = ApplicationManager.startApplication("webbrowser-app");
801+ verify(webApp);
774802 waitUntilAppSurfaceShowsUp("webbrowser-app")
775803
776− verify(dialerApp.session.surface);
804+ verify(webApp.session.surface);
805+
806+ tryCompare(webApp.session.surface, "activeFocus", true);
807+
808+ GSettingsController.setUsageMode("Windowed");
809+
810+ // check that the desktop stage and window have been loaded
811+ {
812+ var desktopWindow = findChild(shell, "decoratedWindow_webbrowser-app");
813+ verify(desktopWindow);
814+ }
815+
816+ tryCompare(webApp.session.surface, "activeFocus", true);
777817
778− tryCompare(dialerApp.session.surface, "activeFocus", true);
818+ GSettingsController.setUsageMode("Staged");
819+
820+ // check that the tablet stage and app surface delegate have been loaded
821+ {
822+ var desktopWindow = findChild(shell, "tabletSpreadDelegate_webbrowser-app");
823+ verify(desktopWindow);
824+ }
825+
826+ tryCompare(webApp.session.surface, "activeFocus", true);
779827 }
780828
781829 function waitUntilAppSurfaceShowsUp(appId) {
@@ -1261,31 +1309,33 @@ Rectangle {
12611309
12621310 function test_stageLoader_data() {
12631311 return [
1264− {tag: "phone", source: "Stages/PhoneStage.qml"},
1265− {tag: "tablet", source: "Stages/TabletStage.qml"},
1266− {tag: "desktop", source: "Stages/DesktopStage.qml"}
1312+ {tag: "phone", source: "Stages/PhoneStage.qml", formFactor: "phone", usageMode: "Staged"},
1313+ {tag: "tablet", source: "Stages/TabletStage.qml", formFactor: "tablet", usageMode: "Staged"},
1314+ {tag: "desktop", source: "Stages/DesktopStage.qml", formFactor: "tablet", usageMode: "Windowed"}
12671315 ]
12681316 }
12691317
12701318 function test_stageLoader(data) {
1271− loadShell(data.tag);
1319+ GSettingsController.setUsageMode(data.usageMode);
1320+ loadShell(data.formFactor);
12721321 var stageLoader = findChild(shell, "applicationsDisplayLoader");
12731322 verify(String(stageLoader.source).indexOf(data.source) >= 0);
12741323 }
12751324
12761325 function test_launcherInverted_data() {
12771326 return [
1278− {tag: "phone", formFactor: "phone"},
1279− {tag: "tablet", formFactor: "tablet"},
1280− {tag: "desktop", formFactor: "desktop"}
1281− ];
1327+ {tag: "phone", formFactor: "phone", usageMode: "Staged", launcherInverted: true},
1328+ {tag: "tablet", formFactor: "tablet", usageMode: "Staged", launcherInverted: true},
1329+ {tag: "desktop", formFactor: "tablet", usageMode: "Windowed", launcherInverted: false}
1330+ ]
12821331 }
12831332
12841333 function test_launcherInverted(data) {
1334+ GSettingsController.setUsageMode(data.usageMode);
12851335 loadShell(data.formFactor);
12861336
12871337 var launcher = findChild(shell, "launcher");
1288− compare(launcher.inverted, data.formFactor !== "desktop");
1338+ compare(launcher.inverted, data.launcherInverted);
12891339 }
12901340 }
12911341}