Canvas text cursor: move to Efl.Canvas.Text namespace
authorDaniel Hirt <hirt.danny@gmail.com>
Mon, 5 Jun 2017 11:52:10 +0000 (14:52 +0300)
committerDaniel Hirt <hirt.danny@gmail.com>
Sun, 11 Jun 2017 20:58:52 +0000 (23:58 +0300)
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.

15 files changed:
src/Makefile_Elementary.am
src/Makefile_Evas.am
src/bin/elementary/test.c
src/bin/elementary/test_efl_ui_text.c
src/lib/efl/interfaces/efl_text_types.eot
src/lib/elementary/efl_ui_internal_text_interactive.c
src/lib/elementary/efl_ui_text.c
src/lib/elementary/efl_ui_text.eo
src/lib/elementary/efl_ui_text_interactive.eo
src/lib/evas/Evas_Eo.h
src/lib/evas/canvas/efl_canvas_text.eo
src/lib/evas/canvas/efl_canvas_text_cursor.eo [deleted file]
src/lib/evas/canvas/evas_object_textblock.c
src/lib/evas/canvas/evas_textblock_legacy.h
src/tests/evas/evas_test_textblock.c

index 7103ae9..d2064c8 100644 (file)
@@ -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 \
index 41c44e7..fc477e8 100644 (file)
@@ -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 \
index 5ce8de7..82888d2 100644 (file)
@@ -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);
index 49ad15d..2a438d5 100644 (file)
@@ -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");
 
index b9d54a8..0b12c47 100644 (file)
@@ -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]]
index 0281353..e996c23 100644 (file)
@@ -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;
index 7440427..e5a41de 100644 (file)
@@ -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);
 
index d834c99..9cb8772 100644 (file)
@@ -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 {
index de0017e..07da8b5 100644 (file)
@@ -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 {
index 8581042..7dd6b08 100644 (file)
@@ -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"
 /**
  * @}
index 3822d52..184dbba 100644 (file)
@@ -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.Rectangle>),
+                         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.Rectangle>),
+                         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<ptr(Efl.Canvas.Text.Annotation)>),
                  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,113 +326,268 @@ 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.
+      object_item_geometry_get {
+         [[Queries a given object item for its geometry.
 
-           The geometry is represented as rectangles for each of the line
-           segments in the given range [$cur1, $cur2].
+           Note that the provided annotation should be an object item type.
 
-           @since 1.19
+           @since 1.18
          ]]
          legacy: null;
          params {
-             @in cur1: const(Efl.Canvas.Text.Cursor); [[Start of range]]
-             @in cur2: const(Efl.Canvas.Text.Cursor); [[End of range]]
+            @in an: ptr(const(Efl.Canvas.Text.Annotation)); [[Given annotation to query]]
+            @out x: int; [[X coordinate of the annotation]]
+            @out y: int; [[Y coordinate of the annotation]]
+            @out w: int; [[Width of the annotation]]
+            @out h: int; [[Height of the annotation]]
          }
-         return: free(own(iterator<Eina.Rectangle>),
-                         eina_iterator_free); [[Iterator on all geoemtries of
-                     the given range]]
+         return: bool; [[$true if given annotation is an object item, $false otherwise]]
       }
-      range_simple_geometry_get {
-         [[Get the "simple" geometry of a range.
+      annotation_positions_get {
+         [[Sets given cursors to the start and end positions of the annotation.
 
-           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.
+           The cursors $start and $end will be set to the start and end
+           positions of the given annotation $annotation.
 
-           @since 1.19
+           @since 1.18
          ]]
          legacy: null;
          params {
-             @in cur1: const(Efl.Canvas.Text.Cursor); [[Start of range]]
-             @in cur2: const(Efl.Canvas.Text.Cursor); [[End of range]]
+             @in annotation: ptr(const(Efl.Canvas.Text.Annotation)); [[Annotation
+                 handle to query]]
+             @in start: ptr(Efl.Canvas.Text.Cursor); [[Cursor to be set to the start
+             position of the annotation in the text]]
+             @in end: ptr(Efl.Canvas.Text.Cursor); [[Cursor to be set to the end
+             position of the annotation in the text]]
          }
-         return: free(own(iterator<Eina.Rectangle>),
-                         eina_iterator_free); [[Iterator on all simple
-                     geometries of the given range]]
       }
-      range_delete {
-         [[Deletes the range between given cursors.
+      // Cursor
+      @property cursor {
+         [[The object's main cursor.
 
-           This removes all the text in given range [$start,$end].
+           @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 {
-            @in cur1: Efl.Canvas.Text.Cursor; [[Range start position]]
-            @in cur2: Efl.Canvas.Text.Cursor; [[Range end position]]
+            cur: ptr(Efl.Canvas.Text.Cursor);
          }
       }
-      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]]
+      cursor_equal {
+         legacy: null;
          params {
-            @in start: Efl.Canvas.Text.Cursor; [[Range start position]]
-            @in end: Efl.Canvas.Text.Cursor; [[Range end position]]
+            cur1: ptr(const(Efl.Canvas.Text.Cursor));
+            cur2: ptr(const(Efl.Canvas.Text.Cursor));
          }
+         return: bool;
       }
-      range_text_get {
-         [[Returns the text in the range between $cur1 and $cur2.
-
-           @since 1.18
-         ]]
+      cursor_compare {
          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]]
+            cur1: ptr(const(Efl.Canvas.Text.Cursor));
+            cur2: ptr(const(Efl.Canvas.Text.Cursor));
          }
+         return: int;
       }
-      object_item_geometry_get {
-         [[Queries a given object item for its geometry.
-
-           Note that the provided annotation should be an object item type.
-
-           @since 1.18
+      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 {
-            @in an: ptr(const(Efl.Canvas.Text.Annotation)); [[Given annotation to query]]
-            @out x: int; [[X coordinate of the annotation]]
-            @out y: int; [[Y coordinate of the annotation]]
-            @out w: int; [[Width of the annotation]]
-            @out h: int; [[Height of the annotation]]
+            cur: ptr(Efl.Canvas.Text.Cursor);
+            @in text: string; [[Text to append (UTF-8 format).]]
          }
-         return: bool; [[$true if given annotation is an object item, $false otherwise]]
+         return: int; [[Length of the appended text.]]
       }
-      annotation_positions_get {
-         [[Sets given cursors to the start and end positions of the annotation.
-
-           The cursors $start and $end will be set to the start and end
-           positions of the given annotation $annotation.
+      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.
 
-           @since 1.18
+           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 annotation: ptr(const(Efl.Canvas.Text.Annotation)); [[Annotation
-                 handle to query]]
-             @in start: 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
-             position of the annotation in the text]]
+            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 {
@@ -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 (file)
index fdc8734..0000000
+++ /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;
-   }
-}
index 4336914..067fdc0 100644 (file)
@@ -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,14 +9025,16 @@ _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(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_last(cur);
-   efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL);
+   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, "</%s>", 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"
index 3179a76..62650aa 100644 (file)
@@ -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"
 /**
  * @}
index b3b78df..00b7863 100644 (file)
@@ -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);