Skip to content

Commit 2b33f58

Browse files
authored
Merge pull request #50 from WebPlatformForEmbedded/development/METROL-79
Added Thunder to WPE Key Mapping module
2 parents 4e9a79d + 9cbc3b1 commit 2b33f58

File tree

3 files changed

+252
-35
lines changed

3 files changed

+252
-35
lines changed

src/input/KeyMapper/KeyMapperWpe.h

Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
#pragma once
2+
3+
#include <linux/input.h>
4+
#include <wpe/wpe.h>
5+
6+
namespace WPE {
7+
8+
class KeyMapper {
9+
public:
10+
KeyMapper(const KeyMapper&) = delete;
11+
KeyMapper& operator=(const KeyMapper&) = delete;
12+
KeyMapper() = default;
13+
~KeyMapper() = default;
14+
15+
public:
16+
static uint32_t KeyCodeToWpeKey(uint16_t code)
17+
{
18+
uint32_t keyCode = 0;
19+
switch (code) {
20+
case KEY_BACKSPACE:
21+
keyCode = WPE_KEY_BackSpace;
22+
break;
23+
case KEY_DELETE:
24+
keyCode = WPE_KEY_Delete;
25+
break;
26+
case KEY_TAB:
27+
keyCode = WPE_KEY_Tab;
28+
break;
29+
case KEY_LINEFEED:
30+
case KEY_ENTER:
31+
case KEY_KPENTER:
32+
keyCode = WPE_KEY_Return;
33+
break;
34+
case KEY_CLEAR:
35+
keyCode = WPE_KEY_Clear;
36+
break;
37+
case KEY_SPACE:
38+
keyCode = WPE_KEY_space;
39+
break;
40+
case KEY_HOME:
41+
keyCode = WPE_KEY_Home;
42+
break;
43+
case KEY_END:
44+
keyCode = WPE_KEY_End;
45+
break;
46+
case KEY_PAGEUP:
47+
keyCode = WPE_KEY_Prior;
48+
break;
49+
case KEY_PAGEDOWN:
50+
keyCode = WPE_KEY_Next;
51+
break;
52+
case KEY_LEFT:
53+
keyCode = WPE_KEY_Left;
54+
break;
55+
case KEY_RIGHT:
56+
keyCode = WPE_KEY_Right;
57+
break;
58+
case KEY_DOWN:
59+
keyCode = WPE_KEY_Down;
60+
break;
61+
case KEY_UP:
62+
keyCode = WPE_KEY_Up;
63+
break;
64+
case KEY_ESC:
65+
keyCode = WPE_KEY_Escape;
66+
break;
67+
case KEY_A:
68+
keyCode = WPE_KEY_a;
69+
break;
70+
case KEY_B:
71+
keyCode = WPE_KEY_b;
72+
break;
73+
case KEY_C:
74+
keyCode = WPE_KEY_c;
75+
break;
76+
case KEY_D:
77+
keyCode = WPE_KEY_d;
78+
break;
79+
case KEY_E:
80+
keyCode = WPE_KEY_e;
81+
break;
82+
case KEY_F:
83+
keyCode = WPE_KEY_f;
84+
break;
85+
case KEY_G:
86+
keyCode = WPE_KEY_g;
87+
break;
88+
case KEY_H:
89+
keyCode = WPE_KEY_h;
90+
break;
91+
case KEY_I:
92+
keyCode = WPE_KEY_i;
93+
break;
94+
case KEY_J:
95+
keyCode = WPE_KEY_j;
96+
break;
97+
case KEY_K:
98+
keyCode = WPE_KEY_k;
99+
break;
100+
case KEY_L:
101+
keyCode = WPE_KEY_l;
102+
break;
103+
case KEY_M:
104+
keyCode = WPE_KEY_m;
105+
break;
106+
case KEY_N:
107+
keyCode = WPE_KEY_n;
108+
break;
109+
case KEY_O:
110+
keyCode = WPE_KEY_o;
111+
break;
112+
case KEY_P:
113+
keyCode = WPE_KEY_p;
114+
break;
115+
case KEY_Q:
116+
keyCode = WPE_KEY_q;
117+
break;
118+
case KEY_R:
119+
keyCode = WPE_KEY_r;
120+
break;
121+
case KEY_S:
122+
keyCode = WPE_KEY_s;
123+
break;
124+
case KEY_T:
125+
keyCode = WPE_KEY_t;
126+
break;
127+
case KEY_U:
128+
keyCode = WPE_KEY_u;
129+
break;
130+
case KEY_V:
131+
keyCode = WPE_KEY_v;
132+
break;
133+
case KEY_W:
134+
keyCode = WPE_KEY_w;
135+
break;
136+
case KEY_X:
137+
keyCode = WPE_KEY_x;
138+
break;
139+
case KEY_Y:
140+
keyCode = WPE_KEY_y;
141+
break;
142+
case KEY_Z:
143+
keyCode = WPE_KEY_z;
144+
break;
145+
146+
case KEY_0:
147+
keyCode = WPE_KEY_0;
148+
break;
149+
case KEY_1:
150+
keyCode = WPE_KEY_1;
151+
break;
152+
case KEY_2:
153+
keyCode = WPE_KEY_2;
154+
break;
155+
case KEY_3:
156+
keyCode = WPE_KEY_3;
157+
break;
158+
case KEY_4:
159+
keyCode = WPE_KEY_4;
160+
break;
161+
case KEY_5:
162+
keyCode = WPE_KEY_5;
163+
break;
164+
case KEY_6:
165+
keyCode = WPE_KEY_6;
166+
break;
167+
case KEY_7:
168+
keyCode = WPE_KEY_7;
169+
break;
170+
case KEY_8:
171+
keyCode = WPE_KEY_8;
172+
break;
173+
case KEY_9:
174+
keyCode = WPE_KEY_9;
175+
break;
176+
177+
case KEY_MINUS:
178+
keyCode = WPE_KEY_minus;
179+
break;
180+
case KEY_EQUAL:
181+
keyCode = WPE_KEY_equal;
182+
break;
183+
case KEY_SEMICOLON:
184+
keyCode = WPE_KEY_semicolon;
185+
break;
186+
case KEY_APOSTROPHE:
187+
keyCode = WPE_KEY_apostrophe;
188+
break;
189+
case KEY_COMMA:
190+
keyCode = WPE_KEY_comma;
191+
break;
192+
case KEY_DOT:
193+
keyCode = WPE_KEY_period;
194+
break;
195+
case KEY_SLASH:
196+
keyCode = WPE_KEY_slash;
197+
break;
198+
case KEY_BACKSLASH:
199+
keyCode = WPE_KEY_backslash;
200+
break;
201+
case KEY_CAPSLOCK:
202+
keyCode = WPE_KEY_Caps_Lock;
203+
break;
204+
205+
case KEY_RED:
206+
keyCode = WPE_KEY_Red;
207+
break;
208+
case KEY_GREEN:
209+
keyCode = WPE_KEY_Green;
210+
break;
211+
case KEY_YELLOW:
212+
keyCode = WPE_KEY_Yellow;
213+
break;
214+
case KEY_BLUE:
215+
keyCode = WPE_KEY_Blue;
216+
break;
217+
218+
case KEY_NUMERIC_POUND:
219+
keyCode = WPE_KEY_sterling;
220+
break;
221+
case KEY_EURO:
222+
keyCode = WPE_KEY_EuroSign;
223+
break;
224+
225+
default:
226+
break;
227+
}
228+
return keyCode;
229+
}
230+
};
231+
}

