From 62840fe30b2d93a5475d7728dc63b624ab0fe9f9 Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Sun, 30 Jan 2011 10:32:09 +0000 Subject: [PATCH] Evas textblock: Fixed evas_textblock_cursor_geometry_get with the cursor type: EVAS_TEXTBLOCK_CURSOR_BEFORE. SVN revision: 56414 --- .../src/lib/canvas/evas_object_textblock.c | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/legacy/evas/src/lib/canvas/evas_object_textblock.c b/legacy/evas/src/lib/canvas/evas_object_textblock.c index b139bc756a..89ab0d7d6b 100644 --- a/legacy/evas/src/lib/canvas/evas_object_textblock.c +++ b/legacy/evas/src/lib/canvas/evas_object_textblock.c @@ -6704,7 +6704,6 @@ evas_textblock_cursor_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord { int ret = -1; const Evas_Textblock_Cursor *dir_cur; - Evas_Textblock_Cursor cur2; dir_cur = cur; if (ctype == EVAS_TEXTBLOCK_CURSOR_UNDER) @@ -6713,42 +6712,59 @@ evas_textblock_cursor_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord } else if (ctype == EVAS_TEXTBLOCK_CURSOR_BEFORE) { - /*FIXME: Rough sketch, not yet implemented - VERY buggy. */ /* In the case of a "before cursor", we should get the coordinates * of just after the previous char (which in bidi text may not be * just before the current char). */ Evas_Coord x, y, h, w; + Evas_Textblock_Cursor cur2; + Evas_Object_Textblock_Node_Format *fmt; + + cur2.obj = cur->obj; + evas_textblock_cursor_copy(cur, &cur2); + cur2.pos--; + fmt = _evas_textblock_cursor_node_format_at_pos_get(&cur2); /* If it's at the end of the line, we want to get the position, not * the position of the previous */ if ((cur->pos > 0) && !_evas_textblock_cursor_is_at_the_end(cur)) { - dir_cur = &cur2; - cur2.obj = cur->obj; - evas_textblock_cursor_copy(cur, &cur2); - cur2.pos--; - ret = evas_textblock_cursor_char_geometry_get(&cur2, &x, &y, &w, &h); + Eina_Bool before_char = EINA_FALSE; + if (!fmt || + !_IS_LINE_SEPARATOR(eina_strbuf_string_get(fmt->format))) + { + dir_cur = &cur2; + before_char = EINA_FALSE; + } + else + { + before_char = EINA_TRUE; + } + ret = evas_textblock_cursor_char_geometry_get( + dir_cur, &x, &y, &w, &h); #ifdef BIDI_SUPPORT /* Adjust if the char is an rtl char */ if (ret >= 0) { Evas_BiDi_Props props; - props.props = cur2.node->bidi_props; + props.props = dir_cur->node->bidi_props; props.start = 0; - if (evas_bidi_is_rtl_char(&props, cur2.pos)) + if ((!before_char && + evas_bidi_is_rtl_char(&props, dir_cur->pos)) || + (before_char && + !evas_bidi_is_rtl_char(&props, dir_cur->pos))) + { /* Just don't advance the width */ w = 0; } } #endif - } else { - ret = evas_textblock_cursor_char_geometry_get(cur, &x, &y, &w, &h); - w = 0; + ret = evas_textblock_cursor_char_geometry_get( + dir_cur, &x, &y, &w, &h); } if (ret >= 0) {