4d69654795bc6289f58316efec44649d4f7eaf4b
[profile/ivi/ecore.git] / src / lib / ecore_win32 / ecore_win32_event.c
1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4
5 #include <stdlib.h>
6 #include <stdio.h>   /* for printf */
7
8 #define WIN32_LEAN_AND_MEAN
9 #include <windows.h>
10 #undef WIN32_LEAN_AND_MEAN
11 #include <windowsx.h>
12
13 #include <Eina.h>
14 #include <Ecore.h>
15 #include <Ecore_Input.h>
16
17 #include "Ecore_Win32.h"
18 #include "ecore_win32_private.h"
19
20
21 /***** Private declarations *****/
22
23
24 static Ecore_Win32_Window *_ecore_win32_mouse_down_last_window = NULL;
25 static Ecore_Win32_Window *_ecore_win32_mouse_down_last_last_window = NULL;
26 static long                _ecore_win32_mouse_down_last_time = 0  ;
27 static long                _ecore_win32_mouse_down_last_last_time = 0  ;
28 static int                 _ecore_win32_mouse_down_did_triple = 0;
29 static int                 _ecore_win32_mouse_up_count = 0;
30
31 static void _ecore_win32_event_free_key_down(void *data,
32                                              void *ev);
33
34 static void _ecore_win32_event_free_key_up(void *data,
35                                            void *ev);
36
37 static int  _ecore_win32_event_keystroke_get(int    key,
38                                              int    is_extended,
39                                              char **keyname,
40                                              char **keysymbol,
41                                              char **keycompose);
42
43 static int  _ecore_win32_event_char_get(int    key,
44                                         char **keyname,
45                                         char **keysymbol,
46                                         char **keycompose);
47
48
49 /***** Global functions definitions *****/
50
51 void
52 _ecore_win32_event_handle_key_press(Ecore_Win32_Callback_Data *msg,
53                                     int                        is_keystroke)
54 {
55    Ecore_Event_Key *e;
56
57    INF("key pressed");
58
59    e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key));
60    if (!e) return;
61
62    if (is_keystroke)
63      {
64         if (!_ecore_win32_event_keystroke_get(LOWORD(msg->window_param),
65                                               msg->data_param & 0x01000000,
66                                               (char **)&e->keyname,
67                                               (char **)&e->key,
68                                               (char **)&e->string))
69           {
70              free(e);
71              return;
72           }
73         goto store_key;
74      }
75    else
76      {
77         if (!_ecore_win32_event_char_get(LOWORD(msg->window_param),
78                                          (char **)&e->keyname,
79                                          (char **)&e->key,
80                                          (char **)&e->string))
81           {
82              free(e);
83              return;
84           }
85      }
86
87  store_key:
88    e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWL_USERDATA);
89    if (!e->window)
90      {
91         free(e);
92         return;
93      }
94    e->event_window = e->window;
95    e->timestamp = msg->time;
96
97    _ecore_win32_event_last_time = e->timestamp;
98
99    ecore_event_add(ECORE_EVENT_KEY_DOWN, e, _ecore_win32_event_free_key_down, NULL);
100 }
101
102 void
103 _ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg,
104                                       int                        is_keystroke)
105 {
106    Ecore_Event_Key *e;
107
108    INF("key released");
109
110    e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key));
111    if (!e) return;
112
113    if (is_keystroke)
114      {
115         if (!_ecore_win32_event_keystroke_get(LOWORD(msg->window_param),
116                                               msg->data_param & 0x01000000,
117                                               (char **)&e->keyname,
118                                               (char **)&e->key,
119                                               (char **)&e->string))
120           {
121              free(e);
122              return;
123           }
124         goto store_key;
125      }
126    else
127      {
128         if (!_ecore_win32_event_char_get(LOWORD(msg->window_param),
129                                          (char **)&e->keyname,
130                                          (char **)&e->key,
131                                          (char **)&e->string))
132           {
133              free(e);
134              return;
135           }
136      }
137
138  store_key:
139    e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWL_USERDATA);
140    if (!e->window)
141      {
142         free(e);
143         return;
144      }
145    e->event_window = e->window;
146    e->timestamp = msg->time;
147
148    _ecore_win32_event_last_time = e->timestamp;
149
150    ecore_event_add(ECORE_EVENT_KEY_UP, e, _ecore_win32_event_free_key_up, NULL);
151 }
152
153 void
154 _ecore_win32_event_handle_button_press(Ecore_Win32_Callback_Data *msg,
155                                        int                        button)
156 {
157    Ecore_Win32_Window *window;
158
159    INF("mouse button pressed");
160
161    window = (Ecore_Win32_Window *)GetWindowLongPtr(msg->window, GWL_USERDATA);
162
163    if (button > 3)
164      {
165         Ecore_Event_Mouse_Wheel *e;
166
167         e = (Ecore_Event_Mouse_Wheel *)calloc(1, sizeof(Ecore_Event_Mouse_Wheel));
168         if (!e) return;
169
170         e->window = (Ecore_Window)window;
171         e->event_window = e->window;
172         e->direction = 0;
173         /* wheel delta is positive or negative, never 0 */
174         e->z = GET_WHEEL_DELTA_WPARAM(msg->window_param) > 0 ? -1 : 1;
175         e->x = GET_X_LPARAM(msg->data_param);
176         e->y = GET_Y_LPARAM(msg->data_param);
177         e->timestamp = msg->time;
178
179         _ecore_win32_event_last_time = e->timestamp;
180         _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
181
182         ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, e, NULL, NULL);
183      }
184    else
185      {
186        {
187           Ecore_Event_Mouse_Move *e;
188
189           e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
190           if (!e) return;
191
192           e->window = (Ecore_Window)window;
193           e->event_window = e->window;
194           e->x = GET_X_LPARAM(msg->data_param);
195           e->y = GET_Y_LPARAM(msg->data_param);
196           e->timestamp = msg->time;
197
198           _ecore_win32_event_last_time = e->timestamp;
199           _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
200
201           ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
202        }
203
204        {
205           Ecore_Event_Mouse_Button *e;
206
207           if (_ecore_win32_mouse_down_did_triple)
208             {
209                _ecore_win32_mouse_down_last_window = NULL;
210                _ecore_win32_mouse_down_last_last_window = NULL;
211                _ecore_win32_mouse_down_last_time = 0;
212                _ecore_win32_mouse_down_last_last_time = 0;
213             }
214
215           e = (Ecore_Event_Mouse_Button *)calloc(1, sizeof(Ecore_Event_Mouse_Button));
216           if (!e) return;
217
218           e->window = (Ecore_Window)window;
219           e->event_window = e->window;
220           e->buttons = button;
221           e->x = GET_X_LPARAM(msg->data_param);
222           e->y = GET_Y_LPARAM(msg->data_param);
223           e->timestamp = msg->time;
224
225           if (((e->timestamp - _ecore_win32_mouse_down_last_time) <= (unsigned long)(1000 * _ecore_win32_double_click_time)) &&
226               (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_window))
227             e->double_click = 1;
228
229           if (((e->timestamp - _ecore_win32_mouse_down_last_last_time) <= (unsigned long)(2 * 1000 * _ecore_win32_double_click_time)) &&
230               (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_window) &&
231               (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_last_window))
232             {
233                e->triple_click = 1;
234                _ecore_win32_mouse_down_did_triple = 1;
235             }
236           else
237             _ecore_win32_mouse_down_did_triple = 0;
238
239           if (!e->double_click && !e->triple_click)
240             _ecore_win32_mouse_up_count = 0;
241
242           _ecore_win32_event_last_time = e->timestamp;
243           _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
244
245           if (!_ecore_win32_mouse_down_did_triple)
246             {
247                _ecore_win32_mouse_down_last_last_window = _ecore_win32_mouse_down_last_window;
248                _ecore_win32_mouse_down_last_window = (Ecore_Win32_Window *)e->window;
249                _ecore_win32_mouse_down_last_last_time = _ecore_win32_mouse_down_last_time;
250                _ecore_win32_mouse_down_last_time = e->timestamp;
251             }
252
253           ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
254        }
255      }
256 }
257
258 void
259 _ecore_win32_event_handle_button_release(Ecore_Win32_Callback_Data *msg,
260                                          int                        button)
261 {
262    Ecore_Win32_Window *window;
263
264    INF("mouse button released");
265
266    window = (void *)GetWindowLongPtr(msg->window, GWL_USERDATA);
267
268    {
269       Ecore_Event_Mouse_Move *e;
270
271       e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
272       if (!e) return;
273
274       e->window = (Ecore_Window)window;
275       e->event_window = e->window;
276       e->x = GET_X_LPARAM(msg->data_param);
277       e->y = GET_Y_LPARAM(msg->data_param);
278       e->timestamp = msg->time;
279
280       _ecore_win32_event_last_time = e->timestamp;
281       _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
282
283       ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
284    }
285
286    {
287       Ecore_Event_Mouse_Button *e;
288
289       e = (Ecore_Event_Mouse_Button *)calloc(1, sizeof(Ecore_Event_Mouse_Button));
290       if (!e) return;
291
292       e->window = (Ecore_Window)window;
293       e->event_window = e->window;
294       e->buttons = button;
295       e->x = GET_X_LPARAM(msg->data_param);
296       e->y = GET_Y_LPARAM(msg->data_param);
297       e->timestamp = msg->time;
298
299       _ecore_win32_mouse_up_count++;
300
301       if ((_ecore_win32_mouse_up_count >= 2) &&
302           ((e->timestamp - _ecore_win32_mouse_down_last_time) <= (unsigned long)(1000 * _ecore_win32_double_click_time)) &&
303           (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_window))
304         e->double_click = 1;
305
306       if ((_ecore_win32_mouse_up_count >= 3) &&
307           ((e->timestamp - _ecore_win32_mouse_down_last_last_time) <= (unsigned long)(2 * 1000 * _ecore_win32_double_click_time)) &&
308           (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_window) &&
309           (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_last_window))
310         e->triple_click = 1;
311
312       _ecore_win32_event_last_time = e->timestamp;
313       _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
314
315       ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
316    }
317 }
318
319 void
320 _ecore_win32_event_handle_motion_notify(Ecore_Win32_Callback_Data *msg)
321 {
322    Ecore_Event_Mouse_Move *e;
323
324    INF("mouse moved");
325
326    e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
327    if (!e) return;
328
329    e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWL_USERDATA);
330    e->event_window = e->window;
331    e->x = GET_X_LPARAM(msg->data_param);
332    e->y = GET_Y_LPARAM(msg->data_param);
333    e->timestamp = msg->time;
334
335    ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
336 }
337
338 void
339 _ecore_win32_event_handle_enter_notify(Ecore_Win32_Callback_Data *msg)
340 {
341   {
342      Ecore_Event_Mouse_Move *e;
343
344      INF("mouse in");
345
346      e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
347      if (!e) return;
348
349      e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWL_USERDATA);
350      e->event_window = e->window;
351      e->x = msg->x;
352      e->y = msg->y;
353      e->timestamp = msg->time;
354
355      _ecore_win32_event_last_time = e->timestamp;
356      _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
357
358      ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
359   }
360
361   {
362      Ecore_Win32_Event_Mouse_In *e;
363
364      e = (Ecore_Win32_Event_Mouse_In *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_In));
365      if (!e) return;
366
367      e->window = (void *)GetWindowLongPtr(msg->window, GWL_USERDATA);
368      e->x = msg->x;
369      e->y = msg->y;
370      e->time = msg->time ;
371
372      _ecore_win32_event_last_time = e->time;
373
374      ecore_event_add(ECORE_WIN32_EVENT_MOUSE_IN, e, NULL, NULL);
375   }
376 }
377
378 void
379 _ecore_win32_event_handle_leave_notify(Ecore_Win32_Callback_Data *msg)
380 {
381   {
382      Ecore_Event_Mouse_Move *e;
383
384      INF("mouse out");
385
386      e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
387      if (!e) return;
388
389      e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWL_USERDATA);
390      e->event_window = e->window;
391      e->x = msg->x;
392      e->y = msg->y;
393      e->timestamp = msg->time;
394
395      _ecore_win32_event_last_time = e->timestamp;
396      _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
397
398      ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
399   }
400
401   {
402      Ecore_Win32_Event_Mouse_Out *e;
403
404      e = (Ecore_Win32_Event_Mouse_Out *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Out));
405      if (!e) return;
406
407      e->window = (void *)GetWindowLongPtr(msg->window, GWL_USERDATA);
408      e->x = msg->x;
409      e->y = msg->y;
410      e->time = msg->time;
411
412      _ecore_win32_event_last_time = e->time;
413
414      ecore_event_add(ECORE_WIN32_EVENT_MOUSE_OUT, e, NULL, NULL);
415   }
416 }
417
418 void
419 _ecore_win32_event_handle_focus_in(Ecore_Win32_Callback_Data *msg)
420 {
421    Ecore_Win32_Event_Window_Focus_In *e;
422
423    INF("focus in");
424
425    e = (Ecore_Win32_Event_Window_Focus_In *)calloc(1, sizeof(Ecore_Win32_Event_Window_Focus_In));
426    if (!e) return;
427
428    e->window = (void *)GetWindowLongPtr(msg->window, GWL_USERDATA);
429
430    e->time = _ecore_win32_event_last_time;
431    _ecore_win32_event_last_time = e->time;
432
433    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL);
434 }
435
436 void
437 _ecore_win32_event_handle_focus_out(Ecore_Win32_Callback_Data *msg)
438 {
439    Ecore_Win32_Event_Window_Focus_Out *e;
440
441    INF("focus out");
442
443    e = (Ecore_Win32_Event_Window_Focus_Out *)calloc(1, sizeof(Ecore_Win32_Event_Window_Focus_Out));
444    if (!e) return;
445
446    e->window = (void *)GetWindowLongPtr(msg->window, GWL_USERDATA);
447
448    e->time = _ecore_win32_event_last_time;
449    _ecore_win32_event_last_time = e->time;
450
451    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
452 }
453
454 void
455 _ecore_win32_event_handle_expose(Ecore_Win32_Callback_Data *msg)
456 {
457    Ecore_Win32_Event_Window_Damage *e;
458
459    INF("window expose");
460
461    e = (Ecore_Win32_Event_Window_Damage *)calloc(1, sizeof(Ecore_Win32_Event_Window_Damage));
462    if (!e) return;
463
464    e->window = (void *)GetWindowLongPtr(msg->window, GWL_USERDATA);
465
466    e->x = msg->update.left;
467    e->y = msg->update.top;
468    e->width = msg->update.right - msg->update.left;
469    e->height = msg->update.bottom - msg->update.top;
470
471    e->time = _ecore_win32_event_last_time;
472
473    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
474 }
475
476 void
477 _ecore_win32_event_handle_create_notify(Ecore_Win32_Callback_Data *msg)
478 {
479    Ecore_Win32_Event_Window_Create *e;
480
481    INF("window create notify");
482
483    e = calloc(1, sizeof(Ecore_Win32_Event_Window_Create));
484    if (!e) return;
485
486    e->window = (void *)GetWindowLongPtr(msg->window, GWL_USERDATA);
487
488    e->time = _ecore_win32_event_last_time;
489
490    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_CREATE, e, NULL, NULL);
491 }
492
493 void
494 _ecore_win32_event_handle_destroy_notify(Ecore_Win32_Callback_Data *msg)
495 {
496    Ecore_Win32_Event_Window_Destroy *e;
497
498    INF("window destroy notify");
499
500    e = calloc(1, sizeof(Ecore_Win32_Event_Window_Destroy));
501    if (!e) return;
502
503    e->window = (void *)GetWindowLongPtr(msg->window, GWL_USERDATA);
504
505    e->time = _ecore_win32_event_last_time;
506    if (e->window == _ecore_win32_event_last_window) _ecore_win32_event_last_window = NULL;
507
508    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_DESTROY, e, NULL, NULL);
509 }
510
511 void
512 _ecore_win32_event_handle_map_notify(Ecore_Win32_Callback_Data *msg)
513 {
514    Ecore_Win32_Event_Window_Show *e;
515
516    INF("window map notify");
517
518    e = calloc(1, sizeof(Ecore_Win32_Event_Window_Show));
519    if (!e) return;
520
521    e->window = (void *)GetWindowLongPtr(msg->window, GWL_USERDATA);
522
523    e->time = _ecore_win32_event_last_time;
524
525    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_SHOW, e, NULL, NULL);
526 }
527
528 void
529 _ecore_win32_event_handle_unmap_notify(Ecore_Win32_Callback_Data *msg)
530 {
531    Ecore_Win32_Event_Window_Hide *e;
532
533    INF("window unmap notify");
534
535    e = calloc(1, sizeof(Ecore_Win32_Event_Window_Hide));
536    if (!e) return;
537
538    e->window = (void *)GetWindowLongPtr(msg->window, GWL_USERDATA);
539
540    e->time = _ecore_win32_event_last_time;
541
542    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_HIDE, e, NULL, NULL);
543 }
544
545 void
546 _ecore_win32_event_handle_configure_notify(Ecore_Win32_Callback_Data *msg)
547 {
548    WINDOWINFO                          wi;
549    Ecore_Win32_Event_Window_Configure *e;
550    WINDOWPOS                          *window_pos;
551
552    INF("window configure notify");
553
554    e = calloc(1, sizeof(Ecore_Win32_Event_Window_Configure));
555    if (!e) return;
556
557    window_pos = (WINDOWPOS *)msg->data_param;
558    wi.cbSize = sizeof(WINDOWINFO);
559    if (!GetWindowInfo(window_pos->hwnd, &wi))
560      {
561         free(e);
562         return;
563      }
564
565    e->window = (void *)GetWindowLongPtr(msg->window, GWL_USERDATA);
566    e->abovewin = (void *)GetWindowLongPtr(window_pos->hwndInsertAfter, GWL_USERDATA);
567    e->x = wi.rcClient.left;
568    e->y = wi.rcClient.top;
569    e->width = wi.rcClient.right - wi.rcClient.left;
570    e->height = wi.rcClient.bottom - wi.rcClient.top;
571    e->time = _ecore_win32_event_last_time;
572
573    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_CONFIGURE, e, NULL, NULL);
574 }
575
576 void
577 _ecore_win32_event_handle_resize(Ecore_Win32_Callback_Data *msg)
578 {
579    RECT                             rect;
580    Ecore_Win32_Event_Window_Resize *e;
581
582    INF("window resize");
583
584    if (!GetClientRect(msg->window, &rect))
585      return;
586
587    e = calloc(1, sizeof(Ecore_Win32_Event_Window_Resize));
588    if (!e) return;
589
590    e->window = (void *)GetWindowLongPtr(msg->window, GWL_USERDATA);
591    e->width = rect.right - rect.left;
592    e->height = rect.bottom - rect.top;
593    e->time = _ecore_win32_event_last_time;
594
595    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_RESIZE, e, NULL, NULL);
596 }
597
598 void
599 _ecore_win32_event_handle_delete_request(Ecore_Win32_Callback_Data *msg)
600 {
601    Ecore_Win32_Event_Window_Delete_Request *e;
602
603    INF("window delete request");
604
605    e = calloc(1, sizeof(Ecore_Win32_Event_Window_Delete_Request));
606    if (!e) return;
607
608    e->window = (void *)GetWindowLongPtr(msg->window, GWL_USERDATA);
609    e->time = _ecore_win32_event_last_time;
610
611    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
612 }
613
614
615 /***** Private functions definitions *****/
616
617 static void
618 _ecore_win32_event_free_key_down(void *data __UNUSED__,
619                                  void *ev)
620 {
621    Ecore_Event_Key *e;
622
623    e = ev;
624    if (e->keyname) free((char *)e->keyname);
625    if (e->key) free((char *)e->key);
626    if (e->string) free((char *)e->string);
627    free(e);
628 }
629
630 static void
631 _ecore_win32_event_free_key_up(void *data __UNUSED__,
632                                void *ev)
633 {
634    Ecore_Event_Key *e;
635
636    e = ev;
637    if (e->keyname) free((char *)e->keyname);
638    if (e->key) free((char *)e->key);
639    if (e->string) free((char *)e->string);
640    free(e);
641 }
642
643 static int
644 _ecore_win32_event_keystroke_get(int    key,
645                                  int    is_extended,
646                                  char **keyname,
647                                  char **keysymbol,
648                                  char **keycompose)
649 {
650   char *kn;
651   char *ks;
652   char *kc;
653
654   *keyname = NULL;
655   *keysymbol = NULL;
656   *keycompose = NULL;
657
658    switch (key)
659      {
660        /* Keystroke */
661      case VK_PRIOR:
662        if (is_extended)
663          {
664             kn = "Prior";
665             ks = "Prior";
666             kc = "Prior";
667          }
668        else
669          {
670             kn = "KP_Prior";
671             ks = "KP_9";
672             kc = "KP_Prior";
673          }
674        break;
675      case VK_NEXT:
676        if (is_extended)
677          {
678             kn = "Next";
679             ks = "Next";
680             kc = "Next";
681          }
682        else
683          {
684             kn = "KP_Next";
685             ks = "KP_3";
686             kc = "KP_Next";
687          }
688        break;
689      case VK_END:
690        if (is_extended)
691          {
692             kn = "End";
693             ks = "End";
694             kc = "End";
695          }
696        else
697          {
698             kn = "KP_End";
699             ks = "KP_1";
700             kc = "KP_End";
701          }
702        break;
703      case VK_HOME:
704        if (is_extended)
705          {
706             kn = "Home";
707             ks = "Home";
708             kc = "Home";
709          }
710        else
711          {
712             kn = "KP_Home";
713             ks = "KP_7";
714             kc = "KP_Home";
715          }
716        break;
717      case VK_LEFT:
718        if (is_extended)
719          {
720             kn = "Left";
721             ks = "Left";
722             kc = "Left";
723          }
724        else
725          {
726             kn = "KP_Left";
727             ks = "KP_4";
728             kc = "KP_Left";
729          }
730        break;
731      case VK_UP:
732        if (is_extended)
733          {
734             kn = "Up";
735             ks = "Up";
736             kc = "Up";
737          }
738        else
739          {
740             kn = "KP_Up";
741             ks = "KP_8";
742             kc = "KP_Up";
743          }
744        break;
745      case VK_RIGHT:
746        if (is_extended)
747          {
748            kn = "Right";
749            ks = "Right";
750            kc = "Right";
751          }
752        else
753          {
754            kn = "KP_Right";
755            ks = "KP_6";
756            kc = "KP_Right";
757          }
758        break;
759      case VK_DOWN:
760        if (is_extended)
761          {
762            kn = "Down";
763            ks = "Down";
764            kc = "Down";
765          }
766        else
767          {
768            kn = "KP_Down";
769            ks = "KP_2";
770            kc = "KP_Down";
771          }
772        break;
773      case VK_INSERT:
774        if (is_extended)
775          {
776            kn = "Insert";
777            ks = "Insert";
778            kc = "Insert";
779          }
780        else
781          {
782            kn = "KP_Insert";
783            ks = "KP_0";
784            kc = "KP_Insert";
785          }
786        break;
787      case VK_DELETE:
788        if (is_extended)
789          {
790            kn = "Delete";
791            ks = "Delete";
792            kc = "Delete";
793          }
794        else
795          {
796            kn = "KP_Delete";
797            ks = "KP_Decimal";
798            kc = "KP_Delete";
799          }
800        break;
801      case VK_SPACE:
802        kn = "space";
803        ks = "space";
804        kc = "space";
805        break;
806      case VK_F1:
807        kn = "F1";
808        ks = "F1";
809        kc = "";
810        break;
811      case VK_F2:
812        kn = "F2";
813        ks = "F2";
814        kc = "";
815        break;
816      case VK_F3:
817        kn = "F3";
818        ks = "F3";
819        kc = "";
820        break;
821      case VK_F4:
822        kn = "F4";
823        ks = "F4";
824        kc = "";
825        break;
826      case VK_F5:
827        kn = "F5";
828        ks = "F5";
829        kc = "";
830        break;
831      case VK_F6:
832        kn = "F6";
833        ks = "F6";
834        kc = "";
835        break;
836      case VK_F7:
837        kn = "F7";
838        ks = "F7";
839        kc = "";
840        break;
841      case VK_F8:
842        kn = "F8";
843        ks = "F8";
844        kc = "";
845        break;
846      case VK_F9:
847        kn = "F9";
848        ks = "F9";
849        kc = "";
850        break;
851      case VK_F10:
852        kn = "F10";
853        ks = "F10";
854        kc = "";
855        break;
856      case VK_F11:
857        kn = "F11";
858        ks = "F11";
859        kc = "";
860        break;
861      case VK_F12:
862        kn = "F12";
863        ks = "F12";
864        kc = "";
865        break;
866      case VK_F13:
867        kn = "F13";
868        ks = "F13";
869        kc = "";
870        break;
871      case VK_F14:
872        kn = "F14";
873        ks = "F14";
874        kc = "";
875        break;
876      case VK_F15:
877        kn = "F15";
878        ks = "F15";
879        kc = "";
880        break;
881      case VK_F16:
882        kn = "F16";
883        ks = "F16";
884        kc = "";
885        break;
886      case VK_F17:
887        kn = "F17";
888        ks = "F17";
889        kc = "";
890        break;
891      case VK_F18:
892        kn = "F18";
893        ks = "F18";
894        kc = "";
895        break;
896      case VK_F19:
897        kn = "F19";
898        ks = "F19";
899        kc = "";
900        break;
901      case VK_F20:
902        kn = "F20";
903        ks = "F20";
904        kc = "";
905        break;
906      case VK_F21:
907        kn = "F21";
908        ks = "F21";
909        kc = "";
910        break;
911      case VK_F22:
912        kn = "F22";
913        ks = "F22";
914        kc = "";
915        break;
916      case VK_F23:
917        kn = "F23";
918        ks = "F23";
919        kc = "";
920        break;
921      case VK_F24:
922        kn = "F24";
923        ks = "F24";
924        kc = "";
925        break;
926      default:
927        /* other non keystroke characters */
928        return 0;
929      }
930    *keyname = strdup(kn);
931    if (!*keyname) return 0;
932    *keysymbol = strdup(ks);
933    if (!*keysymbol)
934      {
935         free(*keyname);
936         *keyname = NULL;
937         return 0;
938      }
939    *keycompose = strdup(kc);
940    if (!*keycompose)
941      {
942         free(*keyname);
943         free(*keysymbol);
944         *keyname = NULL;
945         *keysymbol = NULL;
946         return 0;
947      }
948
949    return 1;
950 }
951
952 static int
953 _ecore_win32_event_char_get(int    key,
954                             char **keyname,
955                             char **keysymbol,
956                             char **keycompose)
957 {
958   char kn[32];
959   char ks[32];
960   char kc[32];
961
962   *keyname = NULL;
963   *keysymbol = NULL;
964   *keycompose = NULL;
965
966    switch (key)
967      {
968      case VK_BACK:
969        strncpy(kn, "BackSpace", 32);
970        strncpy(ks, "BackSpace", 32);
971        strncpy(kc, "BackSpace", 32);
972        break;
973      case VK_TAB:
974        strncpy(kn, "Tab", 32);
975        strncpy(ks, "ISO_Left_Tab", 32);
976        strncpy(kc, "Tab", 32);
977        break;
978      case 0x0a:
979        /* Line feed (Shift + Enter) */
980        strncpy(kn, "LineFeed", 32);
981        strncpy(ks, "LineFeed", 32);
982        strncpy(kc, "LineFeed", 32);
983        break;
984      case VK_RETURN:
985        strncpy(kn, "Return", 32);
986        strncpy(ks, "Return", 32);
987        strncpy(kc, "Return", 32);
988        break;
989      case VK_ESCAPE:
990        strncpy(kn, "Escape", 32);
991        strncpy(ks, "Escape", 32);
992        strncpy(kc, "Escape", 32);
993        break;
994      case VK_SPACE:
995        strncpy(kn, "space", 32);
996        strncpy(ks, "space", 32);
997        strncpy(kc, "space", 32);
998        break;
999      default:
1000        /* displayable characters */
1001        printf (" * key : %d\n", key);
1002        kn[0] = (TCHAR)key;
1003        kn[1] = '\0';
1004        ks[0] = (TCHAR)key;
1005        ks[1] = '\0';
1006        kc[0] = (TCHAR)key;
1007        kc[1] = '\0';
1008        break;
1009      }
1010    *keyname = strdup(kn);
1011    if (!*keyname) return 0;
1012    *keysymbol = strdup(ks);
1013    if (!*keysymbol)
1014      {
1015         free(*keyname);
1016         *keyname = NULL;
1017         return 0;
1018      }
1019    *keycompose = strdup(kc);
1020    if (!*keycompose)
1021      {
1022         free(*keyname);
1023         free(*keysymbol);
1024         *keyname = NULL;
1025         *keysymbol = NULL;
1026         return 0;
1027      }
1028
1029    return 1;
1030 }