Ecore_WinCE: fix Shift, Control and Alt detection

SVN revision: 65423
This commit is contained in:
Vincent Torri 2011-11-20 06:44:56 +00:00
parent 2a930d615c
commit 1171e9f029
1 changed files with 163 additions and 22 deletions

View File

@ -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))