bu5hm4n pushed a commit to branch master.

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

commit d7d948c23d19cc6c6dc8bc6f014843b2421240a0
Author: Ali <ali198...@gmail.com>
Date:   Fri Mar 27 06:07:16 2020 +0000

    elm_entry: using keycode for main keyboard shortcuts
    
    Previously we use key strings to detect keyboard shortcuts (for example 
copy/paste/select_all, .. etc)
    Now we will use key code alongside with these key strings (I do not remove 
the key string, because I am afraid something depends on them because some 
methods do not send keycode with keys)
    
    This issue can be easily detected when the keyboard layout is not a Latin 
language, for example Hitting "C" will produce key string depends on related 
language not letter C, but Keycodes remain the same regardless of keyboard 
layout.
    
    Reviewed-by: Marcel Hollerbach <m...@marcel-hollerbach.de>
    Differential Revision: https://phab.enlightenment.org/D11606
---
 src/lib/edje/edje_entry.c             | 27 +++++++++++++++++----------
 src/tests/elementary/elm_test_entry.c | 23 +++++++++++++++++++++++
 2 files changed, 40 insertions(+), 10 deletions(-)

diff --git a/src/lib/edje/edje_entry.c b/src/lib/edje/edje_entry.c
index 5d84b1fbef..81046a3716 100644
--- a/src/lib/edje/edje_entry.c
+++ b/src/lib/edje/edje_entry.c
@@ -1737,6 +1737,13 @@ _compose_seq_reset(Entry *en)
    en->composing = EINA_FALSE;
 }
 
+#define KEYCODE_A 65
+#define KEYCODE_C 67
+#define KEYCODE_V 86
+#define KEYCODE_X 88
+#define KEYCODE_Y 89
+#define KEYCODE_Z 90
+
 static void
 _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info)
 {
@@ -2089,9 +2096,9 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED,
         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
      }
 #if defined(__APPLE__) && defined(__MACH__)
-   else if ((super) && (!strcmp(ev->keyname, "a")))
+   else if ((super) && (!strcmp(ev->keyname, "a") || ev->keycode == KEYCODE_A))
 #else
-   else if ((control) && (!strcmp(ev->keyname, "a")))
+   else if ((control) && (!strcmp(ev->keyname, "a") || ev->keycode == 
KEYCODE_A))
 #endif
      {
         _compose_seq_reset(en);
@@ -2107,9 +2114,9 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED,
           }
      }
 #if defined(__APPLE__) && defined(__MACH__)
-   else if ((super) && (((!shift) && !strcmp(ev->keyname, "c")) || 
!strcmp(ev->key, "Insert")))
+   else if ((super) && (((!shift) && (!strcmp(ev->keyname, "c") || ev->keycode 
== KEYCODE_C)) || !strcmp(ev->key, "Insert")))
 #else
-   else if ((control) && (((!shift) && !strcmp(ev->keyname, "c")) || 
!strcmp(ev->key, "Insert")))
+   else if ((control) && (((!shift) && (!strcmp(ev->keyname, "c") || 
ev->keycode == KEYCODE_C)) || !strcmp(ev->key, "Insert")))
 #endif
      {
         _compose_seq_reset(en);
@@ -2117,9 +2124,9 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED,
         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
      }
 #if defined(__APPLE__) && defined(__MACH__)
-   else if ((super) && (!shift) && ((!strcmp(ev->keyname, "x") || 
(!strcmp(ev->keyname, "m")))))
+   else if ((super) && (!shift) && (((!strcmp(ev->keyname, "x") || ev->keycode 
== KEYCODE_X) || (!strcmp(ev->keyname, "m")))))
 #else
-   else if ((control) && (!shift) && ((!strcmp(ev->keyname, "x") || 
(!strcmp(ev->keyname, "m")))))
+   else if ((control) && (!shift) && (((!strcmp(ev->keyname, "x") || 
ev->keycode == KEYCODE_X) || (!strcmp(ev->keyname, "m")))))
 #endif
      {
         _compose_seq_reset(en);
@@ -2127,9 +2134,9 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED,
         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
      }
 #if defined(__APPLE__) && defined(__MACH__)
-   else if ((super) && (!strcmp(ev->keyname, "z")))
+   else if ((super) && (!strcmp(ev->keyname, "z") || ev->keycode == KEYCODE_Z))
 #else
-   else if ((control) && (!strcmp(ev->keyname, "z")))
+   else if ((control) && (!strcmp(ev->keyname, "z") || ev->keycode == 
KEYCODE_Z))
 #endif
      {
         _compose_seq_reset(en);
@@ -2146,9 +2153,9 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED,
         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
      }
 #if defined(__APPLE__) && defined(__MACH__)
-   else if ((super) && (!shift) && (!strcmp(ev->keyname, "y")))
+   else if ((super) && (!shift) && (!strcmp(ev->keyname, "y")  || ev->keycode 
== KEYCODE_Y))
 #else
-   else if ((control) && (!shift) && (!strcmp(ev->keyname, "y")))
+   else if ((control) && (!shift) && (!strcmp(ev->keyname, "y") || ev->keycode 
== KEYCODE_Y))
 #endif
      {
         _compose_seq_reset(en);
diff --git a/src/tests/elementary/elm_test_entry.c 
b/src/tests/elementary/elm_test_entry.c
index 4655a688ba..cc68aed0dd 100644
--- a/src/tests/elementary/elm_test_entry.c
+++ b/src/tests/elementary/elm_test_entry.c
@@ -590,6 +590,28 @@ EFL_START_TEST(elm_entry_test_text_class)
 }
 EFL_END_TEST
 
+EFL_START_TEST(elm_entry_keycode)
+{
+   Evas_Object *win, *entry;
+
+   win = win_add(NULL, "entry", ELM_WIN_BASIC);
+   entry = elm_entry_add(win);
+   evas_object_show(entry);
+
+   elm_entry_entry_set(entry, "Hello World");
+   Evas *e = evas_object_evas_get(entry);
+   elm_object_focus_set(entry, EINA_TRUE);
+   evas_key_modifier_on(e, "Control");
+   evas_event_feed_key_down_with_keycode(e, "", "", "", "", time(NULL), NULL, 
65);
+   ecore_main_loop_iterate();
+   evas_event_feed_key_down(e, "BackSpace", "BackSpace", "\b", "\b", 
time(NULL), NULL);
+   ck_assert_str_eq(elm_object_text_get(entry), "");
+
+   evas_object_del(entry);
+   evas_object_del(win);
+}
+EFL_END_TEST
+
 void elm_test_entry(TCase *tc)
 {
    tcase_add_test(tc, elm_entry_legacy_type_check);
@@ -608,4 +630,5 @@ void elm_test_entry(TCase *tc)
    tcase_add_test(tc, elm_entry_magnifier);
    tcase_add_test(tc, elm_entry_file_get_set);
    tcase_add_test(tc, elm_entry_test_text_class);
+   tcase_add_test(tc, elm_entry_keycode);
 }

-- 


Reply via email to