Mir

Merge lp:~andreas-pokorny/mir/fix-1538632 into lp:mir

Proposed by Andreas Pokorny
Status: Merged
Approved by: Daniel van Vugt
Approved revision: no longer in the source branch.
Merged at revision: 3288
Proposed branch: lp:~andreas-pokorny/mir/fix-1538632
Merge into: lp:mir
Diff against target: 462 lines (+96/-57)
12 files modified
src/include/server/mir/input/input_region.h (+2/-0)
src/server/input/default_configuration.cpp (+1/-1)
src/server/input/display_input_region.cpp (+4/-27)
src/server/input/display_input_region.h (+8/-8)
src/server/scene/default_configuration.cpp (+2/-1)
src/server/scene/mediating_display_changer.cpp (+20/-2)
src/server/scene/mediating_display_changer.h (+9/-1)
tests/include/mir/test/doubles/mock_input_region.h (+1/-0)
tests/integration-tests/input/test_single_seat_setup.cpp (+1/-0)
tests/unit-tests/input/test_default_input_device_hub.cpp (+1/-0)
tests/unit-tests/input/test_display_input_region.cpp (+8/-14)
tests/unit-tests/scene/test_mediating_display_changer.cpp (+39/-3)
To merge this branch: bzr merge lp:~andreas-pokorny/mir/fix-1538632
Reviewer Review Type Date Requested Status
Kevin DuBois (community) Approve
Alan Griffiths Approve
PS Jenkins bot (community) continuous-integration Approve
Mir CI Bot continuous-integration Approve
Alberto Aguirre (community) Needs Fixing
Review via email: mp+284186@code.launchpad.net

Commit message

input: Copy output rectangles when configuration changes

DisplayInputRegion used to calculate a set of rectangles on every mouse event, even when the set of outputs rarely changes. This change keeps a mir::geometry::Rectangles as cache. The actual dead lock of lp:1538632 was caused by the fact that DisplauInputRegion would use - to calculate the mir::geometry::Rectangles - the following locks in the given order:
  * mir::graphics::Display::configuration_mutex via for_each_display_sync_group()
  * mir::graphics::DisplayGroup::guard via for_each_display_buffer()

Simultaneously the SystemWindowManager::add_display method is called by the CompositingFunctor, which uses DisplaySyncGroup::for_each_display_buffer, and deeper in the call tree GraphicsDisplayLayout would request a copy of the DisplayConfiguration during place_in_output, which results in the reverse lock ordering:
  * mir::graphics::DisplayGroup::guard via for_each_display_buffer()
  * mir::graphics::Display::configuration_mutex via configration()

This change makes sure that the DisplayInputRegion does not touch any locks used by the graphics platform during input event handling.

Description of the change

The dead lock is resolved by caching the geom::Rectangles and updating the Rectangles of the DisplayInputRegion through the MediatingDisplayChanger... So the ugly-ish part of this MP is that MediatingDisplayChanger gets that extra knowledge of InputRegion and pushing updates to it. I do plan to resolve that in later steps by introducing the Seat concept for input and output devices. With that a connection between input device or output device changes would look more natuarl..

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

PASSED: Continuous integration, rev:3267
https://mir-jenkins.ubuntu.com/job/mir-ci/173/
Executed test runs:
    None: https://mir-jenkins.ubuntu.com/job/generic-update-mp/173/console

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

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

PASSED: Continuous integration, rev:3267
http://jenkins.qa.ubuntu.com/job/mir-ci/6143/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-android-vivid-i386-build/5713
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-clang-vivid-amd64-build/4620
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-vivid-touch/5669
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-xenial-touch/346
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-xenial-amd64-ci/467
        deb: http://jenkins.qa.ubuntu.com/job/mir-xenial-amd64-ci/467/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-xenial-i386-ci/467
        deb: http://jenkins.qa.ubuntu.com/job/mir-xenial-i386-ci/467/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-vivid-armhf/5666
        deb: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-vivid-armhf/5666/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-runner-touch/8096
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/27098
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-xenial-armhf/342
        deb: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-xenial-armhf/342/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-runner-xenial-touch/198
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/27102

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

