summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Hacohen <tom@stosb.com>2016-06-22 13:43:02 +0100
committerTom Hacohen <tom@stosb.com>2016-06-22 14:03:06 +0100
commit56562b1643554b720f5a9b3b16a07dfb629c9da1 (patch)
tree07b7cf2b15fbc6ace19c201dd9e2f4e30c9101c8
parent3dc4490a999e4d1df8463d3587e1ccca82d44f6e (diff)
downloadefl-56562b1643554b720f5a9b3b16a07dfb629c9da1.tar.gz
Canvas text: Add missing cursor changed callbacks.
In some cases we were changing the cursors but not emitting callbacks. This should fix that.
-rw-r--r--src/lib/evas/canvas/evas_object_textblock.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c
index 69b86bd1ba..85c3e9867f 100644
--- a/src/lib/evas/canvas/evas_object_textblock.c
+++ b/src/lib/evas/canvas/evas_object_textblock.c
@@ -486,6 +486,7 @@ struct _Efl_Canvas_Text_Cursor
Evas_Object *obj;
size_t pos;
Evas_Object_Textblock_Node_Text *node;
+ Eina_Bool changed : 1;
};
typedef struct _Efl_Canvas_Text_Cursor Efl_Canvas_Text_Cursor_Data;
@@ -7014,6 +7015,17 @@ evas_textblock_string_escape_get(const char *string, int *len_ret)
return _escaped_char_match(string, len_ret);
}
+static void
+_cursor_emit_if_changed(Efl_Canvas_Text_Cursor *cur_obj)
+{
+ Efl_Canvas_Text_Cursor_Data *cur = eo_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS);
+ if (cur->changed)
+ {
+ cur->changed = EINA_FALSE;
+ eo_event_callback_call(cur_obj, EFL_CANVAS_TEXT_CURSOR_EVENT_CHANGED, NULL);
+ }
+}
+
/**
* @internal
* prepends the escaped char beteewn s and s_end to the curosr
@@ -9654,6 +9666,7 @@ _evas_textblock_cursors_set_node(Efl_Canvas_Text_Data *o,
{
cur->pos = 0;
cur->node = new_node;
+ cur->changed = EINA_TRUE;
}
EINA_LIST_FOREACH(o->cursors, l, data_obj)
{
@@ -9663,6 +9676,7 @@ _evas_textblock_cursors_set_node(Efl_Canvas_Text_Data *o,
{
data->pos = 0;
data->node = new_node;
+ data->changed = EINA_TRUE;
}
}
}
@@ -9699,6 +9713,7 @@ _evas_textblock_cursors_update_offset(const Efl_Canvas_Text_Cursor_Data *cur,
{
ocur->pos += offset;
}
+ ocur->changed = EINA_TRUE;
}
}
EINA_LIST_FOREACH(o->cursors, l, data_obj)
@@ -9717,11 +9732,13 @@ _evas_textblock_cursors_update_offset(const Efl_Canvas_Text_Cursor_Data *cur,
{
data->pos += offset;
}
+ data->changed = EINA_TRUE;
}
else if (!data->node)
{
data->node = o->text_nodes;
data->pos = 0;
+ data->changed = EINA_TRUE;
}
}
}
@@ -9738,6 +9755,8 @@ static void
_evas_textblock_changed(Efl_Canvas_Text_Data *o, Evas_Object *eo_obj)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+ Eina_List *l;
+ Efl_Canvas_Text_Cursor *data_obj;
LYDBG("ZZ: invalidate 1 %p\n", eo_obj);
o->formatted.valid = 0;
o->native.valid = 0;
@@ -9748,6 +9767,12 @@ _evas_textblock_changed(Efl_Canvas_Text_Data *o, Evas_Object *eo_obj)
o->markup_text = NULL;
}
+ _cursor_emit_if_changed(o->cursor);
+ EINA_LIST_FOREACH(o->cursors, l, data_obj)
+ {
+ _cursor_emit_if_changed(data_obj);
+ }
+
evas_object_change(eo_obj, obj);
}
@@ -9810,6 +9835,7 @@ _evas_textblock_cursor_text_append(Efl_Canvas_Text_Cursor_Data *cur, const char
{
n = cur->node = o->text_nodes;
cur->pos = 0;
+ cur->changed = EINA_TRUE;
}
else
{
@@ -9818,6 +9844,7 @@ _evas_textblock_cursor_text_append(Efl_Canvas_Text_Cursor_Data *cur, const char
EINA_INLIST_GET(o->text_nodes),
EINA_INLIST_GET(n)));
cur->node = n;
+ cur->changed = EINA_TRUE;
}
eina_ustrbuf_insert_length(n->unicode, text, len, cur->pos);
@@ -10074,6 +10101,7 @@ _evas_textblock_cursor_format_append(Efl_Canvas_Text_Cursor_Data *cur,
_NODE_FORMAT(EINA_INLIST_GET(n)->prev)->text_node :
o->text_nodes;
cur->node = n->text_node;
+ cur->changed = EINA_TRUE;
}
else
{
@@ -10284,6 +10312,7 @@ _evas_textblock_cursor_char_delete(Efl_Canvas_Text_Cursor_Data *cur)
{
cur->node = n2;
cur->pos = 0;
+ cur->changed = EINA_TRUE;
}
}
@@ -10395,6 +10424,7 @@ _efl_canvas_text_range_delete(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *pd E
-cur1->pos);
_evas_textblock_cursors_update_offset(cur2, cur2->node, 0, -cur2->pos);
cur2->pos = 0;
+ cur2->changed = EINA_TRUE;
_evas_textblock_nodes_merge(o, n1);
}
fnode = _evas_textblock_cursor_node_format_at_pos_get(cur1);
@@ -12229,11 +12259,13 @@ _evas_object_textblock_clear(Evas_Object *eo_obj)
co = eo_data_scope_get(o->cursor, EFL_CANVAS_TEXT_CURSOR_CLASS);
co->node = NULL;
co->pos = 0;
+ co->changed = EINA_TRUE;
EINA_LIST_FOREACH(o->cursors, l, cur)
{
co = eo_data_scope_get(cur, EFL_CANVAS_TEXT_CURSOR_CLASS);
co->node = NULL;
co->pos = 0;
+ co->changed = EINA_TRUE;
}
_evas_textblock_changed(o, eo_obj);