From a239fc4a1a22ba05a7106248c0cb1655cc87d2c3 Mon Sep 17 00:00:00 2001 From: ali Date: Thu, 26 Dec 2019 16:05:37 +0900 Subject: [PATCH] efl_text_cursor: movement word start/end Summary: This patch will make **efl_text_cursor_move** method, when it is working with **WORD_START** or **WORD_END** If no actual movement happened then return false, and do not fire CHANGE event for example if cursor at word start, and we call efl_text_cursor_move(cursor, word_start); 1- this call should return false because no actual movement happened. If no actual movement happened then return false 2- this call should not fire CHANGE event for cursor.and do not fire CHANGE event Reviewers: woohyun, segfaultxavi, cedric, zmike Reviewed By: woohyun Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T8454 Differential Revision: https://phab.enlightenment.org/D10949 --- src/lib/evas/canvas/evas_object_textblock.c | 21 ++++++++++++++++----- src/tests/evas/evas_test_textblock.c | 16 +++++++++++++++- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index 5516e712bd..bdbe9b18c8 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -9954,6 +9954,7 @@ evas_textblock_cursor_word_start(Efl_Text_Cursor_Handle *cur) const Eina_Unicode *text; size_t i; char *breaks; + size_t old_cursor_pos = cur->pos; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); @@ -10004,8 +10005,12 @@ evas_textblock_cursor_word_start(Efl_Text_Cursor_Handle *cur) cur->pos = i; free(breaks); - _evas_textblock_cursor_object_changed(cur); - return EINA_TRUE; + if (cur->pos != old_cursor_pos) + { + _evas_textblock_cursor_object_changed(cur); + return EINA_TRUE; + } + return EINA_FALSE; } EAPI Eina_Bool @@ -10015,6 +10020,7 @@ evas_textblock_cursor_word_end(Efl_Text_Cursor_Handle *cur) const Eina_Unicode *text; size_t i; char *breaks; + size_t old_cursor_pos = cur->pos; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); @@ -10022,8 +10028,9 @@ evas_textblock_cursor_word_end(Efl_Text_Cursor_Handle *cur) size_t len = eina_ustrbuf_length_get(cur->node->unicode); + // No movement happend, return false if (cur->pos == len) - return EINA_TRUE; + return EINA_FALSE; text = eina_ustrbuf_string_get(cur->node->unicode); @@ -10059,8 +10066,12 @@ evas_textblock_cursor_word_end(Efl_Text_Cursor_Handle *cur) cur->pos = i; free(breaks); - _evas_textblock_cursor_object_changed(cur); - return EINA_TRUE; + if (cur->pos != old_cursor_pos) + { + _evas_textblock_cursor_object_changed(cur); + return EINA_TRUE; + } + return EINA_FALSE; } static char * diff --git a/src/tests/evas/evas_test_textblock.c b/src/tests/evas/evas_test_textblock.c index 3a112a0048..33bbad6472 100644 --- a/src/tests/evas/evas_test_textblock.c +++ b/src/tests/evas/evas_test_textblock.c @@ -4513,7 +4513,6 @@ EFL_START_TEST(efl_canvas_textblock_cursor) efl_text_set(txt, ""); efl_text_set(txt, ""); efl_text_cursor_text_insert(cursor1, "aa"); - ck_assert_int_eq(changed_emit, 3); Eo *cursor_temp = efl_add(EFL_TEXT_CURSOR_CLASS, txt); @@ -4528,6 +4527,21 @@ EFL_START_TEST(efl_canvas_textblock_cursor) efl_text_cursor_line_jump_by(cur_obj, -1); ck_assert_int_eq(efl_text_cursor_position_get(cur_obj), 0); + efl_text_set(txt, "Word"); + efl_text_cursor_position_set(cur_obj, 1); + changed_emit = 0; + efl_event_callback_add(cur_obj, EFL_TEXT_CURSOR_EVENT_CHANGED, _increment_int_changed, &changed_emit); + ck_assert(efl_text_cursor_move(cur_obj, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_START)); + ck_assert_int_eq(changed_emit, 1); + + ck_assert(!efl_text_cursor_move(cur_obj, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_START)); + ck_assert_int_eq(changed_emit, 1); + + ck_assert(efl_text_cursor_move(cur_obj, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_END)); + ck_assert_int_eq(changed_emit, 2); + + ck_assert(!efl_text_cursor_move(cur_obj, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_END)); + ck_assert_int_eq(changed_emit, 2); END_EFL_CANVAS_TEXTBLOCK_TEST(); }