Merge lp:~lukas-kde/unity8/activateWindows into lp:unity8
- activateWindows
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Albert Astals Cid |
Approved revision: | 2035 |
Merged at revision: | 2046 |
Proposed branch: | lp:~lukas-kde/unity8/activateWindows |
Merge into: | lp:unity8 |
Prerequisite: | lp:~mzanetti/unity8/panel-button-fixes |
Diff against target: |
709 lines (+317/-73) 7 files modified
qml/Panel/Panel.qml (+18/-1) qml/Stages/DecoratedWindow.qml (+3/-1) qml/Stages/DesktopSpread.qml (+1/-1) qml/Stages/DesktopSpreadDelegate.qml (+2/-2) qml/Stages/DesktopStage.qml (+148/-34) qml/Stages/WindowDecoration.qml (+6/-2) tests/qmltests/Stages/tst_DesktopStage.qml (+139/-32) |
To merge this branch: | bzr merge lp:~lukas-kde/unity8/activateWindows |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Albert Astals Cid (community) | Abstain | ||
PS Jenkins bot (community) | continuous-integration | Needs Fixing | |
Michael Zanetti (community) | Approve | ||
Daniel d'Andrada | Pending | ||
Review via email: mp+275706@code.launchpad.net |
This proposal supersedes a proposal from 2015-10-19.
Commit message
Restore windows when activating from the spread, maintain a focus stack
Stop displaying the "grabbing" icon when we merely click to focus the app's decoration.
Provide keyboard shortcuts for common window operations
Description of the change
Raise/restore windows when activating from the spread, maintain a focus stack in case we minimize/close an app.
Stop displaying the "grabbing" icon when we merely click to focus the app's decoration.
Provide keyboard shortcuts for common window operations
* Are there any related MPs required for this MP to build/function as expected? Please list.
https:/
* Did you perform an exploratory manual test run of your code change and any related functionality?
Yes
* Did you make sure that your branch does not contain spurious tags?
Yes
* If you changed the packaging (debian), did you subscribe the ubuntu-unity team to this MP?
Yes
* If you changed the UI, has there been a design review?
N/A
Daniel d'Andrada (dandrader) wrote : Posted in a previous version of this proposal | # |
Lukáš Tinkl (lukas-kde) wrote : Posted in a previous version of this proposal | # |
> Please follow the commit message format as explained here:
> https:/
Should be fine now
Daniel d'Andrada (dandrader) wrote : Posted in a previous version of this proposal | # |
Could you please add qml tests to cover those use cases you mention (ie active focus when clicking on decoration and raise/restore when activation from spread)?
I believe we already have a test for the first one (focus when clicking decoration). We had similar problems in the past before. Should investigate why it passes now even though there's a bug there (maybe it tests only with touches and not with mouse clicks, don't know).
Daniel d'Andrada (dandrader) wrote : Posted in a previous version of this proposal | # |
Oh, and it's worth making lp:~unity-team/unity8/mousePointer from silo 022 a prerequisite as it makes a lot of changes in this code.
Daniel d'Andrada (dandrader) wrote : Posted in a previous version of this proposal | # |
> > Please follow the commit message format as explained here:
> > https:/
>
> Should be fine now
Yes, thanks!
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2005
http://
Executed test runs:
UNSTABLE: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Michael Zanetti (mzanetti) : Posted in a previous version of this proposal | # |
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2020
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:2022
http://
Executed test runs:
UNSTABLE: http://
FAILURE: http://
UNSTABLE: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
FAILURE: http://
FAILURE: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:2023
http://
Executed test runs:
UNSTABLE: http://
FAILURE: http://
UNSTABLE: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
FAILURE: http://
FAILURE: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
Albert Astals Cid (aacid) wrote : | # |
are the qml failing tests a regression of this?
Lukáš Tinkl (lukas-kde) wrote : | # |
> are the qml failing tests a regression of this?
Ah yes, most likely; gonna look into them.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:2024
http://
Executed test runs:
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
FAILURE: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:2025
http://
Executed test runs:
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
FAILURE: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
Michael Zanetti (mzanetti) wrote : | # |
file://
file://
Getting this warning frequently in the log. Please silence it.
Lukáš Tinkl (lukas-kde) wrote : | # |
> file://
> qml:71:16: Unable to assign [undefined] to QString
> file://
> :218: TypeError: Cannot read property 'title' of null
>
> Getting this warning frequently in the log. Please silence it.
Silence, and fixed (the "model.name" was even wrong), we do get the surface name already as a fallback for window.title
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:2026
http://
Executed test runs:
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Michael Zanetti (mzanetti) wrote : | # |
Here's a case where it breaks still:
* Have only one application open (dash)
* minimize it
* press alt+tab (spread will show, dash is selected)
* release alt+tab
expected: dash restores
actual: nothing happens
* now launch something else from the launcher
expected: other app launches
actual: other app launches & dash restores
Michael Zanetti (mzanetti) wrote : | # |
* press Ctrl+Meta+Right to half-maximize the window on the right side
* press Ctrl+Meta+Down
expected: Window restores (as it does in unity7)
actual: Window minimizes
Michael Zanetti (mzanetti) wrote : | # |
* Minimize all windows
* Press Ctrl+Meta+Up
expected: nothing happens as there is no focused window
actual: last focused app restores
Michael Zanetti (mzanetti) wrote : | # |
* Alt+F4 doesn't seem to work for me
* Meta+Ctrl+D to Minimize all doesn't minimize maximized and semi-maximized windows (only restored ones are minimized)
Some more inline comments too.
Lukáš Tinkl (lukas-kde) wrote : | # |
> * Alt+F4 doesn't seem to work for me
> * Meta+Ctrl+D to Minimize all doesn't minimize maximized and semi-maximized
> windows (only restored ones are minimized)
>
> Some more inline comments too.
All issues hopefully fixed; found a new one: we should restore minimized apps to their previous state (not normal) respecting the maximized bits.
Please test again :)
Michael Zanetti (mzanetti) wrote : | # |
Quite an improvement, yes! Still some small ones.
* minimize a maximized window, select it in the spread => expected: maximized, actual: restored. Same for closing a maximized one and reopening. Not sure how far we want to go with those in a single branch... this one improves things already a lot and there's still lots to do. So you decide when you want to give it a rest with this branch. We can start splitting things into multiple branches.
* managed to break alt+f4 again. I tried to log out and in again and break it again but didn't manage so far. Will keep on trying.
* During the above, I found a super weird one :D Minimize all windows, now ctrl+meta+arrow shouldn't do anything any more. Here's how: press and hold ctrl+meta and then press all 4 arrows dogether down two times in a row. It will restore a window :D Not that this would be a common thing to do, but it does indicate some focus issue when everything is minimized. Can you try to find out what's going on?
- ApplicationMana
+ ApplicationMana
careful with that... can you explain the reason for this? The difference is that with "requestFocusAp
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:2027
http://
Executed test runs:
UNSTABLE: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:2028
http://
Executed test runs:
SUCCESS: http://
FAILURE: http://
UNSTABLE: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Lukáš Tinkl (lukas-kde) wrote : | # |
All issues fixed, wasn't able to reproduce the Alt+F4 problem, neither the ctrl+meta+arrows one.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:2029
http://
Executed test runs:
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Michael Zanetti (mzanetti) wrote : | # |
> All issues fixed, wasn't able to reproduce the Alt+F4 problem, neither the
> ctrl+meta+arrows one.
the ctr+meta-arrows is really easy to reproduce tho... just minimize all whindows, press and hold ctrl and alt, then use your flat hand to press down all the arrow keys, twice in a row. It will restore some windows.
Just found another one: when you semi-maximize a window (left or right), it is placed below the panel, but the panel's height is not subtracted and so the window's bottom edge is outside the screen.
Michael Zanetti (mzanetti) wrote : | # |
I think I found how to reproduce the lost alt+f4: Switch to another vt (e.g. the unity7 session) and back to unity8. Alt+F4 will be gone. Could be an issue with general input handling and not directly related to the branch... Please give it a quick look if it is to be fixed in here or not.
Lukáš Tinkl (lukas-kde) wrote : | # |
> > All issues fixed, wasn't able to reproduce the Alt+F4 problem, neither the
> > ctrl+meta+arrows one.
>
> the ctr+meta-arrows is really easy to reproduce tho... just minimize all
> whindows, press and hold ctrl and alt, then use your flat hand to press down
> all the arrow keys, twice in a row. It will restore some windows.
Can't reproduce at all :/ Nothing happens in this case
>
> Just found another one: when you semi-maximize a window (left or right), it is
> placed below the panel, but the panel's height is not subtracted and so the
> window's bottom edge is outside the screen.
Thanks for spotting, fixed
Lukáš Tinkl (lukas-kde) wrote : | # |
For reference, the Alt+F4 bug seems to be caused by:
https:/
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:2030
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Michael Zanetti (mzanetti) wrote : | # |
all issues addressed now.
* Did you perform an exploratory manual test run of the code change and any related functionality?
yes
* Did CI run pass? If not, please explain why.
it did for vivid, at least qmltests. AP tests seem to have issues flashing devices.
* Did you make sure that the branch does not contain spurious tags?
yes
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:2031
http://
Executed test runs:
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Albert Astals Cid (aacid) wrote : | # |
Note: was already top approved
Text conflict in qml/Panel/Panel.qml
Text conflict in qml/Stages/
Text conflict in tests/qmltests/
3 conflicts encountered.
- 2033. By Lukáš Tinkl
-
merge trunk
- 2034. By Lukáš Tinkl
-
cleanup
- 2035. By Lukáš Tinkl
-
cleanup
Lukáš Tinkl (lukas-kde) wrote : | # |
Conflicts resolved
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:2032
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:2035
http://
Executed test runs:
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Albert Astals Cid (aacid) wrote : | # |
Top approving again now that merge has made CI happy.
Preview Diff
1 | === modified file 'qml/Panel/Panel.qml' |
2 | --- qml/Panel/Panel.qml 2015-11-04 14:57:33 +0000 |
3 | +++ qml/Panel/Panel.qml 2015-11-06 14:14:29 +0000 |
4 | @@ -137,7 +137,7 @@ |
5 | } |
6 | |
7 | shown: false |
8 | - width: root.width - (windowControlButtons.visible ? windowControlButtons.width : 0) |
9 | + width: root.width - (windowControlButtons.visible ? windowControlButtons.width + titleLabel.width : 0) |
10 | minimizedPanelHeight: units.gu(3) |
11 | expandedPanelHeight: units.gu(7) |
12 | openedHeight: root.height - indicatorOrangeLine.height |
13 | @@ -178,6 +178,23 @@ |
14 | onMaximize: PanelState.maximize() |
15 | } |
16 | |
17 | + Label { |
18 | + id: titleLabel |
19 | + objectName: "windowDecorationTitle" |
20 | + anchors { |
21 | + left: windowControlButtons.right |
22 | + top: parent.top |
23 | + margins: units.gu(0.7) |
24 | + } |
25 | + color: "#DFDBD2" |
26 | + height: windowControlButtons.height |
27 | + visible: windowControlButtons.visible |
28 | + verticalAlignment: Text.AlignVCenter |
29 | + fontSize: "small" |
30 | + font.bold: true |
31 | + text: PanelState.title |
32 | + } |
33 | + |
34 | PanelSeparatorLine { |
35 | id: indicatorOrangeLine |
36 | anchors { |
37 | |
38 | === modified file 'qml/Stages/DecoratedWindow.qml' |
39 | --- qml/Stages/DecoratedWindow.qml 2015-11-04 14:57:33 +0000 |
40 | +++ qml/Stages/DecoratedWindow.qml 2015-11-06 14:14:29 +0000 |
41 | @@ -26,6 +26,7 @@ |
42 | property alias window: applicationWindow |
43 | property alias application: applicationWindow.application |
44 | property alias active: decoration.active |
45 | + property alias title: decoration.title |
46 | |
47 | property bool decorationShown: true |
48 | property bool highlightShown: false |
49 | @@ -66,7 +67,8 @@ |
50 | objectName: application ? "appWindowDecoration_" + application.appId : "appWindowDecoration_null" |
51 | anchors { left: parent.left; top: parent.top; right: parent.right } |
52 | height: units.gu(3) |
53 | - title: window.title !== "" ? window.title : model.name |
54 | + width: root.width |
55 | + title: window.title !== "" ? window.title : "" |
56 | onClose: root.close(); |
57 | onMaximize: root.maximize(); |
58 | onMinimize: root.minimize(); |
59 | |
60 | === modified file 'qml/Stages/DesktopSpread.qml' |
61 | --- qml/Stages/DesktopSpread.qml 2015-09-29 12:25:39 +0000 |
62 | +++ qml/Stages/DesktopSpread.qml 2015-11-06 14:14:29 +0000 |
63 | @@ -87,7 +87,7 @@ |
64 | function focusSelected() { |
65 | if (spreadRepeater.highlightedIndex != -1) { |
66 | var application = ApplicationManager.get(spreadRepeater.highlightedIndex); |
67 | - ApplicationManager.focusApplication(application.appId); |
68 | + ApplicationManager.requestFocusApplication(application.appId); |
69 | } |
70 | } |
71 | |
72 | |
73 | === modified file 'qml/Stages/DesktopSpreadDelegate.qml' |
74 | --- qml/Stages/DesktopSpreadDelegate.qml 2015-09-29 12:28:10 +0000 |
75 | +++ qml/Stages/DesktopSpreadDelegate.qml 2015-11-06 14:14:29 +0000 |
76 | @@ -29,8 +29,8 @@ |
77 | property bool highlightShown: false |
78 | property real shadowOpacity: 1 |
79 | |
80 | - property int windowWidth: application.session && application.session.surface ? application.session.surface.size.width : 0 |
81 | - property int windowHeight: application.session && application.session.surface ? application.session.surface.size.height : 0 |
82 | + property int windowWidth: application && application.session && application.session.surface ? application.session.surface.size.width : 0 |
83 | + property int windowHeight: application && application.session && application.session.surface ? application.session.surface.size.height : 0 |
84 | |
85 | state: "normal" |
86 | states: [ |
87 | |
88 | === modified file 'qml/Stages/DesktopStage.qml' |
89 | --- qml/Stages/DesktopStage.qml 2015-11-04 14:58:05 +0000 |
90 | +++ qml/Stages/DesktopStage.qml 2015-11-06 14:14:29 +0000 |
91 | @@ -20,11 +20,11 @@ |
92 | import QtQuick.Layouts 1.1 |
93 | import Ubuntu.Components 1.3 |
94 | import Unity.Application 0.1 |
95 | -import "../Components" |
96 | import "../Components/PanelState" |
97 | import "../Components" |
98 | import Utils 0.1 |
99 | import Ubuntu.Gestures 0.1 |
100 | +import GlobalShortcut 1.0 |
101 | |
102 | AbstractStage { |
103 | id: root |
104 | @@ -45,21 +45,72 @@ |
105 | spread.state = ""; |
106 | } |
107 | |
108 | - ApplicationManager.requestFocusApplication(appId) |
109 | + ApplicationManager.focusApplication(appId); |
110 | + } |
111 | + |
112 | + onApplicationRemoved: { |
113 | + priv.focusNext(); |
114 | } |
115 | |
116 | onFocusRequested: { |
117 | var appIndex = priv.indexOf(appId); |
118 | var appDelegate = appRepeater.itemAt(appIndex); |
119 | - appDelegate.minimized = false; |
120 | - ApplicationManager.focusApplication(appId) |
121 | + appDelegate.restoreFromMinimized(); |
122 | |
123 | if (spread.state == "altTab") { |
124 | - spread.cancel() |
125 | + spread.cancel(); |
126 | } |
127 | } |
128 | } |
129 | |
130 | + GlobalShortcut { |
131 | + id: closeWindowShortcut |
132 | + shortcut: Qt.AltModifier|Qt.Key_F4 |
133 | + onTriggered: ApplicationManager.stopApplication(priv.focusedAppId) |
134 | + active: priv.focusedAppId !== "" |
135 | + } |
136 | + |
137 | + GlobalShortcut { |
138 | + id: showSpreadShortcut |
139 | + shortcut: Qt.MetaModifier|Qt.Key_W |
140 | + onTriggered: spread.state = "altTab" |
141 | + } |
142 | + |
143 | + GlobalShortcut { |
144 | + id: minimizeAllShortcut |
145 | + shortcut: Qt.MetaModifier|Qt.ControlModifier|Qt.Key_D |
146 | + onTriggered: priv.minimizeAllWindows() |
147 | + } |
148 | + |
149 | + GlobalShortcut { |
150 | + id: maximizeWindowShortcut |
151 | + shortcut: Qt.MetaModifier|Qt.ControlModifier|Qt.Key_Up |
152 | + onTriggered: priv.focusedAppDelegate.maximize() |
153 | + active: priv.focusedAppDelegate !== null |
154 | + } |
155 | + |
156 | + GlobalShortcut { |
157 | + id: maximizeWindowLeftShortcut |
158 | + shortcut: Qt.MetaModifier|Qt.ControlModifier|Qt.Key_Left |
159 | + onTriggered: priv.focusedAppDelegate.maximizeLeft() |
160 | + active: priv.focusedAppDelegate !== null |
161 | + } |
162 | + |
163 | + GlobalShortcut { |
164 | + id: maximizeWindowRightShortcut |
165 | + shortcut: Qt.MetaModifier|Qt.ControlModifier|Qt.Key_Right |
166 | + onTriggered: priv.focusedAppDelegate.maximizeRight() |
167 | + active: priv.focusedAppDelegate !== null |
168 | + } |
169 | + |
170 | + GlobalShortcut { |
171 | + id: minimizeRestoreShortcut |
172 | + shortcut: Qt.MetaModifier|Qt.ControlModifier|Qt.Key_Down |
173 | + onTriggered: priv.focusedAppDelegate.maximized || priv.focusedAppDelegate.maximizedLeft || priv.focusedAppDelegate.maximizedRight |
174 | + ? priv.focusedAppDelegate.restore() : priv.focusedAppDelegate.minimize(true) |
175 | + active: priv.focusedAppDelegate !== null |
176 | + } |
177 | + |
178 | QtObject { |
179 | id: priv |
180 | |
181 | @@ -93,6 +144,28 @@ |
182 | } |
183 | return -1; |
184 | } |
185 | + |
186 | + function minimizeAllWindows() { |
187 | + for (var i = 0; i < appRepeater.count; i++) { |
188 | + var appDelegate = appRepeater.itemAt(i); |
189 | + if (appDelegate && !appDelegate.minimized) { |
190 | + appDelegate.minimize(false); // minimize but don't switch focus |
191 | + } |
192 | + } |
193 | + |
194 | + ApplicationManager.unfocusCurrentApplication(); // no app should have focus at this point |
195 | + } |
196 | + |
197 | + function focusNext() { |
198 | + ApplicationManager.unfocusCurrentApplication(); |
199 | + for (var i = 0; i < appRepeater.count; i++) { |
200 | + var appDelegate = appRepeater.itemAt(i); |
201 | + if (appDelegate && !appDelegate.minimized) { |
202 | + ApplicationManager.focusApplication(appDelegate.appId); |
203 | + return; |
204 | + } |
205 | + } |
206 | + } |
207 | } |
208 | |
209 | Connections { |
210 | @@ -100,15 +173,23 @@ |
211 | onClose: { |
212 | ApplicationManager.stopApplication(ApplicationManager.focusedApplicationId) |
213 | } |
214 | - onMinimize: appRepeater.itemAt(0).minimize(); |
215 | - onMaximize: appRepeater.itemAt(0).unmaximize(); |
216 | + onMinimize: appRepeater.itemAt(0).minimize(true); |
217 | + onMaximize: appRepeater.itemAt(0).restore(); |
218 | } |
219 | |
220 | Binding { |
221 | target: PanelState |
222 | property: "buttonsVisible" |
223 | - value: priv.focusedAppDelegate !== null && priv.focusedAppDelegate.state === "maximized" |
224 | - } |
225 | + value: priv.focusedAppDelegate !== null && priv.focusedAppDelegate.maximized |
226 | + } |
227 | + |
228 | + Binding { |
229 | + target: PanelState |
230 | + property: "title" |
231 | + value: priv.focusedAppDelegate !== null && priv.focusedAppDelegate.title |
232 | + when: priv.focusedAppDelegate && priv.focusedAppDelegate.maximized |
233 | + } |
234 | + |
235 | Component.onDestruction: PanelState.buttonsVisible = false; |
236 | |
237 | FocusScope { |
238 | @@ -135,23 +216,26 @@ |
239 | |
240 | delegate: FocusScope { |
241 | id: appDelegate |
242 | - objectName: "stageDelegate_" + model.appId |
243 | + objectName: "appDelegate_" + appId |
244 | z: ApplicationManager.count - index |
245 | y: units.gu(3) |
246 | width: units.gu(60) |
247 | height: units.gu(50) |
248 | - focus: model.appId === priv.focusedAppId |
249 | + focus: appId === priv.focusedAppId |
250 | |
251 | property bool maximized: false |
252 | + property bool maximizedLeft: false |
253 | + property bool maximizedRight: false |
254 | property bool minimized: false |
255 | + readonly property string appId: model.appId |
256 | property bool animationsEnabled: true |
257 | - |
258 | + property alias title: decoratedWindow.title |
259 | property bool visuallyMaximized: false |
260 | property bool visuallyMinimized: false |
261 | |
262 | onFocusChanged: { |
263 | - if (focus && ApplicationManager.focusedApplicationId !== model.appId) { |
264 | - ApplicationManager.focusApplication(model.appId); |
265 | + if (focus && ApplicationManager.focusedApplicationId !== appId) { |
266 | + ApplicationManager.focusApplication(appId); |
267 | } |
268 | } |
269 | |
270 | @@ -163,8 +247,6 @@ |
271 | (priv.foregroundMaximizedAppIdIndex === -1 || priv.foregroundMaximizedAppIdIndex >= index) || |
272 | (spread.state == "altTab" && index === spread.highlightedIndex) |
273 | |
274 | - onVisibleChanged: console.log("VISIBLE", model.appId, visible) |
275 | - |
276 | Binding { |
277 | target: ApplicationManager.get(index) |
278 | property: "requestedState" |
279 | @@ -180,22 +262,50 @@ |
280 | animationsEnabled = (animated === undefined) || animated; |
281 | minimized = false; |
282 | maximized = true; |
283 | + maximizedLeft = false; |
284 | + maximizedRight = false; |
285 | + } |
286 | + function maximizeLeft() { |
287 | + minimized = false; |
288 | + maximized = false; |
289 | + maximizedLeft = true; |
290 | + maximizedRight = false; |
291 | + } |
292 | + function maximizeRight() { |
293 | + minimized = false; |
294 | + maximized = false; |
295 | + maximizedLeft = false; |
296 | + maximizedRight = true; |
297 | } |
298 | function minimize(animated) { |
299 | animationsEnabled = (animated === undefined) || animated; |
300 | maximized = false; |
301 | minimized = true; |
302 | } |
303 | - function unmaximize(animated) { |
304 | + function restore(animated) { |
305 | animationsEnabled = (animated === undefined) || animated; |
306 | minimized = false; |
307 | maximized = false; |
308 | + maximizedLeft = false; |
309 | + maximizedRight = false; |
310 | + } |
311 | + function restoreFromMinimized(animated) { |
312 | + animationsEnabled = (animated === undefined) || animated; |
313 | + minimized = false; |
314 | + if (maximized) |
315 | + maximize(); |
316 | + else if (maximizedLeft) |
317 | + maximizeLeft(); |
318 | + else if (maximizedRight) |
319 | + maximizeRight(); |
320 | + ApplicationManager.focusApplication(appId); |
321 | } |
322 | |
323 | states: [ |
324 | State { |
325 | name: "normal"; |
326 | when: !appDelegate.maximized && !appDelegate.minimized |
327 | + && !appDelegate.maximizedLeft && !appDelegate.maximizedRight |
328 | PropertyChanges { |
329 | target: appDelegate; |
330 | visuallyMinimized: false; |
331 | @@ -213,6 +323,14 @@ |
332 | } |
333 | }, |
334 | State { |
335 | + name: "maximizedLeft"; when: appDelegate.maximizedLeft && !appDelegate.minimized |
336 | + PropertyChanges { target: appDelegate; x: 0; y: units.gu(3); width: root.width/2; height: root.height - units.gu(3) } |
337 | + }, |
338 | + State { |
339 | + name: "maximizedRight"; when: appDelegate.maximizedRight && !appDelegate.minimized |
340 | + PropertyChanges { target: appDelegate; x: root.width/2; y: units.gu(3); width: root.width/2; height: root.height - units.gu(3) } |
341 | + }, |
342 | + State { |
343 | name: "minimized"; when: appDelegate.minimized |
344 | PropertyChanges { |
345 | target: appDelegate; |
346 | @@ -229,14 +347,14 @@ |
347 | to: "normal" |
348 | enabled: appDelegate.animationsEnabled |
349 | PropertyAction { target: appDelegate; properties: "visuallyMinimized,visuallyMaximized" } |
350 | - PropertyAnimation { target: appDelegate; properties: "x,y,opacity,width,height,scale,opacity" } |
351 | + PropertyAnimation { target: appDelegate; properties: "x,y,opacity,width,height,scale" } |
352 | }, |
353 | Transition { |
354 | to: "maximized" |
355 | enabled: appDelegate.animationsEnabled |
356 | PropertyAction { target: appDelegate; property: "visuallyMinimized" } |
357 | SequentialAnimation { |
358 | - PropertyAnimation { target: appDelegate; properties: "x,y,opacity,width,height,scale,opacity" } |
359 | + PropertyAnimation { target: appDelegate; properties: "x,y,opacity,width,height,scale" } |
360 | PropertyAction { target: appDelegate; property: "visuallyMaximized" } |
361 | } |
362 | }, |
363 | @@ -245,20 +363,15 @@ |
364 | enabled: appDelegate.animationsEnabled |
365 | PropertyAction { target: appDelegate; property: "visuallyMaximized" } |
366 | SequentialAnimation { |
367 | - PropertyAnimation { target: appDelegate; properties: "x,y,opacity,width,height,scale,opacity" } |
368 | + PropertyAnimation { target: appDelegate; properties: "x,y,opacity,width,height,scale" } |
369 | PropertyAction { target: appDelegate; property: "visuallyMinimized" } |
370 | - } |
371 | - }, |
372 | - Transition { |
373 | - from: "" |
374 | - to: "altTab" |
375 | - PropertyAction { target: appDelegate; properties: "y,angle,z,itemScale,itemScaleOriginY" } |
376 | - PropertyAction { target: decoratedWindow; properties: "anchors.topMargin" } |
377 | - PropertyAnimation { |
378 | - target: appDelegate; properties: "x" |
379 | - from: root.width |
380 | - duration: rightEdgePushArea.containsMouse ? UbuntuAnimation.FastDuration :0 |
381 | - easing: UbuntuAnimation.StandardEasing |
382 | + ScriptAction { |
383 | + script: { |
384 | + if (appDelegate.animationsEnabled && state === "minimized" ) { |
385 | + priv.focusNext(); |
386 | + } |
387 | + } |
388 | + } |
389 | } |
390 | } |
391 | ] |
392 | @@ -294,8 +407,9 @@ |
393 | focus: true |
394 | |
395 | onClose: ApplicationManager.stopApplication(model.appId) |
396 | - onMaximize: appDelegate.maximized ? appDelegate.unmaximize() : appDelegate.maximize() |
397 | - onMinimize: appDelegate.minimize() |
398 | + onMaximize: appDelegate.maximized || appDelegate.maximizedLeft || appDelegate.maximizedRight |
399 | + ? appDelegate.restore() : appDelegate.maximize() |
400 | + onMinimize: appDelegate.minimize(true) |
401 | onDecorationPressed: { ApplicationManager.focusApplication(model.appId) } |
402 | } |
403 | } |
404 | |
405 | === modified file 'qml/Stages/WindowDecoration.qml' |
406 | --- qml/Stages/WindowDecoration.qml 2015-11-04 14:57:33 +0000 |
407 | +++ qml/Stages/WindowDecoration.qml 2015-11-06 14:14:29 +0000 |
408 | @@ -45,14 +45,15 @@ |
409 | priv.distanceX = pos.x; |
410 | priv.distanceY = pos.y; |
411 | priv.dragging = true; |
412 | - Mir.cursorName = "grabbing"; |
413 | } else { |
414 | priv.dragging = false; |
415 | Mir.cursorName = ""; |
416 | } |
417 | } |
418 | + |
419 | onPositionChanged: { |
420 | if (priv.dragging) { |
421 | + Mir.cursorName = "grabbing"; |
422 | var pos = mapToItem(root.target.parent, mouseX, mouseY); |
423 | root.target.x = pos.x - priv.distanceX; |
424 | root.target.y = pos.y - priv.distanceY; |
425 | @@ -70,11 +71,12 @@ |
426 | } |
427 | |
428 | Row { |
429 | - anchors { left: parent.left; top: parent.top; bottom: parent.bottom; margins: units.gu(0.7) } |
430 | + anchors { fill: parent; margins: units.gu(0.7) } |
431 | spacing: units.gu(1) |
432 | opacity: root.active ? 1 : 0.5 |
433 | |
434 | WindowControlButtons { |
435 | + id: buttons |
436 | height: parent.height |
437 | onClose: root.close(); |
438 | onMinimize: root.minimize(); |
439 | @@ -86,9 +88,11 @@ |
440 | objectName: "windowDecorationTitle" |
441 | color: "#DFDBD2" |
442 | height: parent.height |
443 | + width: parent.width - buttons.width - parent.anchors.rightMargin - parent.anchors.leftMargin |
444 | verticalAlignment: Text.AlignVCenter |
445 | fontSize: "small" |
446 | font.bold: true |
447 | + elide: Text.ElideRight |
448 | } |
449 | } |
450 | } |
451 | |
452 | === modified file 'tests/qmltests/Stages/tst_DesktopStage.qml' |
453 | --- tests/qmltests/Stages/tst_DesktopStage.qml 2015-11-04 14:58:05 +0000 |
454 | +++ tests/qmltests/Stages/tst_DesktopStage.qml 2015-11-06 14:14:29 +0000 |
455 | @@ -60,14 +60,10 @@ |
456 | |
457 | focus: true |
458 | |
459 | - property bool itemDestroyed: false |
460 | sourceComponent: Component { |
461 | DesktopStage { |
462 | color: "darkblue" |
463 | anchors.fill: parent |
464 | - Component.onDestruction: { |
465 | - desktopStageLoader.itemDestroyed = true; |
466 | - } |
467 | orientations: Orientations {} |
468 | } |
469 | } |
470 | @@ -103,16 +99,10 @@ |
471 | property Item desktopStage: desktopStageLoader.status === Loader.Ready ? desktopStageLoader.item : null |
472 | |
473 | function cleanup() { |
474 | - desktopStageLoader.itemDestroyed = false; |
475 | desktopStageLoader.active = false; |
476 | |
477 | tryCompare(desktopStageLoader, "status", Loader.Null); |
478 | tryCompare(desktopStageLoader, "item", null); |
479 | - // Loader.status might be Loader.Null and Loader.item might be null but the Loader |
480 | - // actually took place. Likely because Loader waits until the next event loop |
481 | - // iteration to do its work. So to ensure the reload, we will wait until the |
482 | - // Shell instance gets destroyed. |
483 | - tryCompare(desktopStageLoader, "itemDestroyed", true); |
484 | |
485 | killAllRunningApps(); |
486 | |
487 | @@ -155,10 +145,7 @@ |
488 | } |
489 | |
490 | function test_appFocusSwitch(data) { |
491 | - var i; |
492 | - for (i = 0; i < data.apps.length; i++) { |
493 | - startApplication(data.apps[i]); |
494 | - } |
495 | + data.apps.forEach(startApplication); |
496 | |
497 | ApplicationManager.requestFocusApplication(data.apps[data.focusfrom]); |
498 | tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.surface, "activeFocus", true); |
499 | @@ -175,10 +162,7 @@ |
500 | } |
501 | |
502 | function test_tappingOnWindowChangesFocusedApp(data) { |
503 | - var i; |
504 | - for (i = 0; i < data.apps.length; i++) { |
505 | - startApplication(data.apps[i]); |
506 | - } |
507 | + data.apps.forEach(startApplication); |
508 | var fromAppId = data.apps[data.focusfrom]; |
509 | var toAppId = data.apps[data.focusTo] |
510 | |
511 | @@ -195,18 +179,37 @@ |
512 | compare(ApplicationManager.focusedApplicationId, toAppId); |
513 | } |
514 | |
515 | + function test_clickingOnWindowChangesFocusedApp_data() { |
516 | + return test_tappingOnWindowChangesFocusedApp_data(); // reuse test data |
517 | + } |
518 | + |
519 | + function test_clickingOnWindowChangesFocusedApp(data) { |
520 | + data.apps.forEach(startApplication); |
521 | + var fromAppId = data.apps[data.focusfrom]; |
522 | + var toAppId = data.apps[data.focusTo] |
523 | + |
524 | + var fromAppWindow = findChild(desktopStage, "appWindow_" + fromAppId); |
525 | + verify(fromAppWindow); |
526 | + mouseClick(fromAppWindow); |
527 | + compare(fromAppWindow.application.session.surface.activeFocus, true); |
528 | + compare(ApplicationManager.focusedApplicationId, fromAppId); |
529 | + |
530 | + var toAppWindow = findChild(desktopStage, "appWindow_" + toAppId); |
531 | + verify(toAppWindow); |
532 | + mouseClick(toAppWindow); |
533 | + compare(toAppWindow.application.session.surface.activeFocus, true); |
534 | + compare(ApplicationManager.focusedApplicationId, toAppId); |
535 | + } |
536 | + |
537 | function test_tappingOnDecorationFocusesApplication_data() { |
538 | return [ |
539 | - {tag: "dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 0, focusTo: 1 }, |
540 | - {tag: "dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 1, focusTo: 0 }, |
541 | + {tag: "dash to dialer", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 0, focusTo: 1 }, |
542 | + {tag: "dialer to dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 1, focusTo: 0 }, |
543 | ] |
544 | } |
545 | |
546 | function test_tappingOnDecorationFocusesApplication(data) { |
547 | - var i; |
548 | - for (i = 0; i < data.apps.length; i++) { |
549 | - startApplication(data.apps[i]); |
550 | - } |
551 | + data.apps.forEach(startApplication); |
552 | |
553 | var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]); |
554 | verify(fromAppDecoration); |
555 | @@ -219,10 +222,114 @@ |
556 | tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.surface, "activeFocus", true); |
557 | } |
558 | |
559 | + function test_clickingOnDecorationFocusesApplication_data() { |
560 | + return test_tappingOnDecorationFocusesApplication_data(); // reuse test data |
561 | + } |
562 | + |
563 | + function test_clickingOnDecorationFocusesApplication(data) { |
564 | + data.apps.forEach(startApplication); |
565 | + |
566 | + var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]); |
567 | + verify(fromAppDecoration); |
568 | + mouseClick(fromAppDecoration); |
569 | + tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.surface, "activeFocus", true); |
570 | + |
571 | + var toAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusTo]); |
572 | + verify(toAppDecoration); |
573 | + mouseClick(toAppDecoration); |
574 | + tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.surface, "activeFocus", true); |
575 | + } |
576 | + |
577 | + function test_windowMaximize() { |
578 | + var apps = ["unity8-dash", "dialer-app", "camera-app"]; |
579 | + apps.forEach(startApplication); |
580 | + var appName = "dialer-app"; |
581 | + var appDelegate = findChild(desktopStage, "appDelegate_" + appName); |
582 | + verify(appDelegate); |
583 | + ApplicationManager.focusApplication(appName); |
584 | + keyClick(Qt.Key_Up, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Up shortcut to maximize |
585 | + tryCompare(appDelegate, "maximized", true); |
586 | + tryCompare(appDelegate, "minimized", false); |
587 | + } |
588 | + |
589 | + function test_windowMaximizeLeft() { |
590 | + var apps = ["unity8-dash", "dialer-app", "camera-app"]; |
591 | + apps.forEach(startApplication); |
592 | + var appName = "dialer-app"; |
593 | + var appDelegate = findChild(desktopStage, "appDelegate_" + appName); |
594 | + verify(appDelegate); |
595 | + ApplicationManager.focusApplication(appName); |
596 | + keyClick(Qt.Key_Left, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Left shortcut to maximizeLeft |
597 | + tryCompare(appDelegate, "maximized", false); |
598 | + tryCompare(appDelegate, "minimized", false); |
599 | + tryCompare(appDelegate, "maximizedLeft", true); |
600 | + tryCompare(appDelegate, "maximizedRight", false); |
601 | + } |
602 | + |
603 | + function test_windowMaximizeRight() { |
604 | + var apps = ["unity8-dash", "dialer-app", "camera-app"]; |
605 | + apps.forEach(startApplication); |
606 | + var appName = "dialer-app"; |
607 | + var appDelegate = findChild(desktopStage, "appDelegate_" + appName); |
608 | + verify(appDelegate); |
609 | + ApplicationManager.focusApplication(appName); |
610 | + keyClick(Qt.Key_Right, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Right shortcut to maximizeRight |
611 | + tryCompare(appDelegate, "maximized", false); |
612 | + tryCompare(appDelegate, "minimized", false); |
613 | + tryCompare(appDelegate, "maximizedLeft", false); |
614 | + tryCompare(appDelegate, "maximizedRight", true); |
615 | + } |
616 | + |
617 | + function test_windowMinimize() { |
618 | + var apps = ["unity8-dash", "dialer-app", "camera-app"]; |
619 | + apps.forEach(startApplication); |
620 | + var appName = "dialer-app"; |
621 | + var appDelegate = findChild(desktopStage, "appDelegate_" + appName); |
622 | + verify(appDelegate); |
623 | + ApplicationManager.focusApplication(appName); |
624 | + keyClick(Qt.Key_Down, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Down shortcut to minimize |
625 | + tryCompare(appDelegate, "maximized", false); |
626 | + tryCompare(appDelegate, "minimized", true); |
627 | + verify(ApplicationManager.focusedApplicationId != ""); // verify we don't lose focus when minimizing an app |
628 | + } |
629 | + |
630 | + function test_windowMinimizeAll() { |
631 | + var apps = ["unity8-dash", "dialer-app", "camera-app"]; |
632 | + apps.forEach(startApplication); |
633 | + verify(ApplicationManager.count == 3); |
634 | + keyClick(Qt.Key_D, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+D shortcut to minimize all |
635 | + tryCompare(ApplicationManager, "focusedApplicationId", ""); // verify no app is focused |
636 | + } |
637 | + |
638 | + function test_windowClose() { |
639 | + var apps = ["unity8-dash", "dialer-app", "camera-app"]; |
640 | + apps.forEach(startApplication); |
641 | + verify(ApplicationManager.count == 3); |
642 | + var appName = "dialer-app"; |
643 | + var appDelegate = findChild(desktopStage, "appDelegate_" + appName); |
644 | + verify(appDelegate); |
645 | + ApplicationManager.focusApplication(appName); |
646 | + keyClick(Qt.Key_F4, Qt.AltModifier); // Alt+F4 shortcut to close |
647 | + verify(ApplicationManager.count == 2); // verify the app is gone |
648 | + verify(ApplicationManager.findApplication(appName) === null); // and it's not in running apps |
649 | + } |
650 | + |
651 | + function test_smashCursorKeys() { |
652 | + var apps = ["unity8-dash", "dialer-app", "camera-app"]; |
653 | + apps.forEach(startApplication); |
654 | + verify(ApplicationManager.count == 3); |
655 | + keyClick(Qt.Key_D, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+D shortcut to minimize all |
656 | + tryCompare(ApplicationManager, "focusedApplicationId", ""); // verify no app is focused |
657 | + |
658 | + // now try pressing all 4 arrow keys + ctrl + meta |
659 | + keyClick(Qt.Key_Up | Qt.Key_Down | Qt.Key_Left | Qt.Key_Right, Qt.MetaModifier|Qt.ControlModifier); // smash it!!! |
660 | + tryCompare(ApplicationManager, "focusedApplicationId", ""); // verify still no app is focused |
661 | + } |
662 | + |
663 | function test_minimizeApplicationHidesSurface() { |
664 | var dashApp = startApplication("unity8-dash"); |
665 | |
666 | - var dashDelegate = findChild(desktopStage, "stageDelegate_unity8-dash"); |
667 | + var dashDelegate = findChild(desktopStage, "appDelegate_unity8-dash"); |
668 | verify(dashDelegate); |
669 | |
670 | findChild(dashDelegate, "decoratedWindow").minimize(); |
671 | @@ -234,11 +341,11 @@ |
672 | var dialerApp = startApplication("dialer-app"); |
673 | var cameraApp = startApplication("camera-app"); |
674 | |
675 | - var dashDelegate = findChild(desktopStage, "stageDelegate_unity8-dash"); |
676 | + var dashDelegate = findChild(desktopStage, "appDelegate_unity8-dash"); |
677 | verify(dashDelegate); |
678 | - var dialerDelegate = findChild(desktopStage, "stageDelegate_dialer-app"); |
679 | + var dialerDelegate = findChild(desktopStage, "appDelegate_dialer-app"); |
680 | verify(dialerDelegate); |
681 | - var cameraDelegate = findChild(desktopStage, "stageDelegate_camera-app"); |
682 | + var cameraDelegate = findChild(desktopStage, "appDelegate_camera-app"); |
683 | verify(cameraDelegate); |
684 | |
685 | // maximize |
686 | @@ -256,20 +363,20 @@ |
687 | |
688 | function test_applicationsBecomeVisibleWhenOccludingAppRemoved() { |
689 | var dashApp = startApplication("unity8-dash"); |
690 | - var dashDelegate = findChild(desktopStage, "stageDelegate_unity8-dash"); |
691 | + var dashDelegate = findChild(desktopStage, "appDelegate_unity8-dash"); |
692 | verify(dashDelegate); |
693 | |
694 | var dialerApp = startApplication("dialer-app"); |
695 | - var dialerDelegate = findChild(desktopStage, "stageDelegate_dialer-app"); |
696 | + var dialerDelegate = findChild(desktopStage, "appDelegate_dialer-app"); |
697 | verify(dialerDelegate); |
698 | |
699 | var cameraApp = startApplication("camera-app"); |
700 | - var cameraDelegate = findChild(desktopStage, "stageDelegate_camera-app"); |
701 | + var cameraDelegate = findChild(desktopStage, "appDelegate_camera-app"); |
702 | verify(cameraDelegate); |
703 | findChild(dialerDelegate, "decoratedWindow").maximize(); |
704 | |
705 | var galleryApp = startApplication("gallery-app"); |
706 | - var galleryDelegate = findChild(desktopStage, "stageDelegate_gallery-app"); |
707 | + var galleryDelegate = findChild(desktopStage, "appDelegate_gallery-app"); |
708 | verify(galleryDelegate); |
709 | findChild(galleryDelegate, "decoratedWindow").maximize(); |
710 |
Please follow the commit message format as explained here: https:/ /wiki.ubuntu. com/Process/ Merges/ Checklists/ Unity8