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