diff --git a/legacy/ecore/src/lib/ecore_wince/ecore_wince_event.c b/legacy/ecore/src/lib/ecore_wince/ecore_wince_event.c index b27da9a3ca..41c355bf6a 100644 --- a/legacy/ecore/src/lib/ecore_wince/ecore_wince_event.c +++ b/legacy/ecore/src/lib/ecore_wince/ecore_wince_event.c @@ -23,12 +23,23 @@ * @cond LOCAL */ -static Ecore_WinCE_Window *_ecore_wince_mouse_down_last_window = NULL; -static Ecore_WinCE_Window *_ecore_wince_mouse_down_last_last_window = NULL; -static long _ecore_wince_mouse_down_last_time = 0; -static long _ecore_wince_mouse_down_last_last_time = 0; -static int _ecore_wince_mouse_down_did_triple = 0; -static int _ecore_wince_mouse_up_count = 0; +typedef enum +{ + ECORE_WINCE_KEY_MASK_LSHIFT = 1 << 0, + ECORE_WINCE_KEY_MASK_RSHIFT = 1 << 1, + ECORE_WINCE_KEY_MASK_LCONTROL = 1 << 2, + ECORE_WINCE_KEY_MASK_RCONTROL = 1 << 3, + ECORE_WINCE_KEY_MASK_LMENU = 1 << 4, + ECORE_WINCE_KEY_MASK_RMENU = 1 << 5 +} Ecore_Wince_Key_Mask; + +static Ecore_WinCE_Window *_ecore_wince_mouse_down_last_window = NULL; +static Ecore_WinCE_Window *_ecore_wince_mouse_down_last_last_window = NULL; +static long _ecore_wince_mouse_down_last_time = 0; +static long _ecore_wince_mouse_down_last_last_time = 0; +static int _ecore_wince_mouse_down_did_triple = 0; +static int _ecore_wince_mouse_up_count = 0; +static Ecore_Wince_Key_Mask _ecore_wince_key_mask = 0; static void _ecore_wince_event_free_key_down(void *data __UNUSED__, @@ -57,10 +68,11 @@ _ecore_wince_event_free_key_up(void *data __UNUSED__, } static int -_ecore_wince_event_keystroke_get(int key, - char **keyname, - char **keysymbol, - char **keycompose) +_ecore_wince_event_keystroke_get(int key, + Eina_Bool is_down, + char **keyname, + char **keysymbol, + char **keycompose) { char *kn; char *ks; @@ -252,20 +264,147 @@ _ecore_wince_event_keystroke_get(int key, kc = ""; break; case VK_SHIFT: - kn = "Shift"; - ks = "Shift"; - kc = "Shift"; - break; + { + SHORT res; + + if (is_down) + { + res = GetKeyState(VK_LSHIFT); + if (res & 0x8000) + { + _ecore_wince_key_mask |= ECORE_WINCE_KEY_MASK_LSHIFT; + kn = "Shift_L"; + ks = "Shift_L"; + kc = ""; + } + res = GetKeyState(VK_RSHIFT); + if (res & 0x8000) + { + _ecore_wince_key_mask |= ECORE_WINCE_KEY_MASK_RSHIFT; + kn = "Shift_R"; + ks = "Shift_R"; + kc = ""; + } + } + else /* is_up */ + { + res = GetKeyState(VK_LSHIFT); + if (!(res & 0x8000) && + (_ecore_wince_key_mask & ECORE_WINCE_KEY_MASK_LSHIFT)) + { + kn = "Shift_L"; + ks = "Shift_L"; + kc = ""; + _ecore_wince_key_mask &= ~ECORE_WINCE_KEY_MASK_LSHIFT; + } + res = GetKeyState(VK_RSHIFT); + if (!(res & 0x8000) && + (_ecore_wince_key_mask & ECORE_WINCE_KEY_MASK_RSHIFT)) + { + kn = "Shift_R"; + ks = "Shift_R"; + kc = ""; + _ecore_wince_key_mask &= ~ECORE_WINCE_KEY_MASK_RSHIFT; + } + } + break; + } case VK_CONTROL: - kn = "Control"; - ks = "Control"; - kc = "Control"; - break; + { + SHORT res; + + if (is_down) + { + res = GetKeyState(VK_LCONTROL); + if (res & 0x8000) + { + _ecore_wince_key_mask |= ECORE_WINCE_KEY_MASK_LCONTROL; + kn = "Control_L"; + ks = "Control_L"; + kc = ""; + break; + } + res = GetKeyState(VK_RCONTROL); + if (res & 0x8000) + { + _ecore_wince_key_mask |= ECORE_WINCE_KEY_MASK_RCONTROL; + kn = "Control_R"; + ks = "Control_R"; + kc = ""; + break; + } + } + else /* is_up */ + { + res = GetKeyState(VK_LCONTROL); + if (!(res & 0x8000) && + (_ecore_wince_key_mask & ECORE_WINCE_KEY_MASK_LCONTROL)) + { + kn = "Control_L"; + ks = "Control_L"; + kc = ""; + _ecore_wince_key_mask &= ~ECORE_WINCE_KEY_MASK_LCONTROL; + break; + } + res = GetKeyState(VK_RCONTROL); + if (!(res & 0x8000) && + (_ecore_wince_key_mask & ECORE_WINCE_KEY_MASK_RCONTROL)) + { + kn = "Control_R"; + ks = "Control_R"; + kc = ""; + _ecore_wince_key_mask &= ~ECORE_WINCE_KEY_MASK_RCONTROL; + break; + } + } + break; + } case VK_MENU: - kn = "Menu"; - ks = "Menu"; - kc = ""; - break; + { + SHORT res; + + if (is_down) + { + res = GetKeyState(VK_LMENU); + if (res & 0x8000) + { + _ecore_wince_key_mask |= ECORE_WINCE_KEY_MASK_LMENU; + kn = "Alt_L"; + ks = "Alt_L"; + kc = ""; + } + res = GetKeyState(VK_RMENU); + if (res & 0x8000) + { + _ecore_wince_key_mask |= ECORE_WINCE_KEY_MASK_RMENU; + kn = "Alt_R"; + ks = "Alt_R"; + kc = ""; + } + } + else /* is_up */ + { + res = GetKeyState(VK_LMENU); + if (!(res & 0x8000) && + (_ecore_wince_key_mask & ECORE_WINCE_KEY_MASK_LMENU)) + { + kn = "Alt_L"; + ks = "Alt_L"; + kc = ""; + _ecore_wince_key_mask &= ~ECORE_WINCE_KEY_MASK_LMENU; + } + res = GetKeyState(VK_RMENU); + if (!(res & 0x8000) && + (_ecore_wince_key_mask & ECORE_WINCE_KEY_MASK_RMENU)) + { + kn = "Alt_R"; + ks = "Alt_R"; + kc = ""; + _ecore_wince_key_mask &= ~ECORE_WINCE_KEY_MASK_RMENU; + } + } + break; + } default: /* other non keystroke characters */ return 0; @@ -400,6 +539,7 @@ _ecore_wince_event_handle_key_press(Ecore_WinCE_Callback_Data *msg, if (is_keystroke) { if (!_ecore_wince_event_keystroke_get(LOWORD(msg->window_param), + EINA_TRUE, (char **)&e->keyname, (char **)&e->key, (char **)&e->string)) @@ -448,6 +588,7 @@ _ecore_wince_event_handle_key_release(Ecore_WinCE_Callback_Data *msg, if (is_keystroke) { if (!_ecore_wince_event_keystroke_get(LOWORD(msg->window_param), + EINA_FALSE, (char **)&e->keyname, (char **)&e->key, (char **)&e->string))