2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
11 #define WIN32_LEAN_AND_MEAN
13 #undef WIN32_LEAN_AND_MEAN
17 #include <Ecore_Input.h>
19 #include "Ecore_WinCE.h"
20 #include "ecore_wince_private.h"
23 /***** Private declarations *****/
25 static Ecore_WinCE_Window *_ecore_wince_mouse_down_last_window = NULL;
26 static Ecore_WinCE_Window *_ecore_wince_mouse_down_last_last_window = NULL;
27 static long _ecore_wince_mouse_down_last_time = 0;
28 static long _ecore_wince_mouse_down_last_last_time = 0;
29 static int _ecore_wince_mouse_down_did_triple = 0;
30 static int _ecore_wince_mouse_up_count = 0;
33 static void _ecore_wince_event_free_key_down(void *data,
36 static void _ecore_wince_event_free_key_up(void *data,
39 static int _ecore_wince_event_keystroke_get(int key,
44 static int _ecore_wince_event_char_get(int key,
50 /***** Global functions *****/
53 _ecore_wince_event_handle_key_press(Ecore_WinCE_Callback_Data *msg,
60 e = (Ecore_Event_Key *)malloc(sizeof(Ecore_Event_Key));
65 if (!_ecore_wince_event_keystroke_get(LOWORD(msg->window_param),
76 if (!_ecore_wince_event_char_get(LOWORD(msg->window_param),
86 e->window = (Ecore_Window)GetWindowLong(msg->window, GWL_USERDATA);
92 e->timestamp = msg->time;
94 _ecore_wince_event_last_time = e->timestamp;
96 ecore_event_add(ECORE_EVENT_KEY_DOWN, e, _ecore_wince_event_free_key_down, NULL);
100 _ecore_wince_event_handle_key_release(Ecore_WinCE_Callback_Data *msg,
107 e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key));
112 if (!_ecore_wince_event_keystroke_get(LOWORD(msg->window_param),
113 (char **)&e->keyname,
115 (char **)&e->string))
123 if (!_ecore_wince_event_char_get(LOWORD(msg->window_param),
124 (char **)&e->keyname,
126 (char **)&e->string))
133 e->window = (Ecore_Window)GetWindowLong(msg->window, GWL_USERDATA);
139 e->timestamp = msg->time;
141 _ecore_wince_event_last_time = e->timestamp;
143 ecore_event_add(ECORE_EVENT_KEY_UP, e, _ecore_wince_event_free_key_up, NULL);
147 _ecore_wince_event_handle_button_press(Ecore_WinCE_Callback_Data *msg,
150 Ecore_WinCE_Window *window;
152 INF("mouse button pressed");
154 window = (Ecore_WinCE_Window *)GetWindowLong(msg->window, GWL_USERDATA);
157 Ecore_Event_Mouse_Move *e;
159 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
162 e->window = (Ecore_Window)window;
163 e->x = LOWORD(msg->data_param);
164 e->y = HIWORD(msg->data_param);
165 e->timestamp = msg->time;
167 _ecore_wince_event_last_time = e->timestamp;
168 _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
170 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
174 Ecore_Event_Mouse_Button *e;
176 if (_ecore_wince_mouse_down_did_triple)
178 _ecore_wince_mouse_down_last_window = NULL;
179 _ecore_wince_mouse_down_last_last_window = NULL;
180 _ecore_wince_mouse_down_last_time = 0;
181 _ecore_wince_mouse_down_last_last_time = 0;
184 e = (Ecore_Event_Mouse_Button *)calloc(1, sizeof(Ecore_Event_Mouse_Button));
187 e->window = (Ecore_Window)window;
189 e->x = LOWORD(msg->data_param);
190 e->y = HIWORD(msg->data_param);
191 e->timestamp = msg->time;
193 if (((e->timestamp - _ecore_wince_mouse_down_last_time) <= (long)(1000 * _ecore_wince_double_click_time)) &&
194 (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_window))
197 if (((e->timestamp - _ecore_wince_mouse_down_last_last_time) <= (long)(2 * 1000 * _ecore_wince_double_click_time)) &&
198 (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_window) &&
199 (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_last_window))
202 _ecore_wince_mouse_down_did_triple = 1;
205 _ecore_wince_mouse_down_did_triple = 0;
207 if (!e->double_click && !e->triple_click)
208 _ecore_wince_mouse_up_count = 0;
210 _ecore_wince_event_last_time = e->timestamp;
211 _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
213 if (!_ecore_wince_mouse_down_did_triple)
215 _ecore_wince_mouse_down_last_last_window = _ecore_wince_mouse_down_last_window;
216 _ecore_wince_mouse_down_last_window = (Ecore_WinCE_Window *)e->window;
217 _ecore_wince_mouse_down_last_last_time = _ecore_wince_mouse_down_last_time;
218 _ecore_wince_mouse_down_last_time = e->timestamp;
221 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
226 _ecore_wince_event_handle_button_release(Ecore_WinCE_Callback_Data *msg,
229 Ecore_WinCE_Window *window;
231 INF("mouse button released");
233 window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
236 Ecore_Event_Mouse_Move *e;
238 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
241 e->window = (Ecore_Window)window;
242 e->x = LOWORD(msg->data_param);
243 e->y = HIWORD(msg->data_param);
244 e->timestamp = msg->time;
246 _ecore_wince_event_last_time = e->timestamp;
247 _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
249 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
253 Ecore_Event_Mouse_Button *e;
255 e = (Ecore_Event_Mouse_Button *)calloc(1, sizeof(Ecore_Event_Mouse_Button));
258 e->window = (Ecore_Window)window;
260 e->x = LOWORD(msg->data_param);
261 e->y = HIWORD(msg->data_param);
262 e->timestamp = msg->time;
264 _ecore_wince_mouse_up_count++;
266 if ((_ecore_wince_mouse_up_count >= 2) &&
267 ((e->timestamp - _ecore_wince_mouse_down_last_time) <= (long)(1000 * _ecore_wince_double_click_time)) &&
268 (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_window))
271 if ((_ecore_wince_mouse_up_count >= 3) &&
272 ((e->timestamp - _ecore_wince_mouse_down_last_last_time) <= (long)(2 * 1000 * _ecore_wince_double_click_time)) &&
273 (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_window) &&
274 (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_last_window))
277 _ecore_wince_event_last_time = e->timestamp;
278 _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
280 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
285 _ecore_wince_event_handle_motion_notify(Ecore_WinCE_Callback_Data *msg)
287 Ecore_Event_Mouse_Move *e;
291 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
294 e->window = (Ecore_Window)GetWindowLong(msg->window, GWL_USERDATA);
295 e->x = LOWORD(msg->data_param);
296 e->y = HIWORD(msg->data_param);
297 e->timestamp = msg->time;
299 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
303 _ecore_wince_event_handle_enter_notify(Ecore_WinCE_Callback_Data *msg)
305 Ecore_WinCE_Window *window;
309 window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
312 Ecore_Event_Mouse_Move *e;
314 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
317 e->window = (Ecore_Window)window;
320 e->timestamp = msg->time;
322 _ecore_wince_event_last_time = e->timestamp;
323 _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
325 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
329 Ecore_WinCE_Event_Mouse_In *e;
331 e = (Ecore_WinCE_Event_Mouse_In *)calloc(1, sizeof(Ecore_WinCE_Event_Mouse_In));
339 _ecore_wince_event_last_time = e->time;
341 ecore_event_add(ECORE_WINCE_EVENT_MOUSE_IN, e, NULL, NULL);
346 _ecore_wince_event_handle_leave_notify(Ecore_WinCE_Callback_Data *msg)
348 Ecore_WinCE_Window *window;
352 window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
355 Ecore_Event_Mouse_Move *e;
357 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
360 e->window = (Ecore_Window)window;
363 e->timestamp = msg->time;
365 _ecore_wince_event_last_time = e->timestamp;
366 _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
368 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
372 Ecore_WinCE_Event_Mouse_Out *e;
374 e = (Ecore_WinCE_Event_Mouse_Out *)calloc(1, sizeof(Ecore_WinCE_Event_Mouse_Out));
382 _ecore_wince_event_last_time = e->time;
384 ecore_event_add(ECORE_WINCE_EVENT_MOUSE_OUT, e, NULL, NULL);
389 _ecore_wince_event_handle_focus_in(Ecore_WinCE_Callback_Data *msg)
391 Ecore_WinCE_Event_Window_Focus_In *e;
392 struct _Ecore_WinCE_Window *window;
396 e = (Ecore_WinCE_Event_Window_Focus_In *)calloc(1, sizeof(Ecore_WinCE_Event_Window_Focus_In));
399 window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
407 window->resume(window->backend);
411 e->time = _ecore_wince_event_last_time;
412 _ecore_wince_event_last_time = e->time;
414 ecore_event_add(ECORE_WINCE_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL);
418 _ecore_wince_event_handle_focus_out(Ecore_WinCE_Callback_Data *msg)
420 Ecore_WinCE_Event_Window_Focus_Out *e;
421 struct _Ecore_WinCE_Window *window;
425 e = (Ecore_WinCE_Event_Window_Focus_Out *)calloc(1, sizeof(Ecore_WinCE_Event_Window_Focus_Out));
428 window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
435 window->suspend(window->backend);
439 e->time = _ecore_wince_event_last_time;
440 _ecore_wince_event_last_time = e->time;
442 ecore_event_add(ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
446 _ecore_wince_event_handle_expose(Ecore_WinCE_Callback_Data *msg)
448 Ecore_WinCE_Event_Window_Damage *e;
450 INF("window expose");
452 e = (Ecore_WinCE_Event_Window_Damage *)calloc(1, sizeof(Ecore_WinCE_Event_Window_Damage));
455 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
462 e->x = msg->update.left;
463 e->y = msg->update.top;
464 e->width = msg->update.right - msg->update.left;
465 e->height = msg->update.bottom - msg->update.top;
466 INF("window expose size: %dx%d", e->width, e->height);
468 e->time = _ecore_wince_event_last_time;
470 ecore_event_add(ECORE_WINCE_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
474 _ecore_wince_event_handle_create_notify(Ecore_WinCE_Callback_Data *msg)
476 Ecore_WinCE_Event_Window_Create *e;
478 INF("window create notify");
480 e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Create));
483 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
490 e->time = _ecore_wince_event_last_time;
492 ecore_event_add(ECORE_WINCE_EVENT_WINDOW_CREATE, e, NULL, NULL);
496 _ecore_wince_event_handle_destroy_notify(Ecore_WinCE_Callback_Data *msg)
498 Ecore_WinCE_Event_Window_Destroy *e;
500 INF("window destroy notify");
502 e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Destroy));
505 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
512 e->time = _ecore_wince_event_last_time;
513 /* if (e->window == _ecore_wince_event_last_window) _ecore_wince_event_last_window = NULL; */
515 ecore_event_add(ECORE_WINCE_EVENT_WINDOW_DESTROY, e, NULL, NULL);
519 _ecore_wince_event_handle_map_notify(Ecore_WinCE_Callback_Data *msg)
521 Ecore_WinCE_Event_Window_Show *e;
523 INF("window map notify");
525 e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Show));
528 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
535 e->time = _ecore_wince_event_last_time;
537 ecore_event_add(ECORE_WINCE_EVENT_WINDOW_SHOW, e, NULL, NULL);
541 _ecore_wince_event_handle_unmap_notify(Ecore_WinCE_Callback_Data *msg)
543 Ecore_WinCE_Event_Window_Hide *e;
545 INF("window unmap notify");
547 e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Hide));
550 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
557 e->time = _ecore_wince_event_last_time;
559 ecore_event_add(ECORE_WINCE_EVENT_WINDOW_HIDE, e, NULL, NULL);
563 _ecore_wince_event_handle_delete_request(Ecore_WinCE_Callback_Data *msg)
565 Ecore_WinCE_Event_Window_Delete_Request *e;
567 INF("window delete request");
569 e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Delete_Request));
572 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
579 e->time = _ecore_wince_event_last_time;
581 ecore_event_add(ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
585 /***** Private functions definitions *****/
588 _ecore_wince_event_free_key_down(void *data __UNUSED__,
594 if (e->keyname) free((char *)e->keyname);
595 if (e->key) free((char *)e->key);
596 if (e->string) free((char *)e->string);
601 _ecore_wince_event_free_key_up(void *data __UNUSED__,
607 if (e->keyname) free((char *)e->keyname);
608 if (e->key) free((char *)e->key);
609 if (e->string) free((char *)e->string);
614 _ecore_wince_event_keystroke_get(int key,
777 * VK_F20 indicates that an arrow key came from a rocker.
778 * This can safely be ignored.
783 * VK_F21 indicates that an arrow key came from a directional
784 * pad. This can safely be ignored.
794 * Sent with VK_RETURN when doing an action (usually the middle
795 * button on a directional pad. This can safely be ignored.
814 /* other non keystroke characters */
817 *keyname = strdup(kn);
818 if (!*keyname) return 0;
819 *keysymbol = strdup(ks);
826 *keycompose = strdup(kc);
840 _ecore_wince_event_char_get(int key,
857 strncpy(kn, "BackSpace", 32);
858 strncpy(ks, "BackSpace", 32);
859 strncpy(kc, "BackSpace", 32);
863 strncpy(kn, "Tab", 32);
864 strncpy(ks, "Tab", 32);
865 strncpy(kc, "Tab", 32);
869 /* Line feed (Shift + Enter) */
870 strncpy(kn, "LineFeed", 32);
871 strncpy(ks, "LineFeed", 32);
872 strncpy(kc, "LineFeed", 32);
876 strncpy(kn, "Return", 32);
877 strncpy(ks, "Return", 32);
878 strncpy(kc, "Return", 32);
882 strncpy(kn, "Escape", 32);
883 strncpy(ks, "Escape", 32);
884 strncpy(kc, "Escape", 32);
887 /* displayable characters */
888 printf (" * key : %d\n", key);
897 *keyname = strdup(kn);
898 if (!*keyname) return 0;
899 *keysymbol = strdup(ks);
906 *keycompose = strdup(kc);