{
int ret = -1;
const Evas_Textblock_Cursor *dir_cur;
- Evas_Textblock_Cursor cur2;
dir_cur = cur;
if (ctype == EVAS_TEXTBLOCK_CURSOR_UNDER)
}
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)
{