review: Approve (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

+ virtual void set_display_configuration(mir::graphics::DisplayConfiguration const& config) = 0;

It seems odd that InputRegion "understands" DisplayConfiguration - I would expect it to only know about geometry (i.e. Point and Rectangle).

Did you consider a design with:

virtual void set_display_configuration(mir::geometry::Rectangles const& geometry) = 0;

I.e. building the display rects at the call site instead? (As MediatingDisplayChanger already uses the complete type.)

~~~~

PS I'd be tempted to add "auto geometry() -> Rectangles" to DisplayConfiguration

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

PASSED: Continuous integration, rev:3268
https://mir-jenkins.ubuntu.com/job/mir-ci/179/
Executed test runs:
    None: https://mir-jenkins.ubuntu.com/job/generic-update-mp/179/console

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

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

PASSED: Continuous integration, rev:3268
http://jenkins.qa.ubuntu.com/job/mir-ci/6150/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-android-vivid-i386-build/5721
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-clang-vivid-amd64-build/4628
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-vivid-touch/5677
    FAILURE: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-xenial-touch/353/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-xenial-amd64-ci/474
        deb: http://jenkins.qa.ubuntu.com/job/mir-xenial-amd64-ci/474/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-xenial-i386-ci/474
        deb: http://jenkins.qa.ubuntu.com/job/mir-xenial-i386-ci/474/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-vivid-armhf/5674
        deb: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-vivid-armhf/5674/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-runner-touch/8104
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/27133
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-xenial-armhf/349
        deb: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-xenial-armhf/349/artifact/work/output/*zip*/output.zip
    FAILURE: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-runner-xenial-touch/205/console
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/27140

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

review: Approve (continuous-integration)
Revision history for this message
Alberto Aguirre (albaguirre) wrote :

215 + if (output.power_mode == mir_power_mode_on && -output.current_mode_index < output.modes.size())

-output.current_mode_index

Why turn it negative?

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

PASSED: Continuous integration, rev:3269
https://mir-jenkins.ubuntu.com/job/mir-ci/183/
Executed test runs:
    None: https://mir-jenkins.ubuntu.com/job/generic-update-mp/183/console

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

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

PASSED: Continuous integration, rev:3269
http://jenkins.qa.ubuntu.com/job/mir-ci/6157/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-android-vivid-i386-build/5730
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-clang-vivid-amd64-build/4637
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-vivid-touch/5686
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-xenial-touch/357
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-xenial-amd64-ci/481
        deb: http://jenkins.qa.ubuntu.com/job/mir-xenial-amd64-ci/481/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-xenial-i386-ci/481
        deb: http://jenkins.qa.ubuntu.com/job/mir-xenial-i386-ci/481/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-vivid-armhf/5683
        deb: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-vivid-armhf/5683/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-runner-touch/8110
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/27154
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-xenial-armhf/353
        deb: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-xenial-armhf/353/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-runner-xenial-touch/209
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/27155

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

review: Approve (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

LGTM

review: Approve
Revision history for this message
Kevin DuBois (kdub) wrote :

looks good to me too

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

Alright. The only Needs Fixing was already resolved a few days ago. Top approving.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/include/server/mir/input/input_region.h'
2--- src/include/server/mir/input/input_region.h 2015-02-22 07:46:25 +0000
3+++ src/include/server/mir/input/input_region.h 2016-01-29 00:24:28 +0000
4@@ -24,6 +24,7 @@
5 namespace geometry
6 {
7 struct Rectangle;
8+struct Rectangles;
9 struct Point;
10 }
11 namespace input
12@@ -50,6 +51,7 @@
13 * @param [in,out] point the point to confine
14 */
15 virtual void confine(geometry::Point& point) = 0;
16+ virtual void set_input_rectangles(geometry::Rectangles const& rectangles) = 0;
17
18 protected:
19 InputRegion() = default;
20
21=== modified file 'src/server/input/default_configuration.cpp'
22--- src/server/input/default_configuration.cpp 2016-01-22 06:01:36 +0000
23+++ src/server/input/default_configuration.cpp 2016-01-29 00:24:28 +0000
24@@ -62,7 +62,7 @@
25 return input_region(
26 [this]()
27 {
28- return std::make_shared<mi::DisplayInputRegion>(the_display());
29+ return std::make_shared<mi::DisplayInputRegion>();
30 });
31 }
32
33
34=== modified file 'src/server/input/display_input_region.cpp'
35--- src/server/input/display_input_region.cpp 2016-01-20 23:59:18 +0000
36+++ src/server/input/display_input_region.cpp 2016-01-29 00:24:28 +0000
37@@ -17,8 +17,7 @@
38 */
39
40 #include "display_input_region.h"
41-#include "mir/graphics/display.h"
42-#include "mir/graphics/display_buffer.h"
43+#include "mir/graphics/display_configuration.h"
44
45 #include "mir/geometry/rectangle.h"
46 #include "mir/geometry/rectangles.h"
47@@ -27,25 +26,14 @@
48 namespace mg = mir::graphics;
49 namespace geom = mir::geometry;
50
51-mi::DisplayInputRegion::DisplayInputRegion(
52- std::shared_ptr<mg::Display> const& display)
53- : display{display}
54+void mi::DisplayInputRegion::set_input_rectangles(geometry::Rectangles const& config)
55 {
56+ std::unique_lock<std::mutex> lock(rectangle_guard);
57+ rectangles = config;
58 }
59
60 geom::Rectangle mi::DisplayInputRegion::bounding_rectangle()
61 {
62- geom::Rectangles rectangles;
63-
64- display->for_each_display_sync_group([&rectangles](mg::DisplaySyncGroup& group)
65- {
66- group.for_each_display_buffer(
67- [&rectangles](mg::DisplayBuffer const& buffer)
68- {
69- rectangles.add(buffer.view_area());
70- });
71- });
72-
73 //TODO: This region is mainly used for scaling touchscreen coordinates, so the caller
74 // probably wants the full list of rectangles. Additional work is needed
75 // to group a touchscreen with a display. So for now, just return the view area
76@@ -59,16 +47,5 @@
77
78 void mi::DisplayInputRegion::confine(geom::Point& point)
79 {
80- geom::Rectangles rectangles;
81-
82- display->for_each_display_sync_group([&rectangles](mg::DisplaySyncGroup& group)
83- {
84- group.for_each_display_buffer(
85- [&rectangles](mg::DisplayBuffer const& buffer)
86- {
87- rectangles.add(buffer.view_area());
88- });
89- });
90-
91 rectangles.confine(point);
92 }
93
94=== modified file 'src/server/input/display_input_region.h'
95--- src/server/input/display_input_region.h 2014-03-06 06:05:17 +0000
96+++ src/server/input/display_input_region.h 2016-01-29 00:24:28 +0000
97@@ -20,28 +20,28 @@
98 #define MIR_INPUT_DISPLAY_INPUT_REGION_H_
99
100 #include "mir/input/input_region.h"
101+#include "mir/geometry/rectangles.h"
102
103 #include <memory>
104+#include <mutex>
105
106 namespace mir
107 {
108-namespace graphics
109-{
110-class Display;
111-}
112 namespace input
113 {
114
115 class DisplayInputRegion : public InputRegion
116 {
117 public:
118- DisplayInputRegion(std::shared_ptr<graphics::Display> const& display);
119+ DisplayInputRegion() = default;
120
121- geometry::Rectangle bounding_rectangle();
122- void confine(geometry::Point& point);
123+ geometry::Rectangle bounding_rectangle() override;
124+ void confine(geometry::Point& point) override;
125+ void set_input_rectangles(geometry::Rectangles const& rectangles) override;
126
127 private:
128- std::shared_ptr<graphics::Display> const display;
129+ std::mutex rectangle_guard;
130+ geometry::Rectangles rectangles;
131 };
132
133 }
134
135=== modified file 'src/server/scene/default_configuration.cpp'
136--- src/server/scene/default_configuration.cpp 2016-01-20 23:59:18 +0000
137+++ src/server/scene/default_configuration.cpp 2016-01-29 00:24:28 +0000
138@@ -140,7 +140,8 @@
139 the_session_container(),
140 the_session_event_handler_register(),
141 the_server_action_queue(),
142- the_display_configuration_report());
143+ the_display_configuration_report(),
144+ the_input_region());
145 });
146
147 }
148
149=== modified file 'src/server/scene/mediating_display_changer.cpp'
150--- src/server/scene/mediating_display_changer.cpp 2016-01-20 23:59:18 +0000
151+++ src/server/scene/mediating_display_changer.cpp 2016-01-29 00:24:28 +0000
152@@ -23,6 +23,7 @@
153 #include "session_event_handler_register.h"
154 #include "mir/graphics/display.h"
155 #include "mir/compositor/compositor.h"
156+#include "mir/geometry/rectangles.h"
157 #include "mir/graphics/display_configuration_policy.h"
158 #include "mir/graphics/display_configuration.h"
159 #include "mir/graphics/display_configuration_report.h"
160@@ -32,6 +33,7 @@
161 namespace ms = mir::scene;
162 namespace mg = mir::graphics;
163 namespace mc = mir::compositor;
164+namespace mi = mir::input;
165
166 namespace
167 {
168@@ -66,7 +68,8 @@
169 std::shared_ptr<SessionContainer> const& session_container,
170 std::shared_ptr<SessionEventHandlerRegister> const& session_event_handler_register,
171 std::shared_ptr<ServerActionQueue> const& server_action_queue,
172- std::shared_ptr<mg::DisplayConfigurationReport> const& report)
173+ std::shared_ptr<mg::DisplayConfigurationReport> const& report,
174+ std::shared_ptr<mi::InputRegion> const& region)
175 : display{display},
176 compositor{compositor},
177 display_configuration_policy{display_configuration_policy},
178@@ -75,7 +78,8 @@
179 server_action_queue{server_action_queue},
180 report{report},
181 base_configuration_{display->configuration()},
182- base_configuration_applied{true}
183+ base_configuration_applied{true},
184+ region{region}
185 {
186 session_event_handler_register->register_focus_change_handler(
187 [this](std::shared_ptr<ms::Session> const& session)
188@@ -112,6 +116,7 @@
189 });
190
191 report->initial_configuration(*base_configuration_);
192+ update_input_rectangles(*base_configuration_);
193 }
194
195 void ms::MediatingDisplayChanger::configure(
196@@ -204,6 +209,7 @@
197 {
198 display->configure(*conf);
199 }
200+ update_input_rectangles(*conf);
201
202 base_configuration_applied = false;
203 }
204@@ -282,3 +288,15 @@
205 send_config_to_all_sessions(conf);
206 });
207 }
208+
209+void ms::MediatingDisplayChanger::update_input_rectangles(mg::DisplayConfiguration const& config)
210+{
211+ geometry::Rectangles rectangles;
212+ config.for_each_output(
213+ [&rectangles](mg::DisplayConfigurationOutput const& output)
214+ {
215+ if (output.power_mode == mir_power_mode_on && output.current_mode_index < output.modes.size())
216+ rectangles.add(geometry::Rectangle(output.top_left, output.modes[output.current_mode_index].size));
217+ });
218+ region->set_input_rectangles(rectangles);
219+}
220
221=== modified file 'src/server/scene/mediating_display_changer.h'
222--- src/server/scene/mediating_display_changer.h 2016-01-20 23:59:18 +0000
223+++ src/server/scene/mediating_display_changer.h 2016-01-29 00:24:28 +0000
224@@ -22,6 +22,7 @@
225 #include "mir/frontend/display_changer.h"
226 #include "mir/display_changer.h"
227 #include "mir/shell/display_configuration_controller.h"
228+#include "mir/input/input_region.h"
229
230 #include <mutex>
231 #include <map>
232@@ -37,6 +38,10 @@
233 class DisplayConfigurationReport;
234 }
235 namespace compositor { class Compositor; }
236+namespace input
237+{
238+class InputRegion;
239+}
240 namespace scene
241 {
242 class SessionEventHandlerRegister;
243@@ -55,7 +60,8 @@
244 std::shared_ptr<SessionContainer> const& session_container,
245 std::shared_ptr<SessionEventHandlerRegister> const& session_event_handler_register,
246 std::shared_ptr<ServerActionQueue> const& server_action_queue,
247- std::shared_ptr<graphics::DisplayConfigurationReport> const& report);
248+ std::shared_ptr<graphics::DisplayConfigurationReport> const& report,
249+ std::shared_ptr<input::InputRegion> const& region);
250
251 /* From mir::frontend::DisplayChanger */
252 std::shared_ptr<graphics::DisplayConfiguration> base_configuration() override;
253@@ -83,6 +89,7 @@
254 void apply_base_config(SystemStateHandling pause_resume_system);
255 void send_config_to_all_sessions(
256 std::shared_ptr<graphics::DisplayConfiguration> const& conf);
257+ void update_input_rectangles(graphics::DisplayConfiguration const& conf);
258
259 std::shared_ptr<graphics::Display> const display;
260 std::shared_ptr<compositor::Compositor> const compositor;
261@@ -98,6 +105,7 @@
262 std::weak_ptr<frontend::Session> focused_session;
263 std::shared_ptr<graphics::DisplayConfiguration> base_configuration_;
264 bool base_configuration_applied;
265+ std::shared_ptr<input::InputRegion> const region;
266 };
267
268 }
269
270=== modified file 'tests/include/mir/test/doubles/mock_input_region.h'
271--- tests/include/mir/test/doubles/mock_input_region.h 2013-07-19 14:12:57 +0000
272+++ tests/include/mir/test/doubles/mock_input_region.h 2016-01-29 00:24:28 +0000
273@@ -36,6 +36,7 @@
274 {
275 public:
276 MOCK_METHOD0(bounding_rectangle, geometry::Rectangle());
277+ MOCK_METHOD1(set_input_rectangles, void(geometry::Rectangles const&));
278 MOCK_METHOD1(confine, void(geometry::Point&));
279 };
280
281
282=== modified file 'tests/integration-tests/input/test_single_seat_setup.cpp'
283--- tests/integration-tests/input/test_single_seat_setup.cpp 2016-01-22 04:38:07 +0000
284+++ tests/integration-tests/input/test_single_seat_setup.cpp 2016-01-29 00:24:28 +0000
285@@ -34,6 +34,7 @@
286 #include "mir/input/device_capability.h"
287 #include "mir/input/pointer_configuration.h"
288 #include "mir/input/touchpad_configuration.h"
289+#include "mir/geometry/rectangles.h"
290
291 #include <gmock/gmock.h>
292 #include <gtest/gtest.h>
293
294=== modified file 'tests/unit-tests/input/test_default_input_device_hub.cpp'
295--- tests/unit-tests/input/test_default_input_device_hub.cpp 2016-01-22 06:01:36 +0000
296+++ tests/unit-tests/input/test_default_input_device_hub.cpp 2016-01-29 00:24:28 +0000
297@@ -29,6 +29,7 @@
298 #include "mir/test/fake_shared.h"
299
300 #include "mir/dispatch/action_queue.h"
301+#include "mir/geometry/rectangles.h"
302 #include "mir/dispatch/multiplexing_dispatchable.h"
303 #include "mir/events/event_builders.h"
304 #include "mir/input/cursor_listener.h"
305
306=== modified file 'tests/unit-tests/input/test_display_input_region.cpp'
307--- tests/unit-tests/input/test_display_input_region.cpp 2016-01-20 23:59:18 +0000
308+++ tests/unit-tests/input/test_display_input_region.cpp 2016-01-29 00:24:28 +0000
309@@ -18,22 +18,16 @@
310
311 #include "src/server/input/display_input_region.h"
312
313-#include "mir/test/doubles/null_display.h"
314-#include "mir/test/doubles/stub_display.h"
315-
316-#include <vector>
317 #include <tuple>
318
319 #include <gtest/gtest.h>
320
321 namespace mi = mir::input;
322-namespace mg = mir::graphics;
323-namespace mtd = mir::test::doubles;
324 namespace geom = mir::geometry;
325
326 namespace
327 {
328-std::vector<geom::Rectangle> const rects{
329+geom::Rectangles const rects{
330 geom::Rectangle{{0,0}, {800,600}},
331 geom::Rectangle{{0,600}, {100,100}},
332 geom::Rectangle{{800,0}, {100,100}}
333@@ -43,9 +37,9 @@
334 TEST(DisplayInputRegionTest, returns_correct_bounding_rectangle)
335 {
336 geom::Rectangle const expected_bounding_rect{geom::Point{0,0}, geom::Size{800,600}};
337- auto stub_display = std::make_shared<mtd::StubDisplay>(rects);
338
339- mi::DisplayInputRegion input_region{stub_display};
340+ mi::DisplayInputRegion input_region;
341+ input_region.set_input_rectangles(rects);
342
343 auto rect = input_region.bounding_rectangle();
344 EXPECT_EQ(expected_bounding_rect, rect);
345@@ -53,9 +47,8 @@
346
347 TEST(DisplayInputRegionTest, confines_point_to_closest_valid_position)
348 {
349- auto stub_display = std::make_shared<mtd::StubDisplay>(rects);
350-
351- mi::DisplayInputRegion input_region{stub_display};
352+ mi::DisplayInputRegion input_region;
353+ input_region.set_input_rectangles(rects);
354
355 std::vector<std::tuple<geom::Point,geom::Point>> point_tuples{
356 std::make_tuple(geom::Point{0,0}, geom::Point{0,0}),
357@@ -83,10 +76,11 @@
358
359 TEST(DisplayInputRegionTest, returns_empty_bounding_rectangle_when_there_are_no_outputs)
360 {
361+ geom::Rectangles const empty_rects{};
362 geom::Rectangle const empty_rect{};
363- auto const stub_display = std::make_shared<mtd::StubDisplay>(0);
364
365- mi::DisplayInputRegion input_region{stub_display};
366+ mi::DisplayInputRegion input_region;
367+ input_region.set_input_rectangles(empty_rects);
368
369 auto const bounding_rect = input_region.bounding_rectangle();
370 EXPECT_EQ(empty_rect, bounding_rect);
371
372=== modified file 'tests/unit-tests/scene/test_mediating_display_changer.cpp'
373--- tests/unit-tests/scene/test_mediating_display_changer.cpp 2016-01-20 23:59:18 +0000
374+++ tests/unit-tests/scene/test_mediating_display_changer.cpp 2016-01-29 00:24:28 +0000
375@@ -20,6 +20,7 @@
376 #include "src/server/scene/session_container.h"
377 #include "mir/graphics/display_configuration_policy.h"
378 #include "mir/graphics/display_configuration_report.h"
379+#include "mir/geometry/rectangles.h"
380 #include "src/server/scene/broadcasting_session_event_sink.h"
381 #include "mir/server_action_queue.h"
382
383@@ -28,6 +29,7 @@
384 #include "mir/test/doubles/null_display_configuration.h"
385 #include "mir/test/doubles/stub_display_configuration.h"
386 #include "mir/test/doubles/mock_scene_session.h"
387+#include "mir/test/doubles/mock_input_region.h"
388 #include "mir/test/doubles/stub_session.h"
389 #include "mir/test/fake_shared.h"
390 #include "mir/test/display_config_matchers.h"
391@@ -135,7 +137,8 @@
392 mt::fake_shared(stub_session_container),
393 mt::fake_shared(session_event_sink),
394 mt::fake_shared(server_action_queue),
395- mt::fake_shared(display_configuration_report));
396+ mt::fake_shared(display_configuration_report),
397+ mt::fake_shared(mock_input_region));
398 }
399
400 testing::NiceMock<MockDisplay> mock_display;
401@@ -146,6 +149,7 @@
402 mtd::StubDisplayConfig base_config;
403 StubServerActionQueue server_action_queue;
404 StubDisplayConfigurationReport display_configuration_report;
405+ testing::NiceMock<mtd::MockInputRegion> mock_input_region;
406 std::shared_ptr<ms::MediatingDisplayChanger> changer;
407 };
408
409@@ -428,7 +432,8 @@
410 mt::fake_shared(stub_session_container),
411 mt::fake_shared(session_event_sink),
412 mt::fake_shared(mock_server_action_queue),
413- mt::fake_shared(display_configuration_report));
414+ mt::fake_shared(display_configuration_report),
415+ mt::fake_shared(mock_input_region));
416
417 void const* owner{nullptr};
418
419@@ -483,7 +488,8 @@
420 mt::fake_shared(stub_session_container),
421 mt::fake_shared(session_event_sink),
422 mt::fake_shared(mock_server_action_queue),
423- mt::fake_shared(display_configuration_report));
424+ mt::fake_shared(display_configuration_report),
425+ mt::fake_shared(mock_input_region));
426
427 EXPECT_CALL(mock_server_action_queue, enqueue(_, _));
428 session_event_sink.handle_focus_change(active_session);
429@@ -594,3 +600,33 @@
430
431 changer->set_base_configuration(mt::fake_shared(conf));
432 }
433+
434+TEST_F(MediatingDisplayChangerTest, input_region_receives_display_configuration_on_start)
435+{
436+ using namespace testing;
437+ EXPECT_CALL(mock_input_region, set_input_rectangles(_));
438+
439+ ms::MediatingDisplayChanger display_changer(
440+ mt::fake_shared(mock_display),
441+ mt::fake_shared(mock_compositor),
442+ mt::fake_shared(mock_conf_policy),
443+ mt::fake_shared(stub_session_container),
444+ mt::fake_shared(session_event_sink),
445+ mt::fake_shared(server_action_queue),
446+ mt::fake_shared(display_configuration_report),
447+ mt::fake_shared(mock_input_region));
448+}
449+
450+TEST_F(MediatingDisplayChangerTest, notifies_input_region_on_new_configuration)
451+{
452+ using namespace testing;
453+ mtd::NullDisplayConfiguration conf;
454+ mir::geometry::Rectangles expected_rectangles;
455+ EXPECT_CALL(mock_input_region, set_input_rectangles(expected_rectangles));
456+
457+ auto session = std::make_shared<mtd::StubSession>();
458+
459+ session_event_sink.handle_focus_change(session);
460+ changer->configure(session,
461+ mt::fake_shared(conf));
462+}

Subscribers

People subscribed via source and target branches