27
27
#include "mir/input/event_builder.h"
28
28
#include "mir/input/pointer_settings.h"
29
29
#include "mir/input/touchpad_settings.h"
30
#include "mir/input/touchscreen_settings.h"
30
31
#include "mir/input/device_capability.h"
31
32
#include "mir/dispatch/action_queue.h"
32
33
#include "mir/events/event_builders.h"
56
57
struct mgn::InputPlatform::InputDevice : mi::InputDevice
59
InputDevice(MirInputDevice const* dev)
60
InputDevice(MirInputDevice* dev, std::function<void()> config_change)
61
: emit_device_change{config_change}
69
void update(MirInputDevice const* dev)
71
void update(MirInputDevice* dev)
71
74
device_id = mir_input_device_get_id(dev);
72
75
device_info.name = mir_input_device_get_name(dev);
73
76
device_info.unique_id = mir_input_device_get_unique_id(dev);
74
77
device_info.capabilities = mi::DeviceCapabilities(mir_input_device_get_capabilities(dev));
79
auto pointer_config = mir_input_device_get_pointer_config(dev);
80
if (pointer_config && contains(device_info.capabilities, mi::DeviceCapability::pointer))
82
mi::PointerSettings settings;
83
settings.handedness = mir_pointer_config_get_handedness(pointer_config);
84
settings.cursor_acceleration_bias = mir_pointer_config_get_acceleration_bias(pointer_config);
85
settings.acceleration = mir_pointer_config_get_acceleration(pointer_config);
86
settings.horizontal_scroll_scale = mir_pointer_config_get_horizontal_scroll_scale(pointer_config);
87
settings.vertical_scroll_scale = mir_pointer_config_get_vertical_scroll_scale(pointer_config);
89
pointer_settings = settings;
92
auto touchpad_config = mir_input_device_get_touchpad_config(dev);
93
if (touchpad_config && contains(device_info.capabilities, mi::DeviceCapability::touchpad))
95
mi::TouchpadSettings settings;
96
settings.click_mode = mir_touchpad_config_get_click_modes(touchpad_config);
97
settings.scroll_mode = mir_touchpad_config_get_scroll_modes(touchpad_config);
98
settings.button_down_scroll_button = mir_touchpad_config_get_button_down_scroll_button(touchpad_config);
99
settings.tap_to_click = mir_touchpad_config_get_tap_to_click(touchpad_config);
100
settings.disable_while_typing = mir_touchpad_config_get_disable_while_typing(touchpad_config);
101
settings.disable_with_mouse = mir_touchpad_config_get_disable_with_mouse(touchpad_config);
102
settings.middle_mouse_button_emulation = mir_touchpad_config_get_middle_mouse_button_emulation(touchpad_config);
104
touchpad_settings = settings;
107
auto touchscreen_config = mir_input_device_get_touchscreen_config(dev);
108
if (touchscreen_config && contains(device_info.capabilities, mi::DeviceCapability::touchscreen))
110
mi::TouchscreenSettings settings;
111
settings.output_id = mir_touchscreen_config_get_output_id(touchscreen_config);
112
settings.mapping_mode = mir_touchscreen_config_get_mapping_mode(touchscreen_config);
114
touchscreen_settings = settings;
77
118
void start(mi::InputSink* destination, mi::EventBuilder* builder) override
163
204
return pointer_settings;
166
void apply_settings(mi::PointerSettings const&) override
207
void apply_settings(mi::PointerSettings const& new_settings) override
168
// TODO no C API for that
209
if (pointer_settings.is_set() && pointer_settings.value() == new_settings)
212
auto ptr_conf = mir_input_device_get_mutable_pointer_config(device);
216
mir_pointer_config_set_acceleration(ptr_conf, new_settings.acceleration);
217
mir_pointer_config_set_acceleration_bias(ptr_conf, new_settings.cursor_acceleration_bias);
218
mir_pointer_config_set_handedness(ptr_conf, new_settings.handedness);
219
mir_pointer_config_set_vertical_scroll_scale(ptr_conf, new_settings.vertical_scroll_scale);
220
mir_pointer_config_set_horizontal_scroll_scale(ptr_conf, new_settings.horizontal_scroll_scale);
222
emit_device_change();
171
226
mir::optional_value<mi::TouchpadSettings> get_touchpad_settings() const override
173
228
return touchpad_settings;
176
void apply_settings(mi::TouchpadSettings const&) override
231
void apply_settings(mi::TouchpadSettings const& new_settings) override
233
if (touchpad_settings.is_set() && touchpad_settings.value() == new_settings)
236
auto tpd_conf = mir_input_device_get_mutable_touchpad_config(device);
240
mir_touchpad_config_set_click_modes(tpd_conf, new_settings.click_mode);
241
mir_touchpad_config_set_scroll_modes(tpd_conf, new_settings.scroll_mode);
242
mir_touchpad_config_set_button_down_scroll_button(tpd_conf, new_settings.button_down_scroll_button);
243
mir_touchpad_config_set_tap_to_click(tpd_conf, new_settings.tap_to_click);
244
mir_touchpad_config_set_disable_with_mouse(tpd_conf, new_settings.disable_with_mouse);
245
mir_touchpad_config_set_disable_while_typing(tpd_conf, new_settings.disable_while_typing);
246
mir_touchpad_config_set_middle_mouse_button_emulation(tpd_conf, new_settings.middle_mouse_button_emulation);
248
emit_device_change();
252
mir::optional_value<mi::TouchscreenSettings> get_touchscreen_settings() const override
254
return touchscreen_settings;
257
void apply_settings(mi::TouchscreenSettings const& new_settings) override
259
if (touchscreen_settings.is_set() && touchscreen_settings.value() == new_settings)
262
auto ts_conf = mir_input_device_get_mutable_touchscreen_config(device);
266
mir_touchscreen_config_set_output_id(ts_conf, new_settings.output_id);
267
mir_touchscreen_config_set_mapping_mode(ts_conf, new_settings.mapping_mode);
269
emit_device_change();
181
273
MirInputDeviceId device_id;
274
MirInputDevice* device{nullptr};
182
275
mi::InputSink* destination{nullptr};
183
276
mi::EventBuilder* builder{nullptr};
184
277
mi::InputDeviceInfo device_info;
185
278
mir::optional_value<mi::PointerSettings> pointer_settings;
186
279
mir::optional_value<mi::TouchpadSettings> touchpad_settings;
280
mir::optional_value<mi::TouchscreenSettings> touchscreen_settings;
281
std::function<void()> emit_device_change;
301
398
auto config_ptr = input_config.get();
302
399
for (size_t i = 0, e = mir_input_config_device_count(config_ptr); i!=e; ++i)
304
auto dev = mir_input_config_get_device(config_ptr, i);
401
auto dev = mir_input_config_get_mutable_device(config_ptr, i);
305
402
auto const id = mir_input_device_get_id(dev);
306
403
auto it = deleted.find(id);
307
404
if (it != end(deleted))
315
new_devs.emplace_back(std::make_shared<InputDevice>(dev), id);
412
new_devs.emplace_back(
413
std::make_shared<InputDevice>(dev, [this]() { config_changed(); }),
316
415
devices[id] = new_devs.back().first;
336
435
unknown_device_events.clear();
438
void mgn::InputPlatform::config_changed()
442
connection->apply_input_configuration(input_config.get());
450
void mgn::InputPlatform::pause_for_config()
455
void mgn::InputPlatform::continue_after_config()
459
connection->apply_input_configuration(input_config.get());