MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
Wayland/KeyMapping.cpp
Go to the documentation of this file.
1#include "KeyMapping.hpp"
2
3#ifdef MAYAFLUX_PLATFORM_LINUX
4
5namespace MayaFlux::Core {
6
7// ============================================================================
8// from_xkb_keysym
9// ============================================================================
10
11IO::Keys from_xkb_keysym(xkb_keysym_t sym) noexcept
12{
13 if (sym >= 0x0020 && sym <= 0x007e) {
14 if (sym >= 'a' && sym <= 'z')
15 sym -= 32;
16 return static_cast<IO::Keys>(static_cast<int16_t>(sym));
17 }
18
19 switch (sym) {
20 case XKB_KEY_Escape:
21 return IO::Keys::Escape;
22 case XKB_KEY_Return:
23 return IO::Keys::Enter;
24 case XKB_KEY_Tab:
25 return IO::Keys::Tab;
26 case XKB_KEY_BackSpace:
28 case XKB_KEY_Insert:
29 return IO::Keys::Insert;
30 case XKB_KEY_Delete:
31 return IO::Keys::Delete;
32
33 case XKB_KEY_Right:
34 return IO::Keys::Right;
35 case XKB_KEY_Left:
36 return IO::Keys::Left;
37 case XKB_KEY_Down:
38 return IO::Keys::Down;
39 case XKB_KEY_Up:
40 return IO::Keys::Up;
41
42 case XKB_KEY_Page_Up:
43 return IO::Keys::PageUp;
44 case XKB_KEY_Page_Down:
45 return IO::Keys::PageDown;
46 case XKB_KEY_Home:
47 return IO::Keys::Home;
48 case XKB_KEY_End:
49 return IO::Keys::End;
50
51 case XKB_KEY_Caps_Lock:
52 return IO::Keys::CapsLock;
53 case XKB_KEY_Scroll_Lock:
55 case XKB_KEY_Num_Lock:
56 return IO::Keys::NumLock;
57 case XKB_KEY_Print:
59 case XKB_KEY_Pause:
60 return IO::Keys::Pause;
61
62 case XKB_KEY_F1:
63 return IO::Keys::F1;
64 case XKB_KEY_F2:
65 return IO::Keys::F2;
66 case XKB_KEY_F3:
67 return IO::Keys::F3;
68 case XKB_KEY_F4:
69 return IO::Keys::F4;
70 case XKB_KEY_F5:
71 return IO::Keys::F5;
72 case XKB_KEY_F6:
73 return IO::Keys::F6;
74 case XKB_KEY_F7:
75 return IO::Keys::F7;
76 case XKB_KEY_F8:
77 return IO::Keys::F8;
78 case XKB_KEY_F9:
79 return IO::Keys::F9;
80 case XKB_KEY_F10:
81 return IO::Keys::F10;
82 case XKB_KEY_F11:
83 return IO::Keys::F11;
84 case XKB_KEY_F12:
85 return IO::Keys::F12;
86 case XKB_KEY_F13:
87 return IO::Keys::F13;
88 case XKB_KEY_F14:
89 return IO::Keys::F14;
90 case XKB_KEY_F15:
91 return IO::Keys::F15;
92 case XKB_KEY_F16:
93 return IO::Keys::F16;
94 case XKB_KEY_F17:
95 return IO::Keys::F17;
96 case XKB_KEY_F18:
97 return IO::Keys::F18;
98 case XKB_KEY_F19:
99 return IO::Keys::F19;
100 case XKB_KEY_F20:
101 return IO::Keys::F20;
102 case XKB_KEY_F21:
103 return IO::Keys::F21;
104 case XKB_KEY_F22:
105 return IO::Keys::F22;
106 case XKB_KEY_F23:
107 return IO::Keys::F23;
108 case XKB_KEY_F24:
109 return IO::Keys::F24;
110 case XKB_KEY_F25:
111 return IO::Keys::F25;
112
113 case XKB_KEY_KP_0:
114 return IO::Keys::KP0;
115 case XKB_KEY_KP_1:
116 return IO::Keys::KP1;
117 case XKB_KEY_KP_2:
118 return IO::Keys::KP2;
119 case XKB_KEY_KP_3:
120 return IO::Keys::KP3;
121 case XKB_KEY_KP_4:
122 return IO::Keys::KP4;
123 case XKB_KEY_KP_5:
124 return IO::Keys::KP5;
125 case XKB_KEY_KP_6:
126 return IO::Keys::KP6;
127 case XKB_KEY_KP_7:
128 return IO::Keys::KP7;
129 case XKB_KEY_KP_8:
130 return IO::Keys::KP8;
131 case XKB_KEY_KP_9:
132 return IO::Keys::KP9;
133 case XKB_KEY_KP_Decimal:
134 return IO::Keys::KPDecimal;
135 case XKB_KEY_KP_Divide:
136 return IO::Keys::KPDivide;
137 case XKB_KEY_KP_Multiply:
139 case XKB_KEY_KP_Subtract:
141 case XKB_KEY_KP_Add:
142 return IO::Keys::KPAdd;
143 case XKB_KEY_KP_Enter:
144 return IO::Keys::KPEnter;
145 case XKB_KEY_KP_Equal:
146 return IO::Keys::KPEqual;
147
148 case XKB_KEY_Shift_L:
149 return IO::Keys::LShift;
150 case XKB_KEY_Control_L:
151 return IO::Keys::LCtrl;
152 case XKB_KEY_Alt_L:
153 return IO::Keys::LAlt;
154 case XKB_KEY_Super_L:
155 return IO::Keys::LSuper;
156 case XKB_KEY_Shift_R:
157 return IO::Keys::RShift;
158 case XKB_KEY_Control_R:
159 return IO::Keys::RCtrl;
160 case XKB_KEY_Alt_R:
161 return IO::Keys::RAlt;
162 case XKB_KEY_Super_R:
163 return IO::Keys::RSuper;
164 case XKB_KEY_Menu:
165 return IO::Keys::Menu;
166
167 default:
168 return IO::Keys::Unknown;
169 }
170}
171
172// ============================================================================
173// to_xkb_keysym
174// ============================================================================
175
176xkb_keysym_t to_xkb_keysym(IO::Keys key) noexcept
177{
178 int k = static_cast<int>(key);
179
180 if (k >= 0x0020 && k <= 0x007e)
181 return static_cast<xkb_keysym_t>(k);
182
183 using K = IO::Keys;
184 switch (key) {
185 case K::Escape:
186 return XKB_KEY_Escape;
187 case K::Enter:
188 return XKB_KEY_Return;
189 case K::Tab:
190 return XKB_KEY_Tab;
191 case K::Backspace:
192 return XKB_KEY_BackSpace;
193 case K::Insert:
194 return XKB_KEY_Insert;
195 case K::Delete:
196 return XKB_KEY_Delete;
197
198 case K::Right:
199 return XKB_KEY_Right;
200 case K::Left:
201 return XKB_KEY_Left;
202 case K::Down:
203 return XKB_KEY_Down;
204 case K::Up:
205 return XKB_KEY_Up;
206
207 case K::PageUp:
208 return XKB_KEY_Page_Up;
209 case K::PageDown:
210 return XKB_KEY_Page_Down;
211 case K::Home:
212 return XKB_KEY_Home;
213 case K::End:
214 return XKB_KEY_End;
215
216 case K::CapsLock:
217 return XKB_KEY_Caps_Lock;
218 case K::ScrollLock:
219 return XKB_KEY_Scroll_Lock;
220 case K::NumLock:
221 return XKB_KEY_Num_Lock;
222 case K::PrintScreen:
223 return XKB_KEY_Print;
224 case K::Pause:
225 return XKB_KEY_Pause;
226
227 case K::F1:
228 return XKB_KEY_F1;
229 case K::F2:
230 return XKB_KEY_F2;
231 case K::F3:
232 return XKB_KEY_F3;
233 case K::F4:
234 return XKB_KEY_F4;
235 case K::F5:
236 return XKB_KEY_F5;
237 case K::F6:
238 return XKB_KEY_F6;
239 case K::F7:
240 return XKB_KEY_F7;
241 case K::F8:
242 return XKB_KEY_F8;
243 case K::F9:
244 return XKB_KEY_F9;
245 case K::F10:
246 return XKB_KEY_F10;
247 case K::F11:
248 return XKB_KEY_F11;
249 case K::F12:
250 return XKB_KEY_F12;
251 case K::F13:
252 return XKB_KEY_F13;
253 case K::F14:
254 return XKB_KEY_F14;
255 case K::F15:
256 return XKB_KEY_F15;
257 case K::F16:
258 return XKB_KEY_F16;
259 case K::F17:
260 return XKB_KEY_F17;
261 case K::F18:
262 return XKB_KEY_F18;
263 case K::F19:
264 return XKB_KEY_F19;
265 case K::F20:
266 return XKB_KEY_F20;
267 case K::F21:
268 return XKB_KEY_F21;
269 case K::F22:
270 return XKB_KEY_F22;
271 case K::F23:
272 return XKB_KEY_F23;
273 case K::F24:
274 return XKB_KEY_F24;
275 case K::F25:
276 return XKB_KEY_F25;
277
278 case K::KP0:
279 return XKB_KEY_KP_0;
280 case K::KP1:
281 return XKB_KEY_KP_1;
282 case K::KP2:
283 return XKB_KEY_KP_2;
284 case K::KP3:
285 return XKB_KEY_KP_3;
286 case K::KP4:
287 return XKB_KEY_KP_4;
288 case K::KP5:
289 return XKB_KEY_KP_5;
290 case K::KP6:
291 return XKB_KEY_KP_6;
292 case K::KP7:
293 return XKB_KEY_KP_7;
294 case K::KP8:
295 return XKB_KEY_KP_8;
296 case K::KP9:
297 return XKB_KEY_KP_9;
298 case K::KPDecimal:
299 return XKB_KEY_KP_Decimal;
300 case K::KPDivide:
301 return XKB_KEY_KP_Divide;
302 case K::KPMultiply:
303 return XKB_KEY_KP_Multiply;
304 case K::KPSubtract:
305 return XKB_KEY_KP_Subtract;
306 case K::KPAdd:
307 return XKB_KEY_KP_Add;
308 case K::KPEnter:
309 return XKB_KEY_KP_Enter;
310 case K::KPEqual:
311 return XKB_KEY_KP_Equal;
312
313 case K::LShift:
314 return XKB_KEY_Shift_L;
315 case K::LCtrl:
316 return XKB_KEY_Control_L;
317 case K::LAlt:
318 return XKB_KEY_Alt_L;
319 case K::LSuper:
320 return XKB_KEY_Super_L;
321 case K::RShift:
322 return XKB_KEY_Shift_R;
323 case K::RCtrl:
324 return XKB_KEY_Control_R;
325 case K::RAlt:
326 return XKB_KEY_Alt_R;
327 case K::RSuper:
328 return XKB_KEY_Super_R;
329 case K::Menu:
330 return XKB_KEY_Menu;
331
332 default:
333 return XKB_KEY_NoSymbol;
334 }
335}
336
337// ============================================================================
338// is_valid_xkb_keysym
339// ============================================================================
340
341bool is_valid_xkb_keysym(xkb_keysym_t sym) noexcept
342{
343 if (sym == XKB_KEY_NoSymbol)
344 return false;
345 return from_xkb_keysym(sym) != IO::Keys::Unknown;
346}
347
348IO::Keys from_evdev_scancode(uint32_t scancode) noexcept
349{
350 switch (scancode) {
351 case 71:
352 return IO::Keys::KP7;
353 case 72:
354 return IO::Keys::KP8;
355 case 73:
356 return IO::Keys::KP9;
357 case 75:
358 return IO::Keys::KP4;
359 case 76:
360 return IO::Keys::KP5;
361 case 77:
362 return IO::Keys::KP6;
363 case 79:
364 return IO::Keys::KP1;
365 case 80:
366 return IO::Keys::KP2;
367 case 81:
368 return IO::Keys::KP3;
369 case 82:
370 return IO::Keys::KP0;
371 case 83:
372 return IO::Keys::KPDecimal;
373 case 98:
374 return IO::Keys::KPDivide;
375 case 55:
377 case 74:
379 case 78:
380 return IO::Keys::KPAdd;
381 case 96:
382 return IO::Keys::KPEnter;
383 case 117:
384 return IO::Keys::KPEqual;
385 default:
386 return IO::Keys::Unknown;
387 }
388}
389
390} // namespace MayaFlux::Core
391
392#endif // MAYAFLUX_PLATFORM_LINUX