Ecore_WinCE: fix Shift, Control and Alt detection
authorcaro <caro@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 20 Nov 2011 06:44:56 +0000 (06:44 +0000)
committercaro <caro@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 20 Nov 2011 06:44:56 +0000 (06:44 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/ecore@65423 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/ecore_wince/ecore_wince_event.c

index b27da9a..41c355b 100644 (file)
  * @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))