From f442bd74d22899c8b3c0100463fd780958e62a7f Mon Sep 17 00:00:00 2001 From: Guilherme Iscaro Date: Wed, 9 Nov 2016 11:40:57 -0200 Subject: [PATCH] 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. --- .../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 8f78f40bde..088516245b 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; }