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