Mir

Merge lp:~brandontschaefer/mir/client-api-apply-remove-display-config into lp:mir

Proposed by Brandon Schaefer
Status: Merged
Approved by: Brandon Schaefer
Approved revision: no longer in the source branch.
Merged at revision: 3900
Proposed branch: lp:~brandontschaefer/mir/client-api-apply-remove-display-config
Merge into: lp:mir
Diff against target: 1018 lines (+556/-25)
29 files modified
include/client/mir_toolkit/mir_connection.h (+24/-0)
include/server/mir/graphics/display_configuration_observer.h (+19/-0)
include/test/mir/test/display_config_matchers.h (+5/-0)
include/test/mir/test/signal.h (+7/-0)
src/client/mir_connection.cpp (+45/-22)
src/client/mir_connection.h (+3/-0)
src/client/mir_connection_api.cpp (+19/-0)
src/client/rpc/mir_display_server.cpp (+7/-0)
src/client/rpc/mir_display_server.h (+4/-0)
src/client/symbols.map (+2/-0)
src/include/common/mir/protobuf/display_server.h (+4/-0)
src/include/server/mir/frontend/display_changer.h (+1/-0)
src/server/frontend/authorizing_display_changer.cpp (+9/-0)
src/server/frontend/authorizing_display_changer.h (+2/-0)
src/server/frontend/protobuf_message_processor.cpp (+4/-0)
src/server/frontend/session_mediator.cpp (+16/-1)
src/server/frontend/session_mediator.h (+4/-0)
src/server/graphics/display_configuration_observer_multiplexer.cpp (+13/-0)
src/server/graphics/display_configuration_observer_multiplexer.h (+9/-0)
src/server/report/logging/display_configuration_report.cpp (+15/-1)
src/server/report/logging/display_configuration_report.h (+9/-0)
src/server/scene/mediating_display_changer.cpp (+39/-1)
src/server/scene/mediating_display_changer.h (+1/-0)
tests/acceptance-tests/test_nested_mir.cpp (+2/-0)
tests/acceptance-tests/test_new_display_configuration.cpp (+273/-0)
tests/include/mir/test/doubles/null_display_changer.h (+3/-0)
tests/include/mir/test/doubles/stub_display_server.h (+4/-0)
tests/mir_test/display_config_matchers.cpp (+9/-0)
tests/unit-tests/scene/test_mediating_display_changer.cpp (+4/-0)
To merge this branch: bzr merge lp:~brandontschaefer/mir/client-api-apply-remove-display-config
Reviewer Review Type Date Requested Status
Mir CI Bot continuous-integration Approve
Chris Halse Rogers Approve
Alan Griffiths Approve
Daniel van Vugt Abstain
Review via email: mp+312951@code.launchpad.net

Commit message

Add the two of the missing functions needed to remove the old display configuration API.

Description of the change

https://trello.com/c/L9LyQ6n6/461-add-client-api-for-mir-connection-apply-display-configuration

Add the two missing functions needed to remove the old display configuration API.

void mir_connection_apply_session_display_config(...)
void mir_connection_remove_session_display_config(...)

To post a comment you must log in.
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Continuous integration, rev:3872
https://mir-jenkins.ubuntu.com/job/mir-ci/2362/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/3077/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/3144
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/3136
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/3136
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/3136
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3106/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3106/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3106/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3106
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3106/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3106
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3106/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3106/console

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2362/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Continuous integration, rev:3873
https://mir-jenkins.ubuntu.com/job/mir-ci/2363/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/3078/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/3145
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/3137
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/3137
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/3137
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3107
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3107/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3107
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3107/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3107
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3107/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3107/console
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3107/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3107
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3107/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3107
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3107/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2363/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:3873
https://mir-jenkins.ubuntu.com/job/mir-ci/2364/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/3079
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/3146
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/3138
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/3138
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/3138
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3108
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3108/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3108
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3108/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3108
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3108/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3108
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3108/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3108
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3108/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3108
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3108/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2364/rebuild

review: Approve (continuous-integration)
Revision history for this message
Chris Halse Rogers (raof) wrote :

13 + * to get notified about hardware changes, so that the can apply a new config.
Typo, the→they

15 + * \warning This request may be denied. Check that the request succeeded with mir_connection_get_error_message.
You've copy-pasted these warnings. They don't apply; clients get notified via their registered error handler.

252 + mir::protobuf::Void * response,
Nit: Coding style

291 + virtual void remove(std::shared_ptr<Session> const&) = 0;
Not wild on the naming - could this be remove_session_configuration?

336 + else if ("remove_display" == invocation.method_name())
And likewise, "remove_display_configuration" (or some equivalent)?

532 +void ms::MediatingDisplayChanger::remove(
533 + std::shared_ptr<mf::Session> const& session)
534 +{
535 + std::lock_guard<std::mutex> lg{configuration_mutex};
536 + config_map.erase(session);
537 + observer->session_configuration_removed(session);
538 +}
Shouldn't this result in a hardware configuration change if (and only if) the session is currently focused? This will result in the configuration being set to the base config the *next* time the session is focused.

Which leads me into: please add some acceptance tests testing the expected behaviour. Particularly:
1) That calling remove_session_display_config from a client that hasn't set a session configuration is a no-op
2) That calling remove_session_display_config from a *focused* client that *has* set a session configuration results in a hardware configuration change
3) That calling remove_session_display_config from an *unfocused* client that *has* set a session configuration results in *no* hardware configuration change
4) That calling remove_session_display_config from an *unfocused* client that *has* set a session configuration results in the base configuration getting applied when the client becomes focused.

review: Needs Fixing
Revision history for this message
Chris Halse Rogers (raof) wrote :

(There are more acceptance tests you could sensibly add, but those are the 4 big ones)

Revision history for this message
Daniel van Vugt (vanvugt) wrote :

You have just rejected my branch based on the assertion that "_config" should be renamed to "_configuration". So you should probably follow your own advice...

review: Needs Fixing
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Although I still prefer "config" over "configuration", it should be said.

Regardless, the type name and the function names should match up. Either:
   MirDisplayConfig
   mir..._display_config_...()
or
   MirDisplayConfiguration
   mir..._display_configuration_...()

For a more clear way forward that gets us closer to this ideal, I have already proposed:
   https://code.launchpad.net/~vanvugt/mir/mir-display-config-header/+merge/311246
which you should probably revisit. Either fix this branch or retract your review of my branch.

review: Needs Fixing
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Specifically, according to your own comments we need to rename display_config_ to display_configuration, and here you are proposing the opposite of that, actually making the problem worse.

If you believe that MirDisplayConfig and _display_config is the way forward then you should retract your review of:
    https://code.launchpad.net/~vanvugt/mir/mir-display-config-header/+merge/311246

If not then you should change "config" to "configuration" here. I know we're in limbo right now with the old API hanging around, but we should reject changes like this that make the problem worse, if indeed the team believes that the word "config" is the problem.

Brandon Schaefer (brandontschaefer) wrote on 2016-12-10:
I would like to think we were all doing our jobs. Im still in favour of MirDisplayConfiguration. 6 characters isnt *to* many extra characters to type. Yes it break ABI, yes it'll be a bit more work. We are already planning on breaking the ABI. I dont see a reason we should avoid this when a majority of us agreed on a name already.

review: Needs Fixing
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

On second thoughts, since this is actually the style I want, I shouldn't block it.

However if this lands then it conflicts with the justification for rejecting:
  https://code.launchpad.net/~vanvugt/mir/mir-display-config-header/+merge/311246
So that should be revisited.

review: Abstain
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

*Needs Information*

I'm not entirely sure about the direction here. Surely the "old configuration API" is the set of functions using MirDisplayConfiguration*?

In which case, you've missed:

MirBlob* mir_blob_from_display_configuration(MirDisplayConfiguration* configuration);

and

MirDisplayConfiguration* mir_blob_to_display_configuration(MirBlob* blob);

(Yes, I know these have the intended form of the "future" API, but AIUI they have to go before we can eliminate MirDisplayConfiguration* and rename MirDisplayConfig* as planned or confusion will ensue.)

Can you (or other reviewers) clarify?

review: Needs Information
Revision history for this message
Brandon Schaefer (brandontschaefer) wrote :

> 13 + * to get notified about hardware changes, so that the can apply a
> new config.
> Typo, the→they
>
> 15 + * \warning This request may be denied. Check that the request
> succeeded with mir_connection_get_error_message.
> You've copy-pasted these warnings. They don't apply; clients get notified via
> their registered error handler.
>
> 252 + mir::protobuf::Void * response,
> Nit: Coding style
>
> 291 + virtual void remove(std::shared_ptr<Session> const&) = 0;
> Not wild on the naming - could this be remove_session_configuration?
>
> 336 + else if ("remove_display" == invocation.method_name())
> And likewise, "remove_display_configuration" (or some equivalent)?

