From 25d756472643474ea7fbf0d17ae849c82f1b61ee Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Sun, 15 Aug 2010 16:04:34 +0000 Subject: [PATCH] Evas textblock: Fixed the bug with going up/down lines when the cursor points to an . With this fix I also fixed a couple of potential bugs with cursor geometry in places with mixed visible+invisible formatting. SVN revision: 51133 --- .../src/lib/canvas/evas_object_textblock.c | 24 ++++++++++++------- .../src/lib/engines/common/evas_bidi_utils.h | 2 ++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/legacy/evas/src/lib/canvas/evas_object_textblock.c b/legacy/evas/src/lib/canvas/evas_object_textblock.c index a7652b71e6..91517bf126 100644 --- a/legacy/evas/src/lib/canvas/evas_object_textblock.c +++ b/legacy/evas/src/lib/canvas/evas_object_textblock.c @@ -4681,7 +4681,7 @@ evas_textblock_cursor_line_char_first(Evas_Textblock_Cursor *cur) { _find_layout_format_item_line_match(cur->obj, _evas_textblock_node_visible_at_pos_get( - _evas_textblock_cursor_node_format_before_or_at_pos_get(cur)), + _evas_textblock_cursor_node_format_at_pos_get(cur)), &ln, &fi); } else @@ -4734,7 +4734,7 @@ evas_textblock_cursor_line_char_last(Evas_Textblock_Cursor *cur) { _find_layout_format_item_line_match(cur->obj, _evas_textblock_node_visible_at_pos_get( - _evas_textblock_cursor_node_format_before_or_at_pos_get(cur)), + _evas_textblock_cursor_node_format_at_pos_get(cur)), &ln, &fi); } else @@ -4786,9 +4786,11 @@ _evas_textblock_format_is_visible(const char *s) { if (!s) return EINA_FALSE; const char *item; + Eina_Bool is_opener = EINA_TRUE; if (s[0] == '+' || s[0] == '-') { + is_opener = (s[0] == '+') ? EINA_TRUE : EINA_FALSE; s++; } while ((item = _format_parse(&s))) @@ -4797,10 +4799,13 @@ _evas_textblock_format_is_visible(const char *s) tmp = alloca(s - item + 1); strncpy(tmp, item, s - item); tmp[s - item] = '\0'; + /* We care about all of the formats even after a - except for + * item which we don't care after a - because it's just a standard + * closing */ if (((!strcmp(item, "\n")) || (!strcmp(item, "\\n"))) || ((!strcmp(item, "\t")) || (!strcmp(item, "\\t"))) || (!strcmp(item, "ps")) || - (!strcmp(item, "item"))) + (!strncmp(item, "item", 4) && is_opener)) /*FIXME: formats like item2 will break it. */ return EINA_TRUE; } return EINA_FALSE; @@ -6109,8 +6114,9 @@ evas_textblock_cursor_char_geometry_get(const Evas_Textblock_Cursor *cur, Evas_C if (!o->formatted.valid) _relayout(cur->obj); if (evas_textblock_cursor_format_is_visible_get(cur)) { - _find_layout_format_item_line_match(cur->obj, - _evas_textblock_cursor_node_format_at_pos_get(cur), + _find_layout_format_item_line_match(cur->obj, + _evas_textblock_node_visible_at_pos_get( + _evas_textblock_cursor_node_format_at_pos_get(cur)), &ln, &fi); } else @@ -6202,7 +6208,7 @@ evas_textblock_cursor_line_geometry_get(const Evas_Textblock_Cursor *cur, Evas_C { _find_layout_format_item_line_match(cur->obj, _evas_textblock_node_visible_at_pos_get( - _evas_textblock_cursor_node_format_before_or_at_pos_get(cur)), + _evas_textblock_cursor_node_format_at_pos_get(cur)), &ln, &fi); } else @@ -6446,11 +6452,13 @@ evas_textblock_cursor_format_item_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Object_Textblock_Format_Item *fi = NULL; Evas_Coord x, y, w, h; - if (!cur) return 0; + if (!cur || !evas_textblock_cursor_format_is_visible_get(cur)) return 0; o = (Evas_Object_Textblock *)(cur->obj->object_data); if (!o->formatted.valid) _relayout(cur->obj); _find_layout_format_item_line_match(cur->obj, - _evas_textblock_cursor_node_format_before_or_at_pos_get(cur), &ln, &fi); + _evas_textblock_node_visible_at_pos_get( + _evas_textblock_cursor_node_format_at_pos_get(cur)), + &ln, &fi); if ((!ln) || (!fi)) return 0; x = ln->x + fi->x; y = ln->y + ln->baseline + fi->y; diff --git a/legacy/evas/src/lib/engines/common/evas_bidi_utils.h b/legacy/evas/src/lib/engines/common/evas_bidi_utils.h index 6902cd7dd7..0d516754a0 100644 --- a/legacy/evas/src/lib/engines/common/evas_bidi_utils.h +++ b/legacy/evas/src/lib/engines/common/evas_bidi_utils.h @@ -80,6 +80,8 @@ struct _Evas_BiDi_Props { #ifdef USE_FRIBIDI + + #define EVAS_BIDI_PARAGRAPH_NATURAL FRIBIDI_PAR_ON #define EVAS_BIDI_PARAGRAPH_LTR FRIBIDI_PAR_LTR #define EVAS_BIDI_PARAGRAPH_RTL FRIBIDI_PAR_RTL