[ecore] merged svn latest code (svn54830)
[profile/ivi/ecore.git] / src / lib / ecore_wince / ecore_wince_event.c
1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4
5 #include <stdlib.h>
6
7 #define WIN32_LEAN_AND_MEAN
8 #include <windows.h>
9 #undef WIN32_LEAN_AND_MEAN
10
11 #include <Eina.h>
12 #include <Ecore.h>
13 #include <Ecore_Input.h>
14
15 #include "Ecore_WinCE.h"
16 #include "ecore_wince_private.h"
17
18 /*============================================================================*
19  *                                  Local                                     *
20  *============================================================================*/
21
22 /**
23  * @cond LOCAL
24  */
25
26 static Ecore_WinCE_Window *_ecore_wince_mouse_down_last_window = NULL;
27 static Ecore_WinCE_Window *_ecore_wince_mouse_down_last_last_window = NULL;
28 static long                _ecore_wince_mouse_down_last_time = 0;
29 static long                _ecore_wince_mouse_down_last_last_time = 0;
30 static int                 _ecore_wince_mouse_down_did_triple = 0;
31 static int                 _ecore_wince_mouse_up_count = 0;
32
33 static void
34 _ecore_wince_event_free_key_down(void *data __UNUSED__,
35                                  void *ev)
36 {
37    Ecore_Event_Key *e;
38
39    e = ev;
40    if (e->keyname) free((char *)e->keyname);
41    if (e->key) free((char *)e->key);
42    if (e->string) free((char *)e->string);
43    free(e);
44 }
45
46 static void
47 _ecore_wince_event_free_key_up(void *data __UNUSED__,
48                                void *ev)
49 {
50    Ecore_Event_Key *e;
51
52    e = ev;
53    if (e->keyname) free((char *)e->keyname);
54    if (e->key) free((char *)e->key);
55    if (e->string) free((char *)e->string);
56    free(e);
57 }
58
59 static int
60 _ecore_wince_event_keystroke_get(int    key,
61                                  char **keyname,
62                                  char **keysymbol,
63                                  char **keycompose)
64 {
65   char *kn;
66   char *ks;
67   char *kc;
68
69   *keyname = NULL;
70   *keysymbol = NULL;
71   *keycompose = NULL;
72
73    switch (key)
74      {
75        /* Keystroke */
76      case VK_PRIOR:
77        kn = "Prior";
78        ks = "Prior";
79        kc = "Prior";
80        break;
81      case VK_NEXT:
82        kn = "Next";
83        ks = "Next";
84        kc = "Next";
85        break;
86      case VK_END:
87        kn = "End";
88        ks = "End";
89        kc = "End";
90        break;
91      case VK_HOME:
92        kn = "Home";
93        ks = "Home";
94        kc = "Home";
95        break;
96      case VK_LEFT:
97        kn = "Left";
98        ks = "Left";
99        kc = "Left";
100        break;
101      case VK_UP:
102        kn = "Up";
103        ks = "Up";
104        kc = "Up";
105        break;
106      case VK_RIGHT:
107        kn = "Right";
108        ks = "Right";
109        kc = "Right";
110        break;
111      case VK_DOWN:
112        kn = "Down";
113        ks = "Down";
114        kc = "Down";
115        break;
116      case VK_INSERT:
117        kn = "Insert";
118        ks = "Insert";
119        kc = "Insert";
120        break;
121      case VK_DELETE:
122        kn = "Delete";
123        ks = "Delete";
124        kc = "Delete";
125        break;
126      case VK_F1:
127        kn = "F1";
128        ks = "F1";
129        kc = "";
130        break;
131      case VK_F2:
132        kn = "F2";
133        ks = "F2";
134        kc = "";
135        break;
136      case VK_F3:
137        kn = "F3";
138        ks = "F3";
139        kc = "";
140        break;
141      case VK_F4:
142        kn = "F4";
143        ks = "F4";
144        kc = "";
145        break;
146      case VK_F5:
147        kn = "F5";
148        ks = "F5";
149        kc = "";
150        break;
151      case VK_F6:
152        kn = "F6";
153        ks = "F6";
154        kc = "";
155        break;
156      case VK_F7:
157        kn = "F7";
158        ks = "F7";
159        kc = "";
160        break;
161      case VK_F8:
162        kn = "F8";
163        ks = "F8";
164        kc = "";
165        break;
166      case VK_F9:
167        kn = "F9";
168        ks = "F9";
169        kc = "";
170        break;
171      case VK_F10:
172        kn = "F10";
173        ks = "F10";
174        kc = "";
175        break;
176      case VK_F11:
177        kn = "F11";
178        ks = "F11";
179        kc = "";
180        break;
181      case VK_F12:
182        kn = "F12";
183        ks = "F12";
184        kc = "";
185        break;
186      case VK_F13:
187        kn = "F13";
188        ks = "F13";
189        kc = "";
190        break;
191      case VK_F14:
192        kn = "F14";
193        ks = "F14";
194        kc = "";
195        break;
196      case VK_F15:
197        kn = "F15";
198        ks = "F15";
199        kc = "";
200        break;
201      case VK_F16:
202        kn = "F16";
203        ks = "F16";
204        kc = "";
205        break;
206      case VK_F17:
207        kn = "F17";
208        ks = "F17";
209        kc = "";
210        break;
211      case VK_F18:
212        kn = "F18";
213        ks = "F18";
214        kc = "";
215        break;
216      case VK_F19:
217        kn = "F19";
218        ks = "F19";
219        kc = "";
220        break;
221      case VK_F20:
222        /*
223        * VK_F20 indicates that an arrow key came from a rocker.
224        * This can safely be ignored.
225        */
226        return 0;
227      case VK_F21:
228        /*
229        * VK_F21 indicates that an arrow key came from a directional
230        * pad. This can safely be ignored.
231        */
232        return 0;
233      case VK_F22:
234        kn = "F22";
235        ks = "F22";
236        kc = "";
237        break;
238      case VK_F23:
239        /*
240        * Sent with VK_RETURN when doing an action (usually the middle
241        * button on a directional pad. This can safely be ignored.
242        */
243        return 0;
244      case VK_F24:
245        kn = "F24";
246        ks = "F24";
247        kc = "";
248        break;
249      case VK_APPS:
250        kn = "Application";
251        ks = "Application";
252        kc = "";
253        break;
254      case VK_MENU:
255        kn = "Menu";
256        ks = "Menu";
257        kc = "";
258        break;
259      default:
260        /* other non keystroke characters */
261        return 0;
262      }
263    *keyname = strdup(kn);
264    if (!*keyname) return 0;
265    *keysymbol = strdup(ks);
266    if (!*keysymbol)
267      {
268         free(*keyname);
269         *keyname = NULL;
270         return 0;
271      }
272    *keycompose = strdup(kc);
273    if (!*keycompose)
274      {
275         free(*keyname);
276         free(*keysymbol);
277         *keyname = NULL;
278         *keysymbol = NULL;
279         return 0;
280      }
281
282    return 1;
283 }
284
285 static int
286 _ecore_wince_event_char_get(int    key,
287                             char **keyname,
288                             char **keysymbol,
289                             char **keycompose)
290 {
291   char kn[32];
292   char ks[32];
293   char kc[32];
294
295   *keyname = NULL;
296   *keysymbol = NULL;
297   *keycompose = NULL;
298
299    switch (key)
300      {
301      case VK_APP3:
302      case VK_BACK:
303        strncpy(kn, "BackSpace", 32);
304        strncpy(ks, "BackSpace", 32);
305        strncpy(kc, "BackSpace", 32);
306        break;
307      case VK_APP4:
308      case VK_TAB:
309        strncpy(kn, "Tab", 32);
310        strncpy(ks, "Tab", 32);
311        strncpy(kc, "Tab", 32);
312        break;
313      case VK_APP5:
314      case 0x0a:
315        /* Line feed (Shift + Enter) */
316        strncpy(kn, "LineFeed", 32);
317        strncpy(ks, "LineFeed", 32);
318        strncpy(kc, "LineFeed", 32);
319        break;
320      case VK_APP2:
321      case VK_RETURN:
322        strncpy(kn, "Return", 32);
323        strncpy(ks, "Return", 32);
324        strncpy(kc, "Return", 32);
325        break;
326      case VK_APP1:
327      case VK_ESCAPE:
328        strncpy(kn, "Escape", 32);
329        strncpy(ks, "Escape", 32);
330        strncpy(kc, "Escape", 32);
331        break;
332      default:
333        /* displayable characters */
334        printf (" * key : %d\n", key);
335        kn[0] = (TCHAR)key;
336        kn[1] = '\0';
337        ks[0] = (TCHAR)key;
338        ks[1] = '\0';
339        kc[0] = (TCHAR)key;
340        kc[1] = '\0';
341        break;
342      }
343    *keyname = strdup(kn);
344    if (!*keyname) return 0;
345    *keysymbol = strdup(ks);
346    if (!*keysymbol)
347      {
348         free(*keyname);
349         *keyname = NULL;
350         return 0;
351      }
352    *keycompose = strdup(kc);
353    if (!*keycompose)
354      {
355         free(*keyname);
356         free(*keysymbol);
357         *keyname = NULL;
358         *keysymbol = NULL;
359         return 0;
360      }
361
362    return 1;
363 }
364
365 /**
366  * @endcond
367  */
368
369
370 /*============================================================================*
371  *                                 Global                                     *
372  *============================================================================*/
373
374 void
375 _ecore_wince_event_handle_key_press(Ecore_WinCE_Callback_Data *msg,
376                                     int                        is_keystroke)
377 {
378    Ecore_Event_Key *e;
379
380    INF("key pressed");
381
382    e = (Ecore_Event_Key *)malloc(sizeof(Ecore_Event_Key));
383    if (!e) return;
384
385    if (is_keystroke)
386      {
387         if (!_ecore_wince_event_keystroke_get(LOWORD(msg->window_param),
388                                               (char **)&e->keyname,
389                                               (char **)&e->key,
390                                               (char **)&e->string))
391           {
392              free(e);
393              return;
394           }
395      }
396    else
397      {
398         if (!_ecore_wince_event_char_get(LOWORD(msg->window_param),
399                                          (char **)&e->keyname,
400                                          (char **)&e->key,
401                                          (char **)&e->string))
402           {
403              free(e);
404              return;
405           }
406      }
407
408    e->window = (Ecore_Window)GetWindowLong(msg->window, GWL_USERDATA);
409    if (!e->window)
410      {
411         free(e);
412         return;
413      }
414    e->timestamp = msg->time;
415
416    _ecore_wince_event_last_time = e->timestamp;
417
418    ecore_event_add(ECORE_EVENT_KEY_DOWN, e, _ecore_wince_event_free_key_down, NULL);
419 }
420
421 void
422 _ecore_wince_event_handle_key_release(Ecore_WinCE_Callback_Data *msg,
423                                       int                        is_keystroke)
424 {
425    Ecore_Event_Key *e;
426
427    INF("key released");
428
429    e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key));
430    if (!e) return;
431
432    if (is_keystroke)
433      {
434         if (!_ecore_wince_event_keystroke_get(LOWORD(msg->window_param),
435                                               (char **)&e->keyname,
436                                               (char **)&e->key,
437                                               (char **)&e->string))
438           {
439              free(e);
440              return;
441           }
442      }
443    else
444      {
445         if (!_ecore_wince_event_char_get(LOWORD(msg->window_param),
446                                          (char **)&e->keyname,
447                                          (char **)&e->key,
448                                          (char **)&e->string))
449           {
450              free(e);
451              return;
452           }
453      }
454
455    e->window = (Ecore_Window)GetWindowLong(msg->window, GWL_USERDATA);
456    if (!e->window)
457      {
458         free(e);
459         return;
460      }
461    e->timestamp = msg->time;
462
463    _ecore_wince_event_last_time = e->timestamp;
464
465    ecore_event_add(ECORE_EVENT_KEY_UP, e, _ecore_wince_event_free_key_up, NULL);
466 }
467
468 void
469 _ecore_wince_event_handle_button_press(Ecore_WinCE_Callback_Data *msg,
470                                        int                        button)
471 {
472    Ecore_WinCE_Window *window;
473
474    INF("mouse button pressed");
475
476    window = (Ecore_WinCE_Window *)GetWindowLong(msg->window, GWL_USERDATA);
477
478    {
479       Ecore_Event_Mouse_Move *e;
480
481       e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
482       if (!e) return;
483
484       e->window = (Ecore_Window)window;
485       e->x = LOWORD(msg->data_param);
486       e->y = HIWORD(msg->data_param);
487       e->timestamp = msg->time;
488
489       _ecore_wince_event_last_time = e->timestamp;
490       _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
491
492       ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
493    }
494
495    {
496       Ecore_Event_Mouse_Button *e;
497
498       if (_ecore_wince_mouse_down_did_triple)
499         {
500            _ecore_wince_mouse_down_last_window = NULL;
501            _ecore_wince_mouse_down_last_last_window = NULL;
502            _ecore_wince_mouse_down_last_time = 0;
503            _ecore_wince_mouse_down_last_last_time = 0;
504         }
505
506       e = (Ecore_Event_Mouse_Button *)calloc(1, sizeof(Ecore_Event_Mouse_Button));
507       if (!e) return;
508
509       e->window = (Ecore_Window)window;
510       e->buttons = button;
511       e->x = LOWORD(msg->data_param);
512       e->y = HIWORD(msg->data_param);
513       e->timestamp = msg->time;
514
515       if (((e->timestamp - _ecore_wince_mouse_down_last_time) <= (long)(1000 * _ecore_wince_double_click_time)) &&
516           (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_window))
517         e->double_click = 1;
518
519       if (((e->timestamp - _ecore_wince_mouse_down_last_last_time) <= (long)(2 * 1000 * _ecore_wince_double_click_time)) &&
520           (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_window) &&
521           (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_last_window))
522         {
523            e->triple_click = 1;
524            _ecore_wince_mouse_down_did_triple = 1;
525         }
526       else
527         _ecore_wince_mouse_down_did_triple = 0;
528
529       if (!e->double_click && !e->triple_click)
530         _ecore_wince_mouse_up_count = 0;
531
532       _ecore_wince_event_last_time = e->timestamp;
533       _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
534
535       if (!_ecore_wince_mouse_down_did_triple)
536         {
537            _ecore_wince_mouse_down_last_last_window = _ecore_wince_mouse_down_last_window;
538            _ecore_wince_mouse_down_last_window = (Ecore_WinCE_Window *)e->window;
539            _ecore_wince_mouse_down_last_last_time = _ecore_wince_mouse_down_last_time;
540            _ecore_wince_mouse_down_last_time = e->timestamp;
541         }
542
543       ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
544    }
545 }
546
547 void
548 _ecore_wince_event_handle_button_release(Ecore_WinCE_Callback_Data *msg,
549                                          int                        button)
550 {
551    Ecore_WinCE_Window *window;
552
553    INF("mouse button released");
554
555    window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
556
557    {
558       Ecore_Event_Mouse_Move *e;
559
560       e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
561       if (!e) return;
562
563       e->window = (Ecore_Window)window;
564       e->x = LOWORD(msg->data_param);
565       e->y = HIWORD(msg->data_param);
566       e->timestamp = msg->time;
567
568       _ecore_wince_event_last_time = e->timestamp;
569       _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
570
571       ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
572    }
573
574    {
575       Ecore_Event_Mouse_Button *e;
576
577       e = (Ecore_Event_Mouse_Button *)calloc(1, sizeof(Ecore_Event_Mouse_Button));
578       if (!e) return;
579
580       e->window = (Ecore_Window)window;
581       e->buttons = button;
582       e->x = LOWORD(msg->data_param);
583       e->y = HIWORD(msg->data_param);
584       e->timestamp = msg->time;
585
586       _ecore_wince_mouse_up_count++;
587
588       if ((_ecore_wince_mouse_up_count >= 2) &&
589           ((e->timestamp - _ecore_wince_mouse_down_last_time) <= (long)(1000 * _ecore_wince_double_click_time)) &&
590           (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_window))
591         e->double_click = 1;
592
593       if ((_ecore_wince_mouse_up_count >= 3) &&
594           ((e->timestamp - _ecore_wince_mouse_down_last_last_time) <= (long)(2 * 1000 * _ecore_wince_double_click_time)) &&
595           (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_window) &&
596           (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_last_window))
597         e->triple_click = 1;
598
599       _ecore_wince_event_last_time = e->timestamp;
600       _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
601
602       ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
603    }
604 }
605
606 void
607 _ecore_wince_event_handle_motion_notify(Ecore_WinCE_Callback_Data *msg)
608 {
609    Ecore_Event_Mouse_Move *e;
610
611    INF("mouse moved");
612
613    e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
614    if (!e) return;
615
616    e->window = (Ecore_Window)GetWindowLong(msg->window, GWL_USERDATA);
617    e->x = LOWORD(msg->data_param);
618    e->y = HIWORD(msg->data_param);
619    e->timestamp = msg->time;
620
621    ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
622 }
623
624 void
625 _ecore_wince_event_handle_enter_notify(Ecore_WinCE_Callback_Data *msg)
626 {
627    Ecore_WinCE_Window *window;
628
629    INF("mouse in");
630
631    window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
632
633    {
634       Ecore_Event_Mouse_Move *e;
635
636       e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
637       if (!e) return;
638
639       e->window = (Ecore_Window)window;
640       e->x = msg->x;
641       e->y = msg->y;
642       e->timestamp = msg->time;
643
644       _ecore_wince_event_last_time = e->timestamp;
645       _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
646
647       ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
648    }
649
650    {
651       Ecore_WinCE_Event_Mouse_In *e;
652
653       e = (Ecore_WinCE_Event_Mouse_In *)calloc(1, sizeof(Ecore_WinCE_Event_Mouse_In));
654       if (!e) return;
655
656       e->window = window;
657       e->x = msg->x;
658       e->y = msg->y;
659       e->time = msg->time;
660
661       _ecore_wince_event_last_time = e->time;
662
663       ecore_event_add(ECORE_WINCE_EVENT_MOUSE_IN, e, NULL, NULL);
664    }
665 }
666
667 void
668 _ecore_wince_event_handle_leave_notify(Ecore_WinCE_Callback_Data *msg)
669 {
670    Ecore_WinCE_Window *window;
671
672    INF("mouse out");
673
674    window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
675
676    {
677       Ecore_Event_Mouse_Move *e;
678
679       e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
680       if (!e) return;
681
682       e->window = (Ecore_Window)window;
683       e->x = msg->x;
684       e->y = msg->y;
685       e->timestamp = msg->time;
686
687       _ecore_wince_event_last_time = e->timestamp;
688       _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
689
690       ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
691    }
692
693    {
694       Ecore_WinCE_Event_Mouse_Out *e;
695
696       e = (Ecore_WinCE_Event_Mouse_Out *)calloc(1, sizeof(Ecore_WinCE_Event_Mouse_Out));
697       if (!e) return;
698
699       e->window = window;
700       e->x = msg->x;
701       e->y = msg->y;
702       e->time = msg->time;
703
704       _ecore_wince_event_last_time = e->time;
705
706       ecore_event_add(ECORE_WINCE_EVENT_MOUSE_OUT, e, NULL, NULL);
707    }
708 }
709
710 void
711 _ecore_wince_event_handle_focus_in(Ecore_WinCE_Callback_Data *msg)
712 {
713    Ecore_WinCE_Event_Window_Focus_In *e;
714    struct _Ecore_WinCE_Window        *window;
715
716    INF("focus in");
717
718    e = (Ecore_WinCE_Event_Window_Focus_In *)calloc(1, sizeof(Ecore_WinCE_Event_Window_Focus_In));
719    if (!e) return;
720
721    window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
722    if (!e->window)
723      {
724         free(e);
725         return;
726      }
727
728    if (window->resume)
729      window->resume(window->backend);
730
731    e->window = window;
732
733    e->time = _ecore_wince_event_last_time;
734    _ecore_wince_event_last_time = e->time;
735
736    ecore_event_add(ECORE_WINCE_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL);
737 }
738
739 void
740 _ecore_wince_event_handle_focus_out(Ecore_WinCE_Callback_Data *msg)
741 {
742    Ecore_WinCE_Event_Window_Focus_Out *e;
743    struct _Ecore_WinCE_Window         *window;
744
745    INF("focus out");
746
747    e = (Ecore_WinCE_Event_Window_Focus_Out *)calloc(1, sizeof(Ecore_WinCE_Event_Window_Focus_Out));
748    if (!e) return;
749
750    window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
751    if (!e->window)
752      {
753         free(e);
754         return;
755      }
756    if (window->suspend)
757      window->suspend(window->backend);
758
759    e->window = window;
760
761    e->time = _ecore_wince_event_last_time;
762    _ecore_wince_event_last_time = e->time;
763
764    ecore_event_add(ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
765 }
766
767 void
768 _ecore_wince_event_handle_expose(Ecore_WinCE_Callback_Data *msg)
769 {
770    Ecore_WinCE_Event_Window_Damage *e;
771
772    INF("window expose");
773
774    e = (Ecore_WinCE_Event_Window_Damage *)calloc(1, sizeof(Ecore_WinCE_Event_Window_Damage));
775    if (!e) return;
776
777    e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
778    if (!e->window)
779      {
780         free(e);
781         return;
782      }
783
784    e->x = msg->update.left;
785    e->y = msg->update.top;
786    e->width = msg->update.right - msg->update.left;
787    e->height = msg->update.bottom - msg->update.top;
788    INF("window expose size: %dx%d", e->width, e->height);
789
790    e->time = _ecore_wince_event_last_time;
791
792    ecore_event_add(ECORE_WINCE_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
793 }
794
795 void
796 _ecore_wince_event_handle_create_notify(Ecore_WinCE_Callback_Data *msg)
797 {
798    Ecore_WinCE_Event_Window_Create *e;
799
800    INF("window create notify");
801
802    e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Create));
803    if (!e) return;
804
805    e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
806    if (!e->window)
807      {
808         free(e);
809         return;
810      }
811
812    e->time = _ecore_wince_event_last_time;
813
814    ecore_event_add(ECORE_WINCE_EVENT_WINDOW_CREATE, e, NULL, NULL);
815 }
816
817 void
818 _ecore_wince_event_handle_destroy_notify(Ecore_WinCE_Callback_Data *msg)
819 {
820    Ecore_WinCE_Event_Window_Destroy *e;
821
822    INF("window destroy notify");
823
824    e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Destroy));
825    if (!e) return;
826
827    e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
828    if (!e->window)
829      {
830         free(e);
831         return;
832      }
833
834    e->time = _ecore_wince_event_last_time;
835 /*    if (e->window == _ecore_wince_event_last_window) _ecore_wince_event_last_window = NULL; */
836
837    ecore_event_add(ECORE_WINCE_EVENT_WINDOW_DESTROY, e, NULL, NULL);
838 }
839
840 void
841 _ecore_wince_event_handle_map_notify(Ecore_WinCE_Callback_Data *msg)
842 {
843    Ecore_WinCE_Event_Window_Show *e;
844
845    INF("window map notify");
846
847    e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Show));
848    if (!e) return;
849
850    e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
851    if (!e->window)
852      {
853         free(e);
854         return;
855      }
856
857    e->time = _ecore_wince_event_last_time;
858
859    ecore_event_add(ECORE_WINCE_EVENT_WINDOW_SHOW, e, NULL, NULL);
860 }
861
862 void
863 _ecore_wince_event_handle_unmap_notify(Ecore_WinCE_Callback_Data *msg)
864 {
865    Ecore_WinCE_Event_Window_Hide *e;
866
867    INF("window unmap notify");
868
869    e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Hide));
870    if (!e) return;
871
872    e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
873    if (!e->window)
874      {
875         free(e);
876         return;
877      }
878
879    e->time = _ecore_wince_event_last_time;
880
881    ecore_event_add(ECORE_WINCE_EVENT_WINDOW_HIDE, e, NULL, NULL);
882 }
883
884 void
885 _ecore_wince_event_handle_delete_request(Ecore_WinCE_Callback_Data *msg)
886 {
887    Ecore_WinCE_Event_Window_Delete_Request *e;
888
889    INF("window delete request");
890
891    e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Delete_Request));
892    if (!e) return;
893
894    e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
895    if (!e->window)
896      {
897         free(e);
898         return;
899      }
900
901    e->time = _ecore_wince_event_last_time;
902
903    ecore_event_add(ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
904 }
905
906 /*============================================================================*
907  *                                   API                                      *
908  *============================================================================*/
909