25
25
#include "mir/dispatch/action_queue.h"
26
26
#include "mir/geometry/displacement.h"
27
27
#include "mir/module_deleter.h"
28
#include "src/platforms/evdev/input_modifier_utils.h"
29
30
#include "boost/throw_exception.hpp"
30
#include "linux/input.h"
32
32
#include "mir/events/event_builders.h"
36
36
namespace mi = mir::input;
37
namespace mie = mi::evdev;
37
38
namespace md = mir::dispatch;
38
39
namespace mtf = mir_test_framework;
42
43
const int64_t device_id_unknown = 0;
44
MirPointerButton to_pointer_button(int button)
48
case BTN_LEFT: return mir_pointer_button_primary;
49
case BTN_RIGHT: return mir_pointer_button_secondary;
50
case BTN_MIDDLE: return mir_pointer_button_tertiary;
51
case BTN_BACK: return mir_pointer_button_back;
52
case BTN_FORWARD: return mir_pointer_button_forward;
54
BOOST_THROW_EXCEPTION(std::runtime_error("Invalid mouse button"));
57
uint32_t to_modifier(int32_t scan_code)
62
return mir_input_event_modifier_alt_left;
64
return mir_input_event_modifier_alt_right;
66
return mir_input_event_modifier_ctrl_right;
68
return mir_input_event_modifier_ctrl_left;
70
return mir_input_event_modifier_caps_lock;
72
return mir_input_event_modifier_meta_left;
74
return mir_input_event_modifier_meta_right;
76
return mir_input_event_modifier_scroll_lock;
78
return mir_input_event_modifier_num_lock;
80
return mir_input_event_modifier_shift_left;
82
return mir_input_event_modifier_shift_right;
84
return mir_input_event_modifier_none;
88
uint32_t expand_modifier(uint32_t modifiers)
90
if ((modifiers & mir_input_event_modifier_alt_left) || (modifiers & mir_input_event_modifier_alt_right))
91
modifiers |= mir_input_event_modifier_alt;
93
if ((modifiers & mir_input_event_modifier_ctrl_left) || (modifiers & mir_input_event_modifier_ctrl_right))
94
modifiers |= mir_input_event_modifier_ctrl;
96
if ((modifiers & mir_input_event_modifier_shift_left) || (modifiers & mir_input_event_modifier_shift_right))
97
modifiers |= mir_input_event_modifier_shift;
99
if ((modifiers & mir_input_event_modifier_meta_left) || (modifiers & mir_input_event_modifier_meta_right))
100
modifiers |= mir_input_event_modifier_meta;
107
46
mtf::FakeInputDeviceImpl::FakeInputDeviceImpl(mi::InputDeviceInfo const& info)
166
105
auto input_action =
167
106
(key_params.action == synthesis::EventAction::Down) ? mir_keyboard_action_down : mir_keyboard_action_up;
169
auto event_modifiers = expand_modifier(modifiers);
108
auto event_modifiers = mie::expand_modifiers(modifiers);
170
109
auto key_event = mir::events::make_event(
171
110
device_id_unknown, event_time, input_action, key_code, key_params.scancode, event_modifiers);
173
112
if (key_params.action == synthesis::EventAction::Down)
174
modifiers |= to_modifier(key_params.scancode);
113
modifiers |= mie::to_modifier(key_params.scancode);
176
modifiers &= ~to_modifier(key_params.scancode);
115
modifiers &= ~mie::to_modifier(key_params.scancode);
179
118
BOOST_THROW_EXCEPTION(std::runtime_error("Device is not started."));
185
124
auto event_time = std::chrono::duration_cast<std::chrono::nanoseconds>(
186
125
std::chrono::system_clock::now().time_since_epoch());
187
auto action = update_buttons(button.action, to_pointer_button(button.button));
188
auto event_modifiers = expand_modifier(modifiers);
126
auto action = update_buttons(button.action, mie::to_pointer_button(button.button));
127
auto event_modifiers = mie::expand_modifiers(modifiers);
189
128
auto button_event = mir::events::make_event(device_id_unknown,
223
162
auto event_time = std::chrono::duration_cast<std::chrono::nanoseconds>(
224
163
std::chrono::system_clock::now().time_since_epoch());
225
auto event_modifiers = expand_modifier(modifiers);
164
auto event_modifiers = mie::expand_modifiers(modifiers);
226
165
update_position(pointer.rel_x, pointer.rel_y);
227
166
auto pointer_event = mir::events::make_event(device_id_unknown,
253
192
auto event_time = std::chrono::duration_cast<std::chrono::nanoseconds>(
254
193
std::chrono::system_clock::now().time_since_epoch());
255
auto event_modifiers = expand_modifier(modifiers);
194
auto event_modifiers = mie::expand_modifiers(modifiers);
257
196
auto touch_event = mir::events::make_event(device_id_unknown, event_time, event_modifiers);