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); } --