/* * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 */ #include #include /* for printf */ #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN #include "Ecore.h" #include "Ecore_WinCE.h" #include "ecore_wince_private.h" /***** Private declarations *****/ static void _ecore_wince_event_free_key_down(void *data, void *ev); static void _ecore_wince_event_free_key_up(void *data, void *ev); static int _ecore_wince_event_keystroke_get(int key, char **keyname, char **keysymbol, char **keycompose); static int _ecore_wince_event_char_get(int key, char **keyname, char **keysymbol, char **keycompose); /***** Global functions *****/ void _ecore_wince_event_handle_key_press(Ecore_WinCE_Callback_Data *msg) { Ecore_WinCE_Event_Key_Down *e; e = (Ecore_WinCE_Event_Key_Down *)malloc(sizeof(Ecore_WinCE_Event_Key_Down)); if (!e) return; if (!_ecore_wince_event_keystroke_get(LOWORD(msg->window_param), &e->keyname, &e->keysymbol, &e->keycompose)) { free(e); return; } e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA); if (!e->window) { free(e); return; } e->time = (double)msg->time / 1000.0; _ecore_wince_event_last_time = e->time; ecore_event_add(ECORE_WINCE_EVENT_KEY_DOWN, e, _ecore_wince_event_free_key_down, NULL); } void _ecore_wince_event_handle_key_release(Ecore_WinCE_Callback_Data *msg) { Ecore_WinCE_Event_Key_Up *e; e = (Ecore_WinCE_Event_Key_Up *)calloc(1, sizeof(Ecore_WinCE_Event_Key_Up)); if (!e) return; if (!_ecore_wince_event_keystroke_get(LOWORD(msg->window_param), &e->keyname, &e->keysymbol, &e->keycompose)) { free(e); return; } e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA); if (!e->window) { free(e); return; } e->time = (double)msg->time / 1000.0; _ecore_wince_event_last_time = e->time; ecore_event_add(ECORE_WINCE_EVENT_KEY_UP, e, _ecore_wince_event_free_key_up, NULL); } void _ecore_wince_event_handle_focus_in(Ecore_WinCE_Callback_Data *msg) { Ecore_WinCE_Event_Window_Focus_In *e; struct _Ecore_WinCE_Window *window; e = (Ecore_WinCE_Event_Window_Focus_In *)calloc(1, sizeof(Ecore_WinCE_Event_Window_Focus_In)); if (!e) return; window = (void *)GetWindowLong(msg->window, GWL_USERDATA); if (!e->window) { free(e); return; } if (window->resume) window->resume(); e->window = window; e->time = _ecore_wince_event_last_time; _ecore_wince_event_last_time = e->time; ecore_event_add(ECORE_WINCE_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL); } void _ecore_wince_event_handle_focus_out(Ecore_WinCE_Callback_Data *msg) { Ecore_WinCE_Event_Window_Focus_Out *e; struct _Ecore_WinCE_Window *window; e = (Ecore_WinCE_Event_Window_Focus_Out *)calloc(1, sizeof(Ecore_WinCE_Event_Window_Focus_Out)); if (!e) return; window = (void *)GetWindowLong(msg->window, GWL_USERDATA); if (!e->window) { free(e); return; } if (window->suspend) window->suspend(); e->window = window; e->time = _ecore_wince_event_last_time; _ecore_wince_event_last_time = e->time; ecore_event_add(ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL); } void _ecore_wince_event_handle_expose(Ecore_WinCE_Callback_Data *msg) { Ecore_WinCE_Event_Window_Damage *e; e = (Ecore_WinCE_Event_Window_Damage *)calloc(1, sizeof(Ecore_WinCE_Event_Window_Damage)); if (!e) return; e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA); if (!e->window) { free(e); return; } e->x = msg->update.left; e->y = msg->update.top; e->width = msg->update.right - msg->update.left; e->height = msg->update.bottom - msg->update.top; printf (" * ecore : event expose %d %d\n", e->width, e->height); e->time = _ecore_wince_event_last_time; ecore_event_add(ECORE_WINCE_EVENT_WINDOW_DAMAGE, e, NULL, NULL); } void _ecore_wince_event_handle_create_notify(Ecore_WinCE_Callback_Data *msg) { Ecore_WinCE_Event_Window_Create *e; e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Create)); if (!e) return; e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA); if (!e->window) { free(e); return; } e->time = _ecore_wince_event_last_time; ecore_event_add(ECORE_WINCE_EVENT_WINDOW_CREATE, e, NULL, NULL); } void _ecore_wince_event_handle_destroy_notify(Ecore_WinCE_Callback_Data *msg) { Ecore_WinCE_Event_Window_Destroy *e; e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Destroy)); if (!e) return; e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA); if (!e->window) { free(e); return; } e->time = _ecore_wince_event_last_time; /* if (e->window == _ecore_wince_event_last_window) _ecore_wince_event_last_window = NULL; */ ecore_event_add(ECORE_WINCE_EVENT_WINDOW_DESTROY, e, NULL, NULL); } void _ecore_wince_event_handle_map_notify(Ecore_WinCE_Callback_Data *msg) { Ecore_WinCE_Event_Window_Show *e; e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Show)); if (!e) return; e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA); if (!e->window) { free(e); return; } e->time = _ecore_wince_event_last_time; ecore_event_add(ECORE_WINCE_EVENT_WINDOW_SHOW, e, NULL, NULL); } void _ecore_wince_event_handle_unmap_notify(Ecore_WinCE_Callback_Data *msg) { Ecore_WinCE_Event_Window_Hide *e; e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Hide)); if (!e) return; e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA); if (!e->window) { free(e); return; } e->time = _ecore_wince_event_last_time; ecore_event_add(ECORE_WINCE_EVENT_WINDOW_HIDE, e, NULL, NULL); } void _ecore_wince_event_handle_delete_request(Ecore_WinCE_Callback_Data *msg) { Ecore_WinCE_Event_Window_Delete_Request *e; e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Delete_Request)); if (!e) return; e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA); if (!e->window) { free(e); return; } e->time = _ecore_wince_event_last_time; ecore_event_add(ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL); } /***** Private functions definitions *****/ static void _ecore_wince_event_free_key_down(void *data, void *ev) { Ecore_WinCE_Event_Key_Down *e; e = ev; if (e->keyname) free(e->keyname); if (e->keysymbol) free(e->keysymbol); if (e->keycompose) free(e->keycompose); free(e); } static void _ecore_wince_event_free_key_up(void *data, void *ev) { Ecore_WinCE_Event_Key_Up *e; e = ev; if (e->keyname) free(e->keyname); if (e->keysymbol) free(e->keysymbol); if (e->keycompose) free(e->keycompose); free(e); } static int _ecore_wince_event_keystroke_get(int key, char **keyname, char **keysymbol, char **keycompose) { char *kn; char *ks; char *kc; *keyname = NULL; *keysymbol = NULL; *keycompose = NULL; switch (key) { /* Keystroke */ case VK_PRIOR: kn = "KP_Prior"; ks = "KP_Prior"; kc = ""; break; case VK_NEXT: kn = "KP_Next"; ks = "KP_Next"; kc = ""; break; case VK_END: kn = "KP_End"; ks = "KP_End"; kc = ""; break; case VK_HOME: kn = "KP_Home"; ks = "KP_Home"; kc = ""; break; case VK_LEFT: kn = "KP_Left"; ks = "KP_Left"; kc = ""; break; case VK_UP: kn = "KP_Up"; ks = "KP_Up"; kc = ""; break; case VK_RIGHT: kn = "KP_Right"; ks = "KP_Right"; kc = ""; break; case VK_DOWN: kn = "KP_Down"; ks = "KP_Down"; kc = ""; break; case VK_INSERT: kn = "KP_Insert"; ks = "KP_Insert"; kc = ""; break; case VK_DELETE: kn = "KP_Delete"; ks = "KP_Delete"; kc = ""; break; case VK_F1: kn = "F1"; ks = "F1"; kc = ""; break; case VK_F2: kn = "F2"; ks = "F2"; kc = ""; break; case VK_F3: kn = "F3"; ks = "F3"; kc = ""; break; case VK_F4: kn = "F4"; ks = "F4"; kc = ""; break; case VK_F5: kn = "F5"; ks = "F5"; kc = ""; break; case VK_F6: kn = "F6"; ks = "F6"; kc = ""; break; case VK_F7: kn = "F7"; ks = "F7"; kc = ""; break; case VK_F8: kn = "F8"; ks = "F8"; kc = ""; break; case VK_F9: kn = "F9"; ks = "F9"; kc = ""; break; case VK_F10: kn = "F10"; ks = "F10"; kc = ""; break; case VK_F11: kn = "F11"; ks = "F11"; kc = ""; break; case VK_F12: kn = "F12"; ks = "F12"; kc = ""; break; case VK_F13: kn = "F13"; ks = "F13"; kc = ""; break; case VK_F14: kn = "F14"; ks = "F14"; kc = ""; break; case VK_F15: kn = "F15"; ks = "F15"; kc = ""; break; case VK_F16: kn = "F16"; ks = "F16"; kc = ""; break; case VK_F17: kn = "F17"; ks = "F17"; kc = ""; break; case VK_F18: kn = "F18"; ks = "F18"; kc = ""; break; case VK_F19: kn = "F19"; ks = "F19"; kc = ""; break; case VK_F20: kn = "F20"; ks = "F20"; kc = ""; break; case VK_F21: kn = "F21"; ks = "F21"; kc = ""; break; case VK_F22: kn = "F22"; ks = "F22"; kc = ""; break; case VK_F23: kn = "F23"; ks = "F23"; kc = ""; break; case VK_F24: kn = "F24"; ks = "F24"; kc = ""; break; default: /* other non keystroke characters */ return 0; } *keyname = strdup(kn); if (!*keyname) return 0; *keysymbol = strdup(ks); if (!*keysymbol) { free(*keyname); *keyname = NULL; return 0; } *keycompose = strdup(kc); if (!*keycompose) { free(*keyname); free(*keysymbol); *keyname = NULL; *keysymbol = NULL; return 0; } return 1; } static int _ecore_wince_event_char_get(int key, char **keyname, char **keysymbol, char **keycompose) { char kn[32]; char ks[32]; char *kc; *keyname = NULL; *keysymbol = NULL; *keycompose = NULL; switch (key) { case VK_APP3: case VK_BACK: strncpy(kn, "Backspace", 32); strncpy(ks, "Backspace", 32); kc = ""; break; case VK_APP4: case VK_TAB: strncpy(kn, "Tab", 32); strncpy(ks, "Tab", 32); kc = ""; break; case VK_APP5: case 0x0a: /* Line feed (Shift + Enter) */ strncpy(kn, "LineFeed", 32); strncpy(ks, "LineFeed", 32); kc = ""; break; case VK_APP2: case VK_RETURN: strncpy(kn, "Return", 32); strncpy(ks, "Return", 32); kc = ""; break; case VK_APP1: case VK_ESCAPE: strncpy(kn, "Escape", 32); strncpy(ks, "Escape", 32); kc = ""; break; default: /* displayable characters */ printf (" * key : %d\n", key); kn[0] = (TCHAR)key; kn[1] = '\0'; ks[0] = (TCHAR)key; ks[1] = '\0'; kc = ""; break; } *keyname = strdup(kn); if (!*keyname) return 0; *keysymbol = strdup(ks); if (!*keysymbol) { free(*keyname); *keyname = NULL; return 0; } *keycompose = strdup(kc); if (!*keycompose) { free(*keyname); free(*keysymbol); *keyname = NULL; *keysymbol = NULL; return 0; } return 1; }