src/wpeframework/display.cpp

Lines changed: 18 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "display.h"
2828
#include <cstring>
2929
#include <chrono>
30+
#include <KeyMapper/KeyMapperWpe.h>
3031

3132
namespace WPEFramework {
3233

@@ -108,12 +109,9 @@ void KeyboardHandler::RepeatDelayTimeout() {
108109
}
109110

110111
void KeyboardHandler::HandleKeyEvent(const uint32_t key, const IKeyboard::state action, const uint32_t time) {
111-
uint32_t keysym = wpe_input_xkb_context_get_key_code(wpe_input_xkb_context_get_default(), key, action == IKeyboard::pressed);
112-
if (!keysym)
113-
return;
114112

115113
// Send the event, it is complete..
116-
_callback->Key(action == IKeyboard::pressed, keysym, key, _modifiers, time);
114+
_callback->Key(action == IKeyboard::pressed, WPE::KeyMapper::KeyCodeToWpeKey(key), key, _modifiers, time);
117115
}
118116

119117
/* virtual */ void KeyboardHandler::Direct(const uint32_t key, const Compositor::IDisplay::IKeyboard::state action)
@@ -122,38 +120,35 @@ void KeyboardHandler::HandleKeyEvent(const uint32_t key, const IKeyboard::state
122120
}
123121

124122
/* virtual */ void KeyboardHandler::KeyMap(const char information[], const uint16_t size) {
125-
auto* xkb = wpe_input_xkb_context_get_default();
126-
auto* keymap = xkb_keymap_new_from_string(wpe_input_xkb_context_get_context(xkb), information, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS);
127-
wpe_input_xkb_context_set_keymap(xkb, keymap);
128-
xkb_keymap_unref(keymap);
129123
}
130124

131125
/* virtual */ void KeyboardHandler::Key(const uint32_t key, const IKeyboard::state action, const uint32_t time) {
132126
// IDK.
133-
uint32_t actual_key = key + 8;
134-
HandleKeyEvent(actual_key, action, time);
135-
136-
auto* keymap = wpe_input_xkb_context_get_keymap(wpe_input_xkb_context_get_default());
127+
HandleKeyEvent(key, action, time);
137128

138129
if (_repeatInfo.rate != 0) {
139-
if (action == IKeyboard::released && _repeatData.key == actual_key) {
130+
if (action == IKeyboard::released && _repeatData.key == key) {
140131
if (_repeatData.eventSource)
141132
g_source_remove(_repeatData.eventSource);
142133
_repeatData = { 0, 0, IKeyboard::released, 0 };
143134
}
144-
else if (action == IKeyboard::pressed
145-
&& keymap && xkb_keymap_key_repeats(keymap, actual_key)) {
146-
147-
if (_repeatData.eventSource)
148-
g_source_remove(_repeatData.eventSource);
149-
150-
_repeatData = { actual_key, time, action, g_timeout_add(_repeatInfo.delay, static_cast<GSourceFunc>(repeatDelayTimeout), this) };
135+
else if (action == IKeyboard::pressed) {
136+
// TODO: add code to handle repeat key
151137
}
152138
}
153139
}
154140

155141
/* virtual */ void KeyboardHandler::Modifiers(uint32_t depressedMods, uint32_t latchedMods, uint32_t lockedMods, uint32_t group) {
156-
_modifiers = wpe_input_xkb_context_get_modifiers(wpe_input_xkb_context_get_default(), depressedMods, latchedMods, lockedMods, group);
142+
unsigned int modifiers = 0;
143+
144+
if (depressedMods & 1)
145+
modifiers |= wpe_input_keyboard_modifier_shift;
146+
if (depressedMods & 4)
147+
modifiers |= wpe_input_keyboard_modifier_control;
148+
if (depressedMods & 8)
149+
modifiers |= wpe_input_keyboard_modifier_alt;
150+
151+
_modifiers = modifiers;
157152
}
158153

159154
/* virtual */ void KeyboardHandler::Repeat(int32_t rate, int32_t delay) {
@@ -260,19 +255,8 @@ Display::~Display()
260255

261256
/* virtual */ void Display::Key (const uint32_t keycode, const Compositor::IDisplay::IKeyboard::state actions) {
262257
uint32_t actual_key = keycode + 8;
263-
264-
auto* xkb = wpe_input_xkb_context_get_default();
265-
uint32_t keysym = wpe_input_xkb_context_get_key_code(xkb, actual_key, !!actions);
266-
if (!keysym)
267-
return;
268-
auto* xkbState = wpe_input_xkb_context_get_state(xkb);
269-
xkb_state_update_key(xkbState, actual_key, !!actions ? XKB_KEY_DOWN : XKB_KEY_UP);
270-
uint32_t modifiers = wpe_input_xkb_context_get_modifiers(xkb,
271-
xkb_state_serialize_mods(xkbState, XKB_STATE_MODS_DEPRESSED),
272-
xkb_state_serialize_mods(xkbState, XKB_STATE_MODS_LATCHED),
273-
xkb_state_serialize_mods(xkbState, XKB_STATE_MODS_LOCKED),
274-
xkb_state_serialize_layout(xkbState, XKB_STATE_LAYOUT_EFFECTIVE));
275-
struct wpe_input_keyboard_event event{ TimeNow(), keysym, actual_key, !!actions, modifiers };
258+
uint32_t modifiers = 0;
259+
struct wpe_input_keyboard_event event{ TimeNow(), WPE::KeyMapper::KeyCodeToWpeKey(keycode), actual_key, !!actions, modifiers };
276260
IPC::Message message;
277261
message.messageCode = MsgType::KEYBOARD;
278262
std::memcpy(message.messageData, &event, sizeof(event));

src/wpeframework/display.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ class KeyboardHandler : public Compositor::IDisplay::IKeyboard
5959
};
6060

6161
public:
62-
KeyboardHandler (IKeyHandler* callback) : _callback(callback) {
62+
KeyboardHandler (IKeyHandler* callback)
63+
: _callback(callback)
64+
, _modifiers(0) {
6365
}
6466
virtual ~KeyboardHandler() {
6567
}

0 commit comments

Comments
 (0)