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 <mail@marcel-hollerbach.de>
Differential Revision: https://phab.enlightenment.org/D11606
This commit is contained in:
Ali Alzyod 2020-03-27 06:07:16 +00:00 committed by Marcel Hollerbach
parent b7804910a7
commit d7d948c23d
2 changed files with 40 additions and 10 deletions

View File

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

View File

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