From cc7dbde8403965081ec5b5db17b1e3ef5b236f90 Mon Sep 17 00:00:00 2001 From: Thiep Ha Date: Fri, 23 Sep 2016 17:51:37 +0900 Subject: [PATCH] text/entry: add more key controls for os x In OS X, cmd-c,v, ... keys are used instead of ctrl-c,v..., this patch adapts these key handlings. --- src/lib/edje/edje_entry.c | 39 +++++++++++++++++++ .../efl_ui_internal_text_interactive.c | 22 +++++++++++ src/lib/elementary/efl_ui_text.c | 4 ++ src/lib/elementary/elm_code_widget.c | 4 ++ 4 files changed, 69 insertions(+) diff --git a/src/lib/edje/edje_entry.c b/src/lib/edje/edje_entry.c index abf66384b7..495843a395 100644 --- a/src/lib/edje/edje_entry.c +++ b/src/lib/edje/edje_entry.c @@ -1679,6 +1679,9 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, Edje_Real_Part *rp = ed->focused_part; Entry *en; Eina_Bool control, alt, shift; +#if defined(__APPLE__) && defined(__MACH__) + Eina_Bool super, altgr; +#endif Eina_Bool multiline; Eina_Bool cursor_changed; int old_cur_pos; @@ -1712,6 +1715,10 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, old_cur_pos = evas_textblock_cursor_pos_get(en->cursor); +#if defined(__APPLE__) && defined(__MACH__) + super = evas_key_modifier_is_set(ev->modifiers, "Super"); + altgr = evas_key_modifier_is_set(ev->modifiers, "AltGr"); +#endif control = evas_key_modifier_is_set(ev->modifiers, "Control"); alt = evas_key_modifier_is_set(ev->modifiers, "Alt"); shift = evas_key_modifier_is_set(ev->modifiers, "Shift"); @@ -1824,8 +1831,12 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, } if (evas_textblock_cursor_char_prev(en->cursor)) ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; +#if defined(__APPLE__) && defined(__MACH__) + if (altgr) evas_textblock_cursor_word_start(en->cursor); +#else /* If control is pressed, go to the start of the word */ if (control) evas_textblock_cursor_word_start(en->cursor); +#endif if (en->select_allow) { if (shift) _sel_extend(ed, en->cursor, rp->object, en); @@ -1861,7 +1872,11 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, } } /* If control is pressed, go to the end of the word */ +#if defined(__APPLE__) && defined(__MACH__) + if (altgr) evas_textblock_cursor_word_end(en->cursor); +#else if (control) evas_textblock_cursor_word_end(en->cursor); +#endif if (evas_textblock_cursor_char_next(en->cursor)) ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; if (en->select_allow) @@ -1990,14 +2005,22 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, _edje_emit(ed, "cursor,changed,manual", rp->part->name); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; } +#if defined(__APPLE__) && defined(__MACH__) + else if ((super) && (!shift) && (!strcmp(ev->keyname, "v"))) +#else else if ((control) && (!shift) && (!strcmp(ev->keyname, "v"))) +#endif { _compose_seq_reset(en); _edje_emit(ed, "entry,paste,request", rp->part->name); _edje_emit(ed, "entry,paste,request,3", rp->part->name); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; } +#if defined(__APPLE__) && defined(__MACH__) + else if ((super) && (!strcmp(ev->keyname, "a"))) +#else else if ((control) && (!strcmp(ev->keyname, "a"))) +#endif { _compose_seq_reset(en); if (shift) @@ -2011,19 +2034,31 @@ _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, "c")) || !strcmp(ev->key, "Insert"))) +#else else if ((control) && (((!shift) && !strcmp(ev->keyname, "c")) || !strcmp(ev->key, "Insert"))) +#endif { _compose_seq_reset(en); _edje_emit(ed, "entry,copy,notify", rp->part->name); 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 else if ((control) && (!shift) && ((!strcmp(ev->keyname, "x") || (!strcmp(ev->keyname, "m"))))) +#endif { _compose_seq_reset(en); _edje_emit(ed, "entry,cut,notify", rp->part->name); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; } +#if defined(__APPLE__) && defined(__MACH__) + else if ((super) && (!strcmp(ev->keyname, "z"))) +#else else if ((control) && (!strcmp(ev->keyname, "z"))) +#endif { _compose_seq_reset(en); if (shift) @@ -2038,7 +2073,11 @@ _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 else if ((control) && (!shift) && (!strcmp(ev->keyname, "y"))) +#endif { _compose_seq_reset(en); // redo diff --git a/src/lib/elementary/efl_ui_internal_text_interactive.c b/src/lib/elementary/efl_ui_internal_text_interactive.c index a55737801a..564b14d6c4 100644 --- a/src/lib/elementary/efl_ui_internal_text_interactive.c +++ b/src/lib/elementary/efl_ui_internal_text_interactive.c @@ -702,6 +702,9 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void Evas_Event_Key_Down *ev = event_info; Efl_Canvas_Text_Cursor *cur; Eina_Bool control, alt, shift; +#if defined(__APPLE__) && defined(__MACH__) + Eina_Bool super, altgr; +#endif Eina_Bool multiline; int old_cur_pos; char *string = (char *)ev->string; @@ -720,6 +723,10 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void control = evas_key_modifier_is_set(ev->modifiers, "Control"); alt = evas_key_modifier_is_set(ev->modifiers, "Alt"); shift = evas_key_modifier_is_set(ev->modifiers, "Shift"); +#if defined(__APPLE__) && defined(__MACH__) + super = evas_key_modifier_is_set(ev->modifiers, "Super"); + altgr = evas_key_modifier_is_set(ev->modifiers, "AltGr"); +#endif multiline = en->multiline; /* Translate some keys to strings. */ @@ -788,8 +795,12 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void _key_down_sel_pre(obj, cur, en, shift, EINA_FALSE); efl_canvas_text_cursor_char_prev(cur); +#if defined(__APPLE__) && defined(__MACH__) + if (altgr) efl_canvas_text_cursor_word_start(cur); +#else /* If control is pressed, go to the start of the word */ if (control) efl_canvas_text_cursor_word_start(cur); +#endif ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; _key_down_sel_post(obj, cur, en, shift); @@ -800,8 +811,12 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void _compose_seq_reset(en); _key_down_sel_pre(obj, cur, en, shift, EINA_TRUE); +#if defined(__APPLE__) && defined(__MACH__) + if (altgr) efl_canvas_text_cursor_word_end(cur); +#else /* If control is pressed, go to the end of the word */ if (control) efl_canvas_text_cursor_word_end(cur); +#endif efl_canvas_text_cursor_char_next(cur); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; @@ -962,9 +977,16 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void free(compres); compres = NULL; _compose_seq_reset(en); +#if defined(__APPLE__) && defined(__MACH__) + if (super || + (string && (!string[1]) && + (string[0] != 0xa) && (string[0] != 0x9) && + ((string[0] < 0x20) || (string[0] == 0x7f)))) +#else if (string && (!string[1]) && (string[0] != 0xa) && (string[0] != 0x9) && ((string[0] < 0x20) || (string[0] == 0x7f))) +#endif goto end; } else diff --git a/src/lib/elementary/efl_ui_text.c b/src/lib/elementary/efl_ui_text.c index 18a8de199a..3697d6d913 100644 --- a/src/lib/elementary/efl_ui_text.c +++ b/src/lib/elementary/efl_ui_text.c @@ -1844,7 +1844,11 @@ _key_down_cb(void *data, } else { +#if defined(__APPLE__) && defined(__MACH__) + Eina_Bool control = evas_key_modifier_is_set(ev->modifiers, "Super"); +#else Eina_Bool control = evas_key_modifier_is_set(ev->modifiers, "Control"); +#endif /* Ctrl operations */ if (control) diff --git a/src/lib/elementary/elm_code_widget.c b/src/lib/elementary/elm_code_widget.c index a54bfb92b9..ebaa4be92a 100644 --- a/src/lib/elementary/elm_code_widget.c +++ b/src/lib/elementary/elm_code_widget.c @@ -1462,7 +1462,11 @@ _elm_code_widget_key_down_cb(void *data, Evas *evas EINA_UNUSED, _elm_code_widget_update_focus_directions((Elm_Code_Widget *)obj); +#if defined(__APPLE__) && defined(__MACH__) + if (evas_key_modifier_is_set(ev->modifiers, "Super")) +#else if (evas_key_modifier_is_set(ev->modifiers, "Control")) +#endif { _elm_code_widget_control_key_down_cb(widget, ev->key); return;