All good suggestions.

>
> 532 +void ms::MediatingDisplayChanger::remove(
> 533 + std::shared_ptr<mf::Session> const& session)
> 534 +{
> 535 + std::lock_guard<std::mutex> lg{configuration_mutex};
> 536 + config_map.erase(session);
> 537 + observer->session_configuration_removed(session);
> 538 +}
> Shouldn't this result in a hardware configuration change if (and only if) the
> session is currently focused? This will result in the configuration being set
> to the base config the *next* time the session is focused.

Hmm yes, i would think that sounds like a better behaviour.

>
> Which leads me into: please add some acceptance tests testing the expected
> behaviour. Particularly:
> 1) That calling remove_session_display_config from a client that hasn't set a
> session configuration is a no-op
> 2) That calling remove_session_display_config from a *focused* client that
> *has* set a session configuration results in a hardware configuration change
> 3) That calling remove_session_display_config from an *unfocused* client that
> *has* set a session configuration results in *no* hardware configuration
> change
> 4) That calling remove_session_display_config from an *unfocused* client that
> *has* set a session configuration results in the base configuration getting
> applied when the client becomes focused.

Good idea, I was thinking about doing some of these tests but ... wasnt sure.

I also wanted to write some unit test which matched the set session config but theres no accessing point to the config_map[]. Soo I think EXEPCT_CALLS(_) are still fine. Plus these other tests.

Revision history for this message
Brandon Schaefer (brandontschaefer) wrote :

> Specifically, according to your own comments we need to rename display_config_
> to display_configuration, and here you are proposing the opposite of that,
> actually making the problem worse.
>
> If you believe that MirDisplayConfig and _display_config is the way forward
> then you should retract your review of:
> https://code.launchpad.net/~vanvugt/mir/mir-display-config-
> header/+merge/311246
>
> If not then you should change "config" to "configuration" here. I know we're
> in limbo right now with the old API hanging around, but we should reject
> changes like this that make the problem worse, if indeed the team believes
> that the word "config" is the problem.
>
> Brandon Schaefer (brandontschaefer) wrote on 2016-12-10:
> I would like to think we were all doing our jobs. Im still in favour of
> MirDisplayConfiguration. 6 characters isnt *to* many extra characters to type.
> Yes it break ABI, yes it'll be a bit more work. We are already planning on
> breaking the ABI. I dont see a reason we should avoid this when a majority of
> us agreed on a name already.

Yes and I still agree with it. I was leaving it how it currently is, *_display_config == new API and
*_display_configuration == old API. With the idea that once we get these functions in we then can deprecate the old set of functions then get a branch to rename them all to *_display_configuration.

Though I could still just move to display_configuration vs waiting, figured it would be more uniformed to have a branch that renames everything.

Revision history for this message
Brandon Schaefer (brandontschaefer) wrote :

> *Needs Information*
>
> I'm not entirely sure about the direction here. Surely the "old configuration
> API" is the set of functions using MirDisplayConfiguration*?

Yes

>
> In which case, you've missed:
>
> MirBlob* mir_blob_from_display_configuration(MirDisplayConfiguration*
> configuration);
>
> and
>
> MirDisplayConfiguration* mir_blob_to_display_configuration(MirBlob* blob);
>

Hmm yes, there is no blob for MirDisplayConfig

> (Yes, I know these have the intended form of the "future" API, but AIUI they
> have to go before we can eliminate MirDisplayConfiguration* and rename
> MirDisplayConfig* as planned or confusion will ensue.)
>
> Can you (or other reviewers) clarify?

Ill get this doubled checked as this is the main goal of this branch to be able to deprecate the old display config way!

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

> > *Needs Information*
> >
> > I'm not entirely sure about the direction here. Surely the "old
> configuration
> > API" is the set of functions using MirDisplayConfiguration*?
>
> Yes
>
> >
> > In which case, you've missed:
> >
> > MirBlob* mir_blob_from_display_configuration(MirDisplayConfiguration*
> > configuration);
> >
> > and
> >
> > MirDisplayConfiguration* mir_blob_to_display_configuration(MirBlob* blob);
> >
>
> Hmm yes, there is no blob for MirDisplayConfig

AFAICS the MP is OK except the commit message needs to say "Add two of the missing functions needed to remove the old display configuration API."

Regarding the blobs: don't forget that blobs may have been created by the legacy API - we may need to support loading both versions (if they differ).

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

> AFAICS the MP is OK except the commit message needs to say "Add two of the
> missing functions needed to remove the old display configuration API."

Fixed

review: Approve
Revision history for this message
Brandon Schaefer (brandontschaefer) wrote :

Yup Ill be doing the blob after this branch.

@duflu

I agree, I should just change the name now, theres no point in making any more annoying since they already have a unique name. Thanks!

Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Continuous integration, rev:3875
https://mir-jenkins.ubuntu.com/job/mir-ci/2408/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/3136/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-0-fetch/3203/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/3195/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/3195/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/3195/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3165/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3165/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3165/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3165/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3165/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3165/console

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2408/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Continuous integration, rev:3876
https://mir-jenkins.ubuntu.com/job/mir-ci/2409/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/3137/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/3204
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/3196
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/3196
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/3196
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3166/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3166/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3166/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3166
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3166/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3166
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3166/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3166/console

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2409/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Continuous integration, rev:3877
https://mir-jenkins.ubuntu.com/job/mir-ci/2410/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/3138/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/3205
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/3197
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/3197
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/3197
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3167/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3167/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3167/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3167
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3167/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3167
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3167/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3167/console

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2410/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Continuous integration, rev:3878
https://mir-jenkins.ubuntu.com/job/mir-ci/2414/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/3145/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/3212
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/3204
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/3204
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/3204
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3174
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3174/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3174
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3174/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3174/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3174
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3174/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3174
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3174/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3174
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3174/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2414/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Brandon Schaefer (brandontschaefer) wrote :
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Continuous integration, rev:3878
https://mir-jenkins.ubuntu.com/job/mir-ci/2419/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/3150/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/3217
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/3209
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/3209
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/3209
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3179/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3179
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3179/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3179
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3179/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3179/console
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3179/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3179
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3179/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3179
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3179/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2419/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Continuous integration, rev:3878
https://mir-jenkins.ubuntu.com/job/mir-ci/2444/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/3187/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/3254
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/3246
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/3246
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/3246
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3216/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3216
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3216/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3216
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3216/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3216
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3216/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3216
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3216/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3216
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3216/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2444/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Chris Halse Rogers (raof) wrote :

LGTM.

Failure is bug# 1649758.

review: Approve
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Autolanding.
More details in the following jenkins job:
https://mir-jenkins.ubuntu.com/job/mir-autolanding/893/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/3232/console
    None: https://mir-jenkins.ubuntu.com/job/generic-land-mp/941/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-0-fetch/3299/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/3291/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/3291/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/3291/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3261/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3261/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3261/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3261/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3261/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3261/console

review: Needs Fixing (continuous-integration)
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

04:21:54 Text conflict in src/client/symbols.map
04:21:54 1 conflicts encountered.

Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:3879
https://mir-jenkins.ubuntu.com/job/mir-ci/2501/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/3259
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/3326
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/3318
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/3318
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/3318
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3288
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3288/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3288
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3288/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3288
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3288/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3288
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3288/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3288
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3288/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3288
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3288/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2501/rebuild

