~mir-team/mir/0.15

« back to all changes in this revision

Viewing changes to tests/mir_test_framework/fake_input_device_impl.cpp

Move modifier tracking and utilities to the soon existing evdev platform
  
The evdev input platform will require the same tracking logic like the fake input devices, hence this moves the code out of test into src/platforms/evdev.

Approved by Alan Griffiths, PS Jenkins bot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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"
28
29
 
29
30
#include "boost/throw_exception.hpp"
30
 
#include "linux/input.h"
31
31
 
32
32
#include "mir/events/event_builders.h"
33
33
 
34
34
#include <chrono>
35
35
 
36
36
namespace mi = mir::input;
 
37
namespace mie = mi::evdev;
37
38
namespace md = mir::dispatch;
38
39
namespace mtf = mir_test_framework;
39
40
 
40
41
namespace
41
42
{
42
43
const int64_t device_id_unknown = 0;
43
 
 
44
 
MirPointerButton to_pointer_button(int button)
45
 
{
46
 
    switch(button)
47
 
    {
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;
53
 
    }
54
 
    BOOST_THROW_EXCEPTION(std::runtime_error("Invalid mouse button"));
55
 
}
56
 
 
57
 
uint32_t to_modifier(int32_t scan_code)
58
 
{
59
 
    switch(scan_code)
60
 
    {
61
 
    case KEY_LEFTALT:
62
 
        return mir_input_event_modifier_alt_left;
63
 
    case KEY_RIGHTALT:
64
 
        return mir_input_event_modifier_alt_right;
65
 
    case KEY_RIGHTCTRL:
66
 
        return mir_input_event_modifier_ctrl_right;
67
 
    case KEY_LEFTCTRL:
68
 
        return mir_input_event_modifier_ctrl_left;
69
 
    case KEY_CAPSLOCK:
70
 
        return mir_input_event_modifier_caps_lock;
71
 
    case KEY_LEFTMETA:
72
 
        return mir_input_event_modifier_meta_left;
73
 
    case KEY_RIGHTMETA:
74
 
        return mir_input_event_modifier_meta_right;
75
 
    case KEY_SCROLLLOCK:
76
 
        return mir_input_event_modifier_scroll_lock;
77
 
    case KEY_NUMLOCK:
78
 
        return mir_input_event_modifier_num_lock;
79
 
    case KEY_LEFTSHIFT:
80
 
        return mir_input_event_modifier_shift_left;
81
 
    case KEY_RIGHTSHIFT:
82
 
        return mir_input_event_modifier_shift_right;
83
 
    default:
84
 
        return mir_input_event_modifier_none;
85
 
    }
86
 
}
87
 
 
88
 
uint32_t expand_modifier(uint32_t modifiers)
89
 
{
90
 
    if ((modifiers & mir_input_event_modifier_alt_left) || (modifiers & mir_input_event_modifier_alt_right))
91
 
        modifiers |= mir_input_event_modifier_alt;
92
 
 
93
 
    if ((modifiers & mir_input_event_modifier_ctrl_left) || (modifiers & mir_input_event_modifier_ctrl_right))
94
 
        modifiers |= mir_input_event_modifier_ctrl;
95
 
 
96
 
    if ((modifiers & mir_input_event_modifier_shift_left) || (modifiers & mir_input_event_modifier_shift_right))
97
 
        modifiers |= mir_input_event_modifier_shift;
98
 
 
99
 
    if ((modifiers & mir_input_event_modifier_meta_left) || (modifiers & mir_input_event_modifier_meta_right))
100
 
        modifiers |= mir_input_event_modifier_meta;
101
 
 
102
 
    return modifiers;
103
 
}
104
 
 
105
44
}
106
45
 
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;
168
107
 
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);
172
111
 
173
112
    if (key_params.action == synthesis::EventAction::Down)
174
 
        modifiers |= to_modifier(key_params.scancode);
 
113
        modifiers |= mie::to_modifier(key_params.scancode);
175
114
    else
176
 
        modifiers &= ~to_modifier(key_params.scancode);
 
115
        modifiers &= ~mie::to_modifier(key_params.scancode);
177
116
 
178
117
    if (!sink)
179
118
        BOOST_THROW_EXCEPTION(std::runtime_error("Device is not started."));
184
123
{
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,
190
129
                                                event_time,
191
130
                                                event_modifiers,
222
161
 
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,
228
167
                                                 event_time,
252
191
 
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);
256
195
 
257
196
    auto touch_event = mir::events::make_event(device_id_unknown, event_time, event_modifiers);
258
197