From: Enlightenment S. <no-...@en...> - 2011-11-20 06:45:02
|
Log: Ecore_WinCE: fix Shift, Control and Alt detection Author: caro Date: 2011-11-19 22:44:56 -0800 (Sat, 19 Nov 2011) New Revision: 65423 Trac: http://trac.enlightenment.org/e/changeset/65423 Modified: trunk/ecore/src/lib/ecore_wince/ecore_wince_event.c Modified: trunk/ecore/src/lib/ecore_wince/ecore_wince_event.c =================================================================== --- trunk/ecore/src/lib/ecore_wince/ecore_wince_event.c 2011-11-20 06:44:11 UTC (rev 65422) +++ trunk/ecore/src/lib/ecore_wince/ecore_wince_event.c 2011-11-20 06:44:56 UTC (rev 65423) @@ -23,13 +23,24 @@ * @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__, void *ev) @@ -57,10 +68,11 @@ } 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 @@ 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 @@ 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 @@ if (is_keystroke) { if (!_ecore_wince_event_keystroke_get(LOWORD(msg->window_param), + EINA_FALSE, (char **)&e->keyname, (char **)&e->key, (char **)&e->string)) |