review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'include/client/mir_toolkit/mir_connection.h'
--- include/client/mir_toolkit/mir_connection.h 2016-10-12 06:03:15 +0000
+++ include/client/mir_toolkit/mir_connection.h 2016-12-23 15:34:22 +0000
@@ -202,6 +202,30 @@
202MirWaitHandle* mir_connection_apply_display_config(MirConnection *connection, MirDisplayConfiguration* display_configuration);202MirWaitHandle* mir_connection_apply_display_config(MirConnection *connection, MirDisplayConfiguration* display_configuration);
203203
204/**204/**
205 * Apply the display configuration for the connection
206 *
207 * The display configuration is applied to this connection only (per-connection
208 * configuration) and is invalidated when a hardware change occurs. Clients should
209 * register a callback with mir_connection_set_display_config_change_callback()
210 * to get notified about hardware changes, so that they can apply a new configuration.
211 *
212 * \param [in] connection The connection
213 * \param [in] display_config The display_config to apply
214 */
215void mir_connection_apply_session_display_configuration(MirConnection* connection, MirDisplayConfig const* display_config);
216
217/**
218 * Remove the display configuration for the connection
219 *
220 * If a session display configuration is applied to the connection it is removed, and
221 * the base display configuration is used. If there was no previous call to
222 * mir_connection_apply_session_display_config this will do nothing.
223 *
224 * \param [in] connection The connection
225 */
226void mir_connection_remove_session_display_configuration(MirConnection* connection);
227
228/**
205 * Set the base display configuration229 * Set the base display configuration
206 *230 *
207 * The base display configuration is the configuration the server applies when231 * The base display configuration is the configuration the server applies when
208232
=== modified file 'include/server/mir/graphics/display_configuration_observer.h'
--- include/server/mir/graphics/display_configuration_observer.h 2016-12-09 02:54:31 +0000
+++ include/server/mir/graphics/display_configuration_observer.h 2016-12-23 15:34:22 +0000
@@ -24,6 +24,10 @@
2424
25namespace mir25namespace mir
26{26{
27namespace frontend
28{
29class Session;
30}
27namespace graphics31namespace graphics
28{32{
29class DisplayConfiguration;33class DisplayConfiguration;
@@ -58,6 +62,21 @@
58 virtual void base_configuration_updated(std::shared_ptr<DisplayConfiguration const> const& base_config) = 0;62 virtual void base_configuration_updated(std::shared_ptr<DisplayConfiguration const> const& base_config) = 0;
5963
60 /**64 /**
65 * Notification after updating the session display configuration.
66 *
67 * \param [in] session The session that is updating its display configuration.
68 * \param [in] config The configuration that is being applied to the session.
69 */
70 virtual void session_configuration_applied(std::shared_ptr<frontend::Session> const& session,
71 std::shared_ptr<DisplayConfiguration> const& config) = 0;
72 /**
73 * Notification after removing the session display configuration.
74 *
75 * \param [in] session The session that is removing its display configuration.
76 */
77 virtual void session_configuration_removed(std::shared_ptr<frontend::Session> const& session) = 0;
78
79 /**
61 * Notification after every failed display configuration attempt.80 * Notification after every failed display configuration attempt.
62 *81 *
63 * This is called if the graphics platform throws an exception when trying82 * This is called if the graphics platform throws an exception when trying
6483
=== modified file 'include/test/mir/test/display_config_matchers.h'
--- include/test/mir/test/display_config_matchers.h 2016-11-02 05:07:18 +0000
+++ include/test/mir/test/display_config_matchers.h 2016-12-23 15:34:22 +0000
@@ -111,6 +111,11 @@
111 MirDisplayConfig const* config1,111 MirDisplayConfig const* config1,
112 MirDisplayConfig const* config2);112 MirDisplayConfig const* config2);
113113
114bool compare_display_configurations(
115 testing::MatchResultListener* listener,
116 std::shared_ptr<graphics::DisplayConfiguration> const& config1,
117 MirDisplayConfig const* config2);
118
114MATCHER_P(DisplayConfigMatches, config, "")119MATCHER_P(DisplayConfigMatches, config, "")
115{120{
116 return compare_display_configurations(result_listener, arg, config);121 return compare_display_configurations(result_listener, arg, config);
117122
=== modified file 'include/test/mir/test/signal.h'
--- include/test/mir/test/signal.h 2016-07-18 07:38:38 +0000
+++ include/test/mir/test/signal.h 2016-12-23 15:34:22 +0000
@@ -69,6 +69,13 @@
69{69{
70 signal->raise();70 signal->raise();
71}71}
72ACTION_P2(WakeUpWhenZero, signal, atomic_int)
73{
74 if (atomic_int->fetch_sub(1) == 1)
75 {
76 signal->raise();
77 }
78}
7279
73}80}
74}81}
7582
=== modified file 'src/client/mir_connection.cpp'
--- src/client/mir_connection.cpp 2016-12-14 19:53:10 +0000
+++ src/client/mir_connection.cpp 2016-12-23 15:34:22 +0000
@@ -1054,13 +1054,15 @@
10541054
1055namespace1055namespace
1056{1056{
1057struct HandleErrorVoid1057template <class T>
1058struct HandleError
1058{1059{
1059 std::unique_ptr<mp::Void> result;1060 std::unique_ptr<T> result;
1060 std::function<void(mp::Void const&)> on_error;1061 std::function<void(T const&)> on_error;
1061};1062};
10621063
1063void handle_structured_error(HandleErrorVoid* handler)1064template <class T>
1065void handle_structured_error(HandleError<T>* handler)
1064{1066{
1065 if (handler->result->has_structured_error())1067 if (handler->result->has_structured_error())
1066 {1068 {
@@ -1068,6 +1070,22 @@
1068 }1070 }
1069 delete handler;1071 delete handler;
1070}1072}
1073
1074template <class T>
1075HandleError<T>* create_stored_error_result(std::shared_ptr<mcl::ErrorHandler> const& error_handler)
1076{
1077 auto store_error_result = new HandleError<T>;
1078 store_error_result->result = std::make_unique<T>();
1079 store_error_result->on_error = [error_handler](T const& message)
1080 {
1081 MirError const error{
1082 static_cast<MirErrorDomain>(message.structured_error().domain()),
1083 message.structured_error().code()};
1084 (*error_handler)(&error);
1085 };
1086
1087 return store_error_result;
1088}
1071}1089}
10721090
1073void MirConnection::preview_base_display_configuration(1091void MirConnection::preview_base_display_configuration(
@@ -1079,15 +1097,7 @@
1079 request.mutable_configuration()->CopyFrom(configuration);1097 request.mutable_configuration()->CopyFrom(configuration);
1080 request.set_timeout(timeout.count());1098 request.set_timeout(timeout.count());
10811099
1082 auto store_error_result = new HandleErrorVoid;1100 auto store_error_result = create_stored_error_result<mp::Void>(error_handler);
1083 store_error_result->result = std::make_unique<mp::Void>();
1084 store_error_result->on_error = [this](mp::Void const& message)
1085 {
1086 MirError const error{
1087 static_cast<MirErrorDomain>(message.structured_error().domain()),
1088 message.structured_error().code()};
1089 (*error_handler)(&error);
1090 };
10911101
1092 server.preview_base_display_configuration(1102 server.preview_base_display_configuration(
1093 &request,1103 &request,
@@ -1099,15 +1109,7 @@
1099{1109{
1100 mp::Void request;1110 mp::Void request;
11011111
1102 auto store_error_result = new HandleErrorVoid;1112 auto store_error_result = create_stored_error_result<mp::Void>(error_handler);
1103 store_error_result->result = std::make_unique<mp::Void>();
1104 store_error_result->on_error = [this](mp::Void const& message)
1105 {
1106 MirError const error{
1107 static_cast<MirErrorDomain>(message.structured_error().domain()),
1108 message.structured_error().code()};
1109 (*error_handler)(&error);
1110 };
11111113
1112 server.cancel_base_display_configuration_preview(1114 server.cancel_base_display_configuration_preview(
1113 &request,1115 &request,
@@ -1115,6 +1117,27 @@
1115 google::protobuf::NewCallback(&handle_structured_error, store_error_result));1117 google::protobuf::NewCallback(&handle_structured_error, store_error_result));
1116}1118}
11171119
1120void MirConnection::configure_session_display(mp::DisplayConfiguration const& configuration)
1121{
1122 auto store_error_result = create_stored_error_result<mp::DisplayConfiguration>(error_handler);
1123
1124 server.configure_display(
1125 &configuration,
1126 store_error_result->result.get(),
1127 google::protobuf::NewCallback(&handle_structured_error, store_error_result));
1128}
1129
1130void MirConnection::remove_session_display()
1131{
1132 mp::Void request;
1133 auto store_error_result = create_stored_error_result<mp::Void>(error_handler);
1134
1135 server.remove_session_configuration(
1136 &request,
1137 store_error_result->result.get(),
1138 google::protobuf::NewCallback(&handle_structured_error, store_error_result));
1139}
1140
1118void MirConnection::confirm_base_display_configuration(1141void MirConnection::confirm_base_display_configuration(
1119 mp::DisplayConfiguration const& configuration)1142 mp::DisplayConfiguration const& configuration)
1120{1143{
11211144
=== modified file 'src/client/mir_connection.h'
--- src/client/mir_connection.h 2016-12-14 19:53:10 +0000
+++ src/client/mir_connection.h 2016-12-23 15:34:22 +0000
@@ -187,6 +187,9 @@
187 MirWaitHandle* configure_display(MirDisplayConfiguration* configuration);187 MirWaitHandle* configure_display(MirDisplayConfiguration* configuration);
188 void done_display_configure();188 void done_display_configure();
189189
190 void configure_session_display(mir::protobuf::DisplayConfiguration const& configuration);
191 void remove_session_display();
192
190 MirWaitHandle* set_base_display_configuration(MirDisplayConfiguration const* configuration);193 MirWaitHandle* set_base_display_configuration(MirDisplayConfiguration const* configuration);
191 void preview_base_display_configuration(194 void preview_base_display_configuration(
192 mir::protobuf::DisplayConfiguration const& configuration,195 mir::protobuf::DisplayConfiguration const& configuration,
193196
=== modified file 'src/client/mir_connection_api.cpp'
--- src/client/mir_connection_api.cpp 2016-12-13 06:00:32 +0000
+++ src/client/mir_connection_api.cpp 2016-12-23 15:34:22 +0000
@@ -427,3 +427,22 @@
427 }427 }
428}428}
429429
430void mir_connection_apply_session_display_configuration(MirConnection* connection, MirDisplayConfig const* display_config)
431try
432{
433 connection->configure_session_display(*display_config);
434}
435catch (std::exception const& ex)
436{
437 MIR_LOG_UNCAUGHT_EXCEPTION(ex);
438}
439
440void mir_connection_remove_session_display_configuration(MirConnection* connection)
441try
442{
443 connection->remove_session_display();
444}
445catch (std::exception const& ex)
446{
447 MIR_LOG_UNCAUGHT_EXCEPTION(ex);
448}
430449
=== modified file 'src/client/rpc/mir_display_server.cpp'
--- src/client/rpc/mir_display_server.cpp 2016-11-28 16:58:23 +0000
+++ src/client/rpc/mir_display_server.cpp 2016-12-23 15:34:22 +0000
@@ -84,6 +84,13 @@
84{84{
85 channel->call_method(std::string(__func__), request, response, done);85 channel->call_method(std::string(__func__), request, response, done);
86}86}
87void mclr::DisplayServer::remove_session_configuration(
88 mir::protobuf::Void const* request,
89 mir::protobuf::Void* response,
90 google::protobuf::Closure* done)
91{
92 channel->call_method(std::string(__func__), request, response, done);
93}
87void mclr::DisplayServer::set_base_display_configuration(94void mclr::DisplayServer::set_base_display_configuration(
88 mir::protobuf::DisplayConfiguration const* request,95 mir::protobuf::DisplayConfiguration const* request,
89 mir::protobuf::Void* response,96 mir::protobuf::Void* response,
9097
=== modified file 'src/client/rpc/mir_display_server.h'
--- src/client/rpc/mir_display_server.h 2016-11-28 16:58:23 +0000
+++ src/client/rpc/mir_display_server.h 2016-12-23 15:34:22 +0000
@@ -67,6 +67,10 @@
67 mir::protobuf::DisplayConfiguration const* request,67 mir::protobuf::DisplayConfiguration const* request,
68 mir::protobuf::DisplayConfiguration* response,68 mir::protobuf::DisplayConfiguration* response,
69 google::protobuf::Closure* done) override;69 google::protobuf::Closure* done) override;
70 void remove_session_configuration(
71 mir::protobuf::Void const* request,
72 mir::protobuf::Void* response,
73 google::protobuf::Closure* done) override;
70 void set_base_display_configuration(74 void set_base_display_configuration(
71 mir::protobuf::DisplayConfiguration const* request,75 mir::protobuf::DisplayConfiguration const* request,
72 mir::protobuf::Void* response,76 mir::protobuf::Void* response,
7377
=== modified file 'src/client/symbols.map'
--- src/client/symbols.map 2016-12-23 04:18:57 +0000
+++ src/client/symbols.map 2016-12-23 15:34:22 +0000
@@ -500,6 +500,8 @@
500 mir_touchpad_configuration_set_tap_to_click;500 mir_touchpad_configuration_set_tap_to_click;
501 mir_connection_request_extension;501 mir_connection_request_extension;
502 mir_output_get_model;502 mir_output_get_model;
503 mir_connection_apply_session_display_configuration;
504 mir_connection_remove_session_display_configuration;
503 mir_blob_from_display_config;505 mir_blob_from_display_config;
504 mir_blob_to_display_config;506 mir_blob_to_display_config;
505} MIR_CLIENT_0.25;507} MIR_CLIENT_0.25;
506508
=== modified file 'src/include/common/mir/protobuf/display_server.h'
--- src/include/common/mir/protobuf/display_server.h 2016-11-28 16:58:23 +0000
+++ src/include/common/mir/protobuf/display_server.h 2016-12-23 15:34:22 +0000
@@ -63,6 +63,10 @@
63 mir::protobuf::DisplayConfiguration const* request,63 mir::protobuf::DisplayConfiguration const* request,
64 mir::protobuf::DisplayConfiguration* response,64 mir::protobuf::DisplayConfiguration* response,
65 google::protobuf::Closure* done) = 0;65 google::protobuf::Closure* done) = 0;
66 virtual void remove_session_configuration(
67 mir::protobuf::Void const* request,
68 mir::protobuf::Void* response,
69 google::protobuf::Closure* done) = 0;
66 virtual void set_base_display_configuration(70 virtual void set_base_display_configuration(
67 mir::protobuf::DisplayConfiguration const* request,71 mir::protobuf::DisplayConfiguration const* request,
68 mir::protobuf::Void* response,72 mir::protobuf::Void* response,
6973
=== modified file 'src/include/server/mir/frontend/display_changer.h'
--- src/include/server/mir/frontend/display_changer.h 2016-10-12 06:03:15 +0000
+++ src/include/server/mir/frontend/display_changer.h 2016-12-23 15:34:22 +0000
@@ -39,6 +39,7 @@
3939
40 virtual std::shared_ptr<graphics::DisplayConfiguration> base_configuration() = 0;40 virtual std::shared_ptr<graphics::DisplayConfiguration> base_configuration() = 0;
41 virtual void configure(std::shared_ptr<Session> const&, std::shared_ptr<graphics::DisplayConfiguration> const&) = 0;41 virtual void configure(std::shared_ptr<Session> const&, std::shared_ptr<graphics::DisplayConfiguration> const&) = 0;
42 virtual void remove_session_configuration(std::shared_ptr<Session> const&) = 0;
42 virtual void set_base_configuration(std::shared_ptr<graphics::DisplayConfiguration> const&) = 0;43 virtual void set_base_configuration(std::shared_ptr<graphics::DisplayConfiguration> const&) = 0;
43 virtual void preview_base_configuration(44 virtual void preview_base_configuration(
44 std::weak_ptr<Session> const& session,45 std::weak_ptr<Session> const& session,
4546
=== modified file 'src/server/frontend/authorizing_display_changer.cpp'
--- src/server/frontend/authorizing_display_changer.cpp 2016-10-12 06:03:15 +0000
+++ src/server/frontend/authorizing_display_changer.cpp 2016-12-23 15:34:22 +0000
@@ -69,6 +69,15 @@
69 BOOST_THROW_EXCEPTION(std::runtime_error("not authorized to apply display configurations"));69 BOOST_THROW_EXCEPTION(std::runtime_error("not authorized to apply display configurations"));
70}70}
7171
72void mf::AuthorizingDisplayChanger::remove_session_configuration(
73 std::shared_ptr<mf::Session> const& session)
74{
75 if (configure_display_is_allowed)
76 changer->remove_session_configuration(session);
77 else
78 BOOST_THROW_EXCEPTION(std::runtime_error("not authorized to remove display configurations"));
79}
80
72void mf::AuthorizingDisplayChanger::set_base_configuration(81void mf::AuthorizingDisplayChanger::set_base_configuration(
73 std::shared_ptr<graphics::DisplayConfiguration> const& config)82 std::shared_ptr<graphics::DisplayConfiguration> const& config)
74{83{
7584
=== modified file 'src/server/frontend/authorizing_display_changer.h'
--- src/server/frontend/authorizing_display_changer.h 2016-10-12 06:03:15 +0000
+++ src/server/frontend/authorizing_display_changer.h 2016-12-23 15:34:22 +0000
@@ -49,6 +49,8 @@
49 void configure(49 void configure(
50 std::shared_ptr<frontend::Session> const&,50 std::shared_ptr<frontend::Session> const&,
51 std::shared_ptr<graphics::DisplayConfiguration> const&) override;51 std::shared_ptr<graphics::DisplayConfiguration> const&) override;
52 void remove_session_configuration(
53 std::shared_ptr<frontend::Session> const&) override;
52 void set_base_configuration(54 void set_base_configuration(
53 std::shared_ptr<graphics::DisplayConfiguration> const&) override;55 std::shared_ptr<graphics::DisplayConfiguration> const&) override;
54 void preview_base_configuration(56 void preview_base_configuration(
5557
=== modified file 'src/server/frontend/protobuf_message_processor.cpp'
--- src/server/frontend/protobuf_message_processor.cpp 2016-11-28 16:58:23 +0000
+++ src/server/frontend/protobuf_message_processor.cpp 2016-12-23 15:34:22 +0000
@@ -249,6 +249,10 @@
249 {249 {
250 invoke(this, display_server.get(), &DisplayServer::configure_display, invocation);250 invoke(this, display_server.get(), &DisplayServer::configure_display, invocation);
251 }251 }
252 else if ("remove_session_configuration" == invocation.method_name())
253 {
254 invoke(this, display_server.get(), &DisplayServer::remove_session_configuration, invocation);
255 }
252 else if ("set_base_display_configuration" == invocation.method_name())256 else if ("set_base_display_configuration" == invocation.method_name())
253 {257 {
254 invoke(this, display_server.get(), &DisplayServer::set_base_display_configuration, invocation);258 invoke(this, display_server.get(), &DisplayServer::set_base_display_configuration, invocation);
255259
=== modified file 'src/server/frontend/session_mediator.cpp'
--- src/server/frontend/session_mediator.cpp 2016-12-21 03:07:05 +0000
+++ src/server/frontend/session_mediator.cpp 2016-12-23 15:34:22 +0000
@@ -646,7 +646,7 @@
646}646}
647647
648void mf::SessionMediator::configure_display(648void mf::SessionMediator::configure_display(
649 const ::mir::protobuf::DisplayConfiguration* request,649 ::mir::protobuf::DisplayConfiguration const* request,
650 ::mir::protobuf::DisplayConfiguration* response,650 ::mir::protobuf::DisplayConfiguration* response,
651 ::google::protobuf::Closure* done)651 ::google::protobuf::Closure* done)
652{652{
@@ -666,6 +666,21 @@
666 done->Run();666 done->Run();
667}667}
668668
669void mf::SessionMediator::remove_session_configuration(
670 ::mir::protobuf::Void const* /*request*/,
671 ::mir::protobuf::Void* /*response*/,
672 ::google::protobuf::Closure* done)
673{
674 auto session = weak_session.lock();
675
676 if (session.get() == nullptr)
677 BOOST_THROW_EXCEPTION(std::logic_error("Invalid application session"));
678
679 display_changer->remove_session_configuration(session);
680
681 done->Run();
682}
683
669void mf::SessionMediator::set_base_display_configuration(684void mf::SessionMediator::set_base_display_configuration(
670 mir::protobuf::DisplayConfiguration const* request,685 mir::protobuf::DisplayConfiguration const* request,
671 mir::protobuf::Void* /*response*/,686 mir::protobuf::Void* /*response*/,
672687
=== modified file 'src/server/frontend/session_mediator.h'
--- src/server/frontend/session_mediator.h 2016-11-28 16:58:23 +0000
+++ src/server/frontend/session_mediator.h 2016-12-23 15:34:22 +0000
@@ -144,6 +144,10 @@
144 mir::protobuf::DisplayConfiguration const* request,144 mir::protobuf::DisplayConfiguration const* request,
145 mir::protobuf::DisplayConfiguration* response,145 mir::protobuf::DisplayConfiguration* response,
146 google::protobuf::Closure* done) override;146 google::protobuf::Closure* done) override;
147 void remove_session_configuration(
148 mir::protobuf::Void const* request,
149 mir::protobuf::Void* response,
150 google::protobuf::Closure* done) override;
147 void set_base_display_configuration(151 void set_base_display_configuration(
148 mir::protobuf::DisplayConfiguration const* request,152 mir::protobuf::DisplayConfiguration const* request,
149 mir::protobuf::Void* response,153 mir::protobuf::Void* response,
150154
=== modified file 'src/server/graphics/display_configuration_observer_multiplexer.cpp'
--- src/server/graphics/display_configuration_observer_multiplexer.cpp 2016-12-09 02:54:31 +0000
+++ src/server/graphics/display_configuration_observer_multiplexer.cpp 2016-12-23 15:34:22 +0000
@@ -38,6 +38,19 @@
38 for_each_observer(&mg::DisplayConfigurationObserver::base_configuration_updated, base_config);38 for_each_observer(&mg::DisplayConfigurationObserver::base_configuration_updated, base_config);
39}39}
4040
41void mg::DisplayConfigurationObserverMultiplexer::session_configuration_applied(
42 std::shared_ptr<frontend::Session> const& session,
43 std::shared_ptr<DisplayConfiguration> const& config)
44{
45 for_each_observer(&mg::DisplayConfigurationObserver::session_configuration_applied, session, config);
46}
47
48void mg::DisplayConfigurationObserverMultiplexer::session_configuration_removed(
49 std::shared_ptr<frontend::Session> const& session)
50{
51 for_each_observer(&mg::DisplayConfigurationObserver::session_configuration_removed, session);
52}
53
41void mg::DisplayConfigurationObserverMultiplexer::configuration_failed(54void mg::DisplayConfigurationObserverMultiplexer::configuration_failed(
42 std::shared_ptr<mg::DisplayConfiguration const> const& attempted,55 std::shared_ptr<mg::DisplayConfiguration const> const& attempted,
43 std::exception const& error)56 std::exception const& error)
4457
=== modified file 'src/server/graphics/display_configuration_observer_multiplexer.h'
--- src/server/graphics/display_configuration_observer_multiplexer.h 2016-12-09 02:54:31 +0000
+++ src/server/graphics/display_configuration_observer_multiplexer.h 2016-12-23 15:34:22 +0000
@@ -25,6 +25,10 @@
2525
26namespace mir26namespace mir
27{27{
28namespace frontend
29{
30class Session;
31}
28namespace graphics32namespace graphics
29{33{
30class DisplayConfigurationObserverMultiplexer : public ObserverMultiplexer<DisplayConfigurationObserver>34class DisplayConfigurationObserverMultiplexer : public ObserverMultiplexer<DisplayConfigurationObserver>
@@ -38,6 +42,11 @@
3842
39 void base_configuration_updated(std::shared_ptr<DisplayConfiguration const> const& base_config) override;43 void base_configuration_updated(std::shared_ptr<DisplayConfiguration const> const& base_config) override;
4044
45 void session_configuration_applied(std::shared_ptr<frontend::Session> const& session,
46 std::shared_ptr<DisplayConfiguration> const& config) override;
47
48 void session_configuration_removed(std::shared_ptr<frontend::Session> const& session) override;
49
41 void configuration_failed(50 void configuration_failed(
42 std::shared_ptr<DisplayConfiguration const> const& attempted,51 std::shared_ptr<DisplayConfiguration const> const& attempted,
43 std::exception const& error) override;52 std::exception const& error) override;
4453
=== modified file 'src/server/report/logging/display_configuration_report.cpp'
--- src/server/report/logging/display_configuration_report.cpp 2016-12-14 04:09:02 +0000
+++ src/server/report/logging/display_configuration_report.cpp 2016-12-23 15:34:22 +0000
@@ -20,11 +20,13 @@
20#include "mir/graphics/display_configuration.h"20#include "mir/graphics/display_configuration.h"
21#include "mir/output_type_names.h"21#include "mir/output_type_names.h"
22#include "mir/logging/logger.h"22#include "mir/logging/logger.h"
23#include "mir/frontend/session.h"
23#include "mir/graphics/edid.h"24#include "mir/graphics/edid.h"
2425
25#include <boost/exception/diagnostic_information.hpp>26#include <boost/exception/diagnostic_information.hpp>
26#include <cmath>27#include <cmath>
2728
29namespace mf = mir::frontend;
28namespace mg = mir::graphics;30namespace mg = mir::graphics;
29namespace ml = mir::logging;31namespace ml = mir::logging;
30namespace mrl= mir::report::logging;32namespace mrl= mir::report::logging;
@@ -65,6 +67,18 @@
65 log_configuration(severity, *base_config);67 log_configuration(severity, *base_config);
66}68}
6769
70void mrl::DisplayConfigurationReport::session_configuration_applied(std::shared_ptr<mf::Session> const& session,
71 std::shared_ptr<mg::DisplayConfiguration> const& config)
72{
73 logger->log(component, severity, "Session %s applied display configuration", session->name().c_str());
74 log_configuration(severity, *config);
75}
76
77void mrl::DisplayConfigurationReport::session_configuration_removed(std::shared_ptr<frontend::Session> const& session)
78{
79 logger->log(component, severity, "Session %s removed display configuration", session->name().c_str());
80}
81
68void mrl::DisplayConfigurationReport::configuration_failed(82void mrl::DisplayConfigurationReport::configuration_failed(
69 std::shared_ptr<mg::DisplayConfiguration const> const& attempted,83 std::shared_ptr<mg::DisplayConfiguration const> const& attempted,
70 std::exception const& error)84 std::exception const& error)
@@ -123,7 +137,7 @@
123 {"on", "in standby", "suspended", "off"};137 {"on", "in standby", "suspended", "off"};
124 logger->log(component, severity,138 logger->log(component, severity,
125 "%sPower is %s", indent, power_mode[out.power_mode]);139 "%sPower is %s", indent, power_mode[out.power_mode]);
126 140
127 if (out.used)141 if (out.used)
128 {142 {
129 if (out.current_mode_index < out.modes.size())143 if (out.current_mode_index < out.modes.size())
130144
=== modified file 'src/server/report/logging/display_configuration_report.h'
--- src/server/report/logging/display_configuration_report.h 2016-12-09 02:54:31 +0000
+++ src/server/report/logging/display_configuration_report.h 2016-12-23 15:34:22 +0000
@@ -27,6 +27,10 @@
27{27{
28namespace logging { class Logger; enum class Severity; }28namespace logging { class Logger; enum class Severity; }
2929
30namespace frontend
31{
32class Session;
33}
30namespace report34namespace report
31{35{
32namespace logging36namespace logging
@@ -42,6 +46,11 @@
4246
43 void base_configuration_updated(std::shared_ptr<graphics::DisplayConfiguration const> const& base_config) override;47 void base_configuration_updated(std::shared_ptr<graphics::DisplayConfiguration const> const& base_config) override;
4448
49 void session_configuration_applied(std::shared_ptr<frontend::Session> const& session,
50 std::shared_ptr<graphics::DisplayConfiguration> const& config) override;
51
52 void session_configuration_removed(std::shared_ptr<frontend::Session> const& session) override;
53
45 void configuration_failed(54 void configuration_failed(
46 std::shared_ptr<graphics::DisplayConfiguration const> const& attempted,55 std::shared_ptr<graphics::DisplayConfiguration const> const& attempted,
47 std::exception const& error) override;56 std::exception const& error) override;
4857
=== modified file 'src/server/scene/mediating_display_changer.cpp'
--- src/server/scene/mediating_display_changer.cpp 2016-12-09 02:54:31 +0000
+++ src/server/scene/mediating_display_changer.cpp 2016-12-23 15:34:22 +0000
@@ -1,5 +1,5 @@
1/*1/*
2 * Copyright © 2013 Canonical Ltd.2 * Copyright © 2013-2016 Canonical Ltd.
3 *3 *
4 * This program is free software: you can redistribute it and/or modify it4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 3,5 * under the terms of the GNU General Public License version 3,
@@ -191,6 +191,7 @@
191 {191 {
192 std::lock_guard<std::mutex> lg{configuration_mutex};192 std::lock_guard<std::mutex> lg{configuration_mutex};
193 config_map[session] = conf;193 config_map[session] = conf;
194 observer->session_configuration_applied(session, conf);
194195
195 if (session != focused_session.lock())196 if (session != focused_session.lock())
196 return;197 return;
@@ -222,6 +223,43 @@
222 });223 });
223}224}
224225
226void ms::MediatingDisplayChanger::remove_session_configuration(
227 std::shared_ptr<mf::Session> const& session)
228{
229 {
230 std::lock_guard<std::mutex> lg{configuration_mutex};
231 if (config_map.find(session) != config_map.end())
232 {
233 config_map.erase(session);
234 observer->session_configuration_removed(session);
235 }
236
237 if (session != focused_session.lock())
238 return;
239 }
240
241 std::weak_ptr<mf::Session> const weak_session{session};
242
243 server_action_queue->enqueue(
244 this,
245 [this, weak_session]
246 {
247 if (auto const session = weak_session.lock())
248 {
249 std::lock_guard<std::mutex> lg{configuration_mutex};
250
251 try
252 {
253 apply_base_config();
254 }
255 catch (std::exception const&)
256 {
257 session->send_error(DisplayConfigurationFailedError{});
258 }
259 }
260 });
261}
262
225void263void
226ms::MediatingDisplayChanger::preview_base_configuration(264ms::MediatingDisplayChanger::preview_base_configuration(
227 std::weak_ptr<frontend::Session> const& session,265 std::weak_ptr<frontend::Session> const& session,
228266
=== modified file 'src/server/scene/mediating_display_changer.h'
--- src/server/scene/mediating_display_changer.h 2016-11-15 23:48:01 +0000
+++ src/server/scene/mediating_display_changer.h 2016-12-23 15:34:22 +0000
@@ -75,6 +75,7 @@
75 std::shared_ptr<graphics::DisplayConfiguration> base_configuration() override;75 std::shared_ptr<graphics::DisplayConfiguration> base_configuration() override;
76 void configure(std::shared_ptr<frontend::Session> const& session,76 void configure(std::shared_ptr<frontend::Session> const& session,
77 std::shared_ptr<graphics::DisplayConfiguration> const& conf) override;77 std::shared_ptr<graphics::DisplayConfiguration> const& conf) override;
78 void remove_session_configuration(std::shared_ptr<frontend::Session> const& session) override;
78 void preview_base_configuration(79 void preview_base_configuration(
79 std::weak_ptr<frontend::Session> const& session,80 std::weak_ptr<frontend::Session> const& session,
80 std::shared_ptr<graphics::DisplayConfiguration> const& conf,81 std::shared_ptr<graphics::DisplayConfiguration> const& conf,
8182
=== modified file 'tests/acceptance-tests/test_nested_mir.cpp'
--- tests/acceptance-tests/test_nested_mir.cpp 2016-12-09 02:54:31 +0000
+++ tests/acceptance-tests/test_nested_mir.cpp 2016-12-23 15:34:22 +0000
@@ -127,6 +127,8 @@
127{127{
128 MOCK_METHOD1(initial_configuration, void (std::shared_ptr<mg::DisplayConfiguration const> const& configuration));128 MOCK_METHOD1(initial_configuration, void (std::shared_ptr<mg::DisplayConfiguration const> const& configuration));
129 MOCK_METHOD1(configuration_applied, void (std::shared_ptr<mg::DisplayConfiguration const> const& configuration));129 MOCK_METHOD1(configuration_applied, void (std::shared_ptr<mg::DisplayConfiguration const> const& configuration));
130 MOCK_METHOD2(session_configuration_applied, void (std::shared_ptr<mf::Session> const& session, std::shared_ptr<mg::DisplayConfiguration> const& configuration));
131 MOCK_METHOD1(session_configuration_removed, void (std::shared_ptr<mf::Session> const& session));
130 MOCK_METHOD1(base_configuration_updated, void (std::shared_ptr<mg::DisplayConfiguration const> const& base_config));132 MOCK_METHOD1(base_configuration_updated, void (std::shared_ptr<mg::DisplayConfiguration const> const& base_config));
131 MOCK_METHOD2(configuration_failed, void(std::shared_ptr<mg::DisplayConfiguration const> const&, std::exception const&));133 MOCK_METHOD2(configuration_failed, void(std::shared_ptr<mg::DisplayConfiguration const> const&, std::exception const&));
132 MOCK_METHOD2(catastrophic_configuration_error, void(std::shared_ptr<mg::DisplayConfiguration const> const&, std::exception const&));134 MOCK_METHOD2(catastrophic_configuration_error, void(std::shared_ptr<mg::DisplayConfiguration const> const&, std::exception const&));
133135
=== modified file 'tests/acceptance-tests/test_new_display_configuration.cpp'
--- tests/acceptance-tests/test_new_display_configuration.cpp 2016-12-12 05:13:17 +0000
+++ tests/acceptance-tests/test_new_display_configuration.cpp 2016-12-23 15:34:22 +0000
@@ -41,6 +41,7 @@
4141
42#include <atomic>42#include <atomic>
43#include <chrono>43#include <chrono>
44#include <mutex>
4445
45#include <gmock/gmock.h>46#include <gmock/gmock.h>
46#include <gtest/gtest.h>47#include <gtest/gtest.h>
@@ -109,6 +110,11 @@
109 return expectations.back().notifier.get_future();110 return expectations.back().notifier.get_future();
110 }111 }
111112
113 MOCK_METHOD2(session_configuration_applied, void(
114 std::shared_ptr<mf::Session> const&,
115 std::shared_ptr<mg::DisplayConfiguration> const&));
116 MOCK_METHOD1(session_configuration_removed, void(std::shared_ptr<mf::Session> const&));
117
112 protected:118 protected:
113 void initial_configuration(119 void initial_configuration(
114 std::shared_ptr<mg::DisplayConfiguration const> const&) override120 std::shared_ptr<mg::DisplayConfiguration const> const&) override
@@ -187,6 +193,7 @@
187 testing::NiceMock<MockDisplay> mock_display;193 testing::NiceMock<MockDisplay> mock_display;
188 std::shared_ptr<NotifyingConfigurationObserver> observer{std::make_shared<NotifyingConfigurationObserver>()};194 std::shared_ptr<NotifyingConfigurationObserver> observer{std::make_shared<NotifyingConfigurationObserver>()};
189 StubAuthorizer stub_authorizer;195 StubAuthorizer stub_authorizer;
196 mir::test::Signal observed_changed;
190};197};
191198
192TEST_F(DisplayConfigurationTest, display_configuration_reaches_client)199TEST_F(DisplayConfigurationTest, display_configuration_reaches_client)
@@ -259,9 +266,31 @@
259 connection = mir_connect_sync(mir_test_socket.c_str(), __PRETTY_FUNCTION__);266 connection = mir_connect_sync(mir_test_socket.c_str(), __PRETTY_FUNCTION__);
260267
261 auto const spec = mir_connection_create_spec_for_normal_surface(connection, 100, 100, mir_pixel_format_abgr_8888);268 auto const spec = mir_connection_create_spec_for_normal_surface(connection, 100, 100, mir_pixel_format_abgr_8888);
269 mir_surface_spec_set_event_handler(spec, &handle_event, this);
262 surface = mir_surface_create_sync(spec);270 surface = mir_surface_create_sync(spec);
263 mir_surface_spec_release(spec);271 mir_surface_spec_release(spec);
264 mir_buffer_stream_swap_buffers_sync(mir_surface_get_buffer_stream(surface));272 mir_buffer_stream_swap_buffers_sync(mir_surface_get_buffer_stream(surface));
273
274 ready_to_accept_events.wait_for(4s);
275 if (!ready_to_accept_events.raised())
276 BOOST_THROW_EXCEPTION(std::runtime_error("Timeout waiting for surface to become focused and exposed"));
277 }
278
279 static void handle_event(MirSurface*, MirEvent const* ev, void* context)
280 {
281 auto const client = static_cast<SimpleClient*>(context);
282 auto type = mir_event_get_type(ev);
283 if (type == mir_event_type_surface)
284 {
285 auto surface_event = mir_event_get_surface_event(ev);
286 auto const attrib = mir_surface_event_get_attribute(surface_event);
287 auto const value = mir_surface_event_get_attribute_value(surface_event);
288
289 std::lock_guard<std::mutex> lk(client->mutex);
290 if (mir_surface_attrib_focus == attrib &&
291 mir_surface_focused == value)
292 client->ready_to_accept_events.raise();
293 }
265 }294 }
266295
267 void disconnect()296 void disconnect()
@@ -278,6 +307,9 @@
278 std::string mir_test_socket;307 std::string mir_test_socket;
279 MirConnection* connection{nullptr};308 MirConnection* connection{nullptr};
280 MirSurface* surface{nullptr};309 MirSurface* surface{nullptr};
310 mutable std::mutex mutex;
311 mir::test::Signal ready_to_accept_events;
312 bool focused{false};
281};313};
282314
283struct DisplayClient : SimpleClient315struct DisplayClient : SimpleClient
@@ -1743,3 +1775,244 @@
17431775
1744 client.disconnect();1776 client.disconnect();
1745}1777}
1778
1779TEST_F(DisplayConfigurationTest, configure_session_display)
1780{
1781 auto configuration = mir_connection_create_display_configuration(connection);
1782
1783 EXPECT_CALL(*observer, session_configuration_applied(_, _))
1784 .Times(1)
1785 .WillOnce(mt::WakeUp(&observed_changed));
1786
1787 mir_connection_apply_session_display_configuration(connection, configuration);
1788
1789 observed_changed.wait_for(10s);
1790
1791 mir_display_config_release(configuration);
1792}
1793
1794TEST_F(DisplayConfigurationTest, configure_session_removed_display)
1795{
1796 auto configuration = mir_connection_create_display_configuration(connection);
1797
1798 EXPECT_CALL(*observer, session_configuration_applied(_, _))
1799 .Times(1)
1800 .WillOnce(mt::WakeUp(&observed_changed));
1801
1802 mir_connection_apply_session_display_configuration(connection, configuration);
1803
1804 observed_changed.wait_for(10s);
1805 observed_changed.reset();
1806
1807 mir_connection_remove_session_display_configuration(connection);
1808
1809 EXPECT_CALL(*observer, session_configuration_removed(_))
1810 .Times(1)
1811 .WillOnce(mt::WakeUp(&observed_changed));
1812
1813 observed_changed.wait_for(10s);
1814
1815 mir_display_config_release(configuration);
1816}
1817
1818TEST_F(DisplayConfigurationTest, remove_is_noop_when_no_session_configuration_set)
1819{
1820 EXPECT_CALL(*observer, session_configuration_removed(_))
1821 .Times(0);
1822
1823 mir_connection_remove_session_display_configuration(connection);
1824
1825 std::this_thread::sleep_for(1s);
1826}
1827
1828TEST_F(DisplayConfigurationTest, remove_from_focused_client_causes_hardware_change)
1829{
1830 DisplayClient client{new_connection()};
1831
1832 client.connect();
1833
1834 std::atomic<int> times{2};
1835 auto new_config = mir_connection_create_display_configuration(client.connection);
1836
1837 // Apply a configuration to the client, assert it has been configured for the display
1838 {
1839 mir_output_set_position(mir_display_config_get_mutable_output(new_config, 0), 500, 12000);
1840
1841 EXPECT_CALL(*observer, session_configuration_applied(_, mt::DisplayConfigMatches(new_config)))
1842 .Times(1)
1843 .WillOnce(mt::WakeUpWhenZero(&observed_changed, &times));
1844 EXPECT_CALL(mock_display, configure(mt::DisplayConfigMatches(new_config)))
1845 .Times(1)
1846 .WillOnce(mt::WakeUpWhenZero(&observed_changed, &times));
1847
1848 mir_connection_apply_session_display_configuration(client.connection, new_config);
1849
1850 observed_changed.wait_for(10s);
1851 observed_changed.reset();
1852 mir_display_config_release(new_config);
1853 }
1854
1855 // Remove the configuration, assert we have been re-configured back to the base config
1856 {
1857 times = 2;
1858
1859 EXPECT_CALL(*observer, session_configuration_removed(_))
1860 .Times(1)
1861 .WillOnce(mt::WakeUpWhenZero(&observed_changed, &times));
1862 EXPECT_CALL(mock_display, configure(mt::DisplayConfigMatches(std::cref(stub_display_config))))
1863 .Times(1)
1864 .WillOnce(mt::WakeUpWhenZero(&observed_changed, &times));
1865
1866 mir_connection_remove_session_display_configuration(client.connection);
1867
1868 observed_changed.wait_for(10s);
1869 }
1870
1871 client.disconnect();
1872}
1873
1874TEST_F(DisplayConfigurationTest, remove_from_unfocused_client_causes_no_hardware_change)
1875{
1876 DisplayClient client{new_connection()};
1877
1878 client.connect();
1879
1880 auto new_config = mir_connection_create_display_configuration(client.connection);
1881 std::atomic<int> times{2};
1882
1883 // Set the first clients display config
1884 {
1885 mir_output_set_position(mir_display_config_get_mutable_output(new_config, 0), 500, 12000);
1886
1887 EXPECT_CALL(*observer, session_configuration_applied(_, mt::DisplayConfigMatches(new_config)))
1888 .Times(1)
1889 .WillOnce(mt::WakeUpWhenZero(&observed_changed, &times));
1890 EXPECT_CALL(mock_display, configure(mt::DisplayConfigMatches(new_config)))
1891 .Times(1)
1892 .WillOnce(mt::WakeUpWhenZero(&observed_changed, &times));
1893
1894 mir_connection_apply_session_display_configuration(client.connection, new_config);
1895
1896 observed_changed.wait_for(10s);
1897 observed_changed.reset();
1898 mir_display_config_release(new_config);
1899 }
1900
1901 DisplayClient client2{new_connection()};
1902
1903 // Connect and wait for the second client to get setup and config. Which will be the focused session
1904 {
1905 EXPECT_CALL(mock_display, configure(mt::DisplayConfigMatches(std::cref(stub_display_config))))
1906 .Times(1)
1907 .WillOnce(mt::WakeUp(&observed_changed));
1908
1909 client2.connect();
1910 observed_changed.wait_for(10s);
1911 observed_changed.reset();
1912 }
1913
1914 // Remove the display config from the first config and assert no hardware changes happen
1915 {
1916 EXPECT_CALL(*observer, session_configuration_removed(_))
1917 .Times(1)
1918 .WillOnce(mt::WakeUp(&observed_changed));
1919 EXPECT_CALL(mock_display, configure(_))
1920 .Times(0);
1921
1922 mir_connection_remove_session_display_configuration(client.connection);
1923
1924 observed_changed.wait_for(10s);
1925 std::this_thread::sleep_for(1s);
1926 }
1927
1928 client2.disconnect();
1929 client.disconnect();
1930}
1931
1932TEST_F(DisplayConfigurationTest, remove_from_unfocused_client_causes_hardware_change_when_focused)
1933{
1934 DisplayClient client{new_connection()};
1935
1936 client.connect();
1937
1938 auto new_config = mir_connection_create_display_configuration(client.connection);
1939 std::atomic<int> times{2};
1940
1941 // Set the first clients display config
1942 {
1943 mir_output_set_position(mir_display_config_get_mutable_output(new_config, 0), 500, 12000);
1944
1945 EXPECT_CALL(*observer, session_configuration_applied(_, mt::DisplayConfigMatches(new_config)))
1946 .Times(1)
1947 .WillOnce(mt::WakeUpWhenZero(&observed_changed, &times));
1948 EXPECT_CALL(mock_display, configure(mt::DisplayConfigMatches(new_config)))
1949 .Times(1)
1950 .WillOnce(mt::WakeUpWhenZero(&observed_changed, &times));
1951
1952 mir_connection_apply_session_display_configuration(client.connection, new_config);
1953
1954 observed_changed.wait_for(10s);
1955 observed_changed.reset();
1956 }
1957
1958 DisplayClient client2{new_connection()};
1959
1960 // Connect and wait for the second client to get setup and config. Which will be the focused session
1961 {
1962 EXPECT_CALL(mock_display, configure(mt::DisplayConfigMatches(std::cref(stub_display_config))))
1963 .Times(1)
1964 .WillOnce(mt::WakeUp(&observed_changed));
1965
1966 client2.connect();
1967 observed_changed.wait_for(10s);
1968 observed_changed.reset();
1969 }
1970
1971 // Apply the new_config to client 2 as well so we can see disconnecting will apply the base config
1972 {
1973 times = 2;
1974
1975 EXPECT_CALL(*observer, session_configuration_applied(_, mt::DisplayConfigMatches(new_config)))
1976 .Times(1)
1977 .WillOnce(mt::WakeUpWhenZero(&observed_changed, &times));
1978 EXPECT_CALL(mock_display, configure(mt::DisplayConfigMatches(new_config)))
1979 .Times(1)
1980 .WillOnce(mt::WakeUpWhenZero(&observed_changed, &times));
1981
1982 mir_connection_apply_session_display_configuration(client2.connection, new_config);
1983 observed_changed.wait_for(10s);
1984 observed_changed.reset();
1985 mir_display_config_release(new_config);
1986 }
1987
1988 // Remove the display config from the first config and assert no hardware changes happen
1989 {
1990
1991 EXPECT_CALL(*observer, session_configuration_removed(_))
1992 .Times(1)
1993 .WillOnce(mt::WakeUp(&observed_changed));
1994 EXPECT_CALL(mock_display, configure(_))
1995 .Times(0);
1996
1997 mir_connection_remove_session_display_configuration(client.connection);
1998
1999 observed_changed.wait_for(10s);
2000 std::this_thread::sleep_for(1s);
2001 observed_changed.reset();
2002 }
2003
2004 testing::Mock::VerifyAndClearExpectations(&mock_display);
2005
2006 // Disconnect client 2 which makes client 1 regain focus. Assert the base config is configured
2007 {
2008 EXPECT_CALL(mock_display, configure(mt::DisplayConfigMatches(std::cref(stub_display_config))))
2009 .Times(1)
2010 .WillOnce(mt::WakeUp(&observed_changed));
2011
2012 client2.disconnect();
2013
2014 observed_changed.wait_for(10s);
2015 }
2016
2017 client.disconnect();
2018}
17462019
=== modified file 'tests/include/mir/test/doubles/null_display_changer.h'
--- tests/include/mir/test/doubles/null_display_changer.h 2016-10-12 06:03:15 +0000
+++ tests/include/mir/test/doubles/null_display_changer.h 2016-12-23 15:34:22 +0000
@@ -39,6 +39,9 @@
39 void configure(std::shared_ptr<frontend::Session> const&, std::shared_ptr<graphics::DisplayConfiguration> const&) override39 void configure(std::shared_ptr<frontend::Session> const&, std::shared_ptr<graphics::DisplayConfiguration> const&) override
40 {40 {
41 }41 }
42 void remove_session_configuration(std::shared_ptr<frontend::Session> const&) override
43 {
44 }
42 void set_base_configuration(std::shared_ptr<graphics::DisplayConfiguration> const&) override45 void set_base_configuration(std::shared_ptr<graphics::DisplayConfiguration> const&) override
43 {46 {
44 }47 }
4548
=== modified file 'tests/include/mir/test/doubles/stub_display_server.h'
--- tests/include/mir/test/doubles/stub_display_server.h 2016-12-21 03:07:05 +0000
+++ tests/include/mir/test/doubles/stub_display_server.h 2016-12-23 15:34:22 +0000
@@ -66,6 +66,10 @@
66 mir::protobuf::DisplayConfiguration const* /*request*/,66 mir::protobuf::DisplayConfiguration const* /*request*/,
67 mir::protobuf::DisplayConfiguration* /*response*/,67 mir::protobuf::DisplayConfiguration* /*response*/,
68 google::protobuf::Closure* /*done*/) {}68 google::protobuf::Closure* /*done*/) {}
69 void remove_session_configuration(
70 mir::protobuf::Void const* /*request*/,
71 mir::protobuf::Void* /*response*/,
72 google::protobuf::Closure* /*done*/) {}
69 void set_base_display_configuration(73 void set_base_display_configuration(
70 mir::protobuf::DisplayConfiguration const* /*request*/,74 mir::protobuf::DisplayConfiguration const* /*request*/,
71 mir::protobuf::Void* /*response*/,75 mir::protobuf::Void* /*response*/,
7276
=== modified file 'tests/mir_test/display_config_matchers.cpp'
--- tests/mir_test/display_config_matchers.cpp 2016-12-09 02:54:31 +0000
+++ tests/mir_test/display_config_matchers.cpp 2016-12-23 15:34:22 +0000
@@ -423,3 +423,12 @@
423 TestDisplayConfiguration translated_config_two{config2};423 TestDisplayConfiguration translated_config_two{config2};
424 return compare_display_configurations(listener, translated_config_one, translated_config_two);424 return compare_display_configurations(listener, translated_config_one, translated_config_two);
425}425}
426
427bool mt::compare_display_configurations(
428 testing::MatchResultListener* listener,
429 std::shared_ptr<mg::DisplayConfiguration> const& config1,
430 MirDisplayConfig const* config2)
431{
432 TestDisplayConfiguration translated_config_two{config2};
433 return compare_display_configurations(listener, *config1, translated_config_two);
434}
426435
=== modified file 'tests/unit-tests/scene/test_mediating_display_changer.cpp'
--- tests/unit-tests/scene/test_mediating_display_changer.cpp 2016-12-09 02:54:31 +0000
+++ tests/unit-tests/scene/test_mediating_display_changer.cpp 2016-12-23 15:34:22 +0000
@@ -174,6 +174,10 @@
174 void initial_configuration(std::shared_ptr<mg::DisplayConfiguration const> const&) override {}174 void initial_configuration(std::shared_ptr<mg::DisplayConfiguration const> const&) override {}
175 void configuration_applied(std::shared_ptr<mg::DisplayConfiguration const> const&) override {}175 void configuration_applied(std::shared_ptr<mg::DisplayConfiguration const> const&) override {}
176 void base_configuration_updated(std::shared_ptr<mg::DisplayConfiguration const> const&) override {}176 void base_configuration_updated(std::shared_ptr<mg::DisplayConfiguration const> const&) override {}
177 void session_configuration_applied(
178 std::shared_ptr<mf::Session> const&,
179 std::shared_ptr<mg::DisplayConfiguration> const&) override {};
180 void session_configuration_removed(std::shared_ptr<mf::Session> const&) override {};
177 void configuration_failed(181 void configuration_failed(
178 std::shared_ptr<mg::DisplayConfiguration const> const&,182 std::shared_ptr<mg::DisplayConfiguration const> const&,
179 std::exception const&) override {}183 std::exception const&) override {}

Subscribers

People subscribed via source and target branches