1 #if defined(__linux__)
2  #include <linux/input-event-codes.h>
3 #elif defined(__DragonFly__)
4  #include <dev/misc/evdev/input-event-codes.h>
5 #elif defined(__FreeBSD__)
6  #include <dev/evdev/input-event-codes.h>
7 #endif
8 #include <rfb/keysym.h>
9 #include <stdlib.h>
10 #include <limits.h>
11 #include <Ecore_Input.h>
12 
13 static const char *_ecore_fb_li_kbd_syms[144 * 7] =
14 {
15 #include "ecore_fb_keytable.h"
16 };
17 
18 #include "ecore_evas_vnc_server_fb_keymap.h"
19 
20 static unsigned int
_x11_to_fb(rfbKeySym key,unsigned int * offset)21 _x11_to_fb(rfbKeySym key, unsigned int *offset)
22 {
23    switch (key)
24      {
25       case XK_Num_Lock:
26          return KEY_NUMLOCK;
27       case XK_KP_Delete:
28          return KEY_DELETE;
29       case XK_KP_Equal:
30          return KEY_KPEQUAL;
31       case XK_KP_Multiply:
32          return KEY_KPASTERISK;
33       case XK_KP_Add:
34          return KEY_KPPLUS;
35       case XK_KP_Subtract:
36          return KEY_KPMINUS;
37       case XK_KP_Decimal:
38          return KEY_KPDOT;
39       case XK_KP_Divide:
40          return KEY_KPSLASH;
41       case XK_plus:
42          *offset = 1;
43          EINA_FALLTHROUGH;
44       case XK_equal:
45          return KEY_EQUAL;
46       case XK_underscore:
47          *offset = 1;
48          EINA_FALLTHROUGH;
49       case XK_minus:
50          return KEY_MINUS;
51       case XK_quotedbl:
52          *offset = 1;
53          EINA_FALLTHROUGH;
54       case XK_apostrophe:
55          return KEY_APOSTROPHE;
56       case XK_Shift_L:
57          return KEY_LEFTSHIFT;
58       case XK_Shift_R:
59          return KEY_RIGHTSHIFT;
60       case XK_Control_L:
61          return KEY_LEFTCTRL;
62       case XK_Control_R:
63          return KEY_RIGHTCTRL;
64       case XK_Caps_Lock:
65          return KEY_CAPSLOCK;
66       case XK_Meta_L:
67          return KEY_LEFTMETA;
68       case XK_Meta_R:
69          return KEY_RIGHTMETA;
70       case XK_Alt_L:
71          return KEY_LEFTALT;
72       case XK_Alt_R:
73          return KEY_RIGHTALT;
74       case XK_space:
75          return KEY_SPACE;
76       case XK_period:
77          *offset = 1;
78          EINA_FALLTHROUGH;
79       case XK_greater:
80          return KEY_DOT;
81       case XK_bar:
82          *offset = 1;
83          EINA_FALLTHROUGH;
84       case XK_backslash:
85          return KEY_BACKSLASH;
86       case XK_question:
87          *offset = 1;
88          EINA_FALLTHROUGH;
89       case XK_slash:
90          return KEY_SLASH;
91       case XK_braceleft:
92       case XK_bracketleft:
93          return KEY_LEFTBRACE;
94       case XK_braceright:
95       case XK_bracketright:
96          return KEY_RIGHTBRACE;
97       case XK_colon:
98          *offset = 1;
99          EINA_FALLTHROUGH;
100       case XK_semicolon:
101          return KEY_SEMICOLON;
102       case XK_asciitilde:
103          *offset = 1;
104          EINA_FALLTHROUGH;
105       case XK_grave:
106          return KEY_GRAVE;
107       case XK_less:
108          *offset = 1;
109          EINA_FALLTHROUGH;
110       case XK_comma:
111          return KEY_COMMA;
112       case XK_F1:
113          return KEY_F1;
114       case XK_F2:
115          return KEY_F2;
116        case XK_F3:
117          return KEY_F3;
118       case XK_F4:
119          return KEY_F4;
120       case XK_F5:
121          return KEY_F5;
122       case XK_F6:
123          return KEY_F6;
124       case XK_F7:
125          return KEY_F7;
126       case XK_F8:
127          return KEY_F8;
128       case XK_F9:
129          return KEY_F9;
130       case XK_F10:
131          return KEY_F10;
132       case XK_F11:
133          return KEY_F11;
134       case XK_F12:
135          return KEY_F12;
136       case XK_BackSpace:
137          return KEY_BACKSPACE;
138       case XK_Tab:
139          return KEY_TAB;
140       case XK_Return:
141          return KEY_ENTER;
142       case XK_Pause:
143          return KEY_PAUSE;
144       case XK_Escape:
145          return KEY_ESC;
146       case XK_Delete:
147          return KEY_DELETE;
148       case XK_Linefeed:
149          return KEY_LINEFEED;
150       case XK_Scroll_Lock:
151          return KEY_SCROLLLOCK;
152       case XK_Sys_Req:
153          return KEY_SYSRQ;
154       case XK_Home:
155          return KEY_HOME;
156       case XK_Left:
157          return KEY_LEFT;
158       case XK_Up:
159          return KEY_UP;
160       case XK_Right:
161          return KEY_RIGHT;
162       case XK_Down:
163          return KEY_DOWN;
164       case XK_Page_Up:
165          return KEY_PAGEUP;
166       case XK_Page_Down:
167          return KEY_PAGEDOWN;
168       case XK_End:
169          return KEY_END;
170       case XK_KP_0:
171          *offset = 1;
172          EINA_FALLTHROUGH;
173       case XK_KP_Insert:
174          return KEY_KP0;
175       case XK_KP_1:
176          *offset = 1;
177          EINA_FALLTHROUGH;
178       case XK_KP_End:
179          return KEY_KP1;
180       case XK_KP_2:
181          *offset = 1;
182          EINA_FALLTHROUGH;
183       case XK_KP_Down:
184          return KEY_KP2;
185       case XK_KP_3:
186          *offset = 1;
187          EINA_FALLTHROUGH;
188       case XK_KP_Next:
189          return KEY_KP3;
190       case XK_KP_4:
191          *offset = 1;
192          EINA_FALLTHROUGH;
193       case XK_KP_Left:
194          return KEY_KP4;
195       case XK_KP_5:
196          *offset = 1;
197          EINA_FALLTHROUGH;
198       case XK_KP_Begin:
199          return KEY_KP5;
200       case XK_KP_6:
201          *offset = 1;
202          EINA_FALLTHROUGH;
203       case XK_KP_Right:
204          return KEY_KP6;
205       case XK_KP_7:
206          *offset = 1;
207          EINA_FALLTHROUGH;
208       case XK_KP_Home:
209          return KEY_KP7;
210       case XK_KP_8:
211          *offset = 1;
212          EINA_FALLTHROUGH;
213       case XK_KP_Up:
214          return KEY_KP8;
215       case XK_KP_9:
216          *offset = 1;
217          EINA_FALLTHROUGH;
218       case XK_KP_Prior:
219          return KEY_KP9;
220       case XK_KP_Enter:
221          return KEY_KPENTER;
222       case XK_parenright:
223          *offset = 1;
224          EINA_FALLTHROUGH;
225       case XK_0:
226          return KEY_0;
227       case XK_exclam:
228          *offset = 1;
229          EINA_FALLTHROUGH;
230       case XK_1:
231          return KEY_1;
232       case XK_at:
233          *offset = 1;
234          EINA_FALLTHROUGH;
235       case XK_2:
236          return KEY_2;
237       case XK_numbersign:
238          *offset = 1;
239          EINA_FALLTHROUGH;
240       case XK_3:
241          return KEY_3;
242       case XK_dollar:
243          *offset = 1;
244          EINA_FALLTHROUGH;
245       case XK_4:
246          return KEY_4;
247       case XK_percent:
248          *offset = 1;
249          EINA_FALLTHROUGH;
250       case XK_5:
251          return KEY_5;
252       case XK_asciicircum:
253          *offset = 1;
254          EINA_FALLTHROUGH;
255       case XK_6:
256          return KEY_6;
257       case XK_ampersand:
258          *offset = 1;
259          EINA_FALLTHROUGH;
260       case XK_7:
261          return KEY_7;
262       case XK_asterisk:
263          *offset = 1;
264          EINA_FALLTHROUGH;
265       case XK_8:
266          return KEY_8;
267       case XK_parenleft:
268          *offset = 1;
269          EINA_FALLTHROUGH;
270       case XK_9:
271          return KEY_9;
272       case XK_A:
273          *offset = 1;
274          EINA_FALLTHROUGH;
275       case XK_a:
276          return KEY_A;
277       case XK_B:
278          *offset = 1;
279          EINA_FALLTHROUGH;
280       case XK_b:
281          return KEY_B;
282       case XK_C:
283          *offset = 1;
284          EINA_FALLTHROUGH;
285       case XK_c:
286          return KEY_C;
287       case XK_D:
288          *offset = 1;
289          EINA_FALLTHROUGH;
290       case XK_d:
291          return KEY_D;
292       case XK_E:
293          *offset = 1;
294          EINA_FALLTHROUGH;
295       case XK_e:
296          return KEY_E;
297       case XK_F:
298          *offset = 1;
299          EINA_FALLTHROUGH;
300       case XK_f:
301          return KEY_F;
302       case XK_G:
303          *offset = 1;
304          EINA_FALLTHROUGH;
305       case XK_g:
306          return KEY_G;
307       case XK_H:
308          *offset = 1;
309          EINA_FALLTHROUGH;
310       case XK_h:
311          return KEY_H;
312       case XK_I:
313          *offset = 1;
314          EINA_FALLTHROUGH;
315       case XK_i:
316          return KEY_I;
317       case XK_J:
318          *offset = 1;
319          EINA_FALLTHROUGH;
320       case XK_j:
321          return KEY_J;
322       case XK_K:
323          *offset = 1;
324          EINA_FALLTHROUGH;
325       case XK_k:
326          return KEY_K;
327       case XK_L:
328          *offset = 1;
329          EINA_FALLTHROUGH;
330       case XK_l:
331          return KEY_L;
332       case XK_M:
333          *offset = 1;
334          EINA_FALLTHROUGH;
335       case XK_m:
336          return KEY_M;
337       case XK_N:
338          *offset = 1;
339          EINA_FALLTHROUGH;
340       case XK_n:
341          return KEY_N;
342       case XK_O:
343          *offset = 1;
344          EINA_FALLTHROUGH;
345       case XK_o:
346          return KEY_O;
347       case XK_P:
348          *offset = 1;
349          EINA_FALLTHROUGH;
350       case XK_p:
351          return KEY_P;
352       case XK_Q:
353          *offset = 1;
354          EINA_FALLTHROUGH;
355       case XK_q:
356          return KEY_Q;
357       case XK_R:
358          *offset = 1;
359          EINA_FALLTHROUGH;
360       case XK_r:
361          return KEY_R;
362       case XK_S:
363          *offset = 1;
364          EINA_FALLTHROUGH;
365       case XK_s:
366          return KEY_S;
367       case XK_T:
368          *offset = 1;
369          EINA_FALLTHROUGH;
370       case XK_t:
371          return KEY_T;
372       case XK_U:
373          *offset = 1;
374          EINA_FALLTHROUGH;
375       case XK_u:
376          return KEY_U;
377       case XK_V:
378          *offset = 1;
379          EINA_FALLTHROUGH;
380       case XK_v:
381          return KEY_V;
382       case XK_W:
383          *offset = 1;
384          EINA_FALLTHROUGH;
385       case XK_w:
386          return KEY_W;
387       case XK_X:
388          *offset = 1;
389          EINA_FALLTHROUGH;
390       case XK_x:
391          return KEY_X;
392       case XK_Y:
393          *offset = 1;
394          EINA_FALLTHROUGH;
395       case XK_y:
396          return KEY_Y;
397       case XK_Z:
398          *offset = 1;
399          EINA_FALLTHROUGH;
400       case XK_z:
401          return KEY_Z;
402       default:
403          return UINT_MAX;
404      }
405 }
406 
407 Eina_Bool
ecore_evas_vnc_server_keysym_to_fb_translate(rfbKeySym key,const char ** key_name,const char ** key_str,const char ** compose)408 ecore_evas_vnc_server_keysym_to_fb_translate(rfbKeySym key,
409                                              const char **key_name,
410                                              const char **key_str,
411                                              const char **compose)
412 {
413    unsigned int offset = 0;
414    unsigned int id = _x11_to_fb(key, &offset);
415 
416    if (id == UINT_MAX)
417      return EINA_FALSE;
418 
419    *key_name = _ecore_fb_li_kbd_syms[id * 7];
420    *key_str = _ecore_fb_li_kbd_syms[(id * 7) + offset];
421    *compose = _ecore_fb_li_kbd_syms[(id* 7) + 3 + offset];
422    return EINA_TRUE;
423 }
424