Mir

Merge lp:~alan-griffiths/mir/port-window-management-example-to-current-input-API into lp:mir

Proposed by Alan Griffiths on 2015-02-10
Status: Merged
Approved by: Alan Griffiths on 2015-02-11
Approved revision: 2310
Merged at revision: 2313
Proposed branch: lp:~alan-griffiths/mir/port-window-management-example-to-current-input-API
Merge into: lp:mir
Diff against target: 223 lines (+104/-63)
1 file modified
examples/server_example_window_management.cpp (+104/-63)
To merge this branch: bzr merge lp:~alan-griffiths/mir/port-window-management-example-to-current-input-API
Reviewer Review Type Date Requested Status
Andreas Pokorny (community) Approve on 2015-02-11
Robert Carr (community) 2015-02-10 Approve on 2015-02-10
PS Jenkins bot continuous-integration Approve on 2015-02-10
Review via email: mp+249180@code.launchpad.net

Commit Message

examples: Port window management off of legacy input events

Description of the Change

examples: Port window management off of legacy input events

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'examples/server_example_window_management.cpp'
2--- examples/server_example_window_management.cpp 2015-02-04 18:10:25 +0000
3+++ examples/server_example_window_management.cpp 2015-02-10 12:05:29 +0000
4@@ -16,8 +16,6 @@
5 * Authored By: Alan Griffiths <alan@octopull.co.uk>
6 */
7
8-#define MIR_INCLUDE_DEPRECATED_EVENT_HEADER
9-
10 #include "server_example_window_management.h"
11 #include "server_example_fullscreen_placement_strategy.h"
12
13@@ -32,6 +30,8 @@
14 #include "mir/scene/surface_creation_parameters.h"
15 #include "mir/shell/abstract_shell.h"
16
17+#include "mir_toolkit/events/input/input_event.h"
18+
19 #include <linux/input.h>
20
21 #include <map>
22@@ -577,44 +577,54 @@
23
24 bool handle(MirEvent const& event) override
25 {
26- switch (event.type)
27- {
28- case mir_event_type_key:
29- return handle_key_event(event.key);
30-
31- case mir_event_type_motion:
32- return handle_motion_event(event.motion);
33-
34- default:
35+ if (mir_event_get_type(&event) != mir_event_type_input)
36 return false;
37+
38+ auto const input_event = mir_event_get_input_event(&event);
39+
40+ switch (mir_input_event_get_type(input_event))
41+ {
42+ case mir_input_event_type_key:
43+ return handle_key_event(mir_input_event_get_key_input_event(input_event));
44+
45+ case mir_input_event_type_touch:
46+ return handle_touch_event(mir_input_event_get_touch_input_event(input_event));
47+
48+ case mir_input_event_type_pointer:
49+ return handle_pointer_event(mir_input_event_get_pointer_input_event(input_event));
50 }
51+
52+ return false;
53 }
54
55 private:
56- bool handle_key_event(MirKeyEvent const& event)
57+ static const int modifier_mask =
58+ mir_input_event_modifier_alt |
59+ mir_input_event_modifier_shift |
60+ mir_input_event_modifier_sym |
61+ mir_input_event_modifier_ctrl |
62+ mir_input_event_modifier_meta;
63+
64+ bool handle_key_event(MirKeyInputEvent const* event)
65 {
66- static const int modifier_mask =
67- mir_key_modifier_alt |
68- mir_key_modifier_shift |
69- mir_key_modifier_sym |
70- mir_key_modifier_ctrl |
71- mir_key_modifier_meta;
72+ auto const action = mir_key_input_event_get_action(event);
73+ auto const scan_code = mir_key_input_event_get_scan_code(event);
74+ auto const modifiers = mir_key_input_event_get_modifiers(event) & modifier_mask;
75
76- if (event.action == mir_key_action_down &&
77- event.scan_code == KEY_F11)
78+ if (action == mir_key_input_event_action_down && scan_code == KEY_F11)
79 {
80 if (auto const wm = window_manager.lock())
81- switch (event.modifiers & modifier_mask)
82+ switch (modifiers & modifier_mask)
83 {
84- case mir_key_modifier_alt:
85+ case mir_input_event_modifier_alt:
86 wm->toggle(mir_surface_state_maximized);
87 return true;
88
89- case mir_key_modifier_shift:
90+ case mir_input_event_modifier_shift:
91 wm->toggle(mir_surface_state_vertmaximized);
92 return true;
93
94- case mir_key_modifier_ctrl:
95+ case mir_input_event_modifier_ctrl:
96 wm->toggle(mir_surface_state_horizmaximized);
97 return true;
98
99@@ -626,34 +636,79 @@
100 return false;
101 }
102
103- bool handle_motion_event(MirMotionEvent const& event)
104- {
105- if (event.action == mir_motion_action_down ||
106- event.action == mir_motion_action_pointer_down)
107- {
108- if (auto const wm = window_manager.lock())
109- {
110- wm->click(average_pointer(event.pointer_count, event.pointer_coordinates));
111+ bool handle_touch_event(MirTouchInputEvent const* event)
112+ {
113+ auto const count = mir_touch_input_event_get_touch_count(event);
114+
115+ if (auto const wm = window_manager.lock())
116+ {
117+ long total_x = 0;
118+ long total_y = 0;
119+
120+ for (auto i = 0U; i != count; ++i)
121+ {
122+ total_x += mir_touch_input_event_get_touch_axis_value(event, i, mir_touch_input_axis_x);
123+ total_y += mir_touch_input_event_get_touch_axis_value(event, i, mir_touch_input_axis_y);
124+ }
125+
126+ Point const cursor{total_x/count, total_y/count};
127+
128+ bool is_drag = true;
129+ for (auto i = 0U; i != count; ++i)
130+ {
131+ switch (mir_touch_input_event_get_touch_action(event, i))
132+ {
133+ case mir_touch_input_event_action_up:
134+ return false;
135+
136+ case mir_touch_input_event_action_down:
137+ is_drag = false;
138+
139+ case mir_touch_input_event_action_change:
140+ continue;
141+ }
142+ }
143+
144+ if (is_drag && count == 3)
145+ {
146+ wm->drag(cursor);
147+ return true;
148+ }
149+
150+ wm->click(cursor);
151+ }
152+
153+ return false;
154+ }
155+
156+ bool handle_pointer_event(MirPointerInputEvent const* event)
157+ {
158+ if (auto const wm = window_manager.lock())
159+ {
160+ auto const action = mir_pointer_input_event_get_action(event);
161+ auto const modifiers = mir_pointer_input_event_get_modifiers(event) & modifier_mask;
162+ Point const cursor{
163+ mir_pointer_input_event_get_axis_value(event, mir_pointer_input_axis_x),
164+ mir_pointer_input_event_get_axis_value(event, mir_pointer_input_axis_y)};
165+
166+ if (action == mir_pointer_input_event_action_button_down)
167+ {
168+ wm->click(cursor);
169 return false;
170 }
171- }
172- else if (event.action == mir_motion_action_move &&
173- event.modifiers & mir_key_modifier_alt)
174- {
175- if (auto const wm = window_manager.lock())
176+ else if (action == mir_pointer_input_event_action_motion &&
177+ modifiers == mir_input_event_modifier_alt)
178 {
179- switch (event.button_state)
180- {
181- case mir_motion_button_primary:
182- wm->drag(average_pointer(event.pointer_count, event.pointer_coordinates));
183- return true;
184-
185- case mir_motion_button_tertiary:
186- wm->resize(average_pointer(event.pointer_count, event.pointer_coordinates));
187- return true;
188-
189- default:
190- ;// ignore
191+ if (mir_pointer_input_event_get_button_state(event, mir_pointer_input_button_primary))
192+ {
193+ wm->drag(cursor);
194+ return true;
195+ }
196+
197+ if (mir_pointer_input_event_get_button_state(event, mir_pointer_input_button_tertiary))
198+ {
199+ wm->resize(cursor);
200+ return true;
201 }
202 }
203 }
204@@ -661,20 +716,6 @@
205 return false;
206 }
207
208- static Point average_pointer(size_t pointer_count, MirMotionPointer const* pointer_coordinates)
209- {
210- long total_x = 0;
211- long total_y = 0;
212-
213- for (auto p = pointer_coordinates; p != pointer_coordinates + pointer_count; ++p)
214- {
215- total_x += p->x;
216- total_y += p->y;
217- }
218-
219- return Point{total_x/pointer_count, total_y/pointer_count};
220- }
221-
222 std::weak_ptr<me::WindowManager> const window_manager;
223 };
224

Subscribers

People subscribed via source and target branches