From 49b838c448e8b77623ce45206476212e2f513778 Mon Sep 17 00:00:00 2001 From: Daniel Hirt Date: Mon, 5 Jun 2017 14:52:10 +0300 Subject: [PATCH] Canvas text cursor: move to Efl.Canvas.Text namespace Originally it was its own object. There are some valid claims that there is no justification for it to remain an object. Furthermore, it's apparent that it added little benefit: changes of each cursors, in practice, triggered a query for all objects of the same textblock. There wasn't real advantage to have a finer resolution of controlling the cursors with their own events. This ports back a lot of code, and changes a lot of other code in the higher-up widgets, such as Efl.Ui.Text and co. The usage was replaces from: efl_canvas_text_cursor_char_next(cur_obj) to efl_canvas_text_cursor_char_next(text_obj, cur_obj) that is, it is an operations on the TEXT OBJECT, rather than on the (now removed) cursor object. So, one less efl object to worry about now. Hopefully, the port went smooth. --- src/Makefile_Elementary.am | 14 +- src/Makefile_Evas.am | 1 - src/bin/elementary/test.c | 8 +- src/bin/elementary/test_efl_ui_text.c | 28 +- src/lib/efl/interfaces/efl_text_types.eot | 1 + .../efl_ui_internal_text_interactive.c | 96 +-- src/lib/elementary/efl_ui_text.c | 98 ++- src/lib/elementary/efl_ui_text.eo | 2 +- src/lib/elementary/efl_ui_text_interactive.eo | 8 +- src/lib/evas/Evas_Eo.h | 2 +- src/lib/evas/canvas/efl_canvas_text.eo | 441 ++++++++--- src/lib/evas/canvas/efl_canvas_text_cursor.eo | 216 ------ src/lib/evas/canvas/evas_object_textblock.c | 705 ++++++++---------- src/lib/evas/canvas/evas_textblock_legacy.h | 23 +- src/tests/evas/evas_test_textblock.c | 20 +- 15 files changed, 809 insertions(+), 854 deletions(-) delete mode 100644 src/lib/evas/canvas/efl_canvas_text_cursor.eo diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am index 7103ae95fd..d2064c8f47 100644 --- a/src/Makefile_Elementary.am +++ b/src/Makefile_Elementary.am @@ -116,9 +116,9 @@ elm_public_eolian_files = \ lib/elementary/elm_fileselector_internal_part.eo \ lib/elementary/elm_multibuttonentry_internal_part.eo \ lib/elementary/elm_code_widget.eo \ - lib/elementary/efl_ui_text_interactive.eo \ - lib/elementary/efl_ui_text.eo \ - lib/elementary/efl_ui_text_editable.eo \ + lib/elementary/efl_ui_text_interactive.eo \ + lib/elementary/efl_ui_text.eo \ + lib/elementary/efl_ui_text_editable.eo \ lib/elementary/efl_config_global.eo \ lib/elementary/efl_ui_clock.eo \ lib/elementary/efl_ui_image_factory.eo \ @@ -131,7 +131,7 @@ elm_public_eolian_files = \ # Private classes (not exposed or shipped) elm_private_eolian_files = \ - lib/elementary/efl_ui_internal_text_interactive.eo \ + lib/elementary/efl_ui_internal_text_interactive.eo \ lib/elementary/efl_ui_win_internal_part.eo \ tests/elementary/focus_test.eo \ tests/elementary/focus_test_sub_main.eo \ @@ -587,8 +587,8 @@ lib_elementary_libelementary_la_SOURCES = \ lib/elementary/elm_diskselector.c \ lib/elementary/elm_entry.c \ lib/elementary/efl_ui_flip.c \ - lib/elementary/efl_ui_internal_text_interactive.c \ - lib/elementary/efl_ui_internal_text_interactive.h \ + lib/elementary/efl_ui_internal_text_interactive.c \ + lib/elementary/efl_ui_internal_text_interactive.h \ lib/elementary/elm_flipselector.c \ lib/elementary/elm_font.c \ lib/elementary/efl_ui_frame.c \ @@ -797,7 +797,6 @@ bin/elementary/test_genlist.c \ bin/elementary/test_gesture_layer.c \ bin/elementary/test_gesture_layer2.c \ bin/elementary/test_gesture_layer3.c \ -bin/elementary/test_gfx_filters.c \ bin/elementary/test_glview_simple.c \ bin/elementary/test_glview.c \ bin/elementary/test_glview_manygears.c \ @@ -860,7 +859,6 @@ bin/elementary/test_win_socket.c \ bin/elementary/test_win_plug.c \ bin/elementary/test_win_state.c \ bin/elementary/test_win_wm_rotation.c \ -bin/elementary/test_win_dialog.c \ bin/elementary/test_win_modal.c \ bin/elementary/test_efl_ui_text.c \ bin/elementary/test_win_stack.c \ diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am index 41c44e702e..fc477e8351 100644 --- a/src/Makefile_Evas.am +++ b/src/Makefile_Evas.am @@ -7,7 +7,6 @@ evas_eolian_pub_files = \ lib/evas/canvas/efl_canvas_polygon.eo \ lib/evas/canvas/efl_canvas_rectangle.eo \ lib/evas/canvas/efl_canvas_text.eo \ - lib/evas/canvas/efl_canvas_text_cursor.eo \ lib/evas/canvas/efl_canvas_group.eo \ lib/evas/canvas/evas_canvas.eo \ lib/evas/canvas/efl_canvas_image_internal.eo \ diff --git a/src/bin/elementary/test.c b/src/bin/elementary/test.c index 5ce8de7f29..82888d2ab6 100644 --- a/src/bin/elementary/test.c +++ b/src/bin/elementary/test.c @@ -292,7 +292,7 @@ void test_dnd_genlist_gengrid(void *data, Evas_Object *obj, void *event_info); void test_dnd_multi_features(void *data, Evas_Object *obj, void *event_info); void test_dnd_types(void *data, Evas_Object *obj, void *event_info); void test_task_switcher(void *data, Evas_Object *obj, void *event_info); -void test_win_dialog(void *data, Evas_Object *obj, void *event_info); +//void test_win_dialog(void *data, Evas_Object *obj, void *event_info); void test_win_modal(void *data, Evas_Object *obj, void *event_info); void test_box_disable(void *data, Evas_Object *obj, void *event_info); void test_layout_disable(void *data, Evas_Object *obj, void *event_info); @@ -310,7 +310,7 @@ void test_code_diff_inline(void *data, Evas_Object *obj, void *event_info); void test_efl_ui_text(void *data, Evas_Object *obj, void *event_info); void test_efl_ui_text_label(void *data, Evas_Object *obj, void *event_info); void test_evas_mask(void *data, Edje_Object *obj, void *event_info); -void test_gfx_filters(void *data, Evas_Object *obj, void *event_info); +//void test_gfx_filters(void *data, Evas_Object *obj, void *event_info); void test_evas_snapshot(void *data, Evas_Object *obj, void *event_info); void test_evas_map(void *data, Edje_Object *obj, void *event_info); void test_efl_gfx_map(void *data, Edje_Object *obj, void *event_info); @@ -667,7 +667,7 @@ add_tests: ADD_TEST(NULL, "Window / Background", "Window Socket", test_win_socket); ADD_TEST(NULL, "Window / Background", "Window Plug", test_win_plug); ADD_TEST(NULL, "Window / Background", "Window WM Rotation", test_win_wm_rotation); - ADD_TEST(NULL, "Window / Background", "Window Standard/Dialog", test_win_dialog); +// ADD_TEST(NULL, "Window / Background", "Window Standard/Dialog", test_win_dialog); ADD_TEST(NULL, "Window / Background", "Window Keygrab Set", test_win_keygrab); ADD_TEST(NULL, "Window / Background", "Window Modal", test_win_modal); ADD_TEST(NULL, "Window / Background", "Window Stack", test_win_stack); @@ -1032,7 +1032,7 @@ add_tests: //------------------------------// ADD_TEST(NULL, "Evas", "Masking", test_evas_mask); - ADD_TEST(NULL, "Evas", "Gfx Filters", test_gfx_filters); +// ADD_TEST(NULL, "Evas", "Gfx Filters", test_gfx_filters); ADD_TEST(NULL, "Evas", "Snapshot", test_evas_snapshot); ADD_TEST(NULL, "Evas", "Map", test_evas_map); ADD_TEST(NULL, "Evas", "Gfx Map", test_efl_gfx_map); diff --git a/src/bin/elementary/test_efl_ui_text.c b/src/bin/elementary/test_efl_ui_text.c index 49ad15d46d..2a438d5640 100644 --- a/src/bin/elementary/test_efl_ui_text.c +++ b/src/bin/elementary/test_efl_ui_text.c @@ -12,10 +12,10 @@ _apply_style(Eo *obj, size_t start_pos, size_t end_pos, const char *style) Efl_Canvas_Text_Cursor *start, *end; start = efl_canvas_text_cursor_get(obj); - end = efl_ui_text_cursor_new(obj); + end = efl_canvas_text_cursor_get(obj); - efl_canvas_text_cursor_position_set(start, start_pos); - efl_canvas_text_cursor_position_set(end, end_pos); + efl_canvas_text_cursor_position_set(obj, start, start_pos); + efl_canvas_text_cursor_position_set(obj, end, end_pos); efl_canvas_text_annotation_insert(obj, start, end, style); } @@ -95,14 +95,14 @@ my_efl_ui_text_anchor_hover_opened(void *data EINA_UNUSED, const Efl_Event *even static void my_efl_ui_text_bt_3(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { - Eo *sel_start, *sel_end; + Efl_Canvas_Text_Cursor *sel_start, *sel_end; efl_ui_text_interactive_selection_cursors_get(data, &sel_start, &sel_end); const char *s = efl_canvas_text_range_text_get(data, sel_start, sel_end); printf("SELECTION REGION: %d - %d\n", - efl_canvas_text_cursor_position_get(sel_start), - efl_canvas_text_cursor_position_get(sel_end)); + efl_canvas_text_cursor_position_get(obj, sel_start), + efl_canvas_text_cursor_position_get(obj, sel_end)); printf("SELECTION:\n"); if (s) printf("%s\n", s); } @@ -111,7 +111,7 @@ static void my_efl_ui_text_bt_4(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *en = data; - efl_canvas_text_cursor_object_item_insert(efl_canvas_text_cursor_get(en), + efl_canvas_text_cursor_object_item_insert(obj, efl_canvas_text_cursor_get(en), "size=32x32 href=emoticon"); } @@ -179,15 +179,15 @@ test_efl_ui_text(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *eve efl_text_style_normal_color_set(en, 255, 255, 255, 255); main_cur = efl_canvas_text_cursor_get(en); - cur = efl_ui_text_cursor_new(en); + cur = efl_canvas_text_cursor_new(en); - efl_canvas_text_cursor_position_set(cur, 2); - efl_canvas_text_cursor_object_item_insert(cur, "size=32x32 href=emoticon"); - efl_canvas_text_cursor_position_set(cur, 50); - efl_canvas_text_cursor_object_item_insert(cur, "size=32x32 href=emoticon"); + efl_canvas_text_cursor_position_set(en, cur, 2); + efl_canvas_text_cursor_object_item_insert(en, cur, "size=32x32 href=emoticon"); + efl_canvas_text_cursor_position_set(en, cur, 50); + efl_canvas_text_cursor_object_item_insert(en, cur, "size=32x32 href=emoticon"); - efl_canvas_text_cursor_position_set(main_cur, 5); - efl_canvas_text_cursor_position_set(cur, 20); + efl_canvas_text_cursor_position_set(en, main_cur, 5); + efl_canvas_text_cursor_position_set(en, cur, 20); efl_canvas_text_annotation_insert(en, main_cur, cur, "a href=#hello"); diff --git a/src/lib/efl/interfaces/efl_text_types.eot b/src/lib/efl/interfaces/efl_text_types.eot index b9d54a8e23..0b12c47240 100644 --- a/src/lib/efl/interfaces/efl_text_types.eot +++ b/src/lib/efl/interfaces/efl_text_types.eot @@ -8,3 +8,4 @@ enum Efl.Text.Bidirectional_Type { } struct Efl.Canvas.Text.Annotation; [[EFL text annotations data structure]] +struct Efl.Canvas.Text.Cursor; [[Text cursor data structure]] diff --git a/src/lib/elementary/efl_ui_internal_text_interactive.c b/src/lib/elementary/efl_ui_internal_text_interactive.c index 028135353e..e996c232e9 100644 --- a/src/lib/elementary/efl_ui_internal_text_interactive.c +++ b/src/lib/elementary/efl_ui_internal_text_interactive.c @@ -39,7 +39,7 @@ static void _sel_enable(Evas_Textblock_Cursor *c EINA_UNUSED, Evas_Object *o EIN static void _sel_extend(Evas_Textblock_Cursor *c, Evas_Object *o, Efl_Ui_Internal_Text_Interactive_Data *en); static void _sel_clear(Evas_Object *o EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *en); static const char *_entry_selection_get(Efl_Ui_Internal_Text_Interactive *obj, Efl_Ui_Internal_Text_Interactive_Data *en); -static void _entry_imf_cursor_info_set(Evas_Textblock_Cursor *cur, Efl_Ui_Internal_Text_Interactive_Data *en); +static void _entry_imf_cursor_info_set(Eo *obj, Evas_Textblock_Cursor *cur, Efl_Ui_Internal_Text_Interactive_Data *en); #ifdef HAVE_ECORE_IMF static void @@ -61,11 +61,11 @@ _preedit_clear(Efl_Ui_Internal_Text_Interactive_Data *en) } static void -_preedit_del(Efl_Ui_Internal_Text_Interactive_Data *en) +_preedit_del(Eo *obj, Efl_Ui_Internal_Text_Interactive_Data *en) { if (!en || !en->have_preedit) return; if (!en->preedit_start || !en->preedit_end) return; - if (efl_canvas_text_cursor_equal(en->preedit_start, en->preedit_end)) return; + if (efl_canvas_text_cursor_equal(obj, en->preedit_start, en->preedit_end)) return; /* delete the preedit characters */ evas_textblock_cursor_range_delete(en->preedit_start, en->preedit_end); @@ -118,7 +118,7 @@ _entry_imf_event_commit_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUSED, void } /* delete preedit characters */ - _preedit_del(en); + _preedit_del(obj, en); _preedit_clear(en); // Skipping commit process when it is useless @@ -213,7 +213,7 @@ _entry_imf_event_preedit_changed_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUS _sel_range_del_emit(obj, en); /* delete preedit characters */ - _preedit_del(en); + _preedit_del(obj, en); preedit_start_pos = evas_textblock_cursor_pos_get(cur); @@ -314,7 +314,7 @@ _entry_imf_event_preedit_changed_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUS evas_textblock_cursor_pos_set(cur, preedit_start_pos + cursor_pos); } - _entry_imf_cursor_info_set(cur, en); + _entry_imf_cursor_info_set(obj, cur, en); /* delete attribute list */ if (attrs) @@ -362,7 +362,7 @@ _entry_imf_event_delete_surrounding_cb(void *data, Ecore_IMF_Context *ctx EINA_U evas_textblock_cursor_range_delete(del_start, del_end); - _entry_imf_cursor_info_set(cur, en); + _entry_imf_cursor_info_set(obj, cur, en); end: evas_textblock_cursor_free(del_start); @@ -379,7 +379,7 @@ _entry_imf_event_selection_set_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUSED if (ev->start == ev->end) { - efl_canvas_text_cursor_position_set(cur, ev->start); + efl_canvas_text_cursor_position_set(obj, cur, ev->start); } else { @@ -415,13 +415,13 @@ _entry_imf_retrieve_selection_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUSED, #endif static void -_entry_imf_cursor_location_set(Efl_Canvas_Text_Cursor *cur, Efl_Ui_Internal_Text_Interactive_Data *en) +_entry_imf_cursor_location_set(Eo *obj, Efl_Canvas_Text_Cursor *cur, Efl_Ui_Internal_Text_Interactive_Data *en) { #ifdef HAVE_ECORE_IMF Evas_Coord cx = 0, cy = 0, cw = 0, ch = 0; if (!en->imf_context) return; - efl_canvas_text_cursor_geometry_get(cur, EFL_CANVAS_TEXT_CURSOR_TYPE_BEFORE, &cx, &cy, &cw, &ch, NULL, NULL, NULL, NULL); + efl_canvas_text_cursor_geometry_get(obj, cur, EFL_CANVAS_TEXT_CURSOR_TYPE_BEFORE, &cx, &cy, &cw, &ch, NULL, NULL, NULL, NULL); ecore_imf_context_cursor_location_set(en->imf_context, cx, cy, cw, ch); // FIXME: ecore_imf_context_bidi_direction_set(en->imf_context, (Ecore_IMF_BiDi_Direction)dir); #else @@ -430,7 +430,7 @@ _entry_imf_cursor_location_set(Efl_Canvas_Text_Cursor *cur, Efl_Ui_Internal_Text } static void -_entry_imf_cursor_info_set(Evas_Textblock_Cursor *cur, Efl_Ui_Internal_Text_Interactive_Data *en) +_entry_imf_cursor_info_set(Eo *obj, Evas_Textblock_Cursor *cur, Efl_Ui_Internal_Text_Interactive_Data *en) { int cursor_pos; @@ -449,7 +449,7 @@ _entry_imf_cursor_info_set(Evas_Textblock_Cursor *cur, Efl_Ui_Internal_Text_Inte ecore_imf_context_cursor_position_set(en->imf_context, cursor_pos); - _entry_imf_cursor_location_set(cur, en); + _entry_imf_cursor_location_set(obj, cur, en); #else (void)en; #endif @@ -466,7 +466,7 @@ _focus_in_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void cur = efl_canvas_text_cursor_get(obj); ecore_imf_context_focus_in(en->imf_context); - _entry_imf_cursor_info_set(cur, en); + _entry_imf_cursor_info_set(obj, cur, en); #endif } @@ -506,7 +506,7 @@ _entry_selection_get(Efl_Ui_Internal_Text_Interactive *obj, Efl_Ui_Internal_Text static void _sel_cursor_changed(void *data, const Efl_Event *event EINA_UNUSED) { - Efl_Canvas_Text_Cursor *obj = data; + Eo *obj = data; efl_event_callback_legacy_call(obj, EFL_UI_TEXT_INTERACTIVE_EVENT_SELECTION_CHANGED, NULL); } @@ -550,11 +550,11 @@ _sel_extend(Evas_Textblock_Cursor *c, Evas_Object *o, Efl_Ui_Internal_Text_Inter { if (!en->sel_end) return; _sel_enable(c, o, en); - if (efl_canvas_text_cursor_equal(c, en->sel_end)) return; + if (efl_canvas_text_cursor_equal(o, c, en->sel_end)) return; evas_textblock_cursor_copy(c, en->sel_end); - _entry_imf_cursor_info_set(c, en); + _entry_imf_cursor_info_set(o, c, en); if (en->selection) { @@ -576,7 +576,7 @@ _sel_clear(Evas_Object *o EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *en { en->have_selection = EINA_FALSE; - efl_canvas_text_cursor_copy(en->sel_start, en->sel_end); + efl_canvas_text_cursor_copy(o, en->sel_start, en->sel_end); } } @@ -614,11 +614,11 @@ _sel_range_del_emit(Evas_Object *obj, Efl_Ui_Internal_Text_Interactive_Data *en) } static void -_delete_emit(Evas_Textblock_Cursor *c, Efl_Ui_Internal_Text_Interactive_Data *en EINA_UNUSED, size_t pos) +_delete_emit(Eo *obj, Evas_Textblock_Cursor *c, Efl_Ui_Internal_Text_Interactive_Data *en EINA_UNUSED, size_t pos) { Efl_Ui_Text_Interactive_Change_Info info = { NULL, 0, 0, 0, 0 }; Eina_Unicode content[2]; - content[0] = efl_canvas_text_cursor_content_get(c); + content[0] = efl_canvas_text_cursor_content_get(obj, c); content[1] = 0; if (!content[0]) return; @@ -630,7 +630,7 @@ _delete_emit(Evas_Textblock_Cursor *c, Efl_Ui_Internal_Text_Interactive_Data *en info.length = 1; info.content = tmp; - efl_event_callback_legacy_call((Eo *) efl_canvas_text_cursor_text_object_get(c), + efl_event_callback_legacy_call(obj, EFL_UI_TEXT_INTERACTIVE_EVENT_CHANGED_USER, &info); if (tmp) free(tmp); @@ -770,7 +770,7 @@ _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_line_jump_by(cur, -1); + efl_canvas_text_cursor_line_jump_by(obj, cur, -1); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; _key_down_sel_post(obj, cur, en, shift); @@ -784,7 +784,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void { _key_down_sel_pre(obj, cur, en, shift, EINA_TRUE); - efl_canvas_text_cursor_line_jump_by(cur, 1); + efl_canvas_text_cursor_line_jump_by(obj, cur, 1); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; _key_down_sel_post(obj, cur, en, shift); @@ -796,12 +796,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_FALSE); - efl_canvas_text_cursor_char_prev(cur); + efl_canvas_text_cursor_char_prev(obj, 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); + if (control) efl_canvas_text_cursor_word_start(obj, cur); #endif ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; @@ -817,9 +817,9 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void 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); + if (control) efl_canvas_text_cursor_word_end(obj, cur); #endif - efl_canvas_text_cursor_char_next(cur); + efl_canvas_text_cursor_char_next(obj, cur); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; _key_down_sel_post(obj, cur, en, shift); @@ -832,13 +832,14 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void // del to start of previous word Evas_Textblock_Cursor *tc = evas_object_textblock_cursor_new(obj); - efl_canvas_text_cursor_copy(tc, cur); + efl_canvas_text_cursor_copy(obj, tc, cur); evas_textblock_cursor_char_prev(cur); evas_textblock_cursor_word_start(cur); _range_del_emit(obj, cur, tc); - efl_del(tc); + //efl_del(tc); + efl_canvas_text_cursor_free(obj, tc); } else if ((alt) && (shift)) { @@ -854,7 +855,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void { if (evas_textblock_cursor_char_prev(cur)) { - _delete_emit(cur, en, old_cur_pos - 1); + _delete_emit(obj, cur, en, old_cur_pos - 1); } } } @@ -870,13 +871,14 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void // del to end of next word Evas_Textblock_Cursor *tc = evas_object_textblock_cursor_new(obj); - efl_canvas_text_cursor_copy(tc, cur); + efl_canvas_text_cursor_copy(obj, tc, cur); evas_textblock_cursor_word_end(cur); evas_textblock_cursor_char_next(cur); _range_del_emit(obj, cur, tc); - efl_del(tc); + //efl_del(tc); + efl_canvas_text_cursor_free(obj, tc); } else if (shift) { @@ -890,7 +892,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void } else { - _delete_emit(cur, en, old_cur_pos); + _delete_emit(obj, cur, en, old_cur_pos); } } _sel_clear(obj, en); @@ -904,9 +906,9 @@ _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); if ((control) && (multiline)) - efl_canvas_text_cursor_paragraph_first(cur); + efl_canvas_text_cursor_paragraph_first(obj, cur); else - efl_canvas_text_cursor_line_char_first(cur); + efl_canvas_text_cursor_line_char_first(obj, cur); _key_down_sel_post(obj, cur, en, shift); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; @@ -919,9 +921,9 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void _key_down_sel_pre(obj, cur, en, shift, EINA_TRUE); if ((control) && (multiline)) - efl_canvas_text_cursor_paragraph_last(cur); + efl_canvas_text_cursor_paragraph_last(obj, cur); else - efl_canvas_text_cursor_line_char_last(cur); + efl_canvas_text_cursor_line_char_last(obj, cur); _key_down_sel_post(obj, cur, en, shift); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; @@ -946,7 +948,7 @@ _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_FALSE); - efl_canvas_text_cursor_line_jump_by(cur, -10); + efl_canvas_text_cursor_line_jump_by(obj, cur, -10); _key_down_sel_post(obj, cur, en, shift); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; @@ -957,7 +959,7 @@ _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); - efl_canvas_text_cursor_line_jump_by(cur, 10); + efl_canvas_text_cursor_line_jump_by(obj, cur, 10); _key_down_sel_post(obj, cur, en, shift); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; @@ -1037,13 +1039,13 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void } info.insert = EINA_TRUE; info.content = string; - info.position = efl_canvas_text_cursor_position_get(cur); + info.position = efl_canvas_text_cursor_position_get(obj, cur); info.length = eina_unicode_utf8_get_len(string); + efl_canvas_text_cursor_text_insert(obj, cur, string); efl_event_callback_legacy_call(obj, EFL_UI_TEXT_INTERACTIVE_EVENT_CHANGED_USER, &info); - efl_canvas_text_cursor_text_insert(cur, string); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; if (free_string) free(string); @@ -1231,7 +1233,7 @@ _mouse_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void if (en->select_allow) { - efl_canvas_text_cursor_copy(en->sel_end, cur); + efl_canvas_text_cursor_copy(obj, en->sel_end, cur); } if (en->selecting) { @@ -1240,7 +1242,7 @@ _mouse_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void en->selecting = EINA_FALSE; } - _entry_imf_cursor_info_set(cur, en); + _entry_imf_cursor_info_set(obj, cur, en); } static void @@ -1278,21 +1280,21 @@ _mouse_move_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, vo if (multiline) { - efl_canvas_text_cursor_coord_set(cur, cx, cy); + efl_canvas_text_cursor_coord_set(obj, cur, cx, cy); } else { Evas_Coord lx, ly, lw, lh; evas_textblock_cursor_paragraph_first(cur); evas_textblock_cursor_line_geometry_get(cur, &lx, &ly, &lw, &lh); - efl_canvas_text_cursor_coord_set(cur, cx, ly + (lh / 2)); + efl_canvas_text_cursor_coord_set(obj, cur, cx, ly + (lh / 2)); } if (en->select_allow) { _sel_extend(cur, obj, en); - if (!efl_canvas_text_cursor_equal(en->sel_start, en->sel_end)) + if (!efl_canvas_text_cursor_equal(obj, en->sel_start, en->sel_end)) _sel_enable(cur, obj, en); } evas_textblock_cursor_free(tc); @@ -1320,9 +1322,9 @@ _efl_ui_internal_text_interactive_efl_object_finalize(Eo *obj, Efl_Ui_Internal_T en->sel_start = evas_object_textblock_cursor_new(obj); en->sel_end = evas_object_textblock_cursor_new(obj); - efl_event_callback_add(en->sel_start, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, + efl_event_callback_add(obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, _sel_cursor_changed, obj); - efl_event_callback_add(en->sel_end, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, + efl_event_callback_add(obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, _sel_cursor_changed, obj); en->input_panel_enable = EINA_TRUE; diff --git a/src/lib/elementary/efl_ui_text.c b/src/lib/elementary/efl_ui_text.c index 7440427b1c..e5a41de276 100644 --- a/src/lib/elementary/efl_ui_text.c +++ b/src/lib/elementary/efl_ui_text.c @@ -76,7 +76,7 @@ struct _Efl_Ui_Text_Data Elm_Input_Panel_Lang input_panel_lang; Elm_Input_Panel_Return_Key_Type input_panel_return_key_type; Elm_Input_Hints input_hints; - Eo *sel_handler_cursor; + Efl_Canvas_Text_Cursor *sel_handler_cursor; void *input_panel_imdata; int input_panel_imdata_len; int input_panel_layout_variation; @@ -576,7 +576,7 @@ _update_selection_handler(Eo *obj) evas_object_geometry_get(sd->entry_edje, &ent_x, &ent_y, NULL, NULL); - efl_canvas_text_cursor_geometry_get(sel_start, + efl_canvas_text_cursor_geometry_get(obj, sel_start, EFL_CANVAS_TEXT_CURSOR_TYPE_BEFORE, &sx, &sy, NULL, &sh, NULL, NULL, NULL, NULL); @@ -602,7 +602,7 @@ _update_selection_handler(Eo *obj) sd->start_handler_shown = EINA_FALSE; } - efl_canvas_text_cursor_geometry_get(sel_end, + efl_canvas_text_cursor_geometry_get(obj, sel_end, EFL_CANVAS_TEXT_CURSOR_TYPE_BEFORE, &ex, &ey, NULL, &eh, NULL, NULL, NULL, NULL); @@ -756,12 +756,12 @@ _selection_data_cb(void *data EINA_UNUSED, { Efl_Canvas_Text_Cursor *cur, *start, *end; efl_ui_text_interactive_selection_cursors_get(obj, &start, &end); - if (!efl_canvas_text_cursor_equal(start, end)) + if (!efl_canvas_text_cursor_equal(obj, start, end)) { efl_canvas_text_range_delete(obj, start, end); } cur = efl_canvas_text_cursor_get(obj); - efl_canvas_text_cursor_text_insert(cur, buf); + efl_canvas_text_cursor_text_insert(obj, cur, buf); } free(buf); @@ -1050,7 +1050,7 @@ _cursor_geometry_recalc(Evas_Object *obj) Efl_Canvas_Text_Cursor *main_cur = efl_canvas_text_cursor_get(obj); - efl_canvas_text_cursor_geometry_get(main_cur, + efl_canvas_text_cursor_geometry_get(obj, main_cur, EFL_CANVAS_TEXT_CURSOR_TYPE_BEFORE, &cx, &cy, &cw, &ch, NULL, NULL, NULL, NULL); edje_object_size_min_restricted_calc(sd->cursor, &cw, NULL, cw, 0); @@ -2770,7 +2770,7 @@ _selection_handlers_offset_calc(Evas_Object *obj, Evas_Object *handler, Evas_Coo EFL_UI_TEXT_DATA_GET(obj, sd); evas_object_geometry_get(sd->entry_edje, &ex, &ey, NULL, NULL); - efl_canvas_text_cursor_geometry_get( + efl_canvas_text_cursor_geometry_get(obj, efl_canvas_text_cursor_get(obj), EFL_CANVAS_TEXT_CURSOR_TYPE_BEFORE, &cx, &cy, &cw, &ch, @@ -2814,8 +2814,8 @@ _start_handler_mouse_down_cb(void *data, efl_ui_text_interactive_selection_cursors_get(text_obj, &sel_start, &sel_end); main_cur = efl_canvas_text_cursor_get(text_obj); - start_pos = efl_canvas_text_cursor_position_get(sel_start); - end_pos = efl_canvas_text_cursor_position_get(sel_end); + start_pos = efl_canvas_text_cursor_position_get(obj, sel_start); + end_pos = efl_canvas_text_cursor_position_get(obj, sel_end); if (start_pos <= end_pos) { @@ -2827,7 +2827,7 @@ _start_handler_mouse_down_cb(void *data, pos = end_pos; sd->sel_handler_cursor = sel_end; } - efl_canvas_text_cursor_position_set(main_cur, pos); + efl_canvas_text_cursor_position_set(obj, main_cur, pos); _selection_handlers_offset_calc(data, sd->start_handler, ev->canvas.x, ev->canvas.y); } @@ -2868,11 +2868,11 @@ _start_handler_mouse_move_cb(void *data, cy = ev->cur.canvas.y - sd->oy - ey; if (cx <= 0) cx = 1; - efl_canvas_text_cursor_coord_set(sd->sel_handler_cursor, cx, cy); - pos = efl_canvas_text_cursor_position_get(sd->sel_handler_cursor); + efl_canvas_text_cursor_coord_set(obj, sd->sel_handler_cursor, cx, cy); + pos = efl_canvas_text_cursor_position_get(obj, sd->sel_handler_cursor); /* Set the main cursor. */ - efl_canvas_text_cursor_position_set(efl_canvas_text_cursor_get(data), pos); + efl_canvas_text_cursor_position_set(obj, efl_canvas_text_cursor_get(data), pos); ELM_SAFE_FREE(sd->longpress_timer, ecore_timer_del); sd->long_pressed = EINA_FALSE; @@ -2900,8 +2900,8 @@ _end_handler_mouse_down_cb(void *data, efl_ui_text_interactive_selection_cursors_get(text_obj, &sel_start, &sel_end); main_cur = efl_canvas_text_cursor_get(text_obj); - start_pos = efl_canvas_text_cursor_position_get(sel_start); - end_pos = efl_canvas_text_cursor_position_get(sel_end); + start_pos = efl_canvas_text_cursor_position_get(obj, sel_start); + end_pos = efl_canvas_text_cursor_position_get(obj, sel_end); if (start_pos < end_pos) { @@ -2914,7 +2914,7 @@ _end_handler_mouse_down_cb(void *data, sd->sel_handler_cursor = sel_start; } - efl_canvas_text_cursor_position_set(main_cur, pos); + efl_canvas_text_cursor_position_set(obj, main_cur, pos); _selection_handlers_offset_calc(data, sd->end_handler, ev->canvas.x, ev->canvas.y); } @@ -2955,10 +2955,10 @@ _end_handler_mouse_move_cb(void *data, cy = ev->cur.canvas.y - sd->oy - ey; if (cx <= 0) cx = 1; - efl_canvas_text_cursor_coord_set(sd->sel_handler_cursor, cx, cy); - pos = efl_canvas_text_cursor_position_get(sd->sel_handler_cursor); + efl_canvas_text_cursor_coord_set(obj, sd->sel_handler_cursor, cx, cy); + pos = efl_canvas_text_cursor_position_get(obj, sd->sel_handler_cursor); /* Set the main cursor. */ - efl_canvas_text_cursor_position_set(efl_canvas_text_cursor_get(data), pos); + efl_canvas_text_cursor_position_set(obj, efl_canvas_text_cursor_get(data), pos); ELM_SAFE_FREE(sd->longpress_timer, ecore_timer_del); sd->long_pressed = EINA_FALSE; if (_elm_config->magnifier_enable) @@ -3012,9 +3012,10 @@ _efl_ui_text_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Text_Data *priv) _efl_ui_text_changed_cb, obj); efl_event_callback_add(text_obj, EFL_CANVAS_TEXT_EVENT_CHANGED, _efl_ui_text_changed_cb, obj); + printf("ui: text_obj = %p\n", text_obj); efl_event_callback_add(text_obj, EFL_UI_TEXT_INTERACTIVE_EVENT_SELECTION_CHANGED, _efl_ui_text_selection_changed_cb, obj); - efl_event_callback_add(efl_canvas_text_cursor_get(text_obj), EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, + efl_event_callback_add(text_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, _efl_ui_text_cursor_changed_cb, obj); evas_object_event_callback_add(priv->entry_edje, EVAS_CALLBACK_MOVE, _efl_ui_text_move_cb, obj); @@ -3255,7 +3256,7 @@ _efl_ui_text_efl_canvas_group_group_del(Eo *obj, Efl_Ui_Text_Data *sd) _efl_ui_text_changed_cb, obj); efl_event_callback_del(text_obj, EFL_UI_TEXT_INTERACTIVE_EVENT_SELECTION_CHANGED, _efl_ui_text_selection_changed_cb, obj); - efl_event_callback_del(efl_canvas_text_cursor_get(text_obj), EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, + efl_event_callback_del(text_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, _efl_ui_text_cursor_changed_cb, obj); evas_object_event_callback_del_full(sd->entry_edje, EVAS_CALLBACK_MOVE, _efl_ui_text_move_cb, obj); @@ -3446,7 +3447,7 @@ static void _efl_ui_text_entry_insert(Eo *obj, Efl_Ui_Text_Data *sd, const char *entry) { Efl_Canvas_Text_Cursor *cur_obj = efl_canvas_text_cursor_get(obj); - efl_canvas_text_cursor_text_insert(cur_obj, entry); + efl_canvas_text_cursor_text_insert(obj, cur_obj, entry); sd->changed = EINA_TRUE; elm_layout_sizing_eval(obj); } @@ -3510,14 +3511,14 @@ _efl_ui_text_select_none(Eo *obj EINA_UNUSED, Efl_Ui_Text_Data *sd) static void _efl_ui_text_select_region_set(Eo *obj, Efl_Ui_Text_Data *sd, int start, int end) { - Eo *sel_start, *sel_end; + Efl_Canvas_Text_Cursor *sel_start, *sel_end; if ((sd->password)) return; efl_ui_text_interactive_selection_cursors_get(obj, &sel_start, &sel_end); - efl_canvas_text_cursor_position_set(sel_start, start); - efl_canvas_text_cursor_position_set(sel_end, end); + efl_canvas_text_cursor_position_set(obj, sel_start, start); + efl_canvas_text_cursor_position_set(obj, sel_end, end); } EOLIAN static void @@ -4211,13 +4212,13 @@ fail: EOLIAN static int _efl_ui_text_elm_interface_atspi_text_caret_offset_get(Eo *obj, Efl_Ui_Text_Data *_pd EINA_UNUSED) { - return efl_canvas_text_cursor_position_get(obj); + return efl_canvas_text_cursor_position_get(obj, efl_canvas_text_cursor_get(obj)); } EOLIAN static Eina_Bool _efl_ui_text_elm_interface_atspi_text_caret_offset_set(Eo *obj, Efl_Ui_Text_Data *_pd EINA_UNUSED, int offset) { - efl_canvas_text_cursor_position_set(obj, offset); + efl_canvas_text_cursor_position_set(obj, efl_canvas_text_cursor_get(obj), offset); return EINA_TRUE; } @@ -4489,16 +4490,16 @@ _efl_ui_text_elm_interface_atspi_text_default_attributes_get(Eo *obj, Efl_Ui_Tex { Eina_List *ret = NULL; Elm_Atspi_Text_Attribute *attr; - Eo *start, *end; + Efl_Canvas_Text_Cursor *start, *end; Eina_Iterator *annotations; Efl_Canvas_Text_Annotation *an; /* Retrieve all annotations in the text. */ - start = efl_ui_text_cursor_new(obj); - end = efl_ui_text_cursor_new(obj); + start = efl_canvas_text_cursor_new(obj); + end = efl_canvas_text_cursor_new(obj); - efl_canvas_text_cursor_paragraph_first(start); - efl_canvas_text_cursor_paragraph_last(end); + efl_canvas_text_cursor_paragraph_first(obj, start); + efl_canvas_text_cursor_paragraph_last(obj, end); annotations = efl_canvas_text_range_annotations_get(obj, start, end); @@ -4524,7 +4525,7 @@ EOLIAN static Eina_Bool _efl_ui_text_elm_interface_atspi_text_editable_insert(Eo *obj, Efl_Ui_Text_Data *pd, const char *string, int position) { Efl_Canvas_Text_Cursor *cur_obj = efl_canvas_text_cursor_get(obj); - efl_canvas_text_cursor_position_set(cur_obj, position); + efl_canvas_text_cursor_position_set(obj, cur_obj, position); _efl_ui_text_entry_insert(obj, pd, string); return EINA_TRUE; @@ -4574,7 +4575,7 @@ EOLIAN static Eina_Bool _efl_ui_text_elm_interface_atspi_text_editable_paste(Eo *obj, Efl_Ui_Text_Data *_pd EINA_UNUSED, int position) { Efl_Canvas_Text_Cursor *cur_obj = efl_canvas_text_cursor_get(obj); - efl_canvas_text_cursor_position_set(cur_obj, position); + efl_canvas_text_cursor_position_set(obj, cur_obj, position); efl_ui_text_selection_paste(obj); return EINA_TRUE; } @@ -4610,11 +4611,10 @@ _efl_ui_text_elm_interface_atspi_accessible_name_get(Eo *obj, Efl_Ui_Text_Data * } EOLIAN static Efl_Canvas_Text_Cursor * -_efl_ui_text_cursor_new(Eo *obj, Efl_Ui_Text_Data *sd EINA_UNUSED) +_efl_ui_text_cursor_new(Eo *obj EINA_UNUSED, Efl_Ui_Text_Data *sd EINA_UNUSED) { Eo *text_obj = edje_object_part_swallow_get(sd->entry_edje, "elm.text"); - return efl_add(EFL_CANVAS_TEXT_CURSOR_CLASS, (Eo *) obj, - efl_canvas_text_cursor_text_object_set(efl_added, text_obj)); + return efl_canvas_text_cursor_new(text_obj); } static void @@ -4695,7 +4695,7 @@ _update_text_cursors(Eo *obj) x = y = w = h = -1; xx = yy = ww = hh = -1; _decoration_calc_offset(sd, &x, &y); - bidi_cursor = efl_canvas_text_cursor_geometry_get( + bidi_cursor = efl_canvas_text_cursor_geometry_get(obj, efl_canvas_text_cursor_get(text_obj), EFL_CANVAS_TEXT_CURSOR_TYPE_BEFORE, &xx, &yy, &ww, &hh, &xx2, &yy2, NULL, NULL); @@ -4964,18 +4964,16 @@ _anchors_create(Eo *obj, Efl_Ui_Text_Data *sd) Eo *text_obj = edje_object_part_swallow_get(sd->entry_edje, "elm.text"); _anchors_clear_all(obj, sd); - start = efl_add(EFL_CANVAS_TEXT_CURSOR_CLASS, obj, - efl_canvas_text_cursor_text_object_set(efl_added, text_obj)); - end = efl_add(EFL_CANVAS_TEXT_CURSOR_CLASS, obj, - efl_canvas_text_cursor_text_object_set(efl_added, text_obj)); + start = efl_canvas_text_cursor_new(text_obj); + end = efl_canvas_text_cursor_new(text_obj); /* Retrieve all annotations in the text. */ - efl_canvas_text_cursor_paragraph_first(start); - efl_canvas_text_cursor_paragraph_last(end); + efl_canvas_text_cursor_paragraph_first(obj, start); + efl_canvas_text_cursor_paragraph_last(obj, end); it = efl_canvas_text_range_annotations_get(obj, start, end); - efl_del(start); - efl_del(end); + efl_canvas_text_cursor_free(text_obj, start); + efl_canvas_text_cursor_free(text_obj, end); EINA_ITERATOR_FOREACH(it, anchor) { @@ -5113,12 +5111,12 @@ _anchors_update(Eo *o, Efl_Ui_Text_Data *sd) else { Eina_Iterator *range; - Eo *start, *end; + Efl_Canvas_Text_Cursor *start, *end; Eina_List *range_list; Eina_Rectangle *r; - start = efl_ui_text_cursor_new(o); - end = efl_ui_text_cursor_new(o); + start = efl_canvas_text_cursor_new(o); + end = efl_canvas_text_cursor_new(o); efl_canvas_text_annotation_positions_get(o, an->annotation, start, end); @@ -5304,7 +5302,7 @@ static void _efl_ui_text_selection_changed_cb(void *data, const Efl_Event *event EINA_UNUSED) { Eo *obj = data; - Eo *start, *end; + Efl_Canvas_Text_Cursor *start, *end; char *text; EFL_UI_TEXT_DATA_GET(obj, sd); diff --git a/src/lib/elementary/efl_ui_text.eo b/src/lib/elementary/efl_ui_text.eo index d834c99da0..9cb8772862 100644 --- a/src/lib/elementary/efl_ui_text.eo +++ b/src/lib/elementary/efl_ui_text.eo @@ -393,7 +393,7 @@ class Efl.Ui.Text (Elm.Layout, Elm.Interface_Scrollable, Efl.Ui.Clickable, } cursor_new { [[Creates and returns a new cursor for the text.]] - return: Efl.Canvas.Text.Cursor; [[Text cursor]] + return: ptr(Efl.Canvas.Text.Cursor); [[Text cursor]] } } implements { diff --git a/src/lib/elementary/efl_ui_text_interactive.eo b/src/lib/elementary/efl_ui_text_interactive.eo index de0017edbf..07da8b5444 100644 --- a/src/lib/elementary/efl_ui_text_interactive.eo +++ b/src/lib/elementary/efl_ui_text_interactive.eo @@ -1,3 +1,5 @@ +import efl_text_types; + struct Efl.Ui.Text.Interactive.Change_Info { [[This structure includes all the information about content changes. @@ -26,7 +28,7 @@ interface Efl.Ui.Text.Interactive (Efl.Text, Efl.Text.Font, @property selection_cursors { [[The cursors used for selection handling. - If the cursors are equal (@Efl.Canvas.Text.Cursor.equal), there is + If the cursors are equal, there is no selection. You are allowed to retain and modify them. Modifying them modifies @@ -34,8 +36,8 @@ interface Efl.Ui.Text.Interactive (Efl.Text, Efl.Text.Font, ]] get {} values { - start: Efl.Canvas.Text.Cursor; [[The start of the selection]] - end: Efl.Canvas.Text.Cursor; [[The end of the selection]] + start: ptr(Efl.Canvas.Text.Cursor); [[The start of the selection]] + end: ptr(Efl.Canvas.Text.Cursor); [[The end of the selection]] } } @property editable { diff --git a/src/lib/evas/Evas_Eo.h b/src/lib/evas/Evas_Eo.h index 858104228e..7dd6b087db 100644 --- a/src/lib/evas/Evas_Eo.h +++ b/src/lib/evas/Evas_Eo.h @@ -26,7 +26,7 @@ * * @{ */ -#include "canvas/efl_canvas_text_cursor.eo.h" +//#include "canvas/efl_canvas_text_cursor.eo.h" #include "canvas/efl_canvas_text.eo.h" /** * @} diff --git a/src/lib/evas/canvas/efl_canvas_text.eo b/src/lib/evas/canvas/efl_canvas_text.eo index 3822d52a1c..184dbba695 100644 --- a/src/lib/evas/canvas/efl_canvas_text.eo +++ b/src/lib/evas/canvas/efl_canvas_text.eo @@ -1,11 +1,60 @@ struct Efl.Canvas.Text.Style; [[EFL text style data structure]] +enum Efl.Canvas.Text.Cursor.Type +{ + [[Text cursor types]] + before, [[Cursor type before]] + under [[Cursor type under]] +} + class Efl.Canvas.Text (Efl.Canvas.Object, Efl.Text, Efl.Text.Properties, Efl.Canvas.Filter.Internal, Efl.Text.Font, Efl.Text.Style, Efl.Text.Format) { [[Efl canvas text class]] legacy_prefix: evas_object_textblock; methods { + @property is_empty { + [[Whether the object is empty (no text) or not + + @since 1.18 + ]] + get { + legacy: null; + } + values { + is_empty: bool; [[$true if empty, $false otherwise]] + } + } + visible_range_get { + [[Returns the currently visible range. + + The given $start and $end cursor act like an out-variables here, + as these are set to the positions of the start and the end of the + visible range in the text, respectively. + + @since 1.18 + ]] + return: bool; [[$true on success, $false otherwise]] + params { + @in start: ptr(Efl.Canvas.Text.Cursor); [[Range start position]] + @in end: ptr(Efl.Canvas.Text.Cursor); [[Range end position]] + } + } + @property style_insets { + [[Gets the left, right, top and bottom insets of the text. + + The inset is any applied padding on the text. + + @since 1.18 + ]] + get {} + values { + l: int; [[Left padding]] + r: int; [[Right padding]] + t: int; [[Top padding]] + b: int; [[Bottom padding]] + } + } @property bidi_delimiters { [[BiDi delimiters are used for in-paragraph separation of bidi segments. This is useful for example in recipients fields of @@ -83,15 +132,6 @@ Efl.Text.Font, Efl.Text.Style, Efl.Text.Format) h: int; [[The height of the object.]] } } - @property cursor { - [[The object's main cursor. - - @since 1.18 - ]] - get { - return: Efl.Canvas.Text.Cursor; [[Text cursor object]] - } - } @property size_native { [[The native width and height. @@ -118,33 +158,65 @@ Efl.Text.Font, Efl.Text.Style, Efl.Text.Format) h: int; [[The height returned.]] } } - @property style_insets { - [[Gets the left, right, top and bottom insets of the text. - - The inset is any applied padding on the text. + range_text_get { + [[Returns the text in the range between $cur1 and $cur2. @since 1.18 ]] - get {} - values { - l: int; [[Left padding]] - r: int; [[Right padding]] - t: int; [[Top padding]] - b: int; [[Bottom padding]] + legacy: null; + return: own(ptr(char)); [[The text in the given range]] + params { + @in cur1: const(ptr(Efl.Canvas.Text.Cursor)); [[Start of range]] + @in cur2: const(ptr(Efl.Canvas.Text.Cursor)); [[End of range]] } } - @property is_empty { - [[Whether the object is empty (no text) or not + range_geometry_get { + [[Get the geometry of a range in the text. - @since 1.18 + The geometry is represented as rectangles for each of the line + segments in the given range [$cur1, $cur2]. + + @since 1.19 ]] - get { - legacy: null; + legacy: null; + params { + @in cur1: const(ptr(Efl.Canvas.Text.Cursor)); [[Start of range]] + @in cur2: const(ptr(Efl.Canvas.Text.Cursor)); [[End of range]] } - values { - is_empty: bool; [[$true if empty, $false otherwise]] + return: free(own(iterator), + eina_iterator_free); [[Iterator on all geoemtries of + the given range]] + } + range_simple_geometry_get { + [[Get the "simple" geometry of a range. + + The geometry is the geometry in which rectangles in middle lines of + range are merged into one big rectangle. This is an optimized + version of @.range_geometry_get. + + @since 1.19 + ]] + legacy: null; + params { + @in cur1: ptr(const(Efl.Canvas.Text.Cursor)); [[Start of range]] + @in cur2: ptr(const(Efl.Canvas.Text.Cursor)); [[End of range]] + } + return: free(own(iterator), + eina_iterator_free); [[Iterator on all simple + geometries of the given range]] + } + range_delete { + [[Deletes the range between given cursors. + + This removes all the text in given range [$start,$end]. + ]] + legacy: null; + params { + @in cur1: ptr(Efl.Canvas.Text.Cursor); [[Range start position]] + @in cur2: ptr(Efl.Canvas.Text.Cursor); [[Range end position]] } } + // Obstacles obstacle_add { [[Add obstacle evas object $eo_obs to be observed during layout of text. @@ -185,6 +257,7 @@ Efl.Text.Font, Efl.Text.Style, Efl.Text.Format) @since 1.18 ]] } + // Annotation @property annotation { [[A new format for $annotation. @@ -216,8 +289,8 @@ Efl.Text.Font, Efl.Text.Style, Efl.Text.Format) ]] legacy: null; params { - @in start: const(Efl.Canvas.Text.Cursor); [[Start of range]] - @in end: const(Efl.Canvas.Text.Cursor); [[End of range]] + @in start: ptr(const(Efl.Canvas.Text.Cursor)); [[Start of range]] + @in end: ptr(const(Efl.Canvas.Text.Cursor)); [[End of range]] } return: free(own(iterator), eina_iterator_free); [[Handle of the Annotation]] @@ -232,8 +305,8 @@ Efl.Text.Font, Efl.Text.Style, Efl.Text.Format) ]] legacy: null; params { - @in start: Efl.Canvas.Text.Cursor; [[Start of range]] - @in end: Efl.Canvas.Text.Cursor; [[End of range]] + @in start: ptr(Efl.Canvas.Text.Cursor); [[Start of range]] + @in end: ptr(Efl.Canvas.Text.Cursor); [[End of range]] @in format: string; [[Annotation format]] } return: ptr(Efl.Canvas.Text.Annotation); [[Handle of inserted annotation]] @@ -253,79 +326,6 @@ Efl.Text.Font, Efl.Text.Style, Efl.Text.Format) } return: bool; [[$true on success, $false otherwise.]] } - range_geometry_get { - [[Get the geometry of a range in the text. - - The geometry is represented as rectangles for each of the line - segments in the given range [$cur1, $cur2]. - - @since 1.19 - ]] - legacy: null; - params { - @in cur1: const(Efl.Canvas.Text.Cursor); [[Start of range]] - @in cur2: const(Efl.Canvas.Text.Cursor); [[End of range]] - } - return: free(own(iterator), - eina_iterator_free); [[Iterator on all geoemtries of - the given range]] - } - range_simple_geometry_get { - [[Get the "simple" geometry of a range. - - The geometry is the geometry in which rectangles in middle lines of - range are merged into one big rectangle. This is an optimized - version of @.range_geometry_get. - - @since 1.19 - ]] - legacy: null; - params { - @in cur1: const(Efl.Canvas.Text.Cursor); [[Start of range]] - @in cur2: const(Efl.Canvas.Text.Cursor); [[End of range]] - } - return: free(own(iterator), - eina_iterator_free); [[Iterator on all simple - geometries of the given range]] - } - range_delete { - [[Deletes the range between given cursors. - - This removes all the text in given range [$start,$end]. - ]] - legacy: null; - params { - @in cur1: Efl.Canvas.Text.Cursor; [[Range start position]] - @in cur2: Efl.Canvas.Text.Cursor; [[Range end position]] - } - } - visible_range_get { - [[Returns the currently visible range. - - The given $start and $end cursor act like an out-variables here, - as these are set to the positions of the start and the end of the - visible range in the text, respectively. - - @since 1.18 - ]] - return: bool; [[$true on success, $false otherwise]] - params { - @in start: Efl.Canvas.Text.Cursor; [[Range start position]] - @in end: Efl.Canvas.Text.Cursor; [[Range end position]] - } - } - range_text_get { - [[Returns the text in the range between $cur1 and $cur2. - - @since 1.18 - ]] - legacy: null; - return: own(ptr(char)); [[The text in the given range]] - params { - @in cur1: const(Efl.Canvas.Text.Cursor); [[Start of range]] - @in cur2: const(Efl.Canvas.Text.Cursor); [[End of range]] - } - } object_item_geometry_get { [[Queries a given object item for its geometry. @@ -355,12 +355,240 @@ Efl.Text.Font, Efl.Text.Style, Efl.Text.Format) params { @in annotation: ptr(const(Efl.Canvas.Text.Annotation)); [[Annotation handle to query]] - @in start: Efl.Canvas.Text.Cursor; [[Cursor to be set to the start + @in start: ptr(Efl.Canvas.Text.Cursor); [[Cursor to be set to the start position of the annotation in the text]] - @in end: Efl.Canvas.Text.Cursor; [[Cursor to be set to the end + @in end: ptr(Efl.Canvas.Text.Cursor); [[Cursor to be set to the end position of the annotation in the text]] } } + // Cursor + @property cursor { + [[The object's main cursor. + + @since 1.18 + ]] + get { + return: ptr(Efl.Canvas.Text.Cursor); [[Text cursor object]] + } + } + @property cursor_position { + set { legacy: null; } + get { legacy: null; } + values { + position: int; + } + keys { + cur: ptr(Efl.Canvas.Text.Cursor); + } + } + @property cursor_content { + [[The content of the cursor (the character under the cursor)]] + get { + legacy: null; + } + values { + content: Eina.Unicode; [[The unicode codepoint of the character]] + } + keys { + cur: ptr(const(Efl.Canvas.Text.Cursor)); + } + } + @property cursor_geometry { + [[Returns the geometry of two cursors ("split cursor"), if logical cursor is + between LTR/RTL text, also considering paragraph direction. + Upper cursor is shown for the text of the same direction as paragraph, + lower cursor - for opposite. + + Split cursor geometry is valid only in '|' cursor mode. + In this case $true is returned and $cx2, $cy2, $cw2, $ch2 are set. + ]] + get { + legacy: null; + return: bool; [[ $true if split cursor, $false otherwise.]] + } + keys { + cur: ptr(const(Efl.Canvas.Text.Cursor)); + ctype: Efl.Canvas.Text.Cursor.Type; [[The type of the cursor.]] + } + values { + cx: int; [[The x of the cursor (or upper cursor)]] + cy: int; [[The y of the cursor (or upper cursor)]] + cw: int; [[The width of the cursor (or upper cursor)]] + ch: int; [[The height of the cursor (or upper cursor)]] + cx2: int; [[The x of the lower cursor]] + cy2: int; [[The y of the lower cursor]] + cw2: int; [[The width of the lower cursor]] + ch2: int; [[The height of the lower cursor]] + } + } + @property cursor_object_item_annotation { + [[The object-item annotation at the cursor's position.]] + get { + legacy: null; + } + values { + annotation: ptr(Efl.Canvas.Text.Annotation); [[Annotation]] + } + keys { + cur: ptr(Efl.Canvas.Text.Cursor); + } + } + cursor_new { + legacy: null; + return: ptr(Efl.Canvas.Text.Cursor); + } + cursor_free { + legacy: null; + params { + cur: ptr(Efl.Canvas.Text.Cursor); + } + } + cursor_equal { + legacy: null; + params { + cur1: ptr(const(Efl.Canvas.Text.Cursor)); + cur2: ptr(const(Efl.Canvas.Text.Cursor)); + } + return: bool; + } + cursor_compare { + legacy: null; + params { + cur1: ptr(const(Efl.Canvas.Text.Cursor)); + cur2: ptr(const(Efl.Canvas.Text.Cursor)); + } + return: int; + } + cursor_copy { + legacy: null; + params { + dst: ptr(Efl.Canvas.Text.Cursor); + src: ptr(const(Efl.Canvas.Text.Cursor)); + } + } + cursor_char_next { + legacy: null; + params { + cur: ptr(Efl.Canvas.Text.Cursor); + } + } + cursor_char_prev { + legacy: null; + params { + cur: ptr(Efl.Canvas.Text.Cursor); + } + } + cursor_paragraph_char_first { + legacy: null; + params { + cur: ptr(Efl.Canvas.Text.Cursor); + } + } + cursor_paragraph_char_last { + legacy: null; + params { + cur: ptr(Efl.Canvas.Text.Cursor); + } + } + cursor_word_start { + legacy: null; + params { + cur: ptr(Efl.Canvas.Text.Cursor); + } + } + cursor_word_end { + legacy: null; + params { + cur: ptr(Efl.Canvas.Text.Cursor); + } + } + cursor_line_char_first { + legacy: null; + params { + cur: ptr(Efl.Canvas.Text.Cursor); + } + } + cursor_line_char_last { + legacy: null; + params { + cur: ptr(Efl.Canvas.Text.Cursor); + } + } + cursor_paragraph_first { + legacy: null; + params { + cur: ptr(Efl.Canvas.Text.Cursor); + } + } + cursor_paragraph_last { + legacy: null; + params { + cur: ptr(Efl.Canvas.Text.Cursor); + } + } + cursor_paragraph_next { + [[Advances to the start of the next text node]] + legacy: null; + params { + cur: ptr(Efl.Canvas.Text.Cursor); + } + } + cursor_paragraph_prev { + [[Advances to the end of the previous text node]] + legacy: null; + params { + cur: ptr(Efl.Canvas.Text.Cursor); + } + } + cursor_line_jump_by { + legacy: null; + params { + cur: ptr(Efl.Canvas.Text.Cursor); + by: int; + } + } + cursor_coord_set { + legacy: null; + params { + cur: ptr(Efl.Canvas.Text.Cursor); + @in x: int; [[X coord to set by.]] + @in y: int; [[Y coord to set by.]] + } + } + cursor_text_insert { + [[Adds text to the current cursor position and set the cursor to + *after* the start of the text just added. + ]] + legacy: null; + params { + cur: ptr(Efl.Canvas.Text.Cursor); + @in text: string; [[Text to append (UTF-8 format).]] + } + return: int; [[Length of the appended text.]] + } + cursor_char_delete { + [[Deletes a single character from position pointed by given cursor.]] + legacy: null; + params { + cur: ptr(Efl.Canvas.Text.Cursor); + } + } + cursor_object_item_insert { + [[Inserts a object item at specified position. + + This adds a placeholder to be queried by higher-level code, + which in turn place graphics on top of it. It essentially places an + OBJECT REPLACEMENT CHARACTER and set a special annotation to it. + ]] + legacy: null; + params { + cur: ptr(Efl.Canvas.Text.Cursor); + @in format: string; [[Format of the inserted item. + See Format styles.]] + } + return: ptr(Efl.Canvas.Text.Annotation); [[The annotation handle of the + inserted item.]] + } } implements { Efl.Object.constructor; @@ -411,7 +639,8 @@ Efl.Text.Font, Efl.Text.Style, Efl.Text.Format) Efl.Text.Format.format_replacement_char { get; set; } } events { - changed; [[Called when the content (text or annotations) changed.]] + cursor,changed; + changed; style_insets,changed; [[Called when the property @.style_insets changed.]] } } diff --git a/src/lib/evas/canvas/efl_canvas_text_cursor.eo b/src/lib/evas/canvas/efl_canvas_text_cursor.eo deleted file mode 100644 index fdc8734827..0000000000 --- a/src/lib/evas/canvas/efl_canvas_text_cursor.eo +++ /dev/null @@ -1,216 +0,0 @@ -enum Efl.Canvas.Text.Cursor.Type -{ - [[Text cursor types]] - before, [[Cursor type before]] - under [[Cursor type under]] -} - -class Efl.Canvas.Text.Cursor (Efl.Object) -{ - [[Efl canvas text cursor class]] - legacy_prefix: evas_textblock_cursor; - methods { - @property text_object { - [[The text object the cursor is associated with.]] - set { - legacy: null; - } - get { - legacy: null; - } - values { - tb: const(Efl.Canvas.Object); [[The text object]] /* XXX: It should be textblock only. */ - } - } - @property position { - [[Sets position of cursor to given pos. ]] - set { - legacy: evas_textblock_cursor_pos_set; - } - get { - legacy: evas_textblock_cursor_pos_get; - } - values { - position: int; [[Position in the text to move the cursor.]] - } - } - @property geometry { - [[Returns the geometry of two cursors ("split cursor"), if logical cursor is - between LTR/RTL text, also considering paragraph direction. - Upper cursor is shown for the text of the same direction as paragraph, - lower cursor - for opposite. - - Split cursor geometry is valid only in '|' cursor mode. - In this case $true is returned and $cx2, $cy2, $cw2, $ch2 are set. - ]] - get { - legacy: null; - return: bool; [[ $true if split cursor, $false otherwise.]] - } - keys { - ctype: Efl.Canvas.Text.Cursor.Type; [[The type of the cursor.]] - } - values { - cx: int; [[The x of the cursor (or upper cursor)]] - cy: int; [[The y of the cursor (or upper cursor)]] - cw: int; [[The width of the cursor (or upper cursor)]] - ch: int; [[The height of the cursor (or upper cursor)]] - cx2: int; [[The x of the lower cursor]] - cy2: int; [[The y of the lower cursor]] - cw2: int; [[The width of the lower cursor]] - ch2: int; [[The height of the lower cursor]] - } - } - copy { - [[Copies source cursor.]] - legacy: null; - params { - @in src: const(Efl.Canvas.Text.Cursor); [[Source cursor.]] - } - } - text_insert { - [[Adds text to the current cursor position and set the cursor to *after* - the start of the text just added. - ]] - legacy: null; - params { - @in text: string; [[Text to append (UTF-8 format).]] - } - return: int; [[Length of the appended text.]] - } - char_prev { - [[Advances the cursor one char backwards.]] - legacy: null; - } - char_next { - [[Advances the cursor one char forward.]] - legacy: null; - } - char_delete { - [[Deletes a single character from position pointed by given cursor.]] - } - paragraph_first { - [[Sets the cursor to the start of the first text node]] - } - paragraph_last { - [[Sets the cursor to the end of the last text node]] - } - paragraph_next { - [[Advances to the start of the next text node]] - legacy: null; - } - paragraph_prev { - [[Advances to the end of the previous text node]] - legacy: null; - } - paragraph_char_first { - [[Go to the first char in the node the cursor is pointing on.]] - } - paragraph_char_last { - [[Go to the last char in a text node.]] - } - word_start { - [[Moves the cursor to the start of the word under the cursor]] - legacy: null; - } - word_end { - [[Moves the cursor to the end of the word under the cursor]] - legacy: null; - } - line_char_first { - [[Go to the start of the current line]] - } - line_char_last { - [[Go to the end of the current line]] - } - line_jump_by { - [[Move the cursor $by lines up if negative, down if positive. - - If jumping by $by means jumping outside of the textblock, move the - cursor before the first char of the textblock if jumping up, and - after the last if jumping down. - ]] - legacy: null; - params { - by: int; [[How many lines to jump by. Negative values are also supported.]] - } - } - @property content { - [[The content of the cursor (the character under the cursor)]] - get { - legacy: null; - } - values { - content: Eina.Unicode; [[The unicode codepoint of the character]] - } - } - compare @const { - [[Compares two cursors. - - Note that 0 will be returned if they are cursors of different - textblock objects. - - See @.equal for a faster equality check. - ]] - return: int; [[-1 if cur1 < cur2, 0 if cur1 == cur2, 1 otherwise.]] - params { - @in cur: const(Efl.Canvas.Text.Cursor); [[The second cursor.]] - } - } - equal @const { - [[Checks if two cursors are equal - - This is faster than @.compare so it should be used if all we care - about is equality. - - @since 1.18 - ]] - return: bool; [[$true if equal]] - params { - @in cur: const(Efl.Canvas.Text.Cursor); [[The second cursor.]] - } - } - coord_set { - [[Sets the position of the cursor according to the X and Y coordinates.]] - legacy: null; - params { - @in x: int; [[X coord to set by.]] - @in y: int; [[Y coord to set by.]] - } - } - @property object_item_annotation { - [[The object-item annotation at the cursor's position.]] - get { - legacy: null; - } - values { - annotation: ptr(Efl.Canvas.Text.Annotation); [[Annotation]] - } - } - object_item_insert { - [[Inserts a object item at specified position. - - This adds a placeholder to be queried by higher-level code, - which in turn place graphics on top of it. It essentially places an - OBJECT REPLACEMENT CHARACTER and set a special annotation to it. - ]] - legacy: null; - params { - @in format: string; [[Format of the inserted item. - See Format styles.]] - } - return: ptr(Efl.Canvas.Text.Annotation); [[The annotation handle of the - inserted item.]] - } - } - implements { - Efl.Object.destructor; - Efl.Object.finalize; - } - events { - changed; [[The cursor position has changed]] - } - constructors { - Efl.Canvas.Text.Cursor.text_object; - } -} diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index 43369148bd..067fdc0f32 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -559,6 +559,7 @@ struct _Efl_Canvas_Text_Cursor Eina_Bool changed : 1; }; +//typedef struct _Efl_Canvas_Text_Cursor Efl_Canvas_Text_Cursor_Data; typedef struct _Efl_Canvas_Text_Cursor Efl_Canvas_Text_Cursor_Data; struct _Efl_Canvas_Text_Annotation @@ -578,7 +579,7 @@ struct _Evas_Object_Textblock { Evas_Textblock_Style *style; Eina_List *styles; - Eo *cursor; + Efl_Canvas_Text_Cursor *cursor; Eina_List *cursors; Evas_Object_Textblock_Node_Text *text_nodes; Evas_Object_Textblock_Node_Format *format_nodes; @@ -732,7 +733,6 @@ static const Evas_Object_Func object_func = MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ); \ return (x); \ MAGIC_CHECK_END(); - static Eina_Bool _evas_textblock_cursor_is_at_the_end(const Efl_Canvas_Text_Cursor_Data *cur); static void _evas_textblock_node_text_remove(Efl_Canvas_Text_Data *o, Evas_Object_Textblock_Node_Text *n); static Evas_Object_Textblock_Node_Format *_evas_textblock_cursor_node_format_before_or_at_pos_get(const Efl_Canvas_Text_Cursor_Data *cur); @@ -747,19 +747,26 @@ static void _evas_textblock_cursors_set_node(Efl_Canvas_Text_Data *o, const Evas static void _evas_textblock_annotations_clear(Efl_Canvas_Text_Data *o); static void _evas_textblock_annotation_remove(Efl_Canvas_Text_Data *o, Efl_Canvas_Text_Annotation *an, Eina_Bool remove_nodes); -static void _evas_textblock_cursor_copy(Efl_Canvas_Text_Cursor_Data *dst, const Efl_Canvas_Text_Cursor_Data *src); static Eina_Bool _evas_textblock_cursor_format_is_visible_get(const Efl_Canvas_Text_Cursor_Data *cur); static void _evas_textblock_cursor_at_format_set(Efl_Canvas_Text_Cursor_Data *cur, const Evas_Object_Textblock_Node_Format *fmt); -static void _evas_textblock_cursor_paragraph_char_last(Efl_Canvas_Text_Cursor_Data *cur); static void _evas_textblock_cursor_init(Efl_Canvas_Text_Cursor_Data *cur, const Evas_Object *tb); -static int _efl_canvas_text_cursor_text_append(Efl_Canvas_Text_Cursor_Data *cur, const char *text); static Evas_Filter_Program *_format_filter_program_get(Efl_Canvas_Text_Data *o, Evas_Object_Textblock_Format *fmt); - #ifdef HAVE_HYPHEN /* Hyphenation */ #include "evas_textblock_hyphenation.x" #endif +static int _efl_canvas_text_cursor_text_append(Efl_Canvas_Text_Cursor_Data *cur, const char *text); +static Eina_Bool _evas_textblock_cursor_format_append(Efl_Canvas_Text_Cursor *cur, const char *format, Evas_Object_Textblock_Node_Format **_fnode, Eina_Bool is_item); +EAPI Eina_Bool evas_textblock_cursor_eol_get(const Evas_Textblock_Cursor *cur); +static void _evas_textblock_cursor_init(Efl_Canvas_Text_Cursor_Data *cur, const Evas_Object *tb); +static Eina_Bool _evas_textblock_cursor_format_is_visible_get(const Efl_Canvas_Text_Cursor *cur); +static void _find_layout_item_line_match(Evas_Object *eo_obj, Evas_Object_Textblock_Node_Text *n, size_t pos, Evas_Object_Textblock_Line **lnr, Evas_Object_Textblock_Item **itr); +static Evas_Object_Textblock_Node_Format *_evas_textblock_cursor_node_format_at_pos_get(const Efl_Canvas_Text_Cursor *cur); +static int _evas_textblock_cursor_text_prepend(Efl_Canvas_Text_Cursor *cur, const char *_text); +EAPI int evas_textblock_cursor_compare(const Efl_Canvas_Text_Cursor *cur1, const Efl_Canvas_Text_Cursor *cur2); +static void _evas_textblock_cursor_copy(Efl_Canvas_Text_Cursor *dst, const Efl_Canvas_Text_Cursor *src); + /** selection iterator */ /** * @internal @@ -7313,13 +7320,12 @@ evas_textblock_string_escape_get(const char *string, int *len_ret) } static void -_cursor_emit_if_changed(Efl_Canvas_Text_Cursor *cur_obj) +_cursor_emit_if_changed(Efl_Canvas_Text_Cursor *cur) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (cur->changed) { cur->changed = EINA_FALSE; - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + efl_event_callback_legacy_call(cur->obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); } } @@ -7367,16 +7373,16 @@ evas_object_textblock_text_markup_set(Eo *eo_obj, const char *text) _nodes_clear(eo_obj); - Efl_Canvas_Text_Cursor_Data *co = efl_data_scope_get(o->cursor, EFL_CANVAS_TEXT_CURSOR_CLASS); + Efl_Canvas_Text_Cursor_Data *co = o->cursor; co->node = _evas_textblock_node_text_new(); o->text_nodes = _NODE_TEXT(eina_inlist_append( EINA_INLIST_GET(o->text_nodes), EINA_INLIST_GET(co->node))); - efl_event_freeze(o->cursor); evas_textblock_cursor_paragraph_first(o->cursor); evas_object_textblock_text_markup_prepend(o->cursor, text); + efl_event_freeze(eo_obj); /* Point all the cursors to the starrt */ { Eina_List *l; @@ -7385,26 +7391,19 @@ evas_object_textblock_text_markup_set(Eo *eo_obj, const char *text) evas_textblock_cursor_paragraph_first(o->cursor); EINA_LIST_FOREACH(o->cursors, l, data) { - efl_event_freeze(data); evas_textblock_cursor_paragraph_first(data); } - EINA_LIST_FOREACH(o->cursors, l, data) - { - efl_event_thaw(data); - efl_event_callback_legacy_call(data, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); - } } - efl_event_thaw(o->cursor); - efl_event_callback_legacy_call(o->cursor, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + efl_event_thaw(eo_obj); + efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); o->markup_text = text; } EAPI void -evas_object_textblock_text_markup_prepend(Efl_Canvas_Text_Cursor *cur_obj, const char *text) +evas_object_textblock_text_markup_prepend(Efl_Canvas_Text_Cursor *cur, const char *text) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return; Evas_Object *eo_obj = cur->obj; Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); @@ -7444,19 +7443,19 @@ evas_object_textblock_text_markup_prepend(Efl_Canvas_Text_Cursor *cur_obj, const { memcpy(ttag, tag_start, ttag_len); ttag[ttag_len] = 0; - evas_textblock_cursor_format_prepend(cur_obj, ttag); + evas_textblock_cursor_format_prepend(cur, ttag); free(ttag); } tag_start = tag_end = NULL; } else if (esc_end) { - _prepend_escaped_char(cur_obj, esc_start, esc_end + 1); + _prepend_escaped_char(cur, esc_start, esc_end + 1); esc_start = esc_end = NULL; } else if (*p == 0) { - _prepend_text_run(cur_obj, s, p); + _prepend_text_run(cur, s, p); s = NULL; } if (*p == 0) @@ -7470,7 +7469,7 @@ evas_object_textblock_text_markup_prepend(Efl_Canvas_Text_Cursor *cur_obj, const * the start of the tag */ tag_start = p; tag_end = NULL; - _prepend_text_run(cur_obj, s, p); + _prepend_text_run(cur, s, p); s = NULL; } } @@ -7490,7 +7489,7 @@ evas_object_textblock_text_markup_prepend(Efl_Canvas_Text_Cursor *cur_obj, const * the start of the escape sequence */ esc_start = p; esc_end = NULL; - _prepend_text_run(cur_obj, s, p); + _prepend_text_run(cur, s, p); s = NULL; } } @@ -7515,7 +7514,7 @@ evas_object_textblock_text_markup_prepend(Efl_Canvas_Text_Cursor *cur_obj, const /*FIXME: currently just remove them, maybe do something * fancier in the future, atm it breaks if this char * is inside <> */ - _prepend_text_run(cur_obj, s, p); + _prepend_text_run(cur, s, p); /* it's also advanced later in this loop need +text_len in total*/ p += text_len - 1; @@ -8155,7 +8154,7 @@ _evas_textblock_cursor_nodes_merge(Efl_Canvas_Text_Cursor_Data *cur) _evas_textblock_nodes_merge(o, cur->node); _evas_textblock_cursors_update_offset(cur, nnode, 0, len); _evas_textblock_cursors_set_node(o, nnode, cur->node); - Efl_Canvas_Text_Cursor_Data *co = efl_data_scope_get(o->cursor, EFL_CANVAS_TEXT_CURSOR_CLASS); + Efl_Canvas_Text_Cursor_Data *co = o->cursor; if (nnode == co->node) { co->node = cur->node; @@ -8171,7 +8170,7 @@ _evas_textblock_cursor_nodes_merge(Efl_Canvas_Text_Cursor_Data *cur) * @return the format node at the specific position or NULL if not found. */ static Evas_Object_Textblock_Node_Format * -_evas_textblock_cursor_node_format_at_pos_get(const Efl_Canvas_Text_Cursor_Data *cur) +_evas_textblock_cursor_node_format_at_pos_get(const Efl_Canvas_Text_Cursor *cur) { Evas_Object_Textblock_Node_Format *node; Evas_Object_Textblock_Node_Format *itr; @@ -8337,23 +8336,6 @@ _find_layout_item_match(const Efl_Canvas_Text_Cursor_Data *cur, Evas_Object_Text return previous_format; } -EOLIAN static Efl_Canvas_Text_Cursor * -_efl_canvas_text_cursor_get(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o) -{ - return o->cursor; -} - -EOLIAN static Efl_Object * -_efl_canvas_text_cursor_efl_object_finalize(Eo *obj, Efl_Canvas_Text_Cursor_Data *pd) -{ - if (!pd->obj) - { - return NULL; - } - - return obj; -} - static void _evas_textblock_cursor_init(Efl_Canvas_Text_Cursor_Data *cur, const Evas_Object *tb) { @@ -8364,48 +8346,20 @@ _evas_textblock_cursor_init(Efl_Canvas_Text_Cursor_Data *cur, const Evas_Object cur->pos = 0; } -EOLIAN static void -_efl_canvas_text_cursor_text_object_set(Eo *obj, Efl_Canvas_Text_Cursor_Data *pd, const Evas_Object *tb) -{ - if (efl_finalized_get(obj)) - { - ERR("Can't change the cursor's textblock after creation."); - return; - } - - Efl_Canvas_Text_Data *o = efl_data_scope_get(tb, MY_CLASS); - _evas_textblock_cursor_init(pd, tb); - o->cursors = eina_list_append(o->cursors, obj); -} - -EOLIAN static const Evas_Object * -_efl_canvas_text_cursor_text_object_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Cursor_Data *pd) -{ - return pd->obj; -} - EAPI Efl_Canvas_Text_Cursor * -evas_object_textblock_cursor_new(const Eo *eo_obj) +evas_object_textblock_cursor_new(Eo *eo_obj) { EINA_SAFETY_ON_NULL_RETURN_VAL(eo_obj, NULL); - // XXX; Discarding const here - return efl_add(EFL_CANVAS_TEXT_CURSOR_CLASS, (Eo *) eo_obj, - efl_canvas_text_cursor_text_object_set(efl_added, eo_obj)); -} - -EOLIAN static void -_efl_canvas_text_cursor_efl_object_destructor(Eo *cur_obj, Efl_Canvas_Text_Cursor_Data *cur) -{ - efl_destructor(efl_super(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS)); - Efl_Canvas_Text_Data *o = efl_data_scope_get(cur->obj, MY_CLASS); - if (cur_obj == o->cursor) return; - o->cursors = eina_list_remove(o->cursors, cur_obj); + return efl_canvas_text_cursor_new(eo_obj); } EAPI void evas_textblock_cursor_free(Evas_Textblock_Cursor *cur) { - efl_del(cur); + Efl_Canvas_Text_Data *o = efl_data_scope_get(cur->obj, MY_CLASS); + if (cur == o->cursor) return; + o->cursors = eina_list_remove(o->cursors, cur); + free(cur); } EAPI Eina_Bool @@ -8419,9 +8373,8 @@ _evas_textblock_cursor_is_format(const Efl_Canvas_Text_Cursor_Data *cur) } EAPI Eina_Bool -evas_textblock_cursor_is_format(const Evas_Textblock_Cursor *cur_obj) +evas_textblock_cursor_is_format(const Evas_Textblock_Cursor *cur) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); return _evas_textblock_cursor_is_format(cur); } @@ -8579,8 +8532,9 @@ found: _evas_textblock_changed(o, eo_obj); } -static void -_canvas_text_cursor_paragraph_first(Efl_Canvas_Text_Cursor_Data *cur) +//FIXME: add to legacy header +EAPI void +evas_textblock_cursor_paragraph_first(Efl_Canvas_Text_Cursor *cur) { Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); @@ -8590,15 +8544,15 @@ _canvas_text_cursor_paragraph_first(Efl_Canvas_Text_Cursor_Data *cur) } EOLIAN static void -_efl_canvas_text_cursor_paragraph_first(Evas_Textblock_Cursor *cur_obj, Efl_Canvas_Text_Cursor_Data *cur) +_efl_canvas_text_cursor_paragraph_first(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Canvas_Text_Cursor *cur) { - _canvas_text_cursor_paragraph_first(cur); - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + evas_textblock_cursor_paragraph_first(cur); + efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); } - -static void -_canvas_text_cursor_paragraph_last(Efl_Canvas_Text_Cursor_Data *cur) +//FIXME: add to legacy header +EAPI void +evas_textblock_cursor_paragraph_last(Efl_Canvas_Text_Cursor *cur) { Evas_Object_Textblock_Node_Text *node; @@ -8611,7 +8565,7 @@ _canvas_text_cursor_paragraph_last(Efl_Canvas_Text_Cursor_Data *cur) node = _NODE_TEXT(EINA_INLIST_GET(node)->last); cur->node = node; cur->pos = 0; - _evas_textblock_cursor_paragraph_char_last(cur); + evas_textblock_cursor_paragraph_char_last(cur); } else { @@ -8621,10 +8575,10 @@ _canvas_text_cursor_paragraph_last(Efl_Canvas_Text_Cursor_Data *cur) } EOLIAN static void -_efl_canvas_text_cursor_paragraph_last(Evas_Textblock_Cursor *cur_obj, Efl_Canvas_Text_Cursor_Data *cur) +_efl_canvas_text_cursor_paragraph_last(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Canvas_Text_Cursor *cur) { - _canvas_text_cursor_paragraph_last(cur); - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + evas_textblock_cursor_paragraph_last(cur); + efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); } static Eina_Bool @@ -8652,18 +8606,17 @@ _evas_textblock_cursor_paragraph_next(Efl_Canvas_Text_Cursor_Data *cur) } EAPI Eina_Bool -evas_textblock_cursor_paragraph_next(Efl_Canvas_Text_Cursor *obj) +evas_textblock_cursor_paragraph_next(Efl_Canvas_Text_Cursor *cur) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return EINA_FALSE; return _evas_textblock_cursor_paragraph_next(cur); } EOLIAN static void -_efl_canvas_text_cursor_paragraph_next(Evas_Textblock_Cursor *cur_obj, Efl_Canvas_Text_Cursor_Data *cur) +_efl_canvas_text_cursor_paragraph_next(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Evas_Textblock_Cursor *cur) { - _evas_textblock_cursor_paragraph_next(cur); - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + evas_textblock_cursor_paragraph_next(cur); + efl_event_callback_legacy_call(obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); } static Eina_Bool @@ -8687,26 +8640,27 @@ _evas_textblock_cursor_paragraph_prev(Efl_Canvas_Text_Cursor_Data *cur) if (pnode) { cur->node = pnode; - _evas_textblock_cursor_paragraph_char_last(cur); + evas_textblock_cursor_paragraph_char_last(cur); return EINA_TRUE; } } return EINA_FALSE; } + EAPI Eina_Bool -evas_textblock_cursor_paragraph_prev(Efl_Canvas_Text_Cursor *obj) +evas_textblock_cursor_paragraph_prev(Efl_Canvas_Text_Cursor_Data *cur) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return EINA_FALSE; return _evas_textblock_cursor_paragraph_prev(cur); } EOLIAN static void -_efl_canvas_text_cursor_paragraph_prev(Evas_Textblock_Cursor *cur_obj, Efl_Canvas_Text_Cursor_Data *cur) +_efl_canvas_text_cursor_paragraph_prev(Eo *obj EINA_UNUSED, + Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Canvas_Text_Cursor *cur) { _evas_textblock_cursor_paragraph_prev(cur); - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + efl_event_callback_legacy_call(obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); } EAPI void @@ -8716,11 +8670,10 @@ evas_textblock_cursor_set_at_format(Evas_Textblock_Cursor *cur, const Evas_Objec } EAPI Eina_Bool -evas_textblock_cursor_format_next(Evas_Textblock_Cursor *cur_obj) +evas_textblock_cursor_format_next(Evas_Textblock_Cursor *cur) { Evas_Object_Textblock_Node_Format *node; - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return EINA_FALSE; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); @@ -8756,15 +8709,14 @@ evas_textblock_cursor_format_next(Evas_Textblock_Cursor *cur_obj) } EAPI Eina_Bool -evas_textblock_cursor_format_prev(Evas_Textblock_Cursor *cur_obj) +evas_textblock_cursor_format_prev(Evas_Textblock_Cursor *cur) { const Evas_Object_Textblock_Node_Format *node; - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return EINA_FALSE; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); TB_NULL_CHECK(cur->node, EINA_FALSE); - node = evas_textblock_cursor_format_get(cur_obj); + node = evas_textblock_cursor_format_get(cur); if (!node) { node = _evas_textblock_cursor_node_format_before_or_at_pos_get(cur); @@ -8799,9 +8751,8 @@ evas_textblock_cursor_format_prev(Evas_Textblock_Cursor *cur_obj) (breaks[i] == WORDBREAK_BREAK) EAPI Eina_Bool -evas_textblock_cursor_word_start(Efl_Canvas_Text_Cursor *cur_obj) +evas_textblock_cursor_word_start(Efl_Canvas_Text_Cursor *cur) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return EINA_FALSE; const Eina_Unicode *text; size_t i; @@ -8836,7 +8787,7 @@ evas_textblock_cursor_word_start(Efl_Canvas_Text_Cursor *cur_obj) len = eina_ustrbuf_length_get(cur->node->unicode); cur->pos = len - 1; free(breaks); - return evas_textblock_cursor_word_start(cur_obj); + return evas_textblock_cursor_word_start(cur); } else { @@ -8860,16 +8811,15 @@ evas_textblock_cursor_word_start(Efl_Canvas_Text_Cursor *cur_obj) } EOLIAN static void -_efl_canvas_text_cursor_word_start(Evas_Textblock_Cursor *cur_obj, Efl_Canvas_Text_Cursor_Data *cur EINA_UNUSED) +_efl_canvas_text_cursor_word_start(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Canvas_Text_Cursor *cur EINA_UNUSED) { - evas_textblock_cursor_word_start(cur_obj); - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + evas_textblock_cursor_word_start(cur); + efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); } EAPI Eina_Bool -evas_textblock_cursor_word_end(Efl_Canvas_Text_Cursor *cur_obj) +evas_textblock_cursor_word_end(Efl_Canvas_Text_Cursor *cur) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return EINA_FALSE; const Eina_Unicode *text; size_t i; @@ -8902,7 +8852,7 @@ evas_textblock_cursor_word_end(Efl_Canvas_Text_Cursor *cur_obj) cur->node = nnode; cur->pos = 0; free(breaks); - return evas_textblock_cursor_word_end(cur_obj); + return evas_textblock_cursor_word_end(cur); } } @@ -8922,14 +8872,14 @@ evas_textblock_cursor_word_end(Efl_Canvas_Text_Cursor *cur_obj) } EOLIAN static void -_efl_canvas_text_cursor_word_end(Evas_Textblock_Cursor *cur_obj, Efl_Canvas_Text_Cursor_Data *cur EINA_UNUSED) +_efl_canvas_text_cursor_word_end(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Canvas_Text_Cursor *cur EINA_UNUSED) { - evas_textblock_cursor_word_end(cur_obj); - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + evas_textblock_cursor_word_end(cur); + efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); } -static Eina_Bool -_evas_textblock_cursor_char_next(Efl_Canvas_Text_Cursor_Data *cur) +EAPI Eina_Bool +evas_textblock_cursor_char_next(Efl_Canvas_Text_Cursor_Data *cur) { int ind; const Eina_Unicode *text; @@ -8968,19 +8918,11 @@ _evas_textblock_cursor_char_next(Efl_Canvas_Text_Cursor_Data *cur) } } -EAPI Eina_Bool -evas_textblock_cursor_char_next(Efl_Canvas_Text_Cursor *obj) -{ - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(obj, EFL_CANVAS_TEXT_CURSOR_CLASS); - if (!cur) return EINA_FALSE; - return _evas_textblock_cursor_char_next(cur); -} - EOLIAN static void -_efl_canvas_text_cursor_char_next(Eo *cur_obj, Efl_Canvas_Text_Cursor_Data *cur) +_efl_canvas_text_cursor_char_next(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Canvas_Text_Cursor *cur) { - _evas_textblock_cursor_char_next(cur); - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + evas_textblock_cursor_char_next(cur); + efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); } static Eina_Bool @@ -8995,26 +8937,25 @@ _evas_textblock_cursor_char_prev(Efl_Canvas_Text_Cursor_Data *cur) cur->pos--; return EINA_TRUE; } - return _evas_textblock_cursor_paragraph_prev(cur); + return evas_textblock_cursor_paragraph_prev(cur); } EAPI Eina_Bool -evas_textblock_cursor_char_prev(Efl_Canvas_Text_Cursor *obj) +evas_textblock_cursor_char_prev(Efl_Canvas_Text_Cursor *cur) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return EINA_FALSE; return _evas_textblock_cursor_char_prev(cur); } EOLIAN static void -_efl_canvas_text_cursor_char_prev(Eo *cur_obj, Efl_Canvas_Text_Cursor_Data *cur) +_efl_canvas_text_cursor_char_prev(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Canvas_Text_Cursor *cur) { _evas_textblock_cursor_char_prev(cur); - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); } -static void -_evas_textblock_cursor_paragraph_char_first(Efl_Canvas_Text_Cursor_Data *cur) +EAPI void +evas_textblock_cursor_paragraph_char_first(Efl_Canvas_Text_Cursor_Data *cur) { if (!cur) return; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); @@ -9023,14 +8964,14 @@ _evas_textblock_cursor_paragraph_char_first(Efl_Canvas_Text_Cursor_Data *cur) } EOLIAN static void -_efl_canvas_text_cursor_paragraph_char_first(Evas_Textblock_Cursor *cur_obj, Efl_Canvas_Text_Cursor_Data *cur) +_efl_canvas_text_cursor_paragraph_char_first(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Canvas_Text_Cursor *cur) { - _evas_textblock_cursor_paragraph_char_first(cur); - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + evas_textblock_cursor_paragraph_char_first(cur); + efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); } -static void -_evas_textblock_cursor_paragraph_char_last(Efl_Canvas_Text_Cursor_Data *cur) +EAPI void +evas_textblock_cursor_paragraph_char_last(Efl_Canvas_Text_Cursor_Data *cur) { int ind; @@ -9051,10 +8992,10 @@ _evas_textblock_cursor_paragraph_char_last(Efl_Canvas_Text_Cursor_Data *cur) } EOLIAN static void -_efl_canvas_text_cursor_paragraph_char_last(Evas_Textblock_Cursor *cur_obj, Efl_Canvas_Text_Cursor_Data *cur) +_efl_canvas_text_cursor_paragraph_char_last(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Canvas_Text_Cursor *cur) { - _evas_textblock_cursor_paragraph_char_last(cur); - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + evas_textblock_cursor_paragraph_char_last(cur); + efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); } static void @@ -9084,13 +9025,15 @@ _cursor_line_first_char_get(Evas_Object_Textblock_Line *ln, } } -EOLIAN static void -_efl_canvas_text_cursor_line_char_first(Evas_Textblock_Cursor *cur_obj, Efl_Canvas_Text_Cursor_Data *cur) +EAPI void +evas_textblock_cursor_line_char_first(Efl_Canvas_Text_Cursor *cur) { Evas_Object_Textblock_Line *ln = NULL; Evas_Object_Textblock_Item *it = NULL; - + if (!cur) return; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); + evas_object_async_block(obj); + evas_object_async_block(obj); TB_NULL_CHECK(cur->node); Efl_Canvas_Text_Data *o = efl_data_scope_get(cur->obj, MY_CLASS); @@ -9103,11 +9046,10 @@ _efl_canvas_text_cursor_line_char_first(Evas_Textblock_Cursor *cur_obj, Efl_Canv if (!ln) return; _cursor_line_first_char_get(ln, cur, o); - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); } -static void -_evas_textblock_cursor_line_char_last(Efl_Canvas_Text_Cursor_Data *cur) +EAPI void +evas_textblock_cursor_line_char_last(Efl_Canvas_Text_Cursor_Data *cur) { Evas_Object_Textblock_Line *ln = NULL; Evas_Object_Textblock_Item *it = NULL; @@ -9155,10 +9097,17 @@ _evas_textblock_cursor_line_char_last(Efl_Canvas_Text_Cursor_Data *cur) } EOLIAN static void -_efl_canvas_text_cursor_line_char_last(Evas_Textblock_Cursor *cur_obj, Efl_Canvas_Text_Cursor_Data *cur) +_efl_canvas_text_cursor_line_char_last(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Canvas_Text_Cursor *cur) { - _evas_textblock_cursor_line_char_last(cur); - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + evas_textblock_cursor_line_char_last(cur); + efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); +} + +EOLIAN static void +_efl_canvas_text_cursor_line_char_first(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Canvas_Text_Cursor *cur) +{ + evas_textblock_cursor_line_char_first(cur); + efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); } /** @@ -9338,6 +9287,7 @@ _evas_textblock_node_format_remove_matching(Efl_Canvas_Text_Data *o, while (fmt && (offset == 0) && (fmt->text_node == tnode)); eina_list_free(formats); } + /** * @internal * Add the offset (may be negative) to the first node after fmt which is @@ -9600,16 +9550,16 @@ _evas_textblock_node_format_pos_get(const Evas_Object_Textblock_Node_Format *fmt } EOLIAN static int -_efl_canvas_text_cursor_position_get(Eo *cur_obj EINA_UNUSED, Efl_Canvas_Text_Cursor_Data *cur) +_efl_canvas_text_cursor_position_get(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Canvas_Text_Cursor *cur) { Evas_Object_Textblock_Node_Text *n; size_t npos = 0; if (!cur) return -1; - Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); + if (cur->obj != eo_obj) return -1; + Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); TB_NULL_CHECK(cur->node, 0); - Efl_Canvas_Text_Data *o = efl_data_scope_get(cur->obj, MY_CLASS); n = o->text_nodes; while (n != cur->node) { @@ -9619,8 +9569,16 @@ _efl_canvas_text_cursor_position_get(Eo *cur_obj EINA_UNUSED, Efl_Canvas_Text_Cu return npos + cur->pos; } -static void -_evas_textblock_cursor_pos_set(Efl_Canvas_Text_Cursor_Data *cur, int _pos) +EAPI int +evas_textblock_cursor_pos_get(const Efl_Canvas_Text_Cursor *cur) +{ + if (!cur) return -1; + return efl_canvas_text_cursor_position_get(cur->obj, + (Efl_Canvas_Text_Cursor *) cur); +} + +EAPI void +evas_textblock_cursor_pos_set(Efl_Canvas_Text_Cursor_Data *cur, int _pos) { Evas_Object_Textblock_Node_Text *n; size_t pos; @@ -9666,18 +9624,17 @@ _evas_textblock_cursor_pos_set(Efl_Canvas_Text_Cursor_Data *cur, int _pos) } EOLIAN static void -_efl_canvas_text_cursor_position_set(Eo *cur_obj, Efl_Canvas_Text_Cursor_Data *cur, int _pos) +_efl_canvas_text_cursor_position_set(Eo *cur_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Canvas_Text_Cursor *cur, int _pos) { - _evas_textblock_cursor_pos_set(cur, _pos); - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + evas_textblock_cursor_pos_set(cur, _pos); + efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); } EAPI Eina_Bool -evas_textblock_cursor_line_set(Evas_Textblock_Cursor *cur_obj, int line) +evas_textblock_cursor_line_set(Evas_Textblock_Cursor *cur, int line) { Evas_Object_Textblock_Line *ln; - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return EINA_FALSE; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); @@ -9695,55 +9652,54 @@ evas_textblock_cursor_line_set(Evas_Textblock_Cursor *cur_obj, int line) } EOLIAN static void -_efl_canvas_text_cursor_line_jump_by(Eo *c, Efl_Canvas_Text_Cursor_Data *pd EINA_UNUSED, int by) +_efl_canvas_text_cursor_line_jump_by(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Canvas_Text_Cursor *cur EINA_UNUSED, int by) { int ln; - ln = evas_textblock_cursor_line_geometry_get(c, NULL, NULL, NULL, NULL) + by; - Evas_Object *o = (Eo *) efl_canvas_text_cursor_text_object_get(c); + ln = evas_textblock_cursor_line_geometry_get(cur, NULL, NULL, NULL, NULL) + by; Evas_Coord cx, cw; Evas_Coord lx, ly, lw, lh; int last; - evas_textblock_cursor_geometry_get(c, &cx, NULL, &cw, NULL, NULL, EVAS_TEXTBLOCK_CURSOR_UNDER); + evas_textblock_cursor_geometry_get(cur, &cx, NULL, &cw, NULL, NULL, EVAS_TEXTBLOCK_CURSOR_UNDER); cx += (cw / 2); - evas_textblock_cursor_paragraph_last(c); - last = evas_textblock_cursor_line_geometry_get(c, NULL, NULL, NULL, NULL); + evas_textblock_cursor_paragraph_last(cur); + last = evas_textblock_cursor_line_geometry_get(cur, NULL, NULL, NULL, NULL); if (ln < 0) { - evas_textblock_cursor_paragraph_first(c); + evas_textblock_cursor_paragraph_first(cur); return; } if (ln > last) { - evas_textblock_cursor_paragraph_last(c); + evas_textblock_cursor_paragraph_last(cur); return; } - if (!evas_object_textblock_line_number_geometry_get(o, ln, &lx, &ly, &lw, &lh)) + if (!evas_object_textblock_line_number_geometry_get(cur->obj, ln, &lx, &ly, &lw, &lh)) return; - if (evas_textblock_cursor_char_coord_set(c, cx, ly + (lh / 2))) + if (evas_textblock_cursor_char_coord_set(cur, cx, ly + (lh / 2))) return; - evas_textblock_cursor_line_set(c, ln); + evas_textblock_cursor_line_set(cur, ln); if (cx < (lx + (lw / 2))) { - if (ln == last) evas_textblock_cursor_paragraph_last(c); - evas_textblock_cursor_line_char_first(c); + if (ln == last) evas_textblock_cursor_paragraph_last(cur); + evas_textblock_cursor_line_char_first(cur); } else { if (ln == last) - evas_textblock_cursor_paragraph_last(c); + evas_textblock_cursor_paragraph_last(cur); else - evas_textblock_cursor_line_char_last(c); + evas_textblock_cursor_line_char_last(cur); } - efl_event_callback_legacy_call(c, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); } -static int -_evas_textblock_cursor_compare(const Efl_Canvas_Text_Cursor_Data *cur1, +EAPI int +evas_textblock_cursor_compare(const Efl_Canvas_Text_Cursor_Data *cur1, const Efl_Canvas_Text_Cursor_Data *cur2) { Eina_Inlist *l1, *l2; @@ -9772,21 +9728,19 @@ _evas_textblock_cursor_compare(const Efl_Canvas_Text_Cursor_Data *cur1, } EOLIAN static int -_efl_canvas_text_cursor_compare(const Eo *cur_obj EINA_UNUSED, Efl_Canvas_Text_Cursor_Data *cur, const Efl_Canvas_Text_Cursor *cur2_obj) +_efl_canvas_text_cursor_compare(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, + const Efl_Canvas_Text_Cursor *cur1, const Efl_Canvas_Text_Cursor *cur2) { - Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); + Evas_Object_Protected_Data *obj = efl_data_scope_get(cur1->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); - Efl_Canvas_Text_Cursor_Data *cur1 = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); - Efl_Canvas_Text_Cursor_Data *cur2 = efl_data_scope_get(cur2_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); - return _evas_textblock_cursor_compare(cur1, cur2); + return evas_textblock_cursor_compare(cur1, cur2); } EOLIAN static Eina_Bool -_efl_canvas_text_cursor_equal(const Eo *cur_obj EINA_UNUSED, Efl_Canvas_Text_Cursor_Data *cur, const Efl_Canvas_Text_Cursor *cur2_obj) +_efl_canvas_text_cursor_equal(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, const Efl_Canvas_Text_Cursor *cur, const Efl_Canvas_Text_Cursor *cur2) { - Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); + Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); - Efl_Canvas_Text_Cursor_Data *cur2 = efl_data_scope_get(cur2_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); return ((cur->node == cur2->node) && (cur->pos == cur2->pos)); } @@ -9794,12 +9748,11 @@ EAPI void evas_textblock_cursor_copy(const Evas_Textblock_Cursor *cur_src, Efl_Canvas_Text_Cursor *cur_dest) { if (!cur_src || !cur_dest) return; - efl_canvas_text_cursor_copy(cur_dest, cur_src); + efl_canvas_text_cursor_copy(cur_src->obj, cur_dest, cur_src); } static void -_evas_textblock_cursor_copy(Efl_Canvas_Text_Cursor_Data *dst, - const Efl_Canvas_Text_Cursor_Data *src) +_evas_textblock_cursor_copy(Evas_Textblock_Cursor *dst, const Efl_Canvas_Text_Cursor *src) { if (!src) return; if (!dst) return; @@ -9813,15 +9766,13 @@ _evas_textblock_cursor_copy(Efl_Canvas_Text_Cursor_Data *dst, } static EOLIAN void -_efl_canvas_text_cursor_copy(Eo *cur_obj, Efl_Canvas_Text_Cursor_Data *cur, - const Efl_Canvas_Text_Cursor *src_obj) +_efl_canvas_text_cursor_copy(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, + Efl_Canvas_Text_Cursor *dst, const Efl_Canvas_Text_Cursor *src) { - Efl_Canvas_Text_Cursor_Data *src = efl_data_scope_get(src_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); - - if (!efl_canvas_text_cursor_equal(cur_obj, src_obj)) + if (!efl_canvas_text_cursor_equal(obj, dst, src)) { - _evas_textblock_cursor_copy(cur, src); - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + _evas_textblock_cursor_copy(dst, src); + efl_event_callback_legacy_call(obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); } } @@ -9965,8 +9916,8 @@ _evas_textblock_cursors_set_node(Efl_Canvas_Text_Data *o, Evas_Object_Textblock_Node_Text *new_node) { Eina_List *l; - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(o->cursor, EFL_CANVAS_TEXT_CURSOR_CLASS); - Efl_Canvas_Text_Cursor *data_obj; + Efl_Canvas_Text_Cursor_Data *cur = o->cursor; + Efl_Canvas_Text_Cursor_Data *data; if (n == cur->node) { @@ -9974,10 +9925,8 @@ _evas_textblock_cursors_set_node(Efl_Canvas_Text_Data *o, cur->node = new_node; cur->changed = EINA_TRUE; } - EINA_LIST_FOREACH(o->cursors, l, data_obj) + EINA_LIST_FOREACH(o->cursors, l, data) { - Efl_Canvas_Text_Cursor_Data *data = - efl_data_scope_get(data_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (n == data->node) { data->pos = 0; @@ -10027,19 +9976,17 @@ _evas_textblock_cursors_update_offset(const Efl_Canvas_Text_Cursor_Data *cur, size_t start, int offset) { Eina_List *l; - Efl_Canvas_Text_Cursor *ocur_obj; Efl_Canvas_Text_Cursor_Data *ocur; Efl_Canvas_Text_Data *o = efl_data_scope_get(cur->obj, MY_CLASS); - ocur = efl_data_scope_get(o->cursor, EFL_CANVAS_TEXT_CURSOR_CLASS); + ocur = o->cursor; if (cur != ocur) { _cursor_update_offset(ocur, o, n, start, offset); } - EINA_LIST_FOREACH(o->cursors, l, ocur_obj) + EINA_LIST_FOREACH(o->cursors, l, ocur) { - ocur = efl_data_scope_get(ocur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (ocur != cur) { _cursor_update_offset(ocur, o, n, start, offset); @@ -10070,6 +10017,7 @@ _evas_textblock_changed(Efl_Canvas_Text_Data *o, Evas_Object *eo_obj) o->markup_text = NULL; } + // FIXME: emit ONCE after this following checks _cursor_emit_if_changed(o->cursor); EINA_LIST_FOREACH(o->cursors, l, data_obj) { @@ -10162,16 +10110,15 @@ _evas_textblock_cursor_text_append(Efl_Canvas_Text_Cursor_Data *cur, const char n->dirty = EINA_TRUE; free(text); - main_cur = efl_data_scope_get(o->cursor, EFL_CANVAS_TEXT_CURSOR_CLASS); + main_cur = o->cursor; if (!main_cur->node) main_cur->node = o->text_nodes; return len; } EAPI int -evas_textblock_cursor_text_append(Evas_Textblock_Cursor *cur_obj, const char *_text) +evas_textblock_cursor_text_append(Evas_Textblock_Cursor *cur, const char *_text) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); return _evas_textblock_cursor_text_append(cur, _text); } @@ -10190,18 +10137,18 @@ _evas_textblock_cursor_text_prepend(Efl_Canvas_Text_Cursor_Data *cur, const char } EAPI int -evas_textblock_cursor_text_prepend(Efl_Canvas_Text_Cursor *cur_obj, const char *_text) +evas_textblock_cursor_text_prepend(Efl_Canvas_Text_Cursor *cur, const char *_text) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); return _evas_textblock_cursor_text_prepend(cur, _text); } EOLIAN static int -_efl_canvas_text_cursor_text_insert(Eo *cur_obj, - Efl_Canvas_Text_Cursor_Data *cur, const char *_text) +_efl_canvas_text_cursor_text_insert(Eo *eo_obj, + Efl_Canvas_Text_Data *o EINA_UNUSED, + Efl_Canvas_Text_Cursor *cur, const char *_text) { int len = _efl_canvas_text_cursor_text_append(cur, _text); - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); return len; } @@ -10505,7 +10452,7 @@ _evas_textblock_cursor_format_append(Efl_Canvas_Text_Cursor_Data *cur, _evas_textblock_changed(o, cur->obj); - Efl_Canvas_Text_Cursor_Data *ocur = efl_data_scope_get(o->cursor, EFL_CANVAS_TEXT_CURSOR_CLASS); + Efl_Canvas_Text_Cursor_Data *ocur = o->cursor; if (!ocur->node) ocur->node = o->text_nodes; @@ -10514,9 +10461,8 @@ _evas_textblock_cursor_format_append(Efl_Canvas_Text_Cursor_Data *cur, } EAPI Eina_Bool -evas_textblock_cursor_format_append(Evas_Textblock_Cursor *cur_obj, const char *format) +evas_textblock_cursor_format_append(Evas_Textblock_Cursor *cur, const char *format) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); return _evas_textblock_cursor_format_append(cur, format, NULL, EINA_FALSE); } @@ -10533,21 +10479,20 @@ _evas_textblock_cursor_format_prepend(Efl_Canvas_Text_Cursor_Data *cur, const ch if (is_visible) { /* Advance after the replacement char */ - _evas_textblock_cursor_char_next(cur); + evas_textblock_cursor_char_next(cur); } return is_visible; } EAPI Eina_Bool -evas_textblock_cursor_format_prepend(Evas_Textblock_Cursor *cur_obj, const char *format) +evas_textblock_cursor_format_prepend(Evas_Textblock_Cursor *cur, const char *format) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); return _evas_textblock_cursor_format_prepend(cur, format); } -static void -_evas_textblock_cursor_char_delete(Efl_Canvas_Text_Cursor_Data *cur) +EAPI void +evas_textblock_cursor_char_delete(Efl_Canvas_Text_Cursor_Data *cur) { Evas_Object_Textblock_Node_Text *n, *n2; const Eina_Unicode *text; @@ -10625,52 +10570,45 @@ _evas_textblock_cursor_char_delete(Efl_Canvas_Text_Cursor_Data *cur) } EOLIAN static void -_efl_canvas_text_cursor_char_delete(Eo *cur_obj, Efl_Canvas_Text_Cursor_Data *cur) +_efl_canvas_text_cursor_char_delete(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Canvas_Text_Cursor *cur) { - _evas_textblock_cursor_char_delete(cur); - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + evas_textblock_cursor_char_delete(cur); + efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); } EAPI void -evas_textblock_cursor_range_delete(Efl_Canvas_Text_Cursor *cur1_obj, Evas_Textblock_Cursor *cur2_obj) +evas_textblock_cursor_range_delete(Efl_Canvas_Text_Cursor *cur1, Efl_Canvas_Text_Cursor *cur2) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur1_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); - if (!cur) return; - efl_canvas_text_range_delete(cur->obj, cur1_obj, cur2_obj); + if (!cur1) return; + efl_canvas_text_range_delete(cur1->obj, cur1, cur2); } EOLIAN static void _efl_canvas_text_range_delete(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED, - Efl_Canvas_Text_Cursor *cur1_obj, Evas_Textblock_Cursor *cur2_obj) + Efl_Canvas_Text_Cursor *cur1, Evas_Textblock_Cursor *cur2) { Evas_Object_Textblock_Node_Format *fnode = NULL; Evas_Object_Textblock_Node_Text *n1, *n2; Eina_Bool should_merge = EINA_FALSE, reset_cursor = EINA_FALSE; - Efl_Canvas_Text_Cursor_Data *cur1 = efl_data_scope_get(cur1_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); - Efl_Canvas_Text_Cursor_Data *cur2 = efl_data_scope_get(cur2_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur1 || !cur1->node) return; if (!cur2 || !cur2->node) return; if (cur1->obj != cur2->obj) return; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur1->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); Efl_Canvas_Text_Data *o = efl_data_scope_get(cur1->obj, MY_CLASS); - if (evas_textblock_cursor_compare(cur1_obj, cur2_obj) > 0) + if (evas_textblock_cursor_compare(cur1, cur2) > 0) { - Efl_Canvas_Text_Cursor *tc_obj; Efl_Canvas_Text_Cursor_Data *tc; - tc_obj = cur1_obj; - cur1_obj = cur2_obj; - cur2_obj = tc_obj; tc = cur1; cur1 = cur2; cur2 = tc; } n1 = cur1->node; n2 = cur2->node; - if ((evas_textblock_cursor_compare(o->cursor, cur1_obj) >= 0) && - (evas_textblock_cursor_compare(cur2_obj, o->cursor) >= 0)) + if ((evas_textblock_cursor_compare(o->cursor, cur1) >= 0) && + (evas_textblock_cursor_compare(cur2, o->cursor) >= 0)) { reset_cursor = EINA_TRUE; } @@ -10744,34 +10682,33 @@ _efl_canvas_text_range_delete(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *pd E } _evas_textblock_node_format_remove_matching(o, fnode); - evas_textblock_cursor_copy(cur1_obj, cur2_obj); + evas_textblock_cursor_copy(cur1, cur2); if (reset_cursor) - evas_textblock_cursor_copy(cur1_obj, o->cursor); + evas_textblock_cursor_copy(cur1, o->cursor); _evas_textblock_changed(o, cur1->obj); } - EOLIAN static Eina_Unicode -_efl_canvas_text_cursor_content_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Cursor_Data *pd) +_efl_canvas_text_cursor_content_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED, + const Efl_Canvas_Text_Cursor *cur) { - return eina_ustrbuf_string_get(pd->node->unicode)[pd->pos]; + return eina_ustrbuf_string_get(cur->node->unicode)[cur->pos]; } EAPI char * -evas_textblock_cursor_content_get(const Evas_Textblock_Cursor *cur_obj) +evas_textblock_cursor_content_get(const Evas_Textblock_Cursor *cur) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur || !cur->node) return NULL; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); - if (evas_textblock_cursor_format_is_visible_get(cur_obj)) + if (evas_textblock_cursor_format_is_visible_get(cur)) { Eina_Strbuf *buf; Evas_Object_Textblock_Node_Format *fnode; char *ret; fnode = _evas_textblock_node_visible_at_pos_get( - evas_textblock_cursor_format_get(cur_obj)); + evas_textblock_cursor_format_get(cur)); buf = eina_strbuf_new(); _markup_get_format_append(buf, fnode); @@ -10785,7 +10722,7 @@ evas_textblock_cursor_content_get(const Evas_Textblock_Cursor *cur_obj) Eina_Unicode buf[2]; char *s; - buf[0] = efl_canvas_text_cursor_content_get(cur_obj); + buf[0] = efl_canvas_text_cursor_content_get(cur->obj, cur); buf[1] = 0; s = eina_unicode_unicode_to_utf8(buf, NULL); @@ -10802,7 +10739,7 @@ _evas_textblock_cursor_range_text_markup_get(const Efl_Canvas_Text_Cursor_Data * buf = eina_strbuf_new(); - if (_evas_textblock_cursor_compare(cur1, _cur2) > 0) + if (evas_textblock_cursor_compare(cur1, _cur2) > 0) { const Efl_Canvas_Text_Cursor_Data *tc; @@ -10910,7 +10847,7 @@ _evas_textblock_cursor_range_text_plain_get(const Efl_Canvas_Text_Cursor_Data *c buf = eina_ustrbuf_new(); - if (_evas_textblock_cursor_compare(cur1, _cur2) > 0) + if (evas_textblock_cursor_compare(cur1, _cur2) > 0) { const Efl_Canvas_Text_Cursor_Data *tc; @@ -10958,14 +10895,12 @@ _evas_textblock_cursor_range_text_plain_get(const Efl_Canvas_Text_Cursor_Data *c } EAPI Eina_List * -evas_textblock_cursor_range_formats_get(const Efl_Canvas_Text_Cursor *cur1_obj, const Evas_Textblock_Cursor *cur2_obj) +evas_textblock_cursor_range_formats_get(const Efl_Canvas_Text_Cursor *cur1, const Evas_Textblock_Cursor *cur2) { Evas_Object *eo_obj; Eina_List *ret = NULL; Evas_Object_Textblock_Node_Text *n1, *n2; Evas_Object_Textblock_Node_Format *first, *last; - const Efl_Canvas_Text_Cursor_Data *cur1 = efl_data_scope_get(cur1_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); - const Efl_Canvas_Text_Cursor_Data *cur2 = efl_data_scope_get(cur2_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur1 || !cur1->node) return NULL; if (!cur2 || !cur2->node) return NULL; if (cur1->obj != cur2->obj) return NULL; @@ -10975,7 +10910,7 @@ evas_textblock_cursor_range_formats_get(const Efl_Canvas_Text_Cursor *cur1_obj, eo_obj = cur1->obj; TB_HEAD_RETURN(NULL); - if (_evas_textblock_cursor_compare(cur1, cur2) > 0) + if (evas_textblock_cursor_compare(cur1, cur2) > 0) { const Efl_Canvas_Text_Cursor_Data *tc; @@ -11050,30 +10985,26 @@ _evas_textblock_cursor_range_text_get(const Efl_Canvas_Text_Cursor_Data *cur1, c } +// Add to legacy api EAPI char * -evas_textblock_cursor_range_text_get(const Efl_Canvas_Text_Cursor *cur1_obj, const Evas_Textblock_Cursor *cur2_obj, Evas_Textblock_Text_Type format) +evas_textblock_cursor_range_text_get(const Efl_Canvas_Text_Cursor *cur1, const Evas_Textblock_Cursor *cur2, Evas_Textblock_Text_Type format) { - const Efl_Canvas_Text_Cursor_Data *cur1 = efl_data_scope_get(cur1_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); - const Efl_Canvas_Text_Cursor_Data *cur2 = efl_data_scope_get(cur2_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); return _evas_textblock_cursor_range_text_get(cur1, cur2, format); } static EOLIAN char * _efl_canvas_text_range_text_get(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED, - const Efl_Canvas_Text_Cursor *cur1_obj, - const Evas_Textblock_Cursor *cur2_obj) + const Efl_Canvas_Text_Cursor *cur1, + const Evas_Textblock_Cursor *cur2) { - const Efl_Canvas_Text_Cursor_Data *cur1 = efl_data_scope_get(cur1_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); - const Efl_Canvas_Text_Cursor_Data *cur2 = efl_data_scope_get(cur2_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); return _evas_textblock_cursor_range_text_get(cur1, cur2, EVAS_TEXTBLOCK_TEXT_PLAIN); } EAPI const char * -evas_textblock_cursor_paragraph_text_get(const Evas_Textblock_Cursor *cur_obj) +evas_textblock_cursor_paragraph_text_get(const Evas_Textblock_Cursor *cur) { Efl_Canvas_Text_Cursor_Data cur1, cur2; - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return NULL; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); @@ -11085,8 +11016,8 @@ evas_textblock_cursor_paragraph_text_get(const Evas_Textblock_Cursor *cur_obj) _evas_textblock_cursor_init(&cur1, cur->obj); _evas_textblock_cursor_init(&cur2, cur->obj); cur1.node = cur2.node = cur->node; - _evas_textblock_cursor_paragraph_char_first(&cur1); - _evas_textblock_cursor_paragraph_char_last(&cur2); + evas_textblock_cursor_paragraph_char_first(&cur1); + evas_textblock_cursor_paragraph_char_last(&cur2); cur->node->utf8 = _evas_textblock_cursor_range_text_get(&cur1, &cur2, EVAS_TEXTBLOCK_TEXT_MARKUP); @@ -11094,10 +11025,9 @@ evas_textblock_cursor_paragraph_text_get(const Evas_Textblock_Cursor *cur_obj) } EAPI int -evas_textblock_cursor_paragraph_text_length_get(const Evas_Textblock_Cursor *cur_obj) +evas_textblock_cursor_paragraph_text_length_get(const Evas_Textblock_Cursor *cur) { int len; - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return -1; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); @@ -11111,9 +11041,8 @@ evas_textblock_cursor_paragraph_text_length_get(const Evas_Textblock_Cursor *cur } EAPI const Evas_Object_Textblock_Node_Format * -evas_textblock_cursor_format_get(const Evas_Textblock_Cursor *cur_obj) +evas_textblock_cursor_format_get(const Evas_Textblock_Cursor *cur) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return NULL; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); @@ -11173,9 +11102,8 @@ _evas_textblock_cursor_at_format_set(Efl_Canvas_Text_Cursor_Data *cur, } EAPI void -evas_textblock_cursor_at_format_set(Evas_Textblock_Cursor *cur_obj, const Evas_Object_Textblock_Node_Format *fmt) +evas_textblock_cursor_at_format_set(Evas_Textblock_Cursor *cur, const Evas_Object_Textblock_Node_Format *fmt) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); _evas_textblock_cursor_at_format_set(cur, fmt); } @@ -11194,9 +11122,8 @@ _evas_textblock_cursor_format_is_visible_get(const Efl_Canvas_Text_Cursor_Data * } EAPI Eina_Bool -evas_textblock_cursor_format_is_visible_get(const Evas_Textblock_Cursor *cur_obj) +evas_textblock_cursor_format_is_visible_get(const Evas_Textblock_Cursor *cur) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); return _evas_textblock_cursor_format_is_visible_get(cur); } @@ -11221,29 +11148,27 @@ _find_layout_line_by_item(Evas_Object_Textblock_Paragraph *par, Evas_Object_Text #endif EAPI Eina_Bool -evas_textblock_cursor_geometry_bidi_get(const Efl_Canvas_Text_Cursor *cur_obj, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch, Evas_Coord *cx2, Evas_Coord *cy2, Evas_Coord *cw2, Evas_Coord *ch2, Evas_Textblock_Cursor_Type ctype) +evas_textblock_cursor_geometry_bidi_get(const Efl_Canvas_Text_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch, Evas_Coord *cx2, Evas_Coord *cy2, Evas_Coord *cw2, Evas_Coord *ch2, Evas_Textblock_Cursor_Type ctype) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return EINA_FALSE; - return efl_canvas_text_cursor_geometry_get(cur_obj, + return efl_canvas_text_cursor_geometry_get(cur->obj, cur, (ctype == EVAS_TEXTBLOCK_CURSOR_BEFORE) ? EFL_CANVAS_TEXT_CURSOR_TYPE_BEFORE : EFL_CANVAS_TEXT_CURSOR_TYPE_UNDER, cx, cy, cw, ch, cx2, cy2, cw2, ch2); } EOLIAN static Eina_Bool -_efl_canvas_text_cursor_geometry_get(Eo *cur_obj EINA_UNUSED, Efl_Canvas_Text_Cursor_Data *cur, Efl_Canvas_Text_Cursor_Type ctype, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch, Evas_Coord *cx2, Evas_Coord *cy2, Evas_Coord *cw2, Evas_Coord *ch2) +_efl_canvas_text_cursor_geometry_get(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, const Efl_Canvas_Text_Cursor *cur, Efl_Canvas_Text_Cursor_Type ctype, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch, Evas_Coord *cx2, Evas_Coord *cy2, Evas_Coord *cw2, Evas_Coord *ch2) { if (!cur) return EINA_FALSE; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); - Efl_Canvas_Text_Data *o = efl_data_scope_get(cur->obj, MY_CLASS); evas_object_async_block(obj); _relayout_if_needed(cur->obj, o); if (ctype == EFL_CANVAS_TEXT_CURSOR_TYPE_UNDER) { - evas_textblock_cursor_pen_geometry_get(cur_obj, cx, cy, cw, ch); + evas_textblock_cursor_pen_geometry_get(cur, cx, cy, cw, ch); return EINA_FALSE; } @@ -11339,7 +11264,7 @@ _efl_canvas_text_cursor_geometry_get(Eo *cur_obj EINA_UNUSED, Efl_Canvas_Text_Cu /* Handling last char in line (or in paragraph). * T.e. prev condition didn't work, so we are not standing in the beginning of item, * but in the end of line or paragraph. */ - else if (evas_textblock_cursor_eol_get(cur_obj)) + else if (evas_textblock_cursor_eol_get(cur)) { EvasBiDiLevel par_level, it_level; @@ -11410,17 +11335,16 @@ _efl_canvas_text_cursor_geometry_get(Eo *cur_obj EINA_UNUSED, Efl_Canvas_Text_Cu (void) cw2; (void) ch2; #endif - evas_textblock_cursor_geometry_get(cur_obj, cx, cy, cw, ch, NULL, + evas_textblock_cursor_geometry_get(cur, cx, cy, cw, ch, NULL, (ctype == EFL_CANVAS_TEXT_CURSOR_TYPE_BEFORE) ? EVAS_TEXTBLOCK_CURSOR_BEFORE : EVAS_TEXTBLOCK_CURSOR_UNDER); return EINA_FALSE; } EAPI int -evas_textblock_cursor_geometry_get(const Efl_Canvas_Text_Cursor *cur_obj, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch, Evas_BiDi_Direction *dir, Evas_Textblock_Cursor_Type ctype) +evas_textblock_cursor_geometry_get(const Efl_Canvas_Text_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch, Evas_BiDi_Direction *dir, Evas_Textblock_Cursor_Type ctype) { int ret = -1; - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return -1; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); @@ -11433,7 +11357,7 @@ evas_textblock_cursor_geometry_get(const Efl_Canvas_Text_Cursor *cur_obj, Evas_C Evas_Object_Textblock_Line *ln; Evas_Object_Textblock_Item *it; - ret = evas_textblock_cursor_pen_geometry_get(cur_obj, cx, cy, cw, ch); + ret = evas_textblock_cursor_pen_geometry_get(cur, cx, cy, cw, ch); _find_layout_item_match(cur, &ln, &it); if (ret >= 0) { @@ -11453,7 +11377,7 @@ evas_textblock_cursor_geometry_get(const Efl_Canvas_Text_Cursor *cur_obj, Evas_C Evas_Object_Textblock_Line *ln; Evas_Object_Textblock_Item *it; - ret = evas_textblock_cursor_pen_geometry_get(cur_obj, &x, &y, &w, &h); + ret = evas_textblock_cursor_pen_geometry_get(cur, &x, &y, &w, &h); _find_layout_item_match(cur, &ln, &it); if (ret >= 0) { @@ -11492,7 +11416,7 @@ evas_textblock_cursor_geometry_get(const Efl_Canvas_Text_Cursor *cur_obj, Evas_C * @return line number of the char on success, -1 on error. */ static int -_evas_textblock_cursor_char_pen_geometry_common_get(int (*query_func) (void *data, Evas_Font_Set *font, const Evas_Text_Props *intl_props, int pos, int *cx, int *cy, int *cw, int *ch), const Evas_Textblock_Cursor *cur_obj, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) +_evas_textblock_cursor_char_pen_geometry_common_get(int (*query_func) (void *data, Evas_Font_Set *font, const Evas_Text_Props *intl_props, int pos, int *cx, int *cy, int *cw, int *ch), const Evas_Textblock_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) { Evas_Object_Textblock_Line *ln = NULL; Evas_Object_Textblock_Item *it = NULL; @@ -11502,7 +11426,6 @@ _evas_textblock_cursor_char_pen_geometry_common_get(int (*query_func) (void *dat int pos; Eina_Bool previous_format; - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return -1; Efl_Canvas_Text_Data *o = efl_data_scope_get(cur->obj, MY_CLASS); @@ -11609,35 +11532,32 @@ _evas_textblock_cursor_char_pen_geometry_common_get(int (*query_func) (void *dat } EAPI int -evas_textblock_cursor_char_geometry_get(const Evas_Textblock_Cursor *cur_obj, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) +evas_textblock_cursor_char_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return -1; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); return _evas_textblock_cursor_char_pen_geometry_common_get( - ENFN->font_char_coords_get, cur_obj, cx, cy, cw, ch); + ENFN->font_char_coords_get, cur, cx, cy, cw, ch); } EAPI int -evas_textblock_cursor_pen_geometry_get(const Evas_Textblock_Cursor *cur_obj, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) +evas_textblock_cursor_pen_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return -1; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); return _evas_textblock_cursor_char_pen_geometry_common_get( - ENFN->font_pen_coords_get, cur_obj, cx, cy, cw, ch); + ENFN->font_pen_coords_get, cur, cx, cy, cw, ch); } EAPI int -evas_textblock_cursor_line_geometry_get(const Evas_Textblock_Cursor *cur_obj, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) +evas_textblock_cursor_line_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) { Evas_Object_Textblock_Line *ln = NULL; Evas_Object_Textblock_Item *it = NULL; int x, y, w, h; - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return -1; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); @@ -11666,16 +11586,15 @@ evas_textblock_cursor_line_geometry_get(const Evas_Textblock_Cursor *cur_obj, Ev } EAPI Eina_Bool -evas_textblock_cursor_visible_range_get(Efl_Canvas_Text_Cursor *start_obj, Evas_Textblock_Cursor *end_obj) +evas_textblock_cursor_visible_range_get(Efl_Canvas_Text_Cursor *start, Evas_Textblock_Cursor *end) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(start_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); - return efl_canvas_text_visible_range_get(cur->obj, start_obj, end_obj); + return efl_canvas_text_visible_range_get(start->obj, start, end); } EOLIAN static Eina_Bool _efl_canvas_text_visible_range_get(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED, - Efl_Canvas_Text_Cursor *start_obj, Evas_Textblock_Cursor *end_obj) + Efl_Canvas_Text_Cursor *start, Evas_Textblock_Cursor *end) { Evas *eo_e; Evas_Coord cy, ch; @@ -11686,18 +11605,17 @@ _efl_canvas_text_visible_range_get(Eo *eo_obj EINA_UNUSED, Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS); cy = 0 - obj->cur->geometry.y; ch = e->viewport.h; - evas_textblock_cursor_line_coord_set(start_obj, cy); - evas_textblock_cursor_line_coord_set(end_obj, cy + ch); - evas_textblock_cursor_line_char_last(end_obj); + evas_textblock_cursor_line_coord_set(start, cy); + evas_textblock_cursor_line_coord_set(end, cy + ch); + evas_textblock_cursor_line_char_last(end); return EINA_TRUE; } EAPI Eina_Bool -evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *cur_obj, Evas_Coord x, Evas_Coord y) +evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, Evas_Coord y) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); Evas_Object_Textblock_Paragraph *found_par; Evas_Object_Textblock_Line *ln; Evas_Object_Textblock_Item *it = NULL; @@ -11729,11 +11647,11 @@ evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *cur_obj, Evas_Coord cur->node = found_par->text_node; if (found_par->direction == EVAS_BIDI_DIRECTION_RTL) { - evas_textblock_cursor_line_char_last(cur_obj); + evas_textblock_cursor_line_char_last(cur); } else { - evas_textblock_cursor_line_char_first(cur_obj); + evas_textblock_cursor_line_char_first(cur); } ret = EINA_TRUE; goto end; @@ -11744,11 +11662,11 @@ evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *cur_obj, Evas_Coord cur->node = found_par->text_node; if (found_par->direction == EVAS_BIDI_DIRECTION_RTL) { - evas_textblock_cursor_line_char_first(cur_obj); + evas_textblock_cursor_line_char_first(cur); } else { - evas_textblock_cursor_line_char_last(cur_obj); + evas_textblock_cursor_line_char_last(cur); } ret = EINA_TRUE; goto end; @@ -11810,13 +11728,13 @@ evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *cur_obj, Evas_Coord { /* If we are after the last paragraph, use the last position in the * text. */ - evas_textblock_cursor_paragraph_last(cur_obj); + evas_textblock_cursor_paragraph_last(cur); ret = EINA_TRUE; goto end; } else if (o->paragraphs && (y < (o->paragraphs->y + first_line->y))) { - evas_textblock_cursor_paragraph_first(cur_obj); + evas_textblock_cursor_paragraph_first(cur); ret = EINA_TRUE; goto end; } @@ -11825,25 +11743,24 @@ evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *cur_obj, Evas_Coord end: if (ret) { - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL); + efl_event_callback_legacy_call(cur->obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); } return ret; } EOLIAN static void -_efl_canvas_text_cursor_coord_set(Eo *cur_obj, Efl_Canvas_Text_Cursor_Data *cur EINA_UNUSED, +_efl_canvas_text_cursor_coord_set(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Canvas_Text_Cursor *cur EINA_UNUSED, Evas_Coord x, Evas_Coord y) { - evas_textblock_cursor_char_coord_set(cur_obj, x, y); + evas_textblock_cursor_char_coord_set(cur, x, y); } EAPI int -evas_textblock_cursor_line_coord_set(Evas_Textblock_Cursor *cur_obj, Evas_Coord y) +evas_textblock_cursor_line_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord y) { Evas_Object_Textblock_Paragraph *found_par; Evas_Object_Textblock_Line *ln; - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return -1; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); @@ -11860,7 +11777,7 @@ evas_textblock_cursor_line_coord_set(Evas_Textblock_Cursor *cur_obj, Evas_Coord /* If we are before the first paragraph, use the first position in the text */ if ((found_par->y >= y) && (!EINA_INLIST_GET(found_par)->prev)) { - evas_textblock_cursor_paragraph_first(cur_obj); + evas_textblock_cursor_paragraph_first(cur); return 0; } @@ -11870,7 +11787,7 @@ evas_textblock_cursor_line_coord_set(Evas_Textblock_Cursor *cur_obj, Evas_Coord if (ln->par->y + ln->y > y) break; if ((ln->par->y + ln->y <= y) && ((ln->par->y + ln->y + ln->h) > y)) { - evas_textblock_cursor_line_set(cur_obj, ln->par->line_no + + evas_textblock_cursor_line_set(cur, ln->par->line_no + ln->line_no); return ln->par->line_no + ln->line_no; } @@ -11881,7 +11798,7 @@ evas_textblock_cursor_line_coord_set(Evas_Textblock_Cursor *cur_obj, Evas_Coord int line_no = 0; /* If we are after the last paragraph, use the last position in the * text. */ - evas_textblock_cursor_paragraph_last(cur_obj); + evas_textblock_cursor_paragraph_last(cur); if (cur->node && cur->node->par) { line_no = cur->node->par->line_no; @@ -11896,7 +11813,7 @@ evas_textblock_cursor_line_coord_set(Evas_Textblock_Cursor *cur_obj, Evas_Coord else if (o->paragraphs && (y < o->paragraphs->y)) { int line_no = 0; - evas_textblock_cursor_paragraph_first(cur_obj); + evas_textblock_cursor_paragraph_first(cur); if (cur->node && cur->node->par) { line_no = cur->node->par->line_no; @@ -12263,25 +12180,22 @@ _line_fill_rect_get(const Evas_Object_Textblock_Line *ln, } EAPI Eina_Iterator * -evas_textblock_cursor_range_simple_geometry_get(const Efl_Canvas_Text_Cursor *cur1_obj, const Evas_Textblock_Cursor *cur2_obj) +evas_textblock_cursor_range_simple_geometry_get(const Efl_Canvas_Text_Cursor *cur1, const Evas_Textblock_Cursor *cur2) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur1_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); - if (!cur) return NULL; - return efl_canvas_text_range_simple_geometry_get(cur->obj, cur1_obj, cur2_obj); + if (!cur1) return NULL; + return efl_canvas_text_range_simple_geometry_get(cur1->obj, cur1, cur2); } static EOLIAN Eina_Iterator * _efl_canvas_text_range_simple_geometry_get(Eo *eo_obj EINA_UNUSED, - Efl_Canvas_Text_Data *o, const Efl_Canvas_Text_Cursor *cur1_obj, const - Evas_Textblock_Cursor *cur2_obj) + Efl_Canvas_Text_Data *o, const Efl_Canvas_Text_Cursor *cur1, const + Evas_Textblock_Cursor *cur2) { Evas_Object_Textblock_Line *ln1, *ln2; Evas_Object_Textblock_Item *it1, *it2; Eina_List *rects = NULL; Eina_Iterator *itr = NULL; - const Efl_Canvas_Text_Cursor_Data *cur1 = efl_data_scope_get(cur1_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); - const Efl_Canvas_Text_Cursor_Data *cur2 = efl_data_scope_get(cur2_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur1 || !cur1->node) return NULL; if (!cur2 || !cur2->node) return NULL; if (cur1->obj != cur2->obj) return NULL; @@ -12290,7 +12204,7 @@ _efl_canvas_text_range_simple_geometry_get(Eo *eo_obj EINA_UNUSED, _relayout_if_needed(cur1->obj, o); - if (_evas_textblock_cursor_compare(cur1, cur2) > 0) + if (evas_textblock_cursor_compare(cur1, cur2) > 0) { const Efl_Canvas_Text_Cursor_Data *tc; @@ -12381,16 +12295,14 @@ _efl_canvas_text_range_simple_geometry_get(Eo *eo_obj EINA_UNUSED, static Eina_List * _efl_canvas_text_range_geometry_list_get(Eo *eo_obj EINA_UNUSED, - Efl_Canvas_Text_Data *o, const Efl_Canvas_Text_Cursor *cur1_obj, const - Evas_Textblock_Cursor *cur2_obj) + Efl_Canvas_Text_Data *o, const Efl_Canvas_Text_Cursor *cur1, const + Evas_Textblock_Cursor *cur2) { Evas_Object_Textblock_Line *ln1, *ln2; Evas_Object_Textblock_Item *it1, *it2; Eina_List *rects = NULL; Evas_Textblock_Rectangle *tr; - const Efl_Canvas_Text_Cursor_Data *cur1 = efl_data_scope_get(cur1_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); - const Efl_Canvas_Text_Cursor_Data *cur2 = efl_data_scope_get(cur2_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur1 || !cur1->node) return NULL; if (!cur2 || !cur2->node) return NULL; if (cur1->obj != cur2->obj) return NULL; @@ -12399,7 +12311,7 @@ _efl_canvas_text_range_geometry_list_get(Eo *eo_obj EINA_UNUSED, _relayout_if_needed(cur1->obj, o); - if (_evas_textblock_cursor_compare(cur1, cur2) > 0) + if (evas_textblock_cursor_compare(cur1, cur2) > 0) { const Efl_Canvas_Text_Cursor_Data *tc; @@ -12459,25 +12371,24 @@ _efl_canvas_text_range_geometry_list_get(Eo *eo_obj EINA_UNUSED, } EAPI Eina_List * -evas_textblock_cursor_range_geometry_get(const Efl_Canvas_Text_Cursor *cur1_obj, const Evas_Textblock_Cursor *cur2_obj) +evas_textblock_cursor_range_geometry_get(const Efl_Canvas_Text_Cursor *cur1, const Evas_Textblock_Cursor *cur2_obj) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur1_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); Efl_Canvas_Text_Data *o; - if (!cur) return NULL; + if (!cur1) return NULL; - o = efl_data_scope_get(cur->obj, MY_CLASS); + o = efl_data_scope_get(cur1->obj, MY_CLASS); - return _efl_canvas_text_range_geometry_list_get(cur->obj, o, cur1_obj, cur2_obj); + return _efl_canvas_text_range_geometry_list_get(cur1->obj, o, cur1, cur2_obj); } static EOLIAN Eina_Iterator * _efl_canvas_text_range_geometry_get(Eo *eo_obj EINA_UNUSED, - Efl_Canvas_Text_Data *o, const Efl_Canvas_Text_Cursor *cur1_obj, const - Evas_Textblock_Cursor *cur2_obj) + Efl_Canvas_Text_Data *o, const Efl_Canvas_Text_Cursor *cur1, const + Evas_Textblock_Cursor *cur2) { Eina_List *rects = _efl_canvas_text_range_geometry_list_get(eo_obj, - o, cur1_obj, cur2_obj); + o, cur1, cur2); return _evas_textblock_selection_iterator_new(rects); } @@ -12513,25 +12424,23 @@ _evas_textblock_cursor_format_item_geometry_get(const Efl_Canvas_Text_Cursor_Dat } EAPI Eina_Bool -evas_textblock_cursor_format_item_geometry_get(const Evas_Textblock_Cursor *cur_obj, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) +evas_textblock_cursor_format_item_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) { - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); return _evas_textblock_cursor_format_item_geometry_get(cur, cx, cy, cw, ch); } EAPI Eina_Bool -evas_textblock_cursor_eol_get(const Evas_Textblock_Cursor *cur_obj) +evas_textblock_cursor_eol_get(const Evas_Textblock_Cursor *cur) { Eina_Bool ret = EINA_FALSE; Efl_Canvas_Text_Cursor_Data cur2; - Efl_Canvas_Text_Cursor_Data *cur = efl_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); if (!cur) return EINA_FALSE; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); _evas_textblock_cursor_init(&cur2, cur->obj); _evas_textblock_cursor_copy(&cur2, cur); - _evas_textblock_cursor_line_char_last(&cur2); + evas_textblock_cursor_line_char_last(&cur2); if (cur2.pos == cur->pos) { ret = EINA_TRUE; @@ -12578,16 +12487,15 @@ _evas_object_textblock_clear(Evas_Object *eo_obj) } _nodes_clear(eo_obj); - co = efl_data_scope_get(o->cursor, EFL_CANVAS_TEXT_CURSOR_CLASS); + co = o->cursor; co->node = NULL; co->pos = 0; co->changed = EINA_TRUE; EINA_LIST_FOREACH(o->cursors, l, cur) { - co = efl_data_scope_get(cur, EFL_CANVAS_TEXT_CURSOR_CLASS); - co->node = NULL; - co->pos = 0; - co->changed = EINA_TRUE; + cur->node = NULL; + cur->pos = 0; + cur->changed = EINA_TRUE; } _evas_textblock_changed(o, eo_obj); @@ -12947,7 +12855,7 @@ evas_object_textblock_init(Evas_Object *eo_obj) } o = obj->private_data; - Efl_Canvas_Text_Cursor_Data *co = efl_data_scope_get(o->cursor, EFL_CANVAS_TEXT_CURSOR_CLASS); + Efl_Canvas_Text_Cursor_Data *co = o->cursor; co->obj = eo_obj; evas_object_textblock_text_markup_set(eo_obj, ""); @@ -12995,14 +12903,14 @@ evas_object_textblock_free(Evas_Object *eo_obj) { evas_object_textblock_style_user_pop(eo_obj); } - efl_del(o->cursor); + free(o->cursor); while (o->cursors) { Efl_Canvas_Text_Cursor *cur; cur = (Efl_Canvas_Text_Cursor *)o->cursors->data; o->cursors = eina_list_remove_list(o->cursors, o->cursors); - efl_del(cur); + free(cur); } if (o->repch) eina_stringshare_del(o->repch); if (o->ellip_ti) _item_free(eo_obj, NULL, _ITEM(o->ellip_ti)); @@ -14468,7 +14376,8 @@ _efl_canvas_text_efl_text_text_set(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUS const char *text) { evas_object_textblock_text_markup_set(eo_obj, ""); - efl_canvas_text_cursor_text_insert(o->cursor, text); + efl_canvas_text_cursor_text_insert(eo_obj, o->cursor, text); + printf("canvas_text: eo_obj=%p\n", eo_obj); efl_event_callback_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CHANGED, NULL); } @@ -14480,8 +14389,8 @@ _canvas_text_get_all(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED) _evas_textblock_cursor_init(&start, eo_obj); _evas_textblock_cursor_init(&end, eo_obj); - _canvas_text_cursor_paragraph_first(&start); - _canvas_text_cursor_paragraph_last(&end); + evas_textblock_cursor_paragraph_first(&start); + evas_textblock_cursor_paragraph_last(&end); return _evas_textblock_cursor_range_text_get(&start, &end, EVAS_TEXTBLOCK_TEXT_PLAIN); } @@ -14601,7 +14510,7 @@ _textblock_annotation_set(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o, len = strlen(format); buf = malloc(len + 4); sprintf(buf, "", format); - if (is_item) _evas_textblock_cursor_char_next(end); + if (is_item) evas_textblock_cursor_char_next(end); _evas_textblock_cursor_format_append(end, buf, &fnode, is_item); free(buf); an->end_node = fnode; @@ -14672,7 +14581,7 @@ _evas_textblock_annotation_remove(Efl_Canvas_Text_Data *o, Efl_Canvas_Text_Cursor_Data cur; _evas_textblock_cursor_init(&cur, an->obj); _textblock_cursor_pos_at_fnode_set(an->obj, &cur, an->start_node); - _evas_textblock_cursor_char_delete(&cur); + evas_textblock_cursor_char_delete(&cur); return; // 'an' should be deleted after char deletion. } _evas_textblock_node_format_remove(o, an->start_node, 0); @@ -14730,7 +14639,7 @@ _textblock_annotation_insert(Eo *eo_obj, Efl_Canvas_Text_Data *o, const char *item; if (!format || (format[0] == '\0') || - _evas_textblock_cursor_compare(start, end) > 0) + evas_textblock_cursor_compare(start, end) > 0) { return NULL; } @@ -14786,12 +14695,10 @@ _textblock_annotation_insert(Eo *eo_obj, Efl_Canvas_Text_Data *o, EOLIAN static Efl_Canvas_Text_Annotation * _efl_canvas_text_annotation_insert(Eo *eo_obj, Efl_Canvas_Text_Data *o, - Efl_Canvas_Text_Cursor *start_obj, Efl_Canvas_Text_Cursor *end_obj, + Efl_Canvas_Text_Cursor *start, Efl_Canvas_Text_Cursor *end, const char *format) { Efl_Canvas_Text_Annotation *ret; - Efl_Canvas_Text_Cursor_Data *start = efl_data_scope_get(start_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); - Efl_Canvas_Text_Cursor_Data *end = efl_data_scope_get(end_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); ret = _textblock_annotation_insert(eo_obj, o, start, end, format, EINA_FALSE); @@ -14801,12 +14708,10 @@ _efl_canvas_text_annotation_insert(Eo *eo_obj, Efl_Canvas_Text_Data *o, EOLIAN static Eina_Iterator * _efl_canvas_text_range_annotations_get(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, - const Evas_Textblock_Cursor *start_obj, const Evas_Textblock_Cursor *end_obj) + const Evas_Textblock_Cursor *start, const Evas_Textblock_Cursor *end) { Eina_List *lst = NULL; Efl_Canvas_Text_Annotation *it; - Efl_Canvas_Text_Cursor_Data *start = efl_data_scope_get(start_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); - Efl_Canvas_Text_Cursor_Data *end = efl_data_scope_get(end_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); EINA_INLIST_FOREACH(o->annotations, it) { @@ -14818,8 +14723,8 @@ _efl_canvas_text_range_annotations_get(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_D _textblock_cursor_pos_at_fnode_set(eo_obj, &start2, it->start_node); _textblock_cursor_pos_at_fnode_set(eo_obj, &end2, it->end_node); _evas_textblock_cursor_char_prev(&end2); - if (!((_evas_textblock_cursor_compare(&start2, end) > 0) || - (_evas_textblock_cursor_compare(&end2, start) < 0))) + if (!((evas_textblock_cursor_compare(&start2, end) > 0) || + (evas_textblock_cursor_compare(&end2, start) < 0))) { lst = eina_list_append(lst, it); } @@ -14828,25 +14733,23 @@ _efl_canvas_text_range_annotations_get(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_D } EOLIAN static Efl_Canvas_Text_Annotation * -_efl_canvas_text_cursor_object_item_insert(Eo *cur_obj EINA_UNUSED, - Efl_Canvas_Text_Cursor_Data *cur, const char *format) +_efl_canvas_text_cursor_object_item_insert(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Canvas_Text_Cursor *cur, const char *format) { - Efl_Canvas_Text_Data *o = efl_data_scope_get(cur->obj, MY_CLASS); Efl_Canvas_Text_Annotation *ret = _textblock_annotation_insert(cur->obj, o, cur, cur, format, EINA_TRUE); - efl_event_callback_legacy_call(cur->obj, EFL_CANVAS_TEXT_EVENT_CHANGED, NULL); + efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CHANGED, NULL); return ret; } EOLIAN static Efl_Canvas_Text_Annotation * -_efl_canvas_text_cursor_object_item_annotation_get(Eo *cur_obj EINA_UNUSED, - Efl_Canvas_Text_Cursor_Data *cur) +_efl_canvas_text_cursor_object_item_annotation_get(Eo *eo_obj EINA_UNUSED, + Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Canvas_Text_Cursor *cur) { Eina_Iterator *it; Efl_Canvas_Text_Annotation *data, *ret = NULL; it = efl_canvas_text_range_annotations_get(cur->obj, - cur_obj, cur_obj); + cur, cur); EINA_ITERATOR_FOREACH(it, data) { if (data->is_item) @@ -14878,13 +14781,8 @@ EOLIAN static void _efl_canvas_text_annotation_positions_get(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, const Efl_Canvas_Text_Annotation *annotation, - Efl_Canvas_Text_Cursor *start_obj, Efl_Canvas_Text_Cursor *end_obj) + Efl_Canvas_Text_Cursor *start, Efl_Canvas_Text_Cursor *end) { - Efl_Canvas_Text_Cursor_Data *start, *end; - - start = efl_data_scope_get(start_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); - end = efl_data_scope_get(end_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); - _textblock_cursor_pos_at_fnode_set(eo_obj, start, annotation->start_node); _textblock_cursor_pos_at_fnode_set(eo_obj, end, annotation->end_node); } @@ -15648,5 +15546,32 @@ ppar(Evas_Object_Textblock_Paragraph *par) #define EFL_CANVAS_TEXT_EXTRA_OPS \ EFL_OBJECT_OP_FUNC(efl_dbg_info_get, _efl_canvas_text_efl_object_dbg_info_get) -#include "canvas/efl_canvas_text_cursor.eo.c" +EOLIAN static Efl_Canvas_Text_Cursor * +_efl_canvas_text_cursor_get(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o) +{ + return o->cursor; +} + +EOLIAN static Efl_Canvas_Text_Cursor * +_efl_canvas_text_cursor_new(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o) +{ + Efl_Canvas_Text_Cursor *cur; + Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); + evas_object_async_block(obj); + + cur = calloc(1, sizeof(Efl_Canvas_Text_Cursor)); + if (!cur) return NULL; + _evas_textblock_cursor_init(cur, eo_obj); + + o->cursors = eina_list_append(o->cursors, cur); + return cur; +} + +EOLIAN static void +_efl_canvas_text_cursor_free(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, + Efl_Canvas_Text_Cursor *cur) +{ + evas_textblock_cursor_free(cur); +} + #include "canvas/efl_canvas_text.eo.c" diff --git a/src/lib/evas/canvas/evas_textblock_legacy.h b/src/lib/evas/canvas/evas_textblock_legacy.h index 3179a76f01..62650aa52b 100644 --- a/src/lib/evas/canvas/evas_textblock_legacy.h +++ b/src/lib/evas/canvas/evas_textblock_legacy.h @@ -146,7 +146,7 @@ typedef struct _Efl_Canvas_Text_Style Evas_Textblock_Style; * @see evas_object_textblock_cursor_new * */ -typedef Eo Evas_Textblock_Cursor; +typedef struct _Efl_Canvas_Text_Cursor Evas_Textblock_Cursor; /** * @typedef Evas_Object_Textblock_Node_Format @@ -841,7 +841,7 @@ EAPI void evas_textblock_cursor_copy(const E * @param obj The textblock to which the new cursor will associate. * @return Returns a new cursor associated with the given textblock object. */ -EAPI Evas_Textblock_Cursor *evas_object_textblock_cursor_new(const Evas_Object *obj); +EAPI Evas_Textblock_Cursor *evas_object_textblock_cursor_new(Evas_Object *obj); /** * @brief Sets the position of the cursor according to the X and Y coordinates. @@ -908,7 +908,24 @@ EAPI void evas_object_textblock_valign_set(Evas_Object *obj, double align); */ EAPI double evas_object_textblock_valign_get(const Evas_Object *obj); -#include "canvas/efl_canvas_text_cursor.eo.legacy.h" +EAPI void evas_textblock_cursor_paragraph_first(Efl_Canvas_Text_Cursor *cur); + +EAPI void evas_textblock_cursor_paragraph_last(Efl_Canvas_Text_Cursor *cur); + +EAPI int evas_textblock_cursor_compare(const Efl_Canvas_Text_Cursor *cur1, const Efl_Canvas_Text_Cursor *cur2); + +EAPI void evas_textblock_cursor_line_char_first(Efl_Canvas_Text_Cursor *cur); + +EAPI void evas_textblock_cursor_line_char_last(Efl_Canvas_Text_Cursor *cur); + +EAPI void evas_textblock_cursor_pos_set(Efl_Canvas_Text_Cursor *cur, int _pos); + +EAPI void evas_textblock_cursor_paragraph_char_first(Efl_Canvas_Text_Cursor *cur); + +EAPI void evas_textblock_cursor_paragraph_char_last(Efl_Canvas_Text_Cursor *cur); + +EAPI void evas_textblock_cursor_char_delete(Efl_Canvas_Text_Cursor *cur); +//#include "canvas/efl_canvas_text_cursor.eo.legacy.h" #include "canvas/efl_canvas_text.eo.legacy.h" /** * @} diff --git a/src/tests/evas/evas_test_textblock.c b/src/tests/evas/evas_test_textblock.c index b3b78dfb7b..00b7863cc9 100644 --- a/src/tests/evas/evas_test_textblock.c +++ b/src/tests/evas/evas_test_textblock.c @@ -4157,7 +4157,7 @@ _test_check_annotation(Evas_Object *tb, size_t len, const char **formats) { Efl_Canvas_Text_Annotation *an; - Eo *start, *end; + Efl_Canvas_Text_Cursor *start, *end; start = evas_object_textblock_cursor_new(tb); end = evas_object_textblock_cursor_new(tb); @@ -4197,7 +4197,7 @@ START_TEST(evas_textblock_annotation) { START_TB_TEST(); Efl_Canvas_Text_Annotation *an, *an2; - Eo *start, *end; + Efl_Canvas_Text_Cursor *start, *end; start = evas_object_textblock_cursor_new(tb); end = evas_object_textblock_cursor_new(tb); @@ -4318,12 +4318,12 @@ START_TEST(evas_textblock_annotation) /* Check "item" annotations */ efl_text_set(tb, "abcd"); evas_textblock_cursor_pos_set(cur, 4); - an = efl_canvas_text_cursor_object_item_insert(cur, "size=16x16"); + an = efl_canvas_text_cursor_object_item_insert(tb, cur, "size=16x16"); _test_check_annotation(tb, 4, 4, _COMP_PARAMS("size=16x16")); /* Check that format is not extended if it's an "object item" */ evas_textblock_cursor_pos_set(cur, 5); - efl_canvas_text_cursor_text_insert(cur, "a"); + efl_canvas_text_cursor_text_insert(tb, cur, "a"); _test_check_annotation(tb, 5, 7, _COMP_PARAMS()); _test_check_annotation(tb, 0, 3, _COMP_PARAMS()); @@ -4346,7 +4346,7 @@ START_TEST(evas_textblock_annotation) _test_check_annotation(tb, 3, 3, _COMP_PARAMS("color=#fff")); /* Old API */ evas_textblock_cursor_pos_set(cur, 5); - efl_canvas_text_cursor_text_insert(cur, "a"); + efl_canvas_text_cursor_text_insert(tb, cur, "a"); _test_check_annotation(tb, 0, 0, _COMP_PARAMS("color=#fff")); _test_check_annotation(tb, 5, 5, _COMP_PARAMS()); @@ -4358,18 +4358,18 @@ START_TEST(evas_textblock_annotation) _test_check_annotation(tb, 4, 4, _COMP_PARAMS("color=#fff")); evas_textblock_cursor_pos_set(cur, 4); /* Cursor position is now: hello|\nworld */ - efl_canvas_text_cursor_text_insert(cur, "a"); + efl_canvas_text_cursor_text_insert(tb, cur, "a"); _test_check_annotation(tb, 0, 0, _COMP_PARAMS("color=#fff")); _test_check_annotation(tb, 5, 5, _COMP_PARAMS("color=#fff")); /* Test getting of object item */ evas_textblock_cursor_pos_set(cur, 4); - an = efl_canvas_text_cursor_object_item_annotation_get(cur); + an = efl_canvas_text_cursor_object_item_annotation_get(tb, cur); ck_assert(!an); - an = efl_canvas_text_cursor_object_item_insert(cur, "size=16x16"); + an = efl_canvas_text_cursor_object_item_insert(tb, cur, "size=16x16"); evas_textblock_cursor_pos_set(cur, 4); - an = efl_canvas_text_cursor_object_item_annotation_get(cur); + an = efl_canvas_text_cursor_object_item_annotation_get(tb, cur); ck_assert(an); ck_assert_str_eq("size=16x16", efl_canvas_text_annotation_get(tb, an)); @@ -4395,7 +4395,7 @@ START_TEST(efl_canvas_text_cursor) /* Logical cursor after "test " */ evas_textblock_cursor_pos_set(cur, 6); - fail_if(!efl_canvas_text_cursor_geometry_get(cur, + fail_if(!efl_canvas_text_cursor_geometry_get(tb, cur, EFL_CANVAS_TEXT_CURSOR_TYPE_BEFORE, &cx, NULL, NULL, NULL, &cx2, NULL, NULL, NULL)); evas_textblock_cursor_pos_set(cur, 18);