Merge lp:~lukas-kde/unity8/activateWindows into lp:unity8

Proposed by Lukáš Tinkl
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
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://code.launchpad.net/~mzanetti/unity8/panel-button-fixes/+merge/273838 as a prereq

* 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

To post a comment you must log in.
Revision history for this message
Daniel d'Andrada (dandrader) wrote : Posted in a previous version of this proposal

Please follow the commit message format as explained here: https://wiki.ubuntu.com/Process/Merges/Checklists/Unity8

Revision history for this message
Lukáš Tinkl (lukas-kde) wrote : Posted in a previous version of this proposal

> Please follow the commit message format as explained here:
> https://wiki.ubuntu.com/Process/Merges/Checklists/Unity8

Should be fine now

Revision history for this message
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).

review: Needs Fixing
Revision history for this message
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.

Revision history for this message
Daniel d'Andrada (dandrader) wrote : Posted in a previous version of this proposal

> > Please follow the commit message format as explained here:
> > https://wiki.ubuntu.com/Process/Merges/Checklists/Unity8
>
> Should be fine now

Yes, thanks!

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:2005
http://jenkins.qa.ubuntu.com/job/unity8-ci/6488/
Executed test runs:
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/4701
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-wily-touch/870
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1200
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-wily/516
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1095
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1096
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-wily-amd64-ci/727
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-wily-i386-ci/728
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-mako/3794
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/4698
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/4698/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/24339
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-wily-mako/514
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-wily-armhf/870
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-wily-armhf/870/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/24336

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/6488/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Michael Zanetti (mzanetti) : Posted in a previous version of this proposal
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Albert Astals Cid (aacid) wrote :

are the qml failing tests a regression of this?

Revision history for this message
Lukáš Tinkl (lukas-kde) wrote :

> are the qml failing tests a regression of this?

Ah yes, most likely; gonna look into them.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Michael Zanetti (mzanetti) wrote :

file:///home/micha/Develop/reviews/activateWindows/qml/Stages/DecoratedWindow.qml:71:16: Unable to assign [undefined] to QString
file:///home/micha/Develop/reviews/activateWindows/qml/Stages/DesktopStage.qml:218: TypeError: Cannot read property 'title' of null

Getting this warning frequently in the log. Please silence it.

review: Needs Fixing
Revision history for this message
Lukáš Tinkl (lukas-kde) wrote :

> file:///home/micha/Develop/reviews/activateWindows/qml/Stages/DecoratedWindow.
> qml:71:16: Unable to assign [undefined] to QString
> file:///home/micha/Develop/reviews/activateWindows/qml/Stages/DesktopStage.qml
> :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

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:2026
http://jenkins.qa.ubuntu.com/job/unity8-ci/6590/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/4913
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/5/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1302
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/5
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1197
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1198
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/4
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/4
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-mako/3954
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/4910
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/4910/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/24705
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-mako/4/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/5
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/5/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/24704

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/6590/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
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

review: Needs Fixing
Revision history for this message
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

review: Needs Fixing
Revision history for this message
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

review: Needs Fixing
Revision history for this message
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.

review: Needs Fixing
Revision history for this message
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 :)

Revision history for this message
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?

- ApplicationManager.requestFocusApplication(appId)
+ ApplicationManager.focusApplication(appId);

careful with that... can you explain the reason for this? The difference is that with "requestFocusApplication()" the shell can still execute logic like focus stealing revention (if we had that) or playing some focusing animations. If you change it to focusApplication() ApplicationManager will immediately move the item to index 0 and set it as focusedAppication. Not saying this is necessarily wrong, but just making sure you had a reason to change it.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:2027
http://jenkins.qa.ubuntu.com/job/unity8-ci/6610/
Executed test runs:
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/4950
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/25/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1322
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/25
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1217
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1218
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/24
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/24
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-mako/3974
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/4947
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/4947/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/24756
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-mako/14/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/25
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/25/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/24757

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/6610/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:2028
http://jenkins.qa.ubuntu.com/job/unity8-ci/6615/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/4959
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/30/console
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1327
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/30
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1222
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1223
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/29
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/29
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-mako/3982
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/4956
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/4956/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/24770
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-mako/18/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/30
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/30/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/24771

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/6615/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Lukáš Tinkl (lukas-kde) wrote :

All issues fixed, wasn't able to reproduce the Alt+F4 problem, neither the ctrl+meta+arrows one.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:2029
http://jenkins.qa.ubuntu.com/job/unity8-ci/6617/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/4963
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/32/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1329
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/32
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1224
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1225
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/31
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/31
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-mako/3986
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/4960
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/4960/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/24778
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-mako/20/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/32
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/32/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/24777

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/6617/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
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.

review: Needs Fixing
Revision history for this message
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.

review: Needs Information
Revision history for this message
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

Revision history for this message
Lukáš Tinkl (lukas-kde) wrote :

For reference, the Alt+F4 bug seems to be caused by:
https://bugs.launchpad.net/bugs/1512311

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:2030
http://jenkins.qa.ubuntu.com/job/unity8-ci/6627/
Executed test runs:
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/4973/console
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/42/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1339
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/42
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1234
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1235
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/41
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/41
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-mako/3993/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/4970
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/4970/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/24810
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-mako/28/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/42
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/42/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/24809

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/6627/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
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

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:2031
http://jenkins.qa.ubuntu.com/job/unity8-ci/6632/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/4985
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/47/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1344
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/47
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1239
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1240
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/46
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/46
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-mako/4004
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/4982
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/4982/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/24838
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-mako/32/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/47
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/47/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/24841

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/6632/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Albert Astals Cid (aacid) wrote :

Note: was already top approved

Text conflict in qml/Panel/Panel.qml
Text conflict in qml/Stages/DesktopStage.qml
Text conflict in tests/qmltests/Stages/tst_DesktopStage.qml
3 conflicts encountered.

review: Needs Fixing
lp:~lukas-kde/unity8/activateWindows updated
2033. By Lukáš Tinkl

merge trunk

2034. By Lukáš Tinkl

cleanup

2035. By Lukáš Tinkl

cleanup

Revision history for this message
Lukáš Tinkl (lukas-kde) wrote :

Conflicts resolved

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:2035
http://jenkins.qa.ubuntu.com/job/unity8-ci/6671/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-vivid-touch/5068
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-xenial-touch/86/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-vivid/1383
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-qmluitest-xenial-amd64/86
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-amd64-ci/1278
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-vivid-i386-ci/1279
    FAILURE: http://jenkins.qa.ubuntu.com/job/unity8-xenial-amd64-ci/85/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-xenial-i386-ci/85
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-vivid-mako/4061
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/5073
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-vivid-armhf/5073/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/24990
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-xenial-mako/46/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/86
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-xenial-armhf/86/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/24991

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/6671/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Albert Astals Cid (aacid) wrote :

Top approving again now that merge has made CI happy.

review: Abstain

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
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

Subscribers

People subscribed via source and target branches