Mir

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

Proposed by Andreas Pokorny
Status: Merged
Approved by: Andreas Pokorny
Approved revision: no longer in the source branch.
Merged at revision: 3087
Proposed branch: lp:~andreas-pokorny/mir/fix-1489522
Merge into: lp:mir
Diff against target: 94 lines (+52/-10)
2 files modified
src/platforms/evdev/libinput_device.cpp (+5/-2)
tests/unit-tests/input/evdev/test_libinput_device.cpp (+47/-8)
To merge this branch: bzr merge lp:~andreas-pokorny/mir/fix-1489522
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Approve
Alberto Aguirre (community) Approve
Review via email: mp+276195@code.launchpad.net

Commit message

input-evev: use 'transformed' variant of the coordinate access functions

Description of the change

This fixes the kvm input problem introduced in wily for the libinput stack.

Background: the simulated input devices from kvm currently only emit absolute coordinates. In the past they used to at least have one device node that behaves like a regular mouse.

This change fixes a problem inside the libinput handling code - it scales the coordinates to the actual size of the output

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Alberto Aguirre (albaguirre) wrote :

LGTM

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

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/platforms/evdev/libinput_device.cpp'
2--- src/platforms/evdev/libinput_device.cpp 2015-10-29 16:21:10 +0000
3+++ src/platforms/evdev/libinput_device.cpp 2015-10-29 21:52:55 +0000
4@@ -194,12 +194,15 @@
5 auto const action = mir_pointer_action_motion;
6 auto const hscroll_value = 0.0f;
7 auto const vscroll_value = 0.0f;
8+ auto const screen = sink->bounding_rectangle();
9+ uint32_t const width = screen.size.width.as_int();
10+ uint32_t const height = screen.size.height.as_int();
11
12 report->received_event_from_kernel(time.count(), EV_ABS, 0, 0);
13 auto const old_pointer_pos = pointer_pos;
14 pointer_pos = mir::geometry::Point{
15- libinput_event_pointer_get_absolute_x(pointer),
16- libinput_event_pointer_get_absolute_y(pointer)};
17+ libinput_event_pointer_get_absolute_x_transformed(pointer, width),
18+ libinput_event_pointer_get_absolute_y_transformed(pointer, height)};
19 auto const movement = pointer_pos - old_pointer_pos;
20
21 sink->confine_pointer(pointer_pos);
22
23=== modified file 'tests/unit-tests/input/evdev/test_libinput_device.cpp'
24--- tests/unit-tests/input/evdev/test_libinput_device.cpp 2015-10-29 16:21:10 +0000
25+++ tests/unit-tests/input/evdev/test_libinput_device.cpp 2015-10-29 21:52:55 +0000
26@@ -293,6 +293,22 @@
27 .WillByDefault(Return(relatve_y));
28 }
29
30+ void setup_absolute_pointer_event(libinput_event* event, uint64_t event_time, float x, float y)
31+ {
32+ auto pointer_event = reinterpret_cast<libinput_event_pointer*>(event);
33+
34+ ON_CALL(mock_libinput, libinput_event_get_type(event))
35+ .WillByDefault(Return(LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE));
36+ ON_CALL(mock_libinput, libinput_event_get_pointer_event(event))
37+ .WillByDefault(Return(pointer_event));
38+ ON_CALL(mock_libinput, libinput_event_pointer_get_time_usec(pointer_event))
39+ .WillByDefault(Return(event_time));
40+ ON_CALL(mock_libinput, libinput_event_pointer_get_absolute_x_transformed(pointer_event, _))
41+ .WillByDefault(Return(x));
42+ ON_CALL(mock_libinput, libinput_event_pointer_get_absolute_y_transformed(pointer_event, _))
43+ .WillByDefault(Return(y));
44+ }
45+
46 void setup_button_event(libinput_event* event, uint64_t event_time, int button, libinput_button_state state)
47 {
48 auto pointer_event = reinterpret_cast<libinput_event_pointer*>(event);
49@@ -509,14 +525,37 @@
50
51 TEST_F(LibInputDeviceOnMouse, process_event_converts_pointer_event)
52 {
53- float x = 15;
54- float y = 17;
55- setup_pointer_event(fake_event_1, event_time_1, x, y);
56-
57- EXPECT_CALL(mock_sink, handle_input(mt::PointerEventWithPosition(x,y)));
58-
59- mouse.start(&mock_sink, &mock_builder);
60- mouse.process_event(fake_event_1);
61+ float x_movement_1 = 15;
62+ float y_movement_1 = 17;
63+ float x_movement_2 = 20;
64+ float y_movement_2 = 40;
65+ setup_pointer_event(fake_event_1, event_time_1, x_movement_1, y_movement_1);
66+ setup_pointer_event(fake_event_2, event_time_2, x_movement_2, y_movement_2);
67+
68+ EXPECT_CALL(mock_sink, handle_input(mt::PointerEventWithDiff(x_movement_1,y_movement_1)));
69+ EXPECT_CALL(mock_sink, handle_input(mt::PointerEventWithDiff(x_movement_2,y_movement_2)));
70+
71+ mouse.start(&mock_sink, &mock_builder);
72+ mouse.process_event(fake_event_1);
73+ mouse.process_event(fake_event_2);
74+}
75+
76+TEST_F(LibInputDeviceOnMouse, process_event_handles_absolute_pointer_events)
77+{
78+ float x1 = 15;
79+ float y1 = 17;
80+ float x2 = 40;
81+ float y2 = 10;
82+ setup_absolute_pointer_event(fake_event_1, event_time_1, x1, y1);
83+ setup_absolute_pointer_event(fake_event_2, event_time_2, x2, y2);
84+
85+ EXPECT_CALL(mock_sink, handle_input(mt::PointerEventWithPosition(x1, y1)));
86+ EXPECT_CALL(mock_sink,
87+ handle_input(AllOf(mt::PointerEventWithPosition(x2, y2), mt::PointerEventWithDiff(x2 - x1, y2 - y1))));
88+
89+ mouse.start(&mock_sink, &mock_builder);
90+ mouse.process_event(fake_event_1);
91+ mouse.process_event(fake_event_2);
92 }
93
94 TEST_F(LibInputDeviceOnMouse, process_event_provides_relative_coordinates)

Subscribers

People subscribed via source and target branches