summaryrefslogtreecommitdiff
path: root/src/lib/ecore_win32
diff options
context:
space:
mode:
authorVincent Torri <vincent.torri@gmail.com>2014-06-21 18:02:19 +0200
committerCedric BAIL <c.bail@partner.samsung.com>2014-06-23 10:21:26 +0200
commit113d7949732cd0a9bfbadcbedd0ae1d2dcf086ef (patch)
treeda45eb1ea4b7a2b29ebf9465605a33bc1fefd9d5 /src/lib/ecore_win32
parent836c0535f046e16c8c0be32375a67216c187d8e3 (diff)
ecore_win32: fix key events on Windows.
@fix Signed-off-by: Cedric BAIL <c.bail@partner.samsung.com>
Diffstat (limited to 'src/lib/ecore_win32')
-rw-r--r--src/lib/ecore_win32/Ecore_Win32.h2
-rw-r--r--src/lib/ecore_win32/ecore_win32.c66
-rw-r--r--src/lib/ecore_win32/ecore_win32_event.c2336
-rw-r--r--src/lib/ecore_win32/ecore_win32_keysym_table.h4708
-rw-r--r--src/lib/ecore_win32/ecore_win32_private.h3
5 files changed, 6173 insertions, 942 deletions
diff --git a/src/lib/ecore_win32/Ecore_Win32.h b/src/lib/ecore_win32/Ecore_Win32.h
index 4520467408..363fddb690 100644
--- a/src/lib/ecore_win32/Ecore_Win32.h
+++ b/src/lib/ecore_win32/Ecore_Win32.h
@@ -223,6 +223,7 @@ struct _Ecore_Win32_Event_Mouse_In
223 int x; /**< The x coordinate where the mouse leaved */ 223 int x; /**< The x coordinate where the mouse leaved */
224 int y; /**< The y coordinate where the mouse entered */ 224 int y; /**< The y coordinate where the mouse entered */
225 unsigned long timestamp; /**< The time the event occurred */ 225 unsigned long timestamp; /**< The time the event occurred */
226 unsigned int modifiers; /**< The keyboard modifiers */
226}; 227};
227 228
228/** 229/**
@@ -235,6 +236,7 @@ struct _Ecore_Win32_Event_Mouse_Out
235 int x; /**< The x coordinate where the mouse leaved */ 236 int x; /**< The x coordinate where the mouse leaved */
236 int y; /**< The y coordinate where the mouse leaved */ 237 int y; /**< The y coordinate where the mouse leaved */
237 unsigned long timestamp; /**< The time the event occurred */ 238 unsigned long timestamp; /**< The time the event occurred */
239 unsigned int modifiers; /**< The keyboard modifiers */
238}; 240};
239 241
240/** 242/**
diff --git a/src/lib/ecore_win32/ecore_win32.c b/src/lib/ecore_win32/ecore_win32.c
index 3ee79d6ed7..4741a672ac 100644
--- a/src/lib/ecore_win32/ecore_win32.c
+++ b/src/lib/ecore_win32/ecore_win32.c
@@ -76,76 +76,20 @@ _ecore_win32_window_procedure(HWND window,
76 coord = GetMessagePos(); 76 coord = GetMessagePos();
77 data->x = GET_X_LPARAM(coord); 77 data->x = GET_X_LPARAM(coord);
78 data->y = GET_Y_LPARAM(coord); 78 data->y = GET_Y_LPARAM(coord);
79 data->discard_ctrl = EINA_FALSE;
80 79
81 switch (data->message) 80 switch (data->message)
82 { 81 {
83 /* Keyboard input notifications */ 82 /* Keyboard input notifications */
84 case WM_KEYDOWN: 83 case WM_KEYDOWN:
85 case WM_SYSKEYDOWN: 84 case WM_SYSKEYDOWN:
86 if ((data->message == WM_KEYDOWN) && 85 INF("key down message");
87 (data->window_param == VK_CONTROL) && 86 _ecore_win32_event_handle_key_press(data);
88 ((HIWORD(data->data_param) & KF_EXTENDED) == 0))
89 {
90 /* Ctrl left key is pressed */
91 BOOL res;
92 MSG next_msg;
93
94 /*
95 * we check if the next message
96 * - is a WM_KEYDOWN
97 * - has the same timestamp than the Ctrl one
98 * - is the key press of the right Alt key
99 */
100 res = PeekMessage(&next_msg, data->window,
101 WM_KEYDOWN, WM_KEYDOWN,
102 PM_NOREMOVE);
103 if (res &&
104 (next_msg.wParam == VK_MENU) &&
105 (next_msg.time == data->timestamp) &&
106 (HIWORD(next_msg.lParam) & KF_EXTENDED))
107 {
108 INF("discard left Ctrl key press (sent by AltGr key press)");
109 data->discard_ctrl = EINA_TRUE;
110 }
111 }
112 _ecore_win32_event_handle_key_press(data, 1);
113 return 0;
114 case WM_CHAR:
115 case WM_SYSCHAR:
116 INF("char message");
117 _ecore_win32_event_handle_key_press(data, 0);
118 return 0; 87 return 0;
88 /* case WM_CHAR: */
89 /* case WM_SYSCHAR: */
119 case WM_KEYUP: 90 case WM_KEYUP:
120 case WM_SYSKEYUP: 91 case WM_SYSKEYUP:
121 INF("keyup message"); 92 INF("key up message");
122 if ((data->window_param == VK_CONTROL) &&
123 ((HIWORD(data->data_param) & KF_EXTENDED) == 0))
124 {
125 /* Ctrl left key is pressed */
126 BOOL res;
127 MSG next_msg;
128
129 /*
130 * we check if the next message
131 * - is a WM_KEYUP or WM_SYSKEYUP
132 * - has the same timestamp than the Ctrl one
133 * - is the key release of the right Alt key
134 */
135 res = PeekMessage(&next_msg, data->window,
136 WM_KEYUP, WM_SYSKEYUP,
137 PM_NOREMOVE);
138 if (res &&
139 ((next_msg.message == WM_KEYUP) ||
140 (next_msg.message == WM_SYSKEYUP)) &&
141 (next_msg.wParam == VK_MENU) &&
142 (next_msg.time == data->timestamp) &&
143 (HIWORD(next_msg.lParam) & KF_EXTENDED))
144 {
145 INF("discard left Ctrl key release (sent by AltGr key release)");
146 data->discard_ctrl = EINA_TRUE;
147 }
148 }
149 _ecore_win32_event_handle_key_release(data); 93 _ecore_win32_event_handle_key_release(data);
150 return 0; 94 return 0;
151 case WM_SETFOCUS: 95 case WM_SETFOCUS:
diff --git a/src/lib/ecore_win32/ecore_win32_event.c b/src/lib/ecore_win32/ecore_win32_event.c
index fc285995fc..d5cccf78fe 100644
--- a/src/lib/ecore_win32/ecore_win32_event.c
+++ b/src/lib/ecore_win32/ecore_win32_event.c
@@ -3,7 +3,6 @@
3#endif 3#endif
4 4
5#include <stdlib.h> 5#include <stdlib.h>
6#include <stdio.h> /* for printf */
7 6
8#define WIN32_LEAN_AND_MEAN 7#define WIN32_LEAN_AND_MEAN
9#include <windows.h> 8#include <windows.h>
@@ -16,7 +15,12 @@
16 15
17#include "Ecore_Win32.h" 16#include "Ecore_Win32.h"
18#include "ecore_win32_private.h" 17#include "ecore_win32_private.h"
18#include "ecore_win32_keysym_table.h"
19 19
20#define ECORE_WIN32_VK_IS_EXTENDED(p) ((HIWORD(p) & KF_EXTENDED) == KF_EXTENDED)
21#define ECORE_WIN32_VK_IS_REPEATED(p) ((HIWORD(p) & KF_REPEAT) == KF_REPEAT)
22#define ECORE_WIN32_VK_IS_PRESSED(vk) ((GetKeyState(vk) & KF_UP) == KF_UP)
23#define ECORE_WIN32_VK_IS_TOGGLED(vk) ((GetKeyState(vk) & 0x0001) == 0x0001)
20 24
21typedef enum 25typedef enum
22{ 26{
@@ -28,9 +32,6 @@ typedef enum
28 ECORE_WIN32_KEY_MASK_RMENU = 1 << 5 32 ECORE_WIN32_KEY_MASK_RMENU = 1 << 5
29} Ecore_Win32_Key_Mask; 33} Ecore_Win32_Key_Mask;
30 34
31/***** Private declarations *****/
32
33
34static Ecore_Win32_Window *_ecore_win32_mouse_down_last_window = NULL; 35static Ecore_Win32_Window *_ecore_win32_mouse_down_last_window = NULL;
35static Ecore_Win32_Window *_ecore_win32_mouse_down_last_last_window = NULL; 36static Ecore_Win32_Window *_ecore_win32_mouse_down_last_last_window = NULL;
36static long _ecore_win32_mouse_down_last_time = 0 ; 37static long _ecore_win32_mouse_down_last_time = 0 ;
@@ -38,78 +39,1350 @@ static long _ecore_win32_mouse_down_last_last_time = 0 ;
38static int _ecore_win32_mouse_down_did_triple = 0; 39static int _ecore_win32_mouse_down_did_triple = 0;
39static int _ecore_win32_mouse_up_count = 0; 40static int _ecore_win32_mouse_up_count = 0;
40static Ecore_Win32_Key_Mask _ecore_win32_key_mask = 0; 41static Ecore_Win32_Key_Mask _ecore_win32_key_mask = 0;
42static Eina_Bool _ecore_win32_ctrl_fake = EINA_FALSE;
41 43
42static void _ecore_win32_event_free_key_down(void *data, 44static unsigned int
43 void *ev); 45_ecore_win32_modifiers_get(void)
46{
47 unsigned int modifiers = 0;
44 48
45static void _ecore_win32_event_free_key_up(void *data, 49 if (ECORE_WIN32_VK_IS_PRESSED(VK_SHIFT))
46 void *ev); 50 modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
47 51
48static int _ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg, 52 if (_ecore_win32_ctrl_fake && !ECORE_WIN32_VK_IS_PRESSED(VK_RMENU))
49 Eina_Bool is_down, 53 {
50 char **keyname, 54 _ecore_win32_ctrl_fake = EINA_FALSE;
51 char **keysymbol, 55 }
52 char **keycompose, 56 else
53 unsigned int *modifiers); 57 {
58 if (ECORE_WIN32_VK_IS_PRESSED(VK_CONTROL))
59 modifiers |= ECORE_EVENT_MODIFIER_CTRL;
60 }
54 61
55static int _ecore_win32_event_char_get(int key, 62 if (ECORE_WIN32_VK_IS_PRESSED(VK_LMENU))
56 char **keyname, 63 modifiers |= ECORE_EVENT_MODIFIER_ALT;
57 char **keysymbol,
58 char **keycompose,
59 unsigned int *modifiers);
60 64
65 if (ECORE_WIN32_VK_IS_PRESSED(VK_RMENU))
66 modifiers |= ECORE_EVENT_MODIFIER_ALTGR;
61 67
62/***** Global functions definitions *****/ 68 if (ECORE_WIN32_VK_IS_PRESSED(VK_LWIN))
69 modifiers |= ECORE_EVENT_MODIFIER_WIN;
63 70
64void 71 if (ECORE_WIN32_VK_IS_PRESSED(VK_RWIN))
65_ecore_win32_event_handle_key_press(Ecore_Win32_Callback_Data *msg, 72 modifiers |= ECORE_EVENT_MODIFIER_WIN;
66 int is_keystroke) 73
74 if (ECORE_WIN32_VK_IS_TOGGLED(VK_SCROLL))
75 modifiers |= ECORE_EVENT_LOCK_SCROLL;
76
77 if (ECORE_WIN32_VK_IS_TOGGLED(VK_NUMLOCK))
78 modifiers |= ECORE_EVENT_LOCK_NUM;
79
80 if (ECORE_WIN32_VK_IS_TOGGLED(VK_CAPITAL))
81 modifiers |= ECORE_EVENT_LOCK_CAPS;
82
83 return modifiers;
84}
85
86static void
87_ecore_win32_modifiers_alt_save(BYTE *kbd_state, unsigned short *modifiers)
67{ 88{
68 Ecore_Event_Key *e; 89 if (kbd_state[VK_LMENU] & 128)
90 {
91 *modifiers |= 1 << 0;
92 kbd_state[VK_LMENU] &= ~128;
93 }
94 if (kbd_state[VK_RMENU] & 128)
95 {
96 *modifiers |= 1 << 1;
97 kbd_state[VK_RMENU] &= ~128;
98 }
99 if (kbd_state[VK_MENU] & 128)
100 {
101 *modifiers |= 1 << 2;
102 kbd_state[VK_MENU] &= ~128;
103 }
104}
69 105
70 INF("key pressed"); 106static void
107_ecore_win32_modifiers_alt_restore(BYTE *kbd_state, unsigned short modifiers)
108{
109 if ((modifiers & (1 << 0)) == (1 << 0))
110 kbd_state[VK_LMENU] |= 128;
111 if ((modifiers & (1 << 1)) == (1 << 1))
112 kbd_state[VK_RMENU] |= 128;
113 if ((modifiers & (1 << 2)) == (1 << 2))
114 kbd_state[VK_MENU] |= 128;
115}
71 116
72 e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key)); 117static void
73 if (!e) return; 118_ecore_win32_modifiers_ctrl_save(BYTE *kbd_state, unsigned short *modifiers)
119{
120 if (kbd_state[VK_LCONTROL] & 128)
121 {
122 *modifiers |= 1 << 3;
123 kbd_state[VK_LCONTROL] &= ~128;
124 }
125 if (kbd_state[VK_RCONTROL] & 128)
126 {
127 *modifiers |= 1 << 4;
128 kbd_state[VK_RCONTROL] &= ~128;
129 }
130 if (kbd_state[VK_CONTROL] & 128)
131 {
132 *modifiers |= 1 << 5;
133 kbd_state[VK_CONTROL] &= ~128;
134 }
135}
136
137static void
138_ecore_win32_modifiers_ctrl_restore(BYTE *kbd_state, unsigned short modifiers)
139{
140 if ((modifiers & (1 << 3)) == (1 << 3))
141 kbd_state[VK_LCONTROL] |= 128;
142 if ((modifiers & (1 << 4)) == (1 << 4))
143 kbd_state[VK_RCONTROL] |= 128;
144 if ((modifiers & (1 << 5)) == (1 << 5))
145 kbd_state[VK_CONTROL] |= 128;
146}
74 147
75 if (is_keystroke) 148static void
149_ecore_win32_modifiers_shift_save(BYTE *kbd_state, unsigned short *modifiers)
150{
151 if (kbd_state[VK_LSHIFT] & 128)
76 { 152 {
77 if (!_ecore_win32_event_keystroke_get(msg, 153 *modifiers |= 1 << 6;
78 EINA_TRUE, 154 kbd_state[VK_LSHIFT] &= ~128;
79 (char **)&e->keyname, 155 }
80 (char **)&e->key, 156 if (kbd_state[VK_RSHIFT] & 128)
81 (char **)&e->string, 157 {
82 &e->modifiers)) 158 *modifiers |= 1 << 7;
83 { 159 kbd_state[VK_RSHIFT] &= ~128;
84 free(e); 160 }
85 return; 161 if (kbd_state[VK_SHIFT] & 128)
86 } 162 {
163 *modifiers |= 1 << 8;
164 kbd_state[VK_SHIFT] &= ~128;
165 }
166}
167
168static void
169_ecore_win32_modifiers_shift_restore(BYTE *kbd_state, unsigned short modifiers)
170{
171 if ((modifiers & (1 << 6)) == (1 << 6))
172 kbd_state[VK_LSHIFT] |= 128;
173 if ((modifiers & (1 << 7)) == (1 << 7))
174 kbd_state[VK_RSHIFT] |= 128;
175 if ((modifiers & (1 << 8)) == (1 << 8))
176 kbd_state[VK_SHIFT] |= 128;
177}
178
179static void
180_ecore_win32_modifiers_win_save(BYTE *kbd_state, unsigned short *modifiers)
181{
182 if (kbd_state[VK_LWIN] & 128)
183 {
184 *modifiers |= 1 << 9;
185 kbd_state[VK_LWIN] &= ~128;
186 }
187 if (kbd_state[VK_RWIN] & 128)
188 {
189 *modifiers |= 1 << 10;
190 kbd_state[VK_RWIN] &= ~128;
191 }
192}
193
194static void
195_ecore_win32_modifiers_win_restore(BYTE *kbd_state, unsigned short modifiers)
196{
197 if ((modifiers & (1 << 9)) == (1 << 9))
198 kbd_state[VK_LWIN] |= 128;
199 if ((modifiers & (1 << 10)) == (1 << 10))
200 kbd_state[VK_RWIN] |= 128;
201}
202
203static uint32_t
204_ecore_win32_keysym_offset_get(uint32_t keysym)
205{
206 uint32_t start;
207 uint32_t end;
208
209 /*
210 * statistically, there are more chance to press a key with
211 * keysym between 0 and 255
212 */
213 if (keysym < 256)
214 {
215 start = 0;
216 end = 255;
87 } 217 }
88 else 218 else
89 { 219 {
90 if (!_ecore_win32_event_char_get(LOWORD(msg->window_param), 220 start = 256;
91 (char **)&e->keyname, 221 end = sizeof(_ecore_win32_name_to_keysym) / sizeof(ecore_win32_name_keysym) - 1;
92 (char **)&e->key,
93 (char **)&e->string,
94 &e->modifiers))
95 {
96 free(e);
97 return;
98 }
99 } 222 }
100 223
224 do {
225 uint32_t m = (start + end) / 2;
226
227 if (_ecore_win32_name_to_keysym[m].keysym == keysym)
228 return _ecore_win32_name_to_keysym[m].offset;
229 else
230 {
231 if (keysym > _ecore_win32_name_to_keysym[m].keysym)
232 start = m + 1;
233 else
234 end = m - 1;
235 }
236 } while (start <= end);
237
238 return 0xffffffff;
239}
240
241static const char *
242_ecore_win32_diacritic_get(WCHAR wc)
243{
244 switch (wc)
245 {
246 case 0x0060: /* grave accent */
247 return "dead_grave";
248 case 0x00b4: /* acute accent */
249 return "dead_acute";
250 case 0x005e: /* circumflex_accent */
251 return "dead_circumflex";
252 case 0x007e: /* tilde_accent */
253 return "dead_tilde";
254 case 0x00a8: /* diaeresis_accent */
255 return "dead_diaeresis";
256 /*
257 * FIXME: add more diacritics
258 * needs more langages and keyboards
259 * see http://en.wikipedia.org/wiki/Diacritic
260 */
261 }
262
263 return NULL;
264}
265
266static Ecore_Event_Key *
267_ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg,
268 Eina_Bool is_down)
269{
270 Ecore_Event_Key *e;
271 char string[2] = { 0, 0 };
272 const char *keyname = NULL;
273 const char *key = NULL;
274 const char *compose = NULL;
275
276 switch (msg->window_param)
277 {
278 /* VK_LBUTTON: 0x01 : not launched by message */
279 /* VK_RBUTTON: 0x02 : not launched by message */
280 /* VK_CANCEL: 0x03 : FIXME: what to do ? */
281 /* VK_MBUTTON: 0x04 : not launched by message */
282 /* VK_XBUTTON1: 0x05 : not launched by message */
283 /* VK_XBUTTON2: 0x06 : not launched by message */
284
285 /* 0x07 : undefined */
286
287 case VK_BACK: /* 0x08 */
288 keyname = "Backspace";
289 key = "Backspace";
290 compose = "\b";
291 break;
292 case VK_TAB: /* 0x09 */
293 keyname = "Tab";
294 key = "Tab";
295 compose = "\t";
296 break;
297
298 /* 0x0A - 0x0B : reserved */
299
300 case VK_CLEAR: /* 0x0C */
301 keyname = "KP_Begin";
302 key = "KP_Begin";
303 compose = NULL;
304 break;
305 case VK_RETURN: /* 0x0D */
306 if (ECORE_WIN32_VK_IS_EXTENDED(msg->data_param))
307 {
308 keyname = "KP_Enter";
309 key = "KP_Enter";
310 }
311 else
312 {
313 keyname = "Return";
314 key = "Return";
315 }
316 compose = "\n";
317 break;
318
319 /* 0x0E - 0x0F : undefined */
320
321 case VK_SHIFT: /* 0x10 */
322 {
323 if (is_down)
324 {
325 if (ECORE_WIN32_VK_IS_REPEATED(msg->data_param))
326 return NULL;
327
328 if (ECORE_WIN32_VK_IS_PRESSED(VK_LSHIFT))
329 {
330 _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_LSHIFT;
331 keyname = "Shift_L";
332 key = "Shift_L";
333 compose = NULL;
334 }
335 if (ECORE_WIN32_VK_IS_PRESSED(VK_RSHIFT))
336 {
337 _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_RSHIFT;
338 keyname = "Shift_R";
339 key = "Shift_R";
340 compose = NULL;
341 }
342 }
343 else /* is_up */
344 {
345 if (!ECORE_WIN32_VK_IS_PRESSED(VK_LSHIFT) &&
346 (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_LSHIFT))
347 {
348 keyname = "Shift_L";
349 key = "Shift_L";
350 compose = NULL;
351 _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_LSHIFT;
352 }
353 if (!ECORE_WIN32_VK_IS_PRESSED(VK_RSHIFT) &&
354 (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_RSHIFT))
355 {
356 keyname = "Shift_R";
357 key = "Shift_R";
358 compose = NULL;
359 _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_RSHIFT;
360 }
361 }
362 break;
363 }
364 case VK_CONTROL: /* 0x11 */
365 {
366 if (is_down)
367 {
368 /* We check if Ctrl has be thrown because of AltGr being stroke */
369 if (!ECORE_WIN32_VK_IS_EXTENDED(msg->data_param))
370 {
371 BOOL res;
372 MSG next_msg;
373
374 /*
375 * we check if the next message
376 * - is a WM_KEYDOWN
377 * - has the same timestamp than the Ctrl one
378 * - is the key press of the Alt key
379 */
380 res = PeekMessage(&next_msg, msg->window,
381 WM_KEYDOWN, WM_KEYDOWN,
382 PM_NOREMOVE);
383 if (res &&
384 (next_msg.wParam == VK_MENU) &&
385 (next_msg.time == msg->timestamp) &&
386 ECORE_WIN32_VK_IS_EXTENDED(next_msg.lParam))
387 {
388 INF("discard left Ctrl key press (sent by AltGr key press)");
389 _ecore_win32_ctrl_fake = EINA_TRUE;
390 return NULL;
391 }
392 }
393
394 if (ECORE_WIN32_VK_IS_REPEATED(msg->data_param))
395 return NULL;
396
397 if (ECORE_WIN32_VK_IS_PRESSED(VK_LCONTROL))
398 {
399 _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_LCONTROL;
400 keyname = "Control_L";
401 key = "Control_L";
402 compose = NULL;
403 break;
404 }
405 if (ECORE_WIN32_VK_IS_PRESSED(VK_RCONTROL))
406 {
407 _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_RCONTROL;
408 keyname = "Control_R";
409 key = "Control_R";
410 compose = NULL;
411 break;
412 }
413 }
414 else /* is_up */
415 {
416 /* We check if Ctrl has be thrown because of AltGr being stroke */
417 if (!ECORE_WIN32_VK_IS_EXTENDED(msg->data_param))
418 {
419 BOOL res;
420 MSG next_msg;
421
422 /*
423 * we check if the next message
424 * - is a WM_KEYUP or WM_SYSKEYUP
425 * - has the same timestamp than the Ctrl one
426 * - is the key press of the Alt key
427 */
428 res = PeekMessage(&next_msg, msg->window,
429 WM_KEYUP, WM_SYSKEYUP,
430 PM_NOREMOVE);
431 if (res &&
432 ((next_msg.message == WM_KEYUP) ||
433 (next_msg.message == WM_SYSKEYUP)) &&
434 (next_msg.wParam == VK_MENU) &&
435 (next_msg.time == msg->timestamp) &&
436 ECORE_WIN32_VK_IS_EXTENDED(next_msg.lParam))
437 {
438 INF("discard left Ctrl key press (sent by AltGr key press)");
439 _ecore_win32_ctrl_fake = EINA_TRUE;
440 return NULL;
441 }
442 }
443 if (!ECORE_WIN32_VK_IS_PRESSED(VK_LCONTROL) &&
444 (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_LCONTROL))
445 {
446 keyname = "Control_L";
447 key = "Control_L";
448 compose = NULL;
449 _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_LCONTROL;
450 break;
451 }
452 if (!ECORE_WIN32_VK_IS_PRESSED(VK_LCONTROL) &&
453 (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_RCONTROL))
454 {
455 keyname = "Control_R";
456 key = "Control_R";
457 compose = NULL;
458 _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_RCONTROL;
459 break;
460 }
461 }
462 break;
463 }
464 case VK_MENU: /* 0x12 */
465 {
466 if (is_down)
467 {
468 if (ECORE_WIN32_VK_IS_REPEATED(msg->data_param))
469 return NULL;
470
471 if (ECORE_WIN32_VK_IS_PRESSED(VK_LMENU))
472 {
473 _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_LMENU;
474 keyname = "Alt_L";
475 key = "Alt_L";
476 compose = NULL;
477 }
478 if (ECORE_WIN32_VK_IS_PRESSED(VK_RMENU))
479 {
480 _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_RMENU;
481 keyname = "ISO_Level3_Shift";
482 key = "ISO_Level3_Shift";
483 compose = NULL;
484 }
485 }
486 else /* is_up */
487 {
488 if (!ECORE_WIN32_VK_IS_PRESSED(VK_LMENU) &&
489 (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_LMENU))
490 {
491 keyname = "Alt_L";
492 key = "Alt_L";
493 compose = NULL;
494 _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_LMENU;
495 }
496 if (!ECORE_WIN32_VK_IS_PRESSED(VK_RMENU) &&
497 (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_RMENU))
498 {
499 keyname = "ISO_Level3_Shift";
500 key = "ISO_Level3_Shift";
501 compose = NULL;
502 _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_RMENU;
503 }
504 }
505 break;
506 }
507 case VK_PAUSE: /* 0x13 */
508 keyname = "Pause";
509 key = "Pause";
510 compose = NULL;
511 break;
512 case VK_CAPITAL: /* 0x14 */
513 keyname = "Caps_Lock";
514 key = "Caps_Lock";
515 compose = NULL;
516 break;
517
518 /* VK_KANA: 0x15 : IME Kana mode */
519 /* VK_HANGUEL: 0x15 : IME Hanguel mode (maintained for compatibility; use VK_HANGUL) */
520 /* VK_HANGUL: 0x15 : IME Hangul mode */
521
522 /* 0x16 : undefined */
523
524 /* VK_JUNJA: 0x17 : IME Junja mode */
525 /* VK_FINAL: 0x18 : IME final mode */
526 /* VK_HANJA: 0x19 : IME Hanja mode */
527 /* VK_KANJI: 0x19 : IME Kanji mode */
528
529 /* 0x1A : undefined */
530
531 case VK_ESCAPE: /* 0x1B */
532 keyname = "Escape";
533 key = "Escape";
534 string[0] = 0x1b;
535 compose = string;
536 break;
537
538 /* VK_CONVERT: 0x1C : IME convert */
539 /* VK_NONCONVERT: 0x1D : IME nonconvert */
540 /* VK_ACCEPT: 0x1E : IME accept */
541 /* VK_MODECHANGE: 0x1F : IME mode change request */
542
543 case VK_SPACE: /* 0x20 */
544 keyname = "space";
545 key = "space";
546 compose = " ";
547 break;
548
549 case VK_PRIOR: /* 0x21 */
550 if (ECORE_WIN32_VK_IS_EXTENDED(msg->data_param))
551 {
552 keyname = "Prior";
553 key = "Prior";
554 compose = NULL;
555 }
556 else
557 {
558 keyname = "KP_Prior";
559 key = "KP_Prior";
560 compose = NULL;
561 }
562 break;
563 case VK_NEXT: /* 0x22 */
564 if (ECORE_WIN32_VK_IS_EXTENDED(msg->data_param))
565 {
566 keyname = "Next";
567 key = "Next";
568 compose = NULL;
569 }
570 else
571 {
572 keyname = "KP_Next";
573 key = "KP_Next";
574 compose = NULL;
575 }
576 break;
577 case VK_END: /* 0x23 */
578 if (ECORE_WIN32_VK_IS_EXTENDED(msg->data_param))
579 {
580 keyname = "End";
581 key = "End";
582 compose = NULL;
583 }
584 else
585 {
586 keyname = "KP_End";
587 key = "KP_End";
588 compose = NULL;
589 }
590 break;
591 case VK_HOME: /* 0x24 */
592 if (ECORE_WIN32_VK_IS_EXTENDED(msg->data_param))
593 {
594 keyname = "Home";
595 key = "Home";
596 compose = NULL;
597 }
598 else
599 {
600 keyname = "KP_HOME";
601 key = "KP_HOME";
602 compose = NULL;
603 }
604 break;
605 case VK_LEFT: /* 0x25 */
606 if (ECORE_WIN32_VK_IS_EXTENDED(msg->data_param))
607 {
608 keyname = "Left";
609 key = "Left";
610 compose = NULL;
611 }
612 else
613 {
614 keyname = "KP_Left";
615 key = "KP_Left";
616 compose = NULL;
617 }
618 break;
619 case VK_UP: /* 0x26 */
620 if (ECORE_WIN32_VK_IS_EXTENDED(msg->data_param))
621 {
622 keyname = "Up";
623 key = "Up";
624 compose = NULL;
625 }
626 else
627 {
628 keyname = "KP_Up";
629 key = "KP_Up";
630 compose = NULL;
631 }
632 break;
633 case VK_RIGHT: /* 0x27 */
634 if (ECORE_WIN32_VK_IS_EXTENDED(msg->data_param))
635 {
636 keyname = "Right";
637 key = "Right";
638 compose = NULL;
639 }
640 else
641 {
642 keyname = "KP_Right";
643 key = "KP_Right";
644 compose = NULL;
645 }
646 break;
647 case VK_DOWN: /* 0x28 */
648 if (ECORE_WIN32_VK_IS_EXTENDED(msg->data_param))
649 {
650 keyname = "Down";
651 key = "Down";
652 compose = NULL;
653 }
654 else
655 {
656 keyname = "KP_Down";
657 key = "KP_Down";
658 compose = NULL;
659 }
660 break;
661
662 /* VK_SELECT: 0x29 : SELECT key (for a menu ? on rare keyboards ?) */
663 /* VK_PRINT: 0x2A : PRINT key on old IBM PC XT and AT, maybe also on Nokia keyboards */
664 /* VK_EXECUTE: 0x2B : EXECUTE key (for a menu ? on rare keyboards ?) */
665 /* VK_SNAPSHOT: 0x2C : EXECUTE key (for a menu ? on rare keyboards ?) */
666
667 case VK_INSERT: /* 0x2D */
668 if (ECORE_WIN32_VK_IS_EXTENDED(msg->data_param))
669 {
670 keyname = "Insert";
671 key = "Insert";
672 compose = NULL;
673 }
674 else
675 {
676 keyname = "KP_Insert";
677 key = "KP_Insert";
678 compose = NULL;
679 }
680 break;
681 case VK_DELETE: /* 0x2E */
682 if (ECORE_WIN32_VK_IS_EXTENDED(msg->data_param))
683 {
684 keyname = "Delete";
685 key = "Delete";
686 string[0] = 0x7f;
687 compose = string;
688 }
689 else
690 {
691 keyname = "KP_Delete";
692 key = "KP_Delete";
693 compose = NULL;
694 }
695 break;
696
697 /* VK_HELP: 0x2F : HELP key (for a menu ? on rare keyboards ?) */
698
699 /* case 0x30: 0 key (default case) */
700 /* case 0x31: 1 key (default case) */
701 /* case 0x32: 2 key (default case) */
702 /* case 0x33: 3 key (default case) */
703 /* case 0x34: 4 key (default case) */
704 /* case 0x35: 5 key (default case) */
705 /* case 0x36: 6 key (default case) */
706 /* case 0x37: 7 key (default case) */
707 /* case 0x38: 8 key (default case) */
708 /* case 0x39: 9 key (default case) */
709
710 /* 0x3A - 0x40 : undefined */
711
712 /* case 0x41: A key (default case) */
713 /* case 0x42: B key (default case) */
714 /* case 0x43: C key (default case) */
715 /* case 0x44: D key (default case) */
716 /* case 0x45: E key (default case) */
717 /* case 0x46: F key (default case) */
718 /* case 0x47: G key (default case) */
719 /* case 0x48: H key (default case) */
720 /* case 0x49: I key (default case) */
721 /* case 0x4a: J key (default case) */
722 /* case 0x4b: K key (default case) */
723 /* case 0x4c: L key (default case) */
724 /* case 0x4d: M key (default case) */
725 /* case 0x4e: N key (default case) */
726 /* case 0x4f: O key (default case) */
727 /* case 0x50: P key (default case) */
728 /* case 0x51: Q key (default case) */
729 /* case 0x52: R key (default case) */
730 /* case 0x53: S key (default case) */
731 /* case 0x54: T key (default case) */
732 /* case 0x55: U key (default case) */
733 /* case 0x56: V key (default case) */
734 /* case 0x57: W key (default case) */
735 /* case 0x58: X key (default case) */
736 /* case 0x59: Y key (default case) */
737 /* case 0x5a: Z key (default case) */
738
739 case VK_LWIN: /* 0x5B */
740 {
741 if (is_down)
742 {
743 if (ECORE_WIN32_VK_IS_REPEATED(msg->data_param))
744 return NULL;
745
746 keyname = "Super_L";
747 key = "Super_L";
748 compose = NULL;
749 }
750 else /* is_up */
751 {
752 keyname = "Super_L";
753 key = "Super_L";
754 compose = NULL;
755 }
756 break;
757 }
758 case VK_RWIN: /* 0x5C */
759 {
760 if (is_down)
761 {
762 if (ECORE_WIN32_VK_IS_REPEATED(msg->data_param))
763 return NULL;
764
765 keyname = "Super_R";
766 key = "Super_R";
767 compose = NULL;
768 }
769 else /* is_up */
770 {
771 keyname = "Super_R";
772 key = "Super_R";
773 compose = NULL;
774 }
775 break;
776 }
777 case VK_APPS: /* 0x5D Menu key on some keyboards, or via the 'function' modifier */
778 keyname = "Menu";
779 key = "Menu";
780 compose = NULL;
781 break;
782
783 /* 0x5E : reserved */
784
785 /* case VK_SLEEP: 0x5F SLEEP key (not hookable, the computer goes to sleep immediatly...) */
786
787 case VK_NUMPAD0: /* 0x60 */
788 keyname = "KP_Insert";
789 key = "KP_0";
790 compose = "0";
791 break;
792 case VK_NUMPAD1: /* 0x61 */
793 keyname = "KP_End";
794 key = "KP_1";
795 compose = "1";
796 break;
797 case VK_NUMPAD2: /* 0x62 */
798 keyname = "KP_Down";
799 key = "KP_2";
800 compose = "2";
801 break;
802 case VK_NUMPAD3: /* 0x63 */
803 keyname = "KP_Next";
804 key = "KP_3";
805 compose = "3";
806 break;
807 case VK_NUMPAD4: /* 0x64 */
808 keyname = "KP_Left";
809 key = "KP_4";
810 compose = "4";
811 break;
812 case VK_NUMPAD5: /* 0x65 */
813 keyname = "KP_Begin";
814 key = "KP_5";
815 compose = "5";
816 break;
817 case VK_NUMPAD6: /* 0x66 */
818 keyname = "KP_Right";
819 key = "KP_6";
820 compose = "6";
821 break;
822 case VK_NUMPAD7: /* 0x67 */
823 keyname = "KP_HOME";
824 key = "KP_7";
825 compose = "7";
826 break;
827 case VK_NUMPAD8: /* 0x68 */
828 keyname = "KP_Up";
829 key = "KP_8";
830 compose = "8";
831 break;
832 case VK_NUMPAD9: /* 0x69 */
833 keyname = "KP_Prior";
834 key = "KP_9";
835 compose = "9";
836 break;
837 case VK_MULTIPLY: /* 0x6A */
838 keyname = "KP_Multiply";
839 key = "KP_Multiply";
840 compose = "*";
841 break;
842 case VK_ADD: /* 0x6A */
843 keyname = "KP_Add";
844 key = "KP_Add";
845 compose = "+";
846 break;
847 /* VK_SEPARATOR : 0x6C : FIXME depending on layout : */
848 /* . or , for the separator in a floating point number*/
849 case VK_SUBTRACT: /* 0x6D */
850 keyname = "KP_Subtract";
851 key = "KP_Subtract";
852 compose = "-";
853 break;
854 case VK_DECIMAL: /* 0x6E */
855 /* '.' key with num lock on */
856 keyname = "KP_Delete";
857 key = "KP_Decimal";
858 /* Value of 'compose' may depend on the layout */
859 compose = ".";
860 break;
861 case VK_DIVIDE: /* 0x6F */
862 keyname = "KP_Divide";
863 key = "KP_Divide";
864 compose = "/";
865 break;
866 case VK_F1: /* 0x70 */
867 keyname = "F1";
868 key = "F1";
869 compose = NULL;
870 break;
871 case VK_F2: /* 0x71 */
872 keyname = "F2";
873 key = "F2";
874 compose = NULL;
875 break;
876 case VK_F3: /* 0x72 */
877 keyname = "F3";
878 key = "F3";
879 compose = NULL;
880 break;
881 case VK_F4: /* 0x73 */
882 keyname = "F4";
883 key = "F4";
884 compose = NULL;
885 break;
886 case VK_F5: /* 0x74 */
887 keyname = "F5";
888 key = "F5";
889 compose = NULL;
890 break;
891 case VK_F6: /* 0x75 */
892 keyname = "F6";
893 key = "F6";
894 compose = NULL;
895 break;
896 case VK_F7: /* 0x76 */
897 keyname = "F7";
898 key = "F7";
899 compose = NULL;
900 break;
901 case VK_F8: /* 0x77 */
902 keyname = "F8";
903 key = "F8";
904 compose = NULL;
905 break;
906 case VK_F9: /* 0x78 */
907 keyname = "F9";
908 key = "F9";
909 compose = NULL;
910 break;
911 case VK_F10: /* 0x79 */
912 keyname = "F10";
913 key = "F10";
914 compose = NULL;
915 break;
916 case VK_F11: /* 0x7A */
917 keyname = "F11";
918 key = "F11";
919 compose = NULL;
920 break;
921 case VK_F12: /* 0x7B */
922 keyname = "F12";
923 key = "F12";
924 compose = NULL;
925 break;
926 case VK_F13: /* 0x7C */
927 keyname = "F13";
928 key = "F13";
929 compose = NULL;
930 break;
931 case VK_F14: /* 0x7D */
932 keyname = "F14";
933 key = "F14";
934 compose = NULL;
935 break;
936 case VK_F15: /* 0x7E */
937 keyname = "F15";
938 key = "F15";
939 compose = NULL;
940 break;
941 case VK_F16: /* 0x7F */
942 keyname = "F16";
943 key = "F16";
944 compose = NULL;
945 break;
946 case VK_F17: /* 0x80 */
947 keyname = "F17";
948 key = "F17";
949 compose = NULL;
950 break;
951 case VK_F18: /* 0x81 */
952 keyname = "F18";
953 key = "F18";
954 compose = NULL;
955 break;
956 case VK_F19: /* 0x82 */
957 keyname = "F19";
958 key = "F19";
959 compose = NULL;
960 break;
961 case VK_F20: /* 0x83 */
962 keyname = "F20";
963 key = "F20";
964 compose = NULL;
965 break;
966 case VK_F21: /* 0x84 */
967 keyname = "F21";
968 key = "F21";
969 compose = NULL;
970 break;
971 case VK_F22: /* 0x85 */
972 keyname = "F22";
973 key = "F22";
974 compose = NULL;
975 break;
976 case VK_F23: /* 0x86 */
977 keyname = "F23";
978 key = "F23";
979 compose = NULL;
980 break;
981 case VK_F24: /* 0x87 */
982 keyname = "F24";
983 key = "F24";
984 compose = NULL;
985 break;
986
987 /* 0x88 - 0x8F : unassigned */
988
989 case VK_NUMLOCK: /* 0x90 */
990 keyname = "Num_Lock";
991 key = "Num_Lock";
992 compose = NULL;
993 break;
994 case VK_SCROLL: /* 0x91 */
995 keyname = "Scroll_Lock";
996 key = "Scroll_Lock";
997 compose = NULL;
998 break;
999
1000 /* 0x92 - 0x96 : OEM specific */
1001
1002 /* 0x97 - 0x9F : unassigned */
1003
1004 /* VK_LSHIT: 0xA0 : not launched by message */
1005 /* VK_RSHIT: 0xA1 : not launched by message */
1006 /* VK_LCONTROL: 0xA2 : not launched by message */
1007 /* VK_RCONTROL: 0xA3 : not launched by message */
1008 /* VK_LMENU: 0xA4 : not launched by message */
1009 /* VK_RMENU: 0xA5 : not launched by message */
1010
1011 case VK_BROWSER_BACK: /* 0xA6 */
1012 keyname = "XF86Back";
1013 key = "XF86Back";
1014 compose = NULL;
1015 break;
1016 case VK_BROWSER_FORWARD: /* 0xA7 */
1017 keyname = "XF86Forward";
1018 key = "XF86Forward";
1019 compose = NULL;
1020 break;
1021 case VK_BROWSER_REFRESH: /* 0xA8 */
1022 keyname = "XF86Forward";
1023 key = "XF86Forward";
1024 compose = NULL;
1025 break;
1026 case VK_BROWSER_STOP: /* 0xA9 */
1027 keyname = "XF86Stop";
1028 key = "XF86Stop";
1029 compose = NULL;
1030 break;
1031 case VK_BROWSER_SEARCH: /* 0xAA */
1032 keyname = "XF86Search";
1033 key = "XF86Search";
1034 compose = NULL;
1035 break;
1036 case VK_BROWSER_FAVORITES: /* 0xAB */
1037 keyname = "XF86Favorites";
1038 key = "XF86Favorites";
1039 compose = NULL;
1040 break;
1041 case VK_BROWSER_HOME: /* 0xAC */
1042 keyname = "XF86HomePage";
1043 key = "XF86HomePage";
1044 compose = NULL;
1045 break;
1046
1047 case VK_VOLUME_MUTE: /* 0xAD */
1048 keyname = "XF86AudioMute";
1049 key = "XF86AudioMute";
1050 compose = NULL;
1051 break;
1052 case VK_VOLUME_DOWN: /* 0xAE */
1053 keyname = "XF86AudioLowerVolume";
1054 key = "XF86AudioLowerVolume";
1055 compose = NULL;
1056 break;
1057 case VK_VOLUME_UP: /* 0xAF */
1058 keyname = "XF86AudioRaiseVolume";
1059 key = "XF86AudioRaiseVolume";
1060 compose = NULL;
1061 break;
1062
1063 case VK_MEDIA_NEXT_TRACK: /* 0xB0 */
1064 keyname = "XF86AudioNext";
1065 key = "XF86AudioNext";
1066 compose = NULL;
1067 break;
1068 case VK_MEDIA_PREV_TRACK: /* 0xB1 */
1069 keyname = "XF86AudioPrev";
1070 key = "XF86AudioPrev";
1071 compose = NULL;
1072 break;
1073 case VK_MEDIA_STOP: /* 0xB2 */
1074 keyname = "XF86AudioStop";
1075 key = "XF86AudioStop";
1076 compose = NULL;
1077 break;
1078 case VK_MEDIA_PLAY_PAUSE: /* 0xB3 */
1079 {
1080 if (ECORE_WIN32_VK_IS_TOGGLED(VK_MEDIA_PLAY_PAUSE))
1081 {
1082 keyname = "XF86AudioPlay";
1083 key = "XF86AudioPlay";
1084 compose = NULL;
1085 }
1086 else
1087 {
1088 keyname = "XF86AudioPause";
1089 key = "XF86AudioPause";
1090 compose = NULL;
1091 }
1092 break;
1093 }
1094 case VK_LAUNCH_MAIL: /* 0xB4 */
1095 keyname = "XF86Mail";
1096 key = "XF86Mail";
1097 compose = NULL;
1098 break;
1099
1100 /* VK_LAUNCH_MEDIA_SELECT: 0xB5 : select Media key */
1101 /* VK_LAUNCH_APP1: 0xB6 : start application 1 key */
1102 /* VK_LAUNCH_APP2: 0xB7 : start application 2 key */
1103
1104 /* 0xB8 - 0xB9 : reserved */
1105
1106 /* case VK_OEM1 : 0xBA : Used for miscellaneous characters; it can vary by keyboard. (default case) */
1107 /* case VK_PLUS : 0xBB : For any country/region, the '+' key. (default case) */
1108 /* case VK_COMMA : 0xBC : For any country/region, the ',' key. (default case) */
1109 /* case VK_MINUS : 0xBD : For any country/region, the '-' key. (default case) */
1110 /* case VK_PERIOD : 0xBE : For any country/region, the '.' key. (default case) */
1111 /* case VK_OEM2 : 0xBF : Used for miscellaneous characters; it can vary by keyboard. (default case) */
1112 /* case VK_OEM3 : 0xC0 : Used for miscellaneous characters; it can vary by keyboard. (default case) */
1113
1114 /* 0xC1 - 0xD7 : reserved */
1115
1116 /* 0xD8 - 0xDA : unassigned */
1117
1118 /* case VK_OEM4 : 0xDB : Used for miscellaneous characters; it can vary by keyboard. (default case) */
1119 /* case VK_OEM5 : 0xDC : Used for miscellaneous characters; it can vary by keyboard. (default case) */
1120 /* case VK_OEM6 : 0xDD : Used for miscellaneous characters; it can vary by keyboard. (default case) */
1121 /* case VK_OEM7 : 0xDE : Used for miscellaneous characters; it can vary by keyboard. (default case) */
1122 /* case VK_OEM8 : 0xDF : Used for miscellaneous characters; it can vary by keyboard. (default case) */
1123
1124 /* 0xE0 : reserved */
1125
1126 /* 0xE1 : OEM specific */
1127
1128 /* case VK_OEM102 : 0xE2 : Either the angle bracket key or the backslash key on the RT 102-key keyboard. (default case) */
1129
1130 /* 0xE3 - 0xE4 : OEM specific */
1131
1132 /* case VK_PROCESSKEY : 0xE5 : IME PROCESS key */
1133
1134 /* 0xE6 : OEM specific */
1135
1136 /* case VK_PACKET : 0xE7 : Used to pass Unicode characters as if they were keystrokes. */
1137
1138 /* 0xE8 : unassigned */
1139
1140 /* 0xE9 - 0xF5 : OEM specific */
1141
1142 /* case VK_ATTN : 0xF6 : Attn key */
1143 /* case VK_CRSEL : 0xF7 : CrSel key */
1144 /* case VK_EXSEL : 0xF8 : ExSel key */
1145 /* case VK_EREOF : 0xF9 : Erase EOF key */
1146 /* case VK_PLAY : 0xFA : Play key */
1147 /* case VK_ZOOM : 0xFB : Zoom key */
1148
1149 /* case VK_NONAME : 0xFC : reserved */
1150
1151 /* case VK_PA1 : 0xFD : PA1 key */
1152 /* case VK_OEM_CLEAR : 0xFE : Clear key */
1153 default:
1154 {
1155 BYTE kbd_state[256];
1156 WCHAR buf[4];
1157 uint32_t offset;
1158 int res;
1159 unsigned short modifiers_save = 0;
1160 Eina_Bool is_dead_key;
1161
1162 /*** compose and string field ***/
1163
1164 if (!GetKeyboardState(kbd_state))
1165 return NULL;
1166
1167 /*
1168 * Keep that trick in case it is necessary
1169 char_value = MapVirtualKey(msg->window_param, MAPVK_VK_TO_CHAR);
1170 _ecore_win32_is_dead_key = (char_value & 0x80000000) == 0x80000000;
1171 */
1172 res = ToUnicode(msg->window_param,
1173 MapVirtualKey(msg->window_param, MAPVK_VK_TO_CHAR),
1174 kbd_state, buf, 4, 0);
1175 if (res == -1)
1176 {
1177 /* dead key, but managed like normal key */
1178 }
1179 else if (res == 0)
1180 {
1181 INF("No translatable character found, skipping");
1182 return NULL;
1183 }
1184 else if (res >= 2)
1185 {
1186 /*
1187 * Most common case : dead key which can not be composed,
1188 * or proper symbol.
1189 * Call ToUnicode again to get something sane.
1190 */
1191 res = ToUnicode(msg->window_param,
1192 MapVirtualKey(msg->window_param, MAPVK_VK_TO_CHAR),
1193 kbd_state, buf, 4, 0);
1194 if ((res != 1) && (res != -1))
1195 return NULL;
1196 }
1197
1198 string[0] = (char)buf[0];
1199 compose = string;
1200
1201 /*** key field ***/
1202
1203 if (!_ecore_win32_ctrl_fake)
1204 {
1205 /* save modifiers for key */
1206 modifiers_save = 0;
1207
1208 /* save Control modifier before getting key value */
1209 _ecore_win32_modifiers_ctrl_save(kbd_state, &modifiers_save);
1210
1211 if (!SetKeyboardState(kbd_state))
1212 return NULL;
1213 }
1214
1215 is_dead_key = EINA_FALSE;
1216 res = ToUnicode(msg->window_param,
1217 MapVirtualKey(msg->window_param, MAPVK_VK_TO_CHAR),
1218 kbd_state, buf, 4, 0);
1219 if (res == -1)
1220 {
1221 is_dead_key = EINA_TRUE;
1222 }
1223 else if (res == 0)
1224 {
1225 INF("No translatable character found, skipping");
1226 return NULL;
1227 }
1228 else if (res >= 2)
1229 {
1230 /*
1231 * Most common case : dead key which can not be composed,
1232 * buf[0] is invalid and buf[1] is the dead key.
1233 * Call ToUnicode again to get something sane.
1234 */
1235 res = ToUnicode(msg->window_param,
1236 MapVirtualKey(msg->window_param, MAPVK_VK_TO_CHAR),
1237 kbd_state, buf, 4, 0);
1238 if (res == -1)
1239 is_dead_key = EINA_TRUE;
1240 if ((res != 1) && (res != -1))
1241 return NULL;
1242 }
1243
1244 if (is_dead_key)
1245 key = _ecore_win32_diacritic_get(buf[0]);
1246 else
1247 {
1248 offset = _ecore_win32_keysym_offset_get(buf[0]);
1249 if (offset != 0xffffffff)
1250 key = _ecore_win32_keysym_names + offset;
1251 }
1252
1253 if (!_ecore_win32_ctrl_fake)
1254 {
1255 /* Restaure Control modifier */
1256 _ecore_win32_modifiers_ctrl_restore(kbd_state, modifiers_save);
1257
1258 if (!SetKeyboardState(kbd_state))
1259 return NULL;
1260 }
1261
1262 if (!key)
1263 {
1264 WRN("no keysym found for keycode %d\n", string[0]);
1265 return NULL;
1266 }
1267
1268 /*** keyname field ***/
1269
1270 /* save modifiers for keyname */
1271 modifiers_save = 0;
1272
1273 _ecore_win32_modifiers_alt_save(kbd_state, &modifiers_save);
1274 _ecore_win32_modifiers_ctrl_save(kbd_state, &modifiers_save);
1275 _ecore_win32_modifiers_shift_save(kbd_state, &modifiers_save);
1276 _ecore_win32_modifiers_win_save(kbd_state, &modifiers_save);
1277
1278 if (!SetKeyboardState(kbd_state))
1279 return NULL;
1280
1281 is_dead_key = EINA_FALSE;
1282 res = ToUnicode(msg->window_param,
1283 MapVirtualKey(msg->window_param, MAPVK_VK_TO_CHAR),
1284 kbd_state, buf, 4, 0);
1285
1286 if (res == -1)
1287 {
1288 is_dead_key = EINA_TRUE;
1289 }
1290 else if (res == 0)
1291 {
1292 INF("No translatable character found, skipping");
1293 return NULL;
1294 }
1295 else if (res >= 2)
1296 {
1297 /*
1298 * Most common case : dead key which can not be composed,
1299 * buf[0] is invalid and buf[1] is the dead key.
1300 * Call ToUnicode again to get something sane.
1301 */
1302 res = ToUnicode(msg->window_param,
1303 MapVirtualKey(msg->window_param, MAPVK_VK_TO_CHAR),
1304 kbd_state, buf, 4, 0);
1305 if (res == -1)
1306 is_dead_key = EINA_TRUE;
1307 if ((res != 1) && (res != -1))
1308 return NULL;
1309 }
1310
1311 if (is_dead_key)
1312 keyname = _ecore_win32_diacritic_get(buf[0]);
1313 else
1314 {
1315 offset = _ecore_win32_keysym_offset_get(buf[0]);
1316 if (offset != 0xffffffff)
1317 keyname = _ecore_win32_keysym_names + offset;
1318 }
1319
1320 /* Restore modifiers */
1321 _ecore_win32_modifiers_alt_restore(kbd_state, modifiers_save);
1322 _ecore_win32_modifiers_ctrl_restore(kbd_state, modifiers_save);
1323 _ecore_win32_modifiers_shift_restore(kbd_state, modifiers_save);
1324 _ecore_win32_modifiers_win_restore(kbd_state, modifiers_save);
1325
1326 if (!SetKeyboardState(kbd_state))
1327 return NULL;
1328
1329 if (!keyname)
1330 {
1331 WRN("no keysym found for keycode %d\n", string[0]);
1332 return NULL;
1333 }
1334 }
1335 }
1336
1337 e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key) +
1338 strlen(keyname) + 1 +
1339 strlen(key) + 1 +
1340 (compose ? (strlen(compose) + 1) : 0));
1341 if (!e)
1342 return NULL;
1343
1344 e->keyname = (char *)(e + 1);
1345 e->key = e->keyname + strlen(keyname) + 1;
1346 e->compose = NULL;
1347 if (compose)
1348 e->compose = (e->key + strlen(key) + 1);
1349 e->string = e->compose;
1350
1351 memcpy((char *)e->keyname, keyname, strlen(keyname));
1352 memcpy((char *)e->key, key, strlen(key));
1353 if (compose) memcpy((char *)e->compose, compose, strlen(compose));
1354
1355 return e;
1356}
1357
1358/***** Global functions definitions *****/
1359
1360void
1361_ecore_win32_event_handle_key_press(Ecore_Win32_Callback_Data *msg)
1362{
1363 Ecore_Event_Key *e = NULL;
1364
1365 INF("key pressed");
1366
1367 e = _ecore_win32_event_keystroke_get(msg, EINA_TRUE);
1368 if (!e)
1369 return;
1370
101 e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWLP_USERDATA); 1371 e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWLP_USERDATA);
102 if (!e->window) 1372 if (!e->window)
103 { 1373 {
104 free(e); 1374 free(e);
105 return; 1375 return;
106 } 1376 }
1377 e->root_window = (Ecore_Window)GetAncestor(msg->window, GA_ROOT);
107 e->event_window = e->window; 1378 e->event_window = e->window;
1379 e->same_screen = 1;
108 e->timestamp = msg->timestamp; 1380 e->timestamp = msg->timestamp;
1381 e->modifiers = _ecore_win32_modifiers_get();
109 1382
110 _ecore_win32_event_last_time = e->timestamp; 1383 _ecore_win32_event_last_time = e->timestamp;
111 1384
112 ecore_event_add(ECORE_EVENT_KEY_DOWN, e, _ecore_win32_event_free_key_down, NULL); 1385 ecore_event_add(ECORE_EVENT_KEY_DOWN, e, NULL, NULL);
113} 1386}
114 1387
115void 1388void
@@ -119,27 +1392,9 @@ _ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg)
119 1392
120 INF("key released"); 1393 INF("key released");
121 1394
122 e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key)); 1395 e = _ecore_win32_event_keystroke_get(msg, EINA_FALSE);
123 if (!e) return; 1396 if (!e)
124 1397 return;
125 if (!_ecore_win32_event_keystroke_get(msg,
126 EINA_FALSE,
127 (char **)&e->keyname,
128 (char **)&e->key,
129 (char **)&e->string,
130 &e->modifiers))
131 {
132 if (msg->discard_ctrl ||
133 !_ecore_win32_event_char_get(LOWORD(msg->window_param),
134 (char **)&e->keyname,
135 (char **)&e->key,
136 (char **)&e->string,
137 &e->modifiers))
138 {
139 free(e);
140 return;
141 }
142 }
143 1398
144 e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWLP_USERDATA); 1399 e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWLP_USERDATA);
145 if (!e->window) 1400 if (!e->window)
@@ -147,12 +1402,15 @@ _ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg)
147 free(e); 1402 free(e);
148 return; 1403 return;
149 } 1404 }
1405 e->root_window = (Ecore_Window)GetAncestor(msg->window, GA_ROOT);
150 e->event_window = e->window; 1406 e->event_window = e->window;
1407 e->same_screen = 1;
151 e->timestamp = msg->timestamp; 1408 e->timestamp = msg->timestamp;
1409 e->modifiers = _ecore_win32_modifiers_get();
152 1410
153 _ecore_win32_event_last_time = e->timestamp; 1411 _ecore_win32_event_last_time = e->timestamp;
154 1412
155 ecore_event_add(ECORE_EVENT_KEY_UP, e, _ecore_win32_event_free_key_up, NULL); 1413 ecore_event_add(ECORE_EVENT_KEY_UP, e, NULL, NULL);
156} 1414}
157 1415
158void 1416void
@@ -180,6 +1438,7 @@ _ecore_win32_event_handle_button_press(Ecore_Win32_Callback_Data *msg,
180 e->x = GET_X_LPARAM(msg->data_param); 1438 e->x = GET_X_LPARAM(msg->data_param);
181 e->y = GET_Y_LPARAM(msg->data_param); 1439 e->y = GET_Y_LPARAM(msg->data_param);
182 e->timestamp = msg->timestamp; 1440 e->timestamp = msg->timestamp;
1441 e->modifiers = _ecore_win32_modifiers_get();
183 1442
184 _ecore_win32_event_last_time = e->timestamp; 1443 _ecore_win32_event_last_time = e->timestamp;
185 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window; 1444 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
@@ -188,75 +1447,77 @@ _ecore_win32_event_handle_button_press(Ecore_Win32_Callback_Data *msg,
188 } 1447 }
189 else 1448 else
190 { 1449 {
191 { 1450 {
192 Ecore_Event_Mouse_Move *e; 1451 Ecore_Event_Mouse_Move *e;
193 1452
194 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move)); 1453 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
195 if (!e) return; 1454 if (!e) return;
196 1455
197 e->window = (Ecore_Window)window; 1456 e->window = (Ecore_Window)window;
198 e->event_window = e->window; 1457 e->event_window = e->window;
199 e->x = GET_X_LPARAM(msg->data_param); 1458 e->x = GET_X_LPARAM(msg->data_param);
200 e->y = GET_Y_LPARAM(msg->data_param); 1459 e->y = GET_Y_LPARAM(msg->data_param);
201 e->timestamp = msg->timestamp; 1460 e->timestamp = msg->timestamp;
202 1461 e->modifiers = _ecore_win32_modifiers_get();
203 _ecore_win32_event_last_time = e->timestamp; 1462
204 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window; 1463 _ecore_win32_event_last_time = e->timestamp;
205 1464 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
206 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL); 1465
207 } 1466 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
208 1467 }
209 { 1468
210 Ecore_Event_Mouse_Button *e; 1469 {
211 1470 Ecore_Event_Mouse_Button *e;
212 if (_ecore_win32_mouse_down_did_triple) 1471
213 { 1472 if (_ecore_win32_mouse_down_did_triple)
214 _ecore_win32_mouse_down_last_window = NULL; 1473 {
215 _ecore_win32_mouse_down_last_last_window = NULL; 1474 _ecore_win32_mouse_down_last_window = NULL;
216 _ecore_win32_mouse_down_last_time = 0; 1475 _ecore_win32_mouse_down_last_last_window = NULL;
217 _ecore_win32_mouse_down_last_last_time = 0; 1476 _ecore_win32_mouse_down_last_time = 0;
218 } 1477 _ecore_win32_mouse_down_last_last_time = 0;
219 1478 }
220 e = (Ecore_Event_Mouse_Button *)calloc(1, sizeof(Ecore_Event_Mouse_Button)); 1479
221 if (!e) return; 1480 e = (Ecore_Event_Mouse_Button *)calloc(1, sizeof(Ecore_Event_Mouse_Button));
222 1481 if (!e) return;
223 e->window = (Ecore_Window)window; 1482
224 e->event_window = e->window; 1483 e->window = (Ecore_Window)window;
225 e->buttons = button; 1484 e->event_window = e->window;
226 e->x = GET_X_LPARAM(msg->data_param); 1485 e->buttons = button;
227 e->y = GET_Y_LPARAM(msg->data_param); 1486 e->x = GET_X_LPARAM(msg->data_param);
228 e->timestamp = msg->timestamp; 1487 e->y = GET_Y_LPARAM(msg->data_param);
229 1488 e->timestamp = msg->timestamp;
230 if (((e->timestamp - _ecore_win32_mouse_down_last_time) <= (unsigned long)(1000 * _ecore_win32_double_click_time)) && 1489 e->modifiers = _ecore_win32_modifiers_get();
231 (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_window)) 1490
232 e->double_click = 1; 1491 if (((e->timestamp - _ecore_win32_mouse_down_last_time) <= (unsigned long)(1000 * _ecore_win32_double_click_time)) &&
233 1492 (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_window))
234 if (((e->timestamp - _ecore_win32_mouse_down_last_last_time) <= (unsigned long)(2 * 1000 * _ecore_win32_double_click_time)) && 1493 e->double_click = 1;
235 (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_window) && 1494
236 (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_last_window)) 1495 if (((e->timestamp - _ecore_win32_mouse_down_last_last_time) <= (unsigned long)(2 * 1000 * _ecore_win32_double_click_time)) &&
237 { 1496 (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_window) &&
238 e->triple_click = 1; 1497 (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_last_window))
239 _ecore_win32_mouse_down_did_triple = 1; 1498 {
240 } 1499 e->triple_click = 1;
241 else 1500 _ecore_win32_mouse_down_did_triple = 1;
242 _ecore_win32_mouse_down_did_triple = 0; 1501 }
243 1502 else
244 if (!e->double_click && !e->triple_click) 1503 _ecore_win32_mouse_down_did_triple = 0;
245 _ecore_win32_mouse_up_count = 0; 1504
246 1505 if (!e->double_click && !e->triple_click)
247 _ecore_win32_event_last_time = e->timestamp; 1506 _ecore_win32_mouse_up_count = 0;
248 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window; 1507
249 1508 _ecore_win32_event_last_time = e->timestamp;
250 if (!_ecore_win32_mouse_down_did_triple) 1509 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
251 { 1510
252 _ecore_win32_mouse_down_last_last_window = _ecore_win32_mouse_down_last_window; 1511 if (!_ecore_win32_mouse_down_did_triple)
253 _ecore_win32_mouse_down_last_window = (Ecore_Win32_Window *)e->window; 1512 {
254 _ecore_win32_mouse_down_last_last_time = _ecore_win32_mouse_down_last_time; 1513 _ecore_win32_mouse_down_last_last_window = _ecore_win32_mouse_down_last_window;
255 _ecore_win32_mouse_down_last_time = e->timestamp; 1514 _ecore_win32_mouse_down_last_window = (Ecore_Win32_Window *)e->window;
256 } 1515 _ecore_win32_mouse_down_last_last_time = _ecore_win32_mouse_down_last_time;
257 1516 _ecore_win32_mouse_down_last_time = e->timestamp;
258 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL); 1517 }
259 } 1518
1519 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
1520 }
260 } 1521 }
261} 1522}
262 1523
@@ -281,6 +1542,7 @@ _ecore_win32_event_handle_button_release(Ecore_Win32_Callback_Data *msg,
281 e->x = GET_X_LPARAM(msg->data_param); 1542 e->x = GET_X_LPARAM(msg->data_param);
282 e->y = GET_Y_LPARAM(msg->data_param); 1543 e->y = GET_Y_LPARAM(msg->data_param);
283 e->timestamp = msg->timestamp; 1544 e->timestamp = msg->timestamp;
1545 e->modifiers = _ecore_win32_modifiers_get();
284 1546
285 _ecore_win32_event_last_time = e->timestamp; 1547 _ecore_win32_event_last_time = e->timestamp;
286 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window; 1548 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
@@ -300,6 +1562,7 @@ _ecore_win32_event_handle_button_release(Ecore_Win32_Callback_Data *msg,
300 e->x = GET_X_LPARAM(msg->data_param); 1562 e->x = GET_X_LPARAM(msg->data_param);
301 e->y = GET_Y_LPARAM(msg->data_param); 1563 e->y = GET_Y_LPARAM(msg->data_param);
302 e->timestamp = msg->timestamp; 1564 e->timestamp = msg->timestamp;
1565 e->modifiers = _ecore_win32_modifiers_get();
303 1566
304 _ecore_win32_mouse_up_count++; 1567 _ecore_win32_mouse_up_count++;
305 1568
@@ -336,6 +1599,7 @@ _ecore_win32_event_handle_motion_notify(Ecore_Win32_Callback_Data *msg)
336 e->x = GET_X_LPARAM(msg->data_param); 1599 e->x = GET_X_LPARAM(msg->data_param);
337 e->y = GET_Y_LPARAM(msg->data_param); 1600 e->y = GET_Y_LPARAM(msg->data_param);
338 e->timestamp = msg->timestamp; 1601 e->timestamp = msg->timestamp;
1602 e->modifiers = _ecore_win32_modifiers_get();
339 1603
340 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL); 1604 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
341} 1605}
@@ -343,81 +1607,85 @@ _ecore_win32_event_handle_motion_notify(Ecore_Win32_Callback_Data *msg)
343void 1607void
344_ecore_win32_event_handle_enter_notify(Ecore_Win32_Callback_Data *msg) 1608_ecore_win32_event_handle_enter_notify(Ecore_Win32_Callback_Data *msg)
345{ 1609{
346 { 1610 {
347 Ecore_Event_Mouse_Move *e; 1611 Ecore_Event_Mouse_Move *e;
348 1612
349 INF("mouse in"); 1613 INF("mouse in");
350 1614
351 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move)); 1615 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
352 if (!e) return; 1616 if (!e) return;
353 1617
354 e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWLP_USERDATA); 1618 e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWLP_USERDATA);
355 e->event_window = e->window; 1619 e->event_window = e->window;
356 e->x = msg->x; 1620 e->x = msg->x;
357 e->y = msg->y; 1621 e->y = msg->y;
358 e->timestamp = msg->timestamp; 1622 e->timestamp = msg->timestamp;
1623 e->modifiers = _ecore_win32_modifiers_get();
359 1624
360 _ecore_win32_event_last_time = e->timestamp; 1625 _ecore_win32_event_last_time = e->timestamp;
361 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window; 1626 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
362 1627
363 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL); 1628 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
364 } 1629 }
365 1630
366 { 1631 {
367 Ecore_Win32_Event_Mouse_In *e; 1632 Ecore_Win32_Event_Mouse_In *e;
368 1633
369 e = (Ecore_Win32_Event_Mouse_In *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_In)); 1634 e = (Ecore_Win32_Event_Mouse_In *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_In));
370 if (!e) return; 1635 if (!e) return;
371 1636
372 e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA); 1637 e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
373 e->x = msg->x; 1638 e->x = msg->x;
374 e->y = msg->y; 1639 e->y = msg->y;
375 e->timestamp = msg->timestamp ; 1640 e->timestamp = msg->timestamp ;
1641 e->modifiers = _ecore_win32_modifiers_get();
376 1642
377 _ecore_win32_event_last_time = e->timestamp; 1643 _ecore_win32_event_last_time = e->timestamp;
378 1644
379 ecore_event_add(ECORE_WIN32_EVENT_MOUSE_IN, e, NULL, NULL); 1645 ecore_event_add(ECORE_WIN32_EVENT_MOUSE_IN, e, NULL, NULL);
380 } 1646 }
381} 1647}
382 1648
383void 1649void
384_ecore_win32_event_handle_leave_notify(Ecore_Win32_Callback_Data *msg) 1650_ecore_win32_event_handle_leave_notify(Ecore_Win32_Callback_Data *msg)
385{ 1651{
386 { 1652 {
387 Ecore_Event_Mouse_Move *e; 1653 Ecore_Event_Mouse_Move *e;
388 1654
389 INF("mouse out"); 1655 INF("mouse out");
390 1656
391 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move)); 1657 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
392 if (!e) return; 1658 if (!e) return;
393 1659
394 e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWLP_USERDATA); 1660 e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWLP_USERDATA);
395 e->event_window = e->window; 1661 e->event_window = e->window;
396 e->x = msg->x; 1662 e->x = msg->x;
397 e->y = msg->y; 1663 e->y = msg->y;
398 e->timestamp = msg->timestamp; 1664 e->timestamp = msg->timestamp;
1665 e->modifiers = _ecore_win32_modifiers_get();
399 1666
400 _ecore_win32_event_last_time = e->timestamp; 1667 _ecore_win32_event_last_time = e->timestamp;
401 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window; 1668 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
402 1669
403 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL); 1670 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
404 } 1671 }
405 1672
406 { 1673 {
407 Ecore_Win32_Event_Mouse_Out *e; 1674 Ecore_Win32_Event_Mouse_Out *e;
408 1675
409 e = (Ecore_Win32_Event_Mouse_Out *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Out)); 1676 e = (Ecore_Win32_Event_Mouse_Out *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Out));
410 if (!e) return; 1677 if (!e) return;
411 1678
412 e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA); 1679 e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
413 e->x = msg->x; 1680 e->x = msg->x;
414 e->y = msg->y; 1681 e->y = msg->y;
415 e->timestamp = msg->timestamp; 1682 e->timestamp = msg->timestamp;
1683 e->modifiers = _ecore_win32_modifiers_get();
416 1684
417 _ecore_win32_event_last_time = e->timestamp; 1685 _ecore_win32_event_last_time = e->timestamp;
418 1686
419 ecore_event_add(ECORE_WIN32_EVENT_MOUSE_OUT, e, NULL, NULL); 1687 ecore_event_add(ECORE_WIN32_EVENT_MOUSE_OUT, e, NULL, NULL);
420 } 1688 }
421} 1689}
422 1690
423void 1691void
@@ -615,693 +1883,3 @@ _ecore_win32_event_handle_delete_request(Ecore_Win32_Callback_Data *msg)
615 1883
616 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL); 1884 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
617} 1885}
618
619
620/***** Private functions definitions *****/
621
622static void
623_ecore_win32_event_free_key_down(void *data EINA_UNUSED,
624 void *ev)
625{
626 Ecore_Event_Key *e;
627
628 e = ev;
629 if (e->keyname) free((char *)e->keyname);
630 if (e->key) free((char *)e->key);
631 if (e->string) free((char *)e->string);
632 free(e);
633}
634
635static void
636_ecore_win32_event_free_key_up(void *data EINA_UNUSED,
637 void *ev)
638{
639 Ecore_Event_Key *e;
640
641 e = ev;
642 if (e->keyname) free((char *)e->keyname);
643 if (e->key) free((char *)e->key);
644 if (e->string) free((char *)e->string);
645 free(e);
646}
647
648static int
649_ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg,
650 Eina_Bool is_down,
651 char **keyname,
652 char **keysymbol,
653 char **keycompose,
654 unsigned int *modifiers)
655{
656 WCHAR buf[3];
657 char delete_string[2] = { 0x7f, 0 };
658 char *kn = NULL;
659 char *ks = NULL;
660 char *kc = NULL;
661 int key;
662 int is_extended;
663 int previous_key_state;
664
665 key = msg->window_param;
666 is_extended = msg->data_param & 0x01000000;
667 previous_key_state = msg->data_param & 0x40000000;
668
669 *keyname = NULL;
670 *keysymbol = NULL;
671 *keycompose = NULL;
672
673 switch (key)
674 {
675 /* Keystroke */
676 case VK_PRIOR:
677 if (is_extended)
678 {
679 kn = "Prior";
680 ks = "Prior";
681 kc = NULL;
682 }
683 else
684 {
685 kn = "KP_Prior";
686 ks = "KP_9";
687 kc = "KP_Prior";
688 }
689 break;
690 case VK_NEXT:
691 if (is_extended)
692 {
693 kn = "Next";
694 ks = "Next";
695 kc = NULL;
696 }
697 else
698 {
699 kn = "KP_Next";
700 ks = "KP_3";
701 kc = "KP_Next";
702 }
703 break;
704 case VK_END:
705 if (is_extended)
706 {
707 kn = "End";
708 ks = "End";
709 kc = NULL;
710 }
711 else
712 {
713 kn = "KP_End";
714 ks = "KP_1";
715 kc = "KP_End";
716 }
717 break;
718 case VK_HOME:
719 if (is_extended)
720 {
721 kn = "Home";
722 ks = "Home";
723 kc = NULL;
724 }
725 else
726 {
727 kn = "KP_Home";
728 ks = "KP_7";
729 kc = "KP_Home";
730 }
731 break;
732 case VK_LEFT:
733 if (is_extended)
734 {
735 kn = "Left";
736 ks = "Left";
737 kc = NULL;
738 }
739 else
740 {
741 kn = "KP_Left";
742 ks = "KP_4";
743 kc = "KP_Left";
744 }
745 break;
746 case VK_UP:
747 if (is_extended)
748 {
749 kn = "Up";
750 ks = "Up";
751 kc = NULL;
752 }
753 else
754 {
755 kn = "KP_Up";
756 ks = "KP_8";
757 kc = "KP_Up";
758 }
759 break;
760 case VK_RIGHT:
761 if (is_extended)
762 {
763 kn = "Right";
764 ks = "Right";
765 kc = NULL;
766 }
767 else
768 {
769 kn = "KP_Right";
770 ks = "KP_6";
771 kc = "KP_Right";
772 }
773 break;
774 case VK_DOWN:
775 if (is_extended)
776 {
777 kn = "Down";
778 ks = "Down";
779 kc = NULL;
780 }
781 else
782 {
783 kn = "KP_Down";
784 ks = "KP_2";
785 kc = "KP_Down";
786 }
787 break;
788 case VK_INSERT:
789 if (is_extended)
790 {
791 kn = "Insert";
792 ks = "Insert";
793 kc = NULL;
794 }
795 else
796 {
797 kn = "KP_Insert";
798 ks = "KP_0";
799 kc = "KP_Insert";
800 }
801 break;
802 case VK_DELETE:
803 if (is_extended)
804 {
805 kn = "Delete";
806 ks = "Delete";
807 kc = delete_string;
808 }
809 else
810 {
811 kn = "KP_Delete";
812 ks = "KP_Decimal";
813 kc = "KP_Delete";
814 }
815 break;
816 case VK_SHIFT:
817 {
818 SHORT res;
819
820 if (is_down)
821 {
822 if (previous_key_state) return 0;
823 res = GetKeyState(VK_LSHIFT);
824 if (res & 0x8000)
825 {
826 _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_LSHIFT;
827 kn = "Shift_L";
828 ks = "Shift_L";
829 kc = "";
830 }
831 res = GetKeyState(VK_RSHIFT);
832 if (res & 0x8000)
833 {
834 _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_RSHIFT;
835 kn = "Shift_R";
836 ks = "Shift_R";
837 kc = "";
838 }
839 *modifiers &= ~ECORE_EVENT_MODIFIER_SHIFT;
840 }
841 else /* is_up */
842 {
843 res = GetKeyState(VK_LSHIFT);
844 if (!(res & 0x8000) &&
845 (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_LSHIFT))
846 {
847 kn = "Shift_L";
848 ks = "Shift_L";
849 kc = "";
850 _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_LSHIFT;
851 }
852 res = GetKeyState(VK_RSHIFT);
853 if (!(res & 0x8000) &&
854 (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_RSHIFT))
855 {
856 kn = "Shift_R";
857 ks = "Shift_R";
858 kc = "";
859 _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_RSHIFT;
860 }
861 *modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
862 }
863 break;
864 }
865 case VK_CONTROL:
866 {
867 SHORT res;
868
869 if (msg->discard_ctrl)
870 return 0;
871
872 if (is_down)
873 {
874 if (previous_key_state) return 0;
875 res = GetKeyState(VK_LCONTROL);
876 if (res & 0x8000)
877 {
878 _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_LCONTROL;
879 kn = "Control_L";
880 ks = "Control_L";
881 kc = "";
882 break;
883 }
884 res = GetKeyState(VK_RCONTROL);
885 if (res & 0x8000)
886 {
887 _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_RCONTROL;
888 kn = "Control_R";
889 ks = "Control_R";
890 kc = "";
891 break;
892 }
893 *modifiers |= ECORE_EVENT_MODIFIER_CTRL;
894 }
895 else /* is_up */
896 {
897 res = GetKeyState(VK_LCONTROL);
898 if (!(res & 0x8000) &&
899 (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_LCONTROL))
900 {
901 kn = "Control_L";
902 ks = "Control_L";
903 kc = "";
904 _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_LCONTROL;
905 break;
906 }
907 res = GetKeyState(VK_RCONTROL);
908 if (!(res & 0x8000) &&
909 (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_RCONTROL))
910 {
911 kn = "Control_R";
912 ks = "Control_R";
913 kc = "";
914 _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_RCONTROL;
915 break;
916 }
917 *modifiers &= ~ECORE_EVENT_MODIFIER_CTRL;
918 }
919 break;
920 }
921 case VK_MENU:
922 {
923 SHORT res;
924
925 if (is_down)
926 {
927 if (previous_key_state) return 0;
928 res = GetKeyState(VK_LMENU);
929 if (res & 0x8000)
930 {
931 _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_LMENU;
932 kn = "Alt_L";
933 ks = "Alt_L";
934 kc = "";
935 }
936 res = GetKeyState(VK_RMENU);
937 if (res & 0x8000)
938 {
939 _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_RMENU;
940 kn = "Alt_R";
941 ks = "Alt_R";
942 kc = "";
943 }
944 *modifiers |= ECORE_EVENT_MODIFIER_ALT;
945 }
946 else /* is_up */
947 {
948 res = GetKeyState(VK_LMENU);
949 if (!(res & 0x8000) &&
950 (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_LMENU))
951 {
952 kn = "Alt_L";
953 ks = "Alt_L";
954 kc = "";
955 _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_LMENU;
956 }
957 res = GetKeyState(VK_RMENU);
958 if (!(res & 0x8000) &&
959 (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_RMENU))
960 {
961 kn = "Alt_R";
962 ks = "Alt_R";
963 kc = "";
964 _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_RMENU;
965 }
966 *modifiers &= ~ECORE_EVENT_MODIFIER_ALT;
967 }
968 break;
969 }
970 case VK_LWIN:
971 {
972 if (is_down)
973 {
974 if (previous_key_state) return 0;
975 kn = "Super_L";
976 ks = "Super_L";
977 kc = "";
978 *modifiers |= ECORE_EVENT_MODIFIER_WIN;
979 }
980 else /* is_up */
981 {
982 kn = "Super_L";
983 ks = "Super_L";
984 kc = "";
985 *modifiers &= ~ECORE_EVENT_MODIFIER_WIN;
986 }
987 break;
988 }
989 case VK_RWIN:
990 {
991 if (is_down)
992 {
993 if (previous_key_state) return 0;
994 kn = "Super_R";
995 ks = "Super_R";
996 kc = "";
997 *modifiers |= ECORE_EVENT_MODIFIER_WIN;
998 }
999 else /* is_up */
1000 {
1001 kn = "Super_R";
1002 ks = "Super_R";
1003 kc = "";
1004 *modifiers &= ~ECORE_EVENT_MODIFIER_WIN;
1005 }
1006 break;
1007 }
1008 case VK_F1:
1009 kn = "F1";
1010 ks = "F1";
1011 kc = "";
1012 break;
1013 case VK_F2:
1014 kn = "F2";
1015 ks = "F2";
1016 kc = "";
1017 break;
1018 case VK_F3:
1019 kn = "F3";
1020 ks = "F3";
1021 kc = "";
1022 break;
1023 case VK_F4:
1024 kn = "F4";
1025 ks = "F4";
1026 kc = "";
1027 break;
1028 case VK_F5:
1029 kn = "F5";
1030 ks = "F5";
1031 kc = "";
1032 break;
1033 case VK_F6:
1034 kn = "F6";
1035 ks = "F6";
1036 kc = "";
1037 break;
1038 case VK_F7:
1039 kn = "F7";
1040 ks = "F7";
1041 kc = "";
1042 break;
1043 case VK_F8:
1044 kn = "F8";
1045 ks = "F8";
1046 kc = "";
1047 break;
1048 case VK_F9:
1049 kn = "F9";
1050 ks = "F9";
1051 kc = "";
1052 break;
1053 case VK_F10:
1054 kn = "F10";
1055 ks = "F10";
1056 kc = "";
1057 break;
1058 case VK_F11:
1059 kn = "F11";
1060 ks = "F11";
1061 kc = "";
1062 break;
1063 case VK_F12:
1064 kn = "F12";
1065 ks = "F12";
1066 kc = "";
1067 break;
1068 case VK_F13:
1069 kn = "F13";
1070 ks = "F13";
1071 kc = "";
1072 break;
1073 case VK_F14:
1074 kn = "F14";
1075 ks = "F14";
1076 kc = "";
1077 break;
1078 case VK_F15:
1079 kn = "F15";
1080 ks = "F15";
1081 kc = "";
1082 break;
1083 case VK_F16:
1084 kn = "F16";
1085 ks = "F16";
1086 kc = "";
1087 break;
1088 case VK_F17:
1089 kn = "F17";
1090 ks = "F17";
1091 kc = "";
1092 break;
1093 case VK_F18:
1094 kn = "F18";
1095 ks = "F18";
1096 kc = "";
1097 break;
1098 case VK_F19:
1099 kn = "F19";
1100 ks = "F19";
1101 kc = "";
1102 break;
1103 case VK_F20:
1104 kn = "F20";
1105 ks = "F20";
1106 kc = "";
1107 break;
1108 case VK_F21:
1109 kn = "F21";
1110 ks = "F21";
1111 kc = "";
1112 break;
1113 case VK_F22:
1114 kn = "F22";
1115 ks = "F22";
1116 kc = "";
1117 break;
1118 case VK_F23:
1119 kn = "F23";
1120 ks = "F23";
1121 kc = "";
1122 break;
1123 case VK_F24:
1124 kn = "F24";
1125 ks = "F24";
1126 kc = "";
1127 break;
1128 default:
1129 {
1130 /* other non keystroke characters */
1131 BYTE kbd_state[256];
1132 int res;
1133
1134 if (is_down)
1135 return 0;
1136
1137 if (!GetKeyboardState(kbd_state))
1138 return 0;
1139
1140 res = ToUnicode(msg->window_param,
1141 MapVirtualKey(msg->window_param, 2),
1142 kbd_state, buf, 3, 0);
1143 if (res == 1)
1144 {
1145 /* FIXME: might be troublesome for non european languages */
1146 /* in that case, UNICODE should be used, I guess */
1147 buf[1] = '\0';
1148 kn = (char *)buf;
1149 ks = (char *)buf;
1150 kc = (char *)buf;
1151
1152 res = GetAsyncKeyState(VK_SHIFT);
1153 if (res & 0x8000)
1154 *modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
1155 else
1156 *modifiers &= ~ECORE_EVENT_MODIFIER_SHIFT;
1157
1158 res = GetKeyState(VK_CONTROL);
1159 if (res & 0x8000)
1160 *modifiers |= ECORE_EVENT_MODIFIER_CTRL;
1161 else
1162 *modifiers &= ~ECORE_EVENT_MODIFIER_CTRL;
1163
1164 res = GetKeyState(VK_MENU);
1165 if (res & 0x8000)
1166 *modifiers |= ECORE_EVENT_MODIFIER_ALT;
1167 else
1168 *modifiers &= ~ECORE_EVENT_MODIFIER_ALT;
1169
1170 break;
1171 }
1172 return 0;
1173 }
1174 }
1175
1176 *keyname = strdup(kn);
1177 if (!*keyname) return 0;
1178 *keysymbol = strdup(ks);
1179 if (!*keysymbol)
1180 {
1181 free(*keyname);
1182 *keyname = NULL;
1183 return 0;
1184 }
1185 if (!kc)
1186 *keycompose = NULL;
1187 else
1188 {
1189 *keycompose = strdup(kc);
1190 if (!*keycompose)
1191 {
1192 free(*keyname);
1193 free(*keysymbol);
1194 *keyname = NULL;
1195 *keysymbol = NULL;
1196 return 0;
1197 }
1198 }
1199
1200 return 1;
1201}
1202
1203static int
1204_ecore_win32_event_char_get(int key,
1205 char **keyname,
1206 char **keysymbol,
1207 char **keycompose,
1208 unsigned int *modifiers)
1209{
1210 char *kn = NULL;
1211 char *ks = NULL;
1212 char *kc = NULL;
1213 char buf[2];
1214 SHORT res;
1215
1216 *keyname = NULL;
1217 *keysymbol = NULL;
1218 *keycompose = NULL;
1219
1220 /* check control charaters such as ^a(key:1), ^z(key:26) */
1221 if ((key > 0) && (key < 27) &&
1222 ((GetKeyState(VK_CONTROL) & 0x8000) ||
1223 (GetKeyState(VK_CONTROL) & 0x8000))) key += 96;
1224
1225 switch (key)
1226 {
1227 case VK_PROCESSKEY:
1228 break;
1229 case VK_BACK:
1230 kn = "BackSpace";
1231 ks = "BackSpace";
1232 kc = "\b";
1233 break;
1234 case VK_TAB:
1235 kn = "Tab";
1236 ks = "Tab";
1237 kc = "\t";
1238 break;
1239 case 0x0a:
1240 /* Line feed (Shift + Enter) */
1241 kn = "LineFeed";
1242 ks = "LineFeed";
1243 kc = "LineFeed";
1244 break;
1245 case VK_RETURN:
1246 kn = "Return";
1247 ks = "Return";
1248 kc = "\n";
1249 break;
1250 case VK_ESCAPE:
1251 kn = "Escape";
1252 ks = "Escape";
1253 kc = "\e";
1254 break;
1255 case VK_SPACE:
1256 kn = "space";
1257 ks = "space";
1258 kc = " ";
1259 break;
1260 default:
1261 /* displayable characters */
1262 buf[0] = key;
1263 buf[1] = '\0';
1264 kn = buf;
1265 ks = buf;
1266 kc = buf;
1267 break;
1268 }
1269 *keyname = strdup(kn);
1270 if (!*keyname) return 0;
1271 *keysymbol = strdup(ks);
1272 if (!*keysymbol)
1273 {
1274 free(*keyname);
1275 *keyname = NULL;
1276 return 0;
1277 }
1278 *keycompose = strdup(kc);
1279 if (!*keycompose)
1280 {
1281 free(*keyname);
1282 free(*keysymbol);
1283 *keyname = NULL;
1284 *keysymbol = NULL;
1285 return 0;
1286 }
1287
1288 res = GetAsyncKeyState(VK_SHIFT);
1289 if (res & 0x8000)
1290 *modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
1291 else
1292 *modifiers &= ~ECORE_EVENT_MODIFIER_SHIFT;
1293
1294 res = GetKeyState(VK_CONTROL);
1295 if (res & 0x8000)
1296 *modifiers |= ECORE_EVENT_MODIFIER_CTRL;
1297 else
1298 *modifiers &= ~ECORE_EVENT_MODIFIER_CTRL;
1299
1300 res = GetKeyState(VK_MENU);
1301 if (res & 0x8000)
1302 *modifiers |= ECORE_EVENT_MODIFIER_ALT;
1303 else
1304 *modifiers &= ~ECORE_EVENT_MODIFIER_ALT;
1305
1306 return 1;
1307}
diff --git a/src/lib/ecore_win32/ecore_win32_keysym_table.h b/src/lib/ecore_win32/ecore_win32_keysym_table.h
new file mode 100644
index 0000000000..b3a8da65b2
--- /dev/null
+++ b/src/lib/ecore_win32/ecore_win32_keysym_table.h
@@ -0,0 +1,4708 @@
1
2/**
3 * This file comes from the libxkbcommon project (http://xkbcommon.org/):
4 * https://raw.github.com/xkbcommon/libxkbcommon/master/src/ks_tables.h
5 * revision: 1d5ae2263a
6 * modified to fit with ecore_win32
7*/
8
9#ifndef ECORE_WIN32_KEYSYM_TABLE_H
10#define ECORE_WIN32_KEYSYM_TABLE_H
11
12#pragma GCC diagnostic push
13#pragma GCC diagnostic ignored "-Woverlength-strings"
14
15static const char *_ecore_win32_keysym_names =
16 "0\0"
17 "1\0"
18 "2\0"
19 "3\0"
20 "3270_AltCursor\0"
21 "3270_Attn\0"
22 "3270_BackTab\0"
23 "3270_ChangeScreen\0"
24 "3270_Copy\0"
25 "3270_CursorBlink\0"
26 "3270_CursorSelect\0"
27 "3270_DeleteWord\0"
28 "3270_Duplicate\0"
29 "3270_Enter\0"
30 "3270_EraseEOF\0"
31 "3270_EraseInput\0"
32 "3270_ExSelect\0"
33 "3270_FieldMark\0"
34 "3270_Ident\0"
35 "3270_Jump\0"
36 "3270_KeyClick\0"
37 "3270_Left2\0"
38 "3270_PA1\0"
39 "3270_PA2\0"
40 "3270_PA3\0"
41 "3270_Play\0"
42 "3270_PrintScreen\0"
43 "3270_Quit\0"
44 "3270_Record\0"
45 "3270_Reset\0"
46 "3270_Right2\0"
47 "3270_Rule\0"
48 "3270_Setup\0"
49 "3270_Test\0"
50 "4\0"
51 "5\0"
52 "6\0"
53 "7\0"
54 "8\0"
55 "9\0"
56 "A\0"
57 "a\0"
58 "Aacute\0"
59 "aacute\0"
60 "Abelowdot\0"
61 "abelowdot\0"
62 "abovedot\0"
63 "Abreve\0"
64 "abreve\0"
65 "Abreveacute\0"
66 "abreveacute\0"
67 "Abrevebelowdot\0"
68 "abrevebelowdot\0"
69 "Abrevegrave\0"
70 "abrevegrave\0"
71 "Abrevehook\0"
72 "abrevehook\0"
73 "Abrevetilde\0"
74 "abrevetilde\0"
75 "AccessX_Enable\0"
76 "AccessX_Feedback_Enable\0"
77 "Acircumflex\0"
78 "acircumflex\0"
79 "Acircumflexacute\0"
80 "acircumflexacute\0"
81 "Acircumflexbelowdot\0"
82 "acircumflexbelowdot\0"
83 "Acircumflexgrave\0"
84 "acircumflexgrave\0"
85 "Acircumflexhook\0"
86 "acircumflexhook\0"
87 "Acircumflextilde\0"
88 "acircumflextilde\0"
89 "acute\0"
90 "Adiaeresis\0"
91 "adiaeresis\0"
92 "AE\0"
93 "ae\0"
94 "Agrave\0"
95 "agrave\0"
96 "Ahook\0"
97 "ahook\0"
98 "Alt_L\0"
99 "Alt_R\0"
100 "Amacron\0"
101 "amacron\0"
102 "ampersand\0"
103 "Aogonek\0"
104 "aogonek\0"
105 "apostrophe\0"
106 "approxeq\0"
107 "approximate\0"
108 "Arabic_0\0"
109 "Arabic_1\0"
110 "Arabic_2\0"
111 "Arabic_3\0"
112 "Arabic_4\0"
113 "Arabic_5\0"
114 "Arabic_6\0"
115 "Arabic_7\0"
116 "Arabic_8\0"
117 "Arabic_9\0"
118 "Arabic_ain\0"
119 "Arabic_alef\0"
120 "Arabic_alefmaksura\0"
121 "Arabic_beh\0"
122 "Arabic_comma\0"
123 "Arabic_dad\0"
124 "Arabic_dal\0"
125 "Arabic_damma\0"
126 "Arabic_dammatan\0"
127 "Arabic_ddal\0"
128 "Arabic_farsi_yeh\0"
129 "Arabic_fatha\0"
130 "Arabic_fathatan\0"
131 "Arabic_feh\0"
132 "Arabic_fullstop\0"
133 "Arabic_gaf\0"
134 "Arabic_ghain\0"
135 "Arabic_ha\0"
136 "Arabic_hah\0"
137 "Arabic_hamza\0"
138 "Arabic_hamza_above\0"
139 "Arabic_hamza_below\0"
140 "Arabic_hamzaonalef\0"
141 "Arabic_hamzaonwaw\0"
142 "Arabic_hamzaonyeh\0"
143 "Arabic_hamzaunderalef\0"
144 "Arabic_heh\0"
145 "Arabic_heh_doachashmee\0"
146 "Arabic_heh_goal\0"
147 "Arabic_jeem\0"
148 "Arabic_jeh\0"
149 "Arabic_kaf\0"
150 "Arabic_kasra\0"
151 "Arabic_kasratan\0"
152 "Arabic_keheh\0"
153 "Arabic_khah\0"
154 "Arabic_lam\0"
155 "Arabic_madda_above\0"
156 "Arabic_maddaonalef\0"
157 "Arabic_meem\0"
158 "Arabic_noon\0"
159 "Arabic_noon_ghunna\0"
160 "Arabic_peh\0"
161 "Arabic_percent\0"
162 "Arabic_qaf\0"
163 "Arabic_question_mark\0"
164 "Arabic_ra\0"
165 "Arabic_rreh\0"
166 "Arabic_sad\0"
167 "Arabic_seen\0"
168 "Arabic_semicolon\0"
169 "Arabic_shadda\0"
170 "Arabic_sheen\0"
171 "Arabic_sukun\0"
172 "Arabic_superscript_alef\0"
173 "Arabic_switch\0"
174 "Arabic_tah\0"
175 "Arabic_tatweel\0"
176 "Arabic_tcheh\0"
177 "Arabic_teh\0"
178 "Arabic_tehmarbuta\0"
179 "Arabic_thal\0"
180 "Arabic_theh\0"
181 "Arabic_tteh\0"
182 "Arabic_veh\0"
183 "Arabic_waw\0"
184 "Arabic_yeh\0"
185 "Arabic_yeh_baree\0"
186 "Arabic_zah\0"
187 "Arabic_zain\0"
188 "Aring\0"
189 "aring\0"
190 "Armenian_accent\0"
191 "Armenian_amanak\0"
192 "Armenian_apostrophe\0"
193 "Armenian_AT\0"
194 "Armenian_at\0"
195 "Armenian_AYB\0"
196 "Armenian_ayb\0"
197 "Armenian_BEN\0"
198 "Armenian_ben\0"
199 "Armenian_but\0"
200 "Armenian_CHA\0"
201 "Armenian_cha\0"
202 "Armenian_DA\0"
203 "Armenian_da\0"
204 "Armenian_DZA\0"
205 "Armenian_dza\0"
206 "Armenian_E\0"
207 "Armenian_e\0"
208 "Armenian_exclam\0"
209 "Armenian_FE\0"
210 "Armenian_fe\0"
211 "Armenian_full_stop\0"
212 "Armenian_GHAT\0"
213 "Armenian_ghat\0"
214 "Armenian_GIM\0"
215 "Armenian_gim\0"
216 "Armenian_HI\0"
217 "Armenian_hi\0"
218 "Armenian_HO\0"
219 "Armenian_ho\0"
220 "Armenian_hyphen\0"
221 "Armenian_INI\0"
222 "Armenian_ini\0"
223 "Armenian_JE\0"
224 "Armenian_je\0"
225 "Armenian_KE\0"
226 "Armenian_ke\0"
227 "Armenian_KEN\0"
228 "Armenian_ken\0"
229 "Armenian_KHE\0"
230 "Armenian_khe\0"
231 "Armenian_ligature_ew\0"
232 "Armenian_LYUN\0"
233 "Armenian_lyun\0"
234 "Armenian_MEN\0"
235 "Armenian_men\0"
236 "Armenian_NU\0"
237 "Armenian_nu\0"
238 "Armenian_O\0"
239 "Armenian_o\0"
240 "Armenian_paruyk\0"
241 "Armenian_PE\0"
242 "Armenian_pe\0"
243 "Armenian_PYUR\0"
244 "Armenian_pyur\0"
245 "Armenian_question\0"
246 "Armenian_RA\0"
247 "Armenian_ra\0"
248 "Armenian_RE\0"
249 "Armenian_re\0"
250 "Armenian_SE\0"
251 "Armenian_se\0"
252 "Armenian_separation_mark\0"
253 "Armenian_SHA\0"
254 "Armenian_sha\0"
255 "Armenian_shesht\0"
256 "Armenian_TCHE\0"
257 "Armenian_tche\0"
258 "Armenian_TO\0"
259 "Armenian_to\0"
260 "Armenian_TSA\0"
261 "Armenian_tsa\0"
262 "Armenian_TSO\0"
263 "Armenian_tso\0"
264 "Armenian_TYUN\0"
265 "Armenian_tyun\0"
266 "Armenian_verjaket\0"
267 "Armenian_VEV\0"
268 "Armenian_vev\0"
269 "Armenian_VO\0"
270 "Armenian_vo\0"
271 "Armenian_VYUN\0"
272 "Armenian_vyun\0"
273 "Armenian_YECH\0"
274 "Armenian_yech\0"
275 "Armenian_yentamna\0"
276 "Armenian_ZA\0"
277 "Armenian_za\0"
278 "Armenian_ZHE\0"
279 "Armenian_zhe\0"
280 "asciicircum\0"
281 "asciitilde\0"
282 "asterisk\0"
283 "at\0"
284 "Atilde\0"
285 "atilde\0"
286 "AudibleBell_Enable\0"
287 "B\0"
288 "b\0"
289 "Babovedot\0"
290 "babovedot\0"
291 "backslash\0"
292 "BackSpace\0"
293 "BackTab\0"
294 "ballotcross\0"
295 "bar\0"
296 "because\0"
297 "Begin\0"
298 "blank\0"
299 "block\0"
300 "botintegral\0"
301 "botleftparens\0"
302 "botleftsqbracket\0"
303 "botleftsummation\0"
304 "botrightparens\0"
305 "botrightsqbracket\0"
306 "botrightsummation\0"
307 "bott\0"
308 "botvertsummationconnector\0"
309 "BounceKeys_Enable\0"
310 "braceleft\0"
311 "braceright\0"
312 "bracketleft\0"
313 "bracketright\0"
314 "braille_blank\0"
315 "braille_dot_1\0"
316 "braille_dot_10\0"
317 "braille_dot_2\0"
318 "braille_dot_3\0"
319 "braille_dot_4\0"
320 "braille_dot_5\0"
321 "braille_dot_6\0"
322 "braille_dot_7\0"
323 "braille_dot_8\0"
324 "braille_dot_9\0"
325 "braille_dots_1\0"
326 "braille_dots_12\0"
327 "braille_dots_123\0"
328 "braille_dots_1234\0"
329 "braille_dots_12345\0"
330 "braille_dots_123456\0"
331 "braille_dots_1234567\0"
332 "braille_dots_12345678\0"
333 "braille_dots_1234568\0"
334 "braille_dots_123457\0"
335 "braille_dots_1234578\0"
336 "braille_dots_123458\0"
337 "braille_dots_12346\0"
338 "braille_dots_123467\0"
339 "braille_dots_1234678\0"
340 "braille_dots_123468\0"
341 "braille_dots_12347\0"
342 "braille_dots_123478\0"
343 "braille_dots_12348\0"
344 "braille_dots_1235\0"
345 "braille_dots_12356\0"
346 "braille_dots_123567\0"
347 "braille_dots_1235678\0"
348 "braille_dots_123568\0"
349 "braille_dots_12357\0"
350 "braille_dots_123578\0"
351 "braille_dots_12358\0"
352 "braille_dots_1236\0"
353 "braille_dots_12367\0"
354 "braille_dots_123678\0"
355 "braille_dots_12368\0"
356 "braille_dots_1237\0"
357 "braille_dots_12378\0"
358 "braille_dots_1238\0"
359 "braille_dots_124\0"
360 "braille_dots_1245\0"
361 "braille_dots_12456\0"
362 "braille_dots_124567\0"
363 "braille_dots_1245678\0"
364 "braille_dots_124568\0"
365 "braille_dots_12457\0"
366 "braille_dots_124578\0"
367 "braille_dots_12458\0"
368 "braille_dots_1246\0"
369 "braille_dots_12467\0"
370 "braille_dots_124678\0"
371 "braille_dots_12468\0"
372 "braille_dots_1247\0"
373 "braille_dots_12478\0"
374 "braille_dots_1248\0"
375 "braille_dots_125\0"
376 "braille_dots_1256\0"
377 "braille_dots_12567\0"
378 "braille_dots_125678\0"
379 "braille_dots_12568\0"
380 "braille_dots_1257\0"
381 "braille_dots_12578\0"
382 "braille_dots_1258\0"
383 "braille_dots_126\0"
384 "braille_dots_1267\0"
385 "braille_dots_12678\0"
386 "braille_dots_1268\0"
387 "braille_dots_127\0"
388 "braille_dots_1278\0"
389 "braille_dots_128\0"
390 "braille_dots_13\0"
391 "braille_dots_134\0"
392 "braille_dots_1345\0"
393 "braille_dots_13456\0"
394 "braille_dots_134567\0"
395 "braille_dots_1345678\0"
396 "braille_dots_134568\0"
397 "braille_dots_13457\0"
398 "braille_dots_134578\0"
399 "braille_dots_13458\0"
400 "braille_dots_1346\0"
401 "braille_dots_13467\0"
402 "braille_dots_134678\0"
403 "braille_dots_13468\0"
404 "braille_dots_1347\0"
405 "braille_dots_13478\0"
406 "braille_dots_1348\0"
407 "braille_dots_135\0"
408 "braille_dots_1356\0"
409 "braille_dots_13567\0"
410 "braille_dots_135678\0"
411 "braille_dots_13568\0"
412 "braille_dots_1357\0"
413 "braille_dots_13578\0"
414 "braille_dots_1358\0"
415 "braille_dots_136\0"
416 "braille_dots_1367\0"
417 "braille_dots_13678\0"
418 "braille_dots_1368\0"
419 "braille_dots_137\0"
420 "braille_dots_1378\0"
421 "braille_dots_138\0"
422 "braille_dots_14\0"
423 "braille_dots_145\0"
424 "braille_dots_1456\0"
425 "braille_dots_14567\0"
426 "braille_dots_145678\0"
427 "braille_dots_14568\0"
428 "braille_dots_1457\0"
429 "braille_dots_14578\0"
430 "braille_dots_1458\0"
431 "braille_dots_146\0"
432 "braille_dots_1467\0"
433 "braille_dots_14678\0"
434 "braille_dots_1468\0"
435 "braille_dots_147\0"
436 "braille_dots_1478\0"
437 "braille_dots_148\0"
438 "braille_dots_15\0"
439 "braille_dots_156\0"
440 "braille_dots_1567\0"
441 "braille_dots_15678\0"
442 "braille_dots_1568\0"
443 "braille_dots_157\0"
444 "braille_dots_1578\0"
445 "braille_dots_158\0"
446 "braille_dots_16\0"
447 "braille_dots_167\0"
448 "braille_dots_1678\0"
449 "braille_dots_168\0"
450 "braille_dots_17\0"
451 "braille_dots_178\0"
452 "braille_dots_18\0"
453 "braille_dots_2\0"
454 "braille_dots_23\0"
455 "braille_dots_234\0"
456 "braille_dots_2345\0"
457 "braille_dots_23456\0"
458 "braille_dots_234567\0"
459 "braille_dots_2345678\0"
460 "braille_dots_234568\0"
461 "braille_dots_23457\0"
462 "braille_dots_234578\0"
463 "braille_dots_23458\0"
464 "braille_dots_2346\0"
465 "braille_dots_23467\0"
466 "braille_dots_234678\0"
467 "braille_dots_23468\0"
468 "braille_dots_2347\0"
469 "braille_dots_23478\0"
470 "braille_dots_2348\0"
471 "braille_dots_235\0"
472 "braille_dots_2356\0"
473 "braille_dots_23567\0"
474 "braille_dots_235678\0"
475 "braille_dots_23568\0"
476 "braille_dots_2357\0"
477 "braille_dots_23578\0"
478 "braille_dots_2358\0"
479 "braille_dots_236\0"
480 "braille_dots_2367\0"
481 "braille_dots_23678\0"
482 "braille_dots_2368\0"
483 "braille_dots_237\0"
484 "braille_dots_2378\0"
485 "braille_dots_238\0"
486 "braille_dots_24\0"
487 "braille_dots_245\0"
488 "braille_dots_2456\0"
489 "braille_dots_24567\0"
490 "braille_dots_245678\0"
491 "braille_dots_24568\0"
492 "braille_dots_2457\0"
493 "braille_dots_24578\0"
494 "braille_dots_2458\0"
495 "braille_dots_246\0"
496 "braille_dots_2467\0"
497 "braille_dots_24678\0"
498 "braille_dots_2468\0"
499 "braille_dots_247\0"
500 "braille_dots_2478\0"
501 "braille_dots_248\0"
502 "braille_dots_25\0"
503 "braille_dots_256\0"
504 "braille_dots_2567\0"
505 "braille_dots_25678\0"
506 "braille_dots_2568\0"
507 "braille_dots_257\0"
508 "braille_dots_2578\0"
509 "braille_dots_258\0"
510 "braille_dots_26\0"
511 "braille_dots_267\0"
512 "braille_dots_2678\0"
513 "braille_dots_268\0"
514 "braille_dots_27\0"
515 "braille_dots_278\0"
516 "braille_dots_28\0"
517 "braille_dots_3\0"
518 "braille_dots_34\0"
519 "braille_dots_345\0"
520 "braille_dots_3456\0"
521 "braille_dots_34567\0"
522 "braille_dots_345678\0"
523 "braille_dots_34568\0"
524 "braille_dots_3457\0"
525 "braille_dots_34578\0"
526 "braille_dots_3458\0"
527 "braille_dots_346\0"
528 "braille_dots_3467\0"
529 "braille_dots_34678\0"
530 "braille_dots_3468\0"
531 "braille_dots_347\0"
532 "braille_dots_3478\0"
533 "braille_dots_348\0"
534 "braille_dots_35\0"
535 "braille_dots_356\0"
536 "braille_dots_3567\0"
537 "braille_dots_35678\0"
538 "braille_dots_3568\0"
539 "braille_dots_357\0"
540 "braille_dots_3578\0"
541 "braille_dots_358\0"
542 "braille_dots_36\0"
543 "braille_dots_367\0"
544 "braille_dots_3678\0"
545 "braille_dots_368\0"
546 "braille_dots_37\0"
547 "braille_dots_378\0"
548 "braille_dots_38\0"
549 "braille_dots_4\0"
550 "braille_dots_45\0"
551 "braille_dots_456\0"
552 "braille_dots_4567\0"
553 "braille_dots_45678\0"
554 "braille_dots_4568\0"
555 "braille_dots_457\0"
556 "braille_dots_4578\0"
557 "braille_dots_458\0"
558 "braille_dots_46\0"
559 "braille_dots_467\0"
560 "braille_dots_4678\0"
561 "braille_dots_468\0"
562 "braille_dots_47\0"
563 "braille_dots_478\0"
564 "braille_dots_48\0"
565 "braille_dots_5\0"
566 "braille_dots_56\0"
567 "braille_dots_567\0"
568 "braille_dots_5678\0"
569 "braille_dots_568\0"
570 "braille_dots_57\0"
571 "braille_dots_578\0"
572 "braille_dots_58\0"
573 "braille_dots_6\0"
574 "braille_dots_67\0"
575 "braille_dots_678\0"
576 "braille_dots_68\0"
577 "braille_dots_7\0"
578 "braille_dots_78\0"
579 "braille_dots_8\0"
580 "Break\0"
581 "breve\0"
582 "brokenbar\0"
583 "Byelorussian_shortu\0"
584 "Byelorussian_SHORTU\0"
585 "C\0"
586 "c\0"
587 "c_h\0"
588 "C_h\0"
589 "C_H\0"
590 "Cabovedot\0"
591 "cabovedot\0"
592 "Cacute\0"
593 "cacute\0"
594 "Cancel\0"
595 "Caps_Lock\0"
596 "careof\0"
597 "caret\0"
598 "caron\0"
599 "Ccaron\0"
600 "ccaron\0"
601 "Ccedilla\0"
602 "ccedilla\0"
603 "Ccircumflex\0"
604 "ccircumflex\0"
605 "cedilla\0"
606 "cent\0"
607 "ch\0"
608 "Ch\0"
609 "CH\0"
610 "checkerboard\0"
611 "checkmark\0"
612 "circle\0"
613 "Clear\0"
614 "ClearLine\0"
615 "club\0"
616 "Codeinput\0"
617 "colon\0"
618 "ColonSign\0"
619 "comma\0"
620 "containsas\0"
621 "Control_L\0"
622 "Control_R\0"
623 "copyright\0"
624 "cr\0"
625 "crossinglines\0"
626 "CruzeiroSign\0"
627 "cuberoot\0"
628 "currency\0"
629 "cursor\0"
630 "Cyrillic_a\0"
631 "Cyrillic_A\0"
632 "Cyrillic_be\0"
633 "Cyrillic_BE\0"
634 "Cyrillic_che\0"
635 "Cyrillic_CHE\0"
636 "Cyrillic_CHE_descender\0"
637 "Cyrillic_che_descender\0"
638 "Cyrillic_CHE_vertstroke\0"
639 "Cyrillic_che_vertstroke\0"
640 "Cyrillic_de\0"
641 "Cyrillic_DE\0"
642 "Cyrillic_dzhe\0"
643 "Cyrillic_DZHE\0"
644 "Cyrillic_e\0"
645 "Cyrillic_E\0"
646 "Cyrillic_ef\0"
647 "Cyrillic_EF\0"
648 "Cyrillic_el\0"
649 "Cyrillic_EL\0"
650 "Cyrillic_em\0"
651 "Cyrillic_EM\0"
652 "Cyrillic_en\0"
653 "Cyrillic_EN\0"
654 "Cyrillic_EN_descender\0"
655 "Cyrillic_en_descender\0"
656 "Cyrillic_er\0"
657 "Cyrillic_ER\0"
658 "Cyrillic_es\0"
659 "Cyrillic_ES\0"
660 "Cyrillic_ghe\0"
661 "Cyrillic_GHE\0"
662 "Cyrillic_GHE_bar\0"
663 "Cyrillic_ghe_bar\0"
664 "Cyrillic_ha\0"
665 "Cyrillic_HA\0"
666 "Cyrillic_HA_descender\0"
667 "Cyrillic_ha_descender\0"
668 "Cyrillic_hardsign\0"
669 "Cyrillic_HARDSIGN\0"
670 "Cyrillic_i\0"
671 "Cyrillic_I\0"
672 "Cyrillic_I_macron\0"
673 "Cyrillic_i_macron\0"
674 "Cyrillic_ie\0"
675 "Cyrillic_IE\0"
676 "Cyrillic_io\0"
677 "Cyrillic_IO\0"
678 "Cyrillic_je\0"
679 "Cyrillic_JE\0"
680 "Cyrillic_ka\0"
681 "Cyrillic_KA\0"
682 "Cyrillic_KA_descender\0"
683 "Cyrillic_ka_descender\0"
684 "Cyrillic_KA_vertstroke\0"
685 "Cyrillic_ka_vertstroke\0"
686 "Cyrillic_lje\0"
687 "Cyrillic_LJE\0"
688 "Cyrillic_nje\0"
689 "Cyrillic_NJE\0"
690 "Cyrillic_o\0"
691 "Cyrillic_O\0"
692 "Cyrillic_O_bar\0"
693 "Cyrillic_o_bar\0"
694 "Cyrillic_pe\0"
695 "Cyrillic_PE\0"
696 "Cyrillic_SCHWA\0"
697 "Cyrillic_schwa\0"
698 "Cyrillic_sha\0"
699 "Cyrillic_SHA\0"
700 "Cyrillic_shcha\0"
701 "Cyrillic_SHCHA\0"
702 "Cyrillic_SHHA\0"
703 "Cyrillic_shha\0"
704 "Cyrillic_shorti\0"
705 "Cyrillic_SHORTI\0"
706 "Cyrillic_softsign\0"
707 "Cyrillic_SOFTSIGN\0"
708 "Cyrillic_te\0"
709 "Cyrillic_TE\0"
710 "Cyrillic_tse\0"
711 "Cyrillic_TSE\0"
712 "Cyrillic_u\0"
713 "Cyrillic_U\0"
714 "Cyrillic_U_macron\0"
715 "Cyrillic_u_macron\0"
716 "Cyrillic_U_straight\0"
717 "Cyrillic_u_straight\0"
718 "Cyrillic_U_straight_bar\0"
719 "Cyrillic_u_straight_bar\0"
720 "Cyrillic_ve\0"
721 "Cyrillic_VE\0"
722 "Cyrillic_ya\0"
723 "Cyrillic_YA\0"
724 "Cyrillic_yeru\0"
725 "Cyrillic_YERU\0"
726 "Cyrillic_yu\0"
727 "Cyrillic_YU\0"
728 "Cyrillic_ze\0"
729 "Cyrillic_ZE\0"
730 "Cyrillic_zhe\0"
731 "Cyrillic_ZHE\0"
732 "Cyrillic_ZHE_descender\0"
733 "Cyrillic_zhe_descender\0"
734 "D\0"
735 "d\0"
736 "Dabovedot\0"
737 "dabovedot\0"
738 "Dacute_accent\0"
739 "dagger\0"
740 "Dcaron\0"
741 "dcaron\0"
742 "Dcedilla_accent\0"
743 "Dcircumflex_accent\0"
744 "Ddiaeresis\0"
745 "dead_a\0"
746 "dead_A\0"
747 "dead_abovecomma\0"
748 "dead_abovedot\0"
749 "dead_abovereversedcomma\0"
750 "dead_abovering\0"
751 "dead_aboveverticalline\0"
752 "dead_acute\0"
753 "dead_belowbreve\0"
754 "dead_belowcircumflex\0"
755 "dead_belowcomma\0"
756 "dead_belowdiaeresis\0"
757 "dead_belowdot\0"
758 "dead_belowmacron\0"
759 "dead_belowring\0"
760 "dead_belowtilde\0"
761 "dead_belowverticalline\0"
762 "dead_breve\0"
763 "dead_capital_schwa\0"
764 "dead_caron\0"
765 "dead_cedilla\0"
766 "dead_circumflex\0"
767 "dead_currency\0"
768 "dead_dasia\0"
769 "dead_diaeresis\0"
770 "dead_doubleacute\0"
771 "dead_doublegrave\0"
772 "dead_e\0"
773 "dead_E\0"
774 "dead_grave\0"
775 "dead_greek\0"
776 "dead_hook\0"
777 "dead_horn\0"
778 "dead_i\0"
779 "dead_I\0"
780 "dead_invertedbreve\0"
781 "dead_iota\0"
782 "dead_longsolidusoverlay\0"
783 "dead_lowline\0"
784 "dead_macron\0"
785 "dead_o\0"
786 "dead_O\0"
787 "dead_ogonek\0"
788 "dead_perispomeni\0"
789 "dead_psili\0"
790 "dead_semivoiced_sound\0"
791 "dead_small_schwa\0"
792 "dead_stroke\0"
793 "dead_tilde\0"
794 "dead_u\0"
795 "dead_U\0"
796 "dead_voiced_sound\0"
797 "decimalpoint\0"
798 "degree\0"
799 "Delete\0"
800 "DeleteChar\0"
801 "DeleteLine\0"
802 "Dgrave_accent\0"
803 "diaeresis\0"
804 "diamond\0"
805 "digitspace\0"
806 "dintegral\0"
807 "division\0"
808 "dollar\0"
809 "DongSign\0"
810 "doubbaselinedot\0"
811 "doubleacute\0"
812 "doubledagger\0"
813 "doublelowquotemark\0"
814 "Down\0"
815 "downarrow\0"
816 "downcaret\0"
817 "downshoe\0"
818 "downstile\0"
819 "downtack\0"
820 "DRemove\0"
821 "Dring_accent\0"
822 "Dstroke\0"
823 "dstroke\0"
824 "Dtilde\0"
825 "E\0"
826 "e\0"
827 "Eabovedot\0"
828 "eabovedot\0"
829 "Eacute\0"
830 "eacute\0"
831 "Ebelowdot\0"
832 "ebelowdot\0"
833 "Ecaron\0"
834 "ecaron\0"
835 "Ecircumflex\0"
836 "ecircumflex\0"
837 "Ecircumflexacute\0"
838 "ecircumflexacute\0"
839 "Ecircumflexbelowdot\0"
840 "ecircumflexbelowdot\0"
841 "Ecircumflexgrave\0"
842 "ecircumflexgrave\0"
843 "Ecircumflexhook\0"
844 "ecircumflexhook\0"
845 "Ecircumflextilde\0"
846 "ecircumflextilde\0"
847 "EcuSign\0"
848 "Ediaeresis\0"
849 "ediaeresis\0"
850 "Egrave\0"
851 "egrave\0"
852 "Ehook\0"
853 "ehook\0"
854 "eightsubscript\0"
855 "eightsuperior\0"
856 "Eisu_Shift\0"
857 "Eisu_toggle\0"
858 "elementof\0"
859 "ellipsis\0"
860 "em3space\0"
861 "em4space\0"
862 "Emacron\0"
863 "emacron\0"
864 "emdash\0"
865 "emfilledcircle\0"
866 "emfilledrect\0"
867 "emopencircle\0"
868 "emopenrectangle\0"
869 "emptyset\0"
870 "emspace\0"
871 "End\0"
872 "endash\0"
873 "enfilledcircbullet\0"
874 "enfilledsqbullet\0"
875 "ENG\0"
876 "eng\0"
877 "enopencircbullet\0"
878 "enopensquarebullet\0"
879 "enspace\0"
880 "Eogonek\0"
881 "eogonek\0"
882 "equal\0"
883 "Escape\0"
884 "ETH\0"
885 "Eth\0"
886 "eth\0"
887 "Etilde\0"
888 "etilde\0"
889 "EuroSign\0"
890 "exclam\0"
891 "exclamdown\0"
892 "Execute\0"
893 "Ext16bit_L\0"
894 "Ext16bit_R\0"
895 "EZH\0"
896 "ezh\0"
897 "F\0"
898 "f\0"
899 "F1\0"
900 "F10\0"
901 "F11\0"
902 "F12\0"
903 "F13\0"
904 "F14\0"
905 "F15\0"
906 "F16\0"
907 "F17\0"
908 "F18\0"
909 "F19\0"
910 "F2\0"
911 "F20\0"
912 "F21\0"
913 "F22\0"
914 "F23\0"
915 "F24\0"
916 "F25\0"
917 "F26\0"
918 "F27\0"
919 "F28\0"
920 "F29\0"
921 "F3\0"
922 "F30\0"
923 "F31\0"
924 "F32\0"
925 "F33\0"
926 "F34\0"
927 "F35\0"
928 "F4\0"
929 "F5\0"
930 "F6\0"
931 "F7\0"
932 "F8\0"
933 "F9\0"
934 "Fabovedot\0"
935 "fabovedot\0"
936 "Farsi_0\0"
937 "Farsi_1\0"
938 "Farsi_2\0"
939 "Farsi_3\0"
940 "Farsi_4\0"
941 "Farsi_5\0"
942 "Farsi_6\0"
943 "Farsi_7\0"
944 "Farsi_8\0"
945 "Farsi_9\0"
946 "Farsi_yeh\0"
947 "femalesymbol\0"
948 "ff\0"
949 "FFrancSign\0"
950 "figdash\0"
951 "filledlefttribullet\0"
952 "filledrectbullet\0"
953 "filledrighttribullet\0"
954 "filledtribulletdown\0"
955 "filledtribulletup\0"
956 "Find\0"
957 "First_Virtual_Screen\0"
958 "fiveeighths\0"
959 "fivesixths\0"
960 "fivesubscript\0"
961 "fivesuperior\0"
962 "fourfifths\0"
963 "foursubscript\0"
964 "foursuperior\0"
965 "fourthroot\0"
966 "function\0"
967 "G\0"
968 "g\0"
969 "Gabovedot\0"
970 "gabovedot\0"
971 "Gbreve\0"
972 "gbreve\0"
973 "Gcaron\0"
974 "gcaron\0"
975 "Gcedilla\0"
976 "gcedilla\0"
977 "Gcircumflex\0"
978 "gcircumflex\0"
979 "Georgian_an\0"
980 "Georgian_ban\0"
981 "Georgian_can\0"
982 "Georgian_char\0"
983 "Georgian_chin\0"
984 "Georgian_cil\0"
985 "Georgian_don\0"
986 "Georgian_en\0"
987 "Georgian_fi\0"
988 "Georgian_gan\0"
989 "Georgian_ghan\0"
990 "Georgian_hae\0"
991 "Georgian_har\0"
992 "Georgian_he\0"
993 "Georgian_hie\0"
994 "Georgian_hoe\0"
995 "Georgian_in\0"
996 "Georgian_jhan\0"
997 "Georgian_jil\0"
998 "Georgian_kan\0"
999 "Georgian_khar\0"
1000 "Georgian_las\0"
1001 "Georgian_man\0"
1002 "Georgian_nar\0"
1003 "Georgian_on\0"
1004 "Georgian_par\0"
1005 "Georgian_phar\0"
1006 "Georgian_qar\0"
1007 "Georgian_rae\0"
1008 "Georgian_san\0"
1009 "Georgian_shin\0"
1010 "Georgian_tan\0"
1011 "Georgian_tar\0"
1012 "Georgian_un\0"
1013 "Georgian_vin\0"
1014 "Georgian_we\0"
1015 "Georgian_xan\0"
1016 "Georgian_zen\0"
1017 "Georgian_zhar\0"
1018 "grave\0"
1019 "greater\0"
1020 "greaterthanequal\0"
1021 "Greek_accentdieresis\0"
1022 "Greek_ALPHA\0"
1023 "Greek_alpha\0"
1024 "Greek_ALPHAaccent\0"
1025 "Greek_alphaaccent\0"
1026 "Greek_BETA\0"
1027 "Greek_beta\0"
1028 "Greek_CHI\0"
1029 "Greek_chi\0"
1030 "Greek_DELTA\0"
1031 "Greek_delta\0"
1032 "Greek_EPSILON\0"
1033 "Greek_epsilon\0"
1034 "Greek_EPSILONaccent\0"
1035 "Greek_epsilonaccent\0"
1036 "Greek_ETA\0"
1037 "Greek_eta\0"
1038 "Greek_ETAaccent\0"
1039 "Greek_etaaccent\0"
1040 "Greek_finalsmallsigma\0"
1041 "Greek_GAMMA\0"
1042 "Greek_gamma\0"
1043 "Greek_horizbar\0"
1044 "Greek_IOTA\0"
1045 "Greek_iota\0"
1046 "Greek_IOTAaccent\0"
1047 "Greek_iotaaccent\0"
1048 "Greek_iotaaccentdieresis\0"
1049 "Greek_IOTAdiaeresis\0"
1050 "Greek_IOTAdieresis\0"
1051 "Greek_iotadieresis\0"
1052 "Greek_KAPPA\0"
1053 "Greek_kappa\0"
1054 "Greek_LAMBDA\0"
1055 "Greek_lambda\0"
1056 "Greek_LAMDA\0"
1057 "Greek_lamda\0"
1058 "Greek_MU\0"
1059 "Greek_mu\0"
1060 "Greek_NU\0"
1061 "Greek_nu\0"
1062 "Greek_OMEGA\0"
1063 "Greek_omega\0"
1064 "Greek_OMEGAaccent\0"
1065 "Greek_omegaaccent\0"
1066 "Greek_OMICRON\0"
1067 "Greek_omicron\0"
1068 "Greek_OMICRONaccent\0"
1069 "Greek_omicronaccent\0"
1070 "Greek_PHI\0"
1071 "Greek_phi\0"
1072 "Greek_PI\0"
1073 "Greek_pi\0"
1074 "Greek_PSI\0"
1075 "Greek_psi\0"
1076 "Greek_RHO\0"
1077 "Greek_rho\0"
1078 "Greek_SIGMA\0"
1079 "Greek_sigma\0"
1080 "Greek_switch\0"
1081 "Greek_TAU\0"
1082 "Greek_tau\0"
1083 "Greek_THETA\0"
1084 "Greek_theta\0"
1085 "Greek_UPSILON\0"
1086 "Greek_upsilon\0"
1087 "Greek_UPSILONaccent\0"
1088 "Greek_upsilonaccent\0"
1089 "Greek_upsilonaccentdieresis\0"
1090 "Greek_UPSILONdieresis\0"
1091 "Greek_upsilondieresis\0"
1092 "Greek_XI\0"