bdilly pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=f442bd74d22899c8b3c0100463fd780958e62a7f

commit f442bd74d22899c8b3c0100463fd780958e62a7f
Author: Guilherme Iscaro <isc...@profusion.mobi>
Date:   Wed Nov 9 11:40:57 2016 -0200

    Ecore Evas VNC: Properly set/unset the key locks.
    
    Key locks must be unset only another they down is received,
    otherwise they must remain active.
---
 .../ecore_evas/vnc_server/ecore_evas_vnc_server.c  | 36 +++++++++++++++++-----
 1 file changed, 28 insertions(+), 8 deletions(-)

diff --git a/src/modules/ecore_evas/vnc_server/ecore_evas_vnc_server.c 
b/src/modules/ecore_evas/vnc_server/ecore_evas_vnc_server.c
index 8f78f40..0885162 100644
--- a/src/modules/ecore_evas/vnc_server/ecore_evas_vnc_server.c
+++ b/src/modules/ecore_evas/vnc_server/ecore_evas_vnc_server.c
@@ -279,8 +279,9 @@ _ecore_evas_vnc_server_client_connection_new(rfbClientRec 
*client)
 }
 
 static unsigned int
-_ecore_evas_vnc_server_modifier_to_ecore_modifier(int mod)
+_ecore_evas_vnc_server_modifier_to_ecore_modifier(int mod, Eina_Bool *is_lock)
 {
+   *is_lock = EINA_FALSE;
    if (mod == XK_Shift_L || mod == XK_Shift_R)
      return ECORE_EVENT_MODIFIER_SHIFT;
    if (mod == XK_Control_L || mod == XK_Control_R)
@@ -290,13 +291,25 @@ _ecore_evas_vnc_server_modifier_to_ecore_modifier(int mod)
    if (mod == XK_Super_L || mod == XK_Super_R)
      return ECORE_EVENT_MODIFIER_WIN;
    if (mod == XK_Scroll_Lock)
-     return ECORE_EVENT_LOCK_SCROLL;
+     {
+        *is_lock = EINA_TRUE;
+        return ECORE_EVENT_LOCK_SCROLL;
+     }
    if (mod == XK_Num_Lock)
-     return ECORE_EVENT_LOCK_NUM;
+     {
+        *is_lock = EINA_TRUE;
+        return ECORE_EVENT_LOCK_NUM;
+     }
    if (mod == XK_Caps_Lock)
-     return ECORE_EVENT_LOCK_CAPS;
+     {
+        *is_lock = EINA_TRUE;
+        return ECORE_EVENT_LOCK_CAPS;
+     }
    if (mod == XK_Shift_Lock)
-     return ECORE_EVENT_LOCK_SHIFT;
+     {
+        *is_lock = EINA_TRUE;
+        return ECORE_EVENT_LOCK_SHIFT;
+     }
    return 0;
 }
 
@@ -360,11 +373,18 @@ _ecore_evas_vnc_server_client_keyboard_event(rfbBool down,
 
    if (key >= XK_Shift_L && key <= XK_Hyper_R)
      {
-        int mod = _ecore_evas_vnc_server_modifier_to_ecore_modifier(key);
+        Eina_Bool is_lock;
+        int mod = _ecore_evas_vnc_server_modifier_to_ecore_modifier(key,
+                                                                    &is_lock);
 
         if (down)
-          cdata->key_modifiers |= mod;
-        else
+          {
+             if (!is_lock || !(cdata->key_modifiers & mod))
+               cdata->key_modifiers |= mod;
+             else
+               cdata->key_modifiers &= ~mod;
+          }
+        else if (!is_lock)
           cdata->key_modifiers &= ~mod;
      }
 

-- 


Reply via email to