From e3e3d0cfe4d753782d0adc81a68e5cd7ca27c5b9 Mon Sep 17 00:00:00 2001 From: AbdullehGhujeh Date: Mon, 22 Jun 2020 16:31:53 +0900 Subject: [PATCH] Textblock : Fix cursor cluster movement when emoji at the line start Summary: if we have emoji only or emoji at line start we can move cursor using mouse click to be inside the emoji. {F3868502} this should fix T8664 Test Plan: #include EAPI_MAIN int elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) { Evas_Object *win; elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); win = elm_win_util_standard_add("emoji-test", "emoji-test"); elm_win_autodel_set(win, EINA_TRUE); /* and now just resize the window to a size you want. normally widgets * will determine the initial size though */ evas_object_resize(win, 320, 320); Evas_Object *box; box = elm_box_add(win); evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_win_resize_object_add(win, box); Evas_Object *entry; entry = elm_entry_add(box); elm_entry_entry_set(entry, "☪️"); evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(box, entry); evas_object_show(entry); evas_object_show(box); /* and show the window */ evas_object_show(win); elm_run(); /* and run the program now, starting to handle all * events, etc. */ /* exit code */ return 0; } ELM_MAIN() Reviewers: ali.alzyod, woohyun, bowonryu, zmike, bu5hm4n Reviewed By: ali.alzyod Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T8664 Differential Revision: https://phab.enlightenment.org/D11732 --- src/lib/evas/canvas/evas_object_textblock.c | 11 ++++++++--- src/tests/evas/evas_test_textblock.c | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index fe6552d4ac..0889de197d 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -13342,21 +13342,26 @@ _evas_textblock_cursor_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, Evas_ * try to move cursor to a nearest breakable position. */ if (grapheme_breaks && (grapheme_breaks[pos + it->text_pos - 1] != GRAPHEMEBREAK_BREAK)) { - size_t left_index = pos + it->text_pos - 1; + int left_index = pos + it->text_pos - 1; size_t right_index = pos + it->text_pos - 1; + int temp_index; int lx, rx; /* To the left */ - while ((left_index > 0) && + while ((left_index >= 0) && (grapheme_breaks[left_index] != GRAPHEMEBREAK_BREAK)) { left_index--; } + temp_index = left_index - it->text_pos + 1; + if (temp_index < 0) + temp_index = 0; + ENFN->font_pen_coords_get(ENC, ti->parent.format->font.font, &ti->text_props, - left_index - it->text_pos + 1, + temp_index, &lx, NULL, NULL, NULL); /* To the right */ diff --git a/src/tests/evas/evas_test_textblock.c b/src/tests/evas/evas_test_textblock.c index a0b68ac90a..e56b1d3912 100644 --- a/src/tests/evas/evas_test_textblock.c +++ b/src/tests/evas/evas_test_textblock.c @@ -1003,6 +1003,20 @@ EFL_START_TEST(evas_textblock_cursor) while (evas_textblock_cursor_char_prev(cur2)) j++; ck_assert_int_eq(j, 4); + //make sure if we have cluster at line start we return to pos 0 + Evas_Coord x_coord, y_coord; + int pos; + + cur2 = evas_object_textblock_cursor_new(tb); + evas_object_textblock_text_markup_set(tb, "☪️"); + + evas_textblock_cursor_char_next(cur2); + evas_textblock_cursor_pen_geometry_get(cur2, &x_coord, &y_coord, NULL, NULL); + evas_textblock_cursor_cluster_coord_set(cur, x_coord, y_coord); + pos = evas_textblock_cursor_pos_get(cur); + + ck_assert_int_eq(pos, 0); + END_TB_TEST(); } EFL_END_TEST