summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHermet Park <chuneon.park@samsung.com>2020-08-13 13:13:10 +0900
committerHermet Park <chuneon.park@samsung.com>2020-08-13 13:13:10 +0900
commitffe68563876046e980465e180f82aa2a4ca37b96 (patch)
tree69d9fea8146537ba8e819c88f165f5640ba70590
parent55ac49256c835868557099d8a666c84497ac8081 (diff)
parent812e9f9f09e4789284536ea7fc10634e0c1148b7 (diff)
Merge branch 'master' into devs/hermet/lottie
-rw-r--r--src/bin/embryo/embryo_cc_sc1.c16
-rw-r--r--src/lib/ecore_input/ecore_input_joystick.c2
-rw-r--r--src/lib/ecore_wl2/ecore_wl2_subsurf.c3
-rw-r--r--src/lib/edje/edje_edit.c11
-rw-r--r--src/lib/edje/edje_embryo.c18
-rw-r--r--src/lib/edje/edje_entry.c158
-rw-r--r--src/lib/edje/edje_program.c2
-rw-r--r--src/lib/efl_canvas_wl/efl_canvas_wl.c1
-rw-r--r--src/lib/elementary/efl_ui_internal_text_interactive.c20
-rw-r--r--src/lib/elementary/efl_ui_textbox.c26
-rw-r--r--src/lib/elementary/efl_ui_textbox.eo1
-rw-r--r--src/lib/elementary/efl_ui_timepicker.c4
-rw-r--r--src/lib/elementary/elm_access.c1
-rw-r--r--src/lib/elementary/elm_code_widget.c27
-rw-r--r--src/lib/elementary/elm_gengrid.c4
-rw-r--r--src/lib/elput/elput_logind.c41
-rw-r--r--src/lib/eo/eo_base_class.c77
-rw-r--r--src/lib/evas/canvas/evas_object_textblock.c498
-rw-r--r--src/lib/evas/common/evas_image_main.c1
-rw-r--r--src/lib/evas/filters/evas_filter_parser.c2
-rw-r--r--src/lib/evil/evil_main.c11
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_core.c8
-rw-r--r--src/modules/evas/engines/wayland_shm/evas_engine.c2
-rw-r--r--src/tests/elementary/efl_ui_test_text.c24
-rw-r--r--src/tests/elementary/elm_test_entry.c2
-rw-r--r--src/tests/eo/signals/signals_main.c31
-rw-r--r--src/tests/evas/evas_test_textblock.c21
27 files changed, 565 insertions, 447 deletions
diff --git a/src/bin/embryo/embryo_cc_sc1.c b/src/bin/embryo/embryo_cc_sc1.c
index 1189ce807b..8f25be75b5 100644
--- a/src/bin/embryo/embryo_cc_sc1.c
+++ b/src/bin/embryo/embryo_cc_sc1.c
@@ -266,7 +266,7 @@ sc_compile(int argc, char *argv[])
266 void *inpfmark; 266 void *inpfmark;
267 char lcl_ctrlchar; 267 char lcl_ctrlchar;
268 int lcl_packstr, lcl_needsemicolon, lcl_tabsize; 268 int lcl_packstr, lcl_needsemicolon, lcl_tabsize;
269 Eina_Tmpstr *outfname; 269 Eina_Tmpstr *outfname = NULL;
270 270
271 /* set global variables to their initial value */ 271 /* set global variables to their initial value */
272 binf = NULL; 272 binf = NULL;
@@ -398,8 +398,11 @@ sc_compile(int argc, char *argv[])
398 } /* if */ 398 } /* if */
399 if (outf) 399 if (outf)
400 sc_closeasm(outf); 400 sc_closeasm(outf);
401 unlink(outfname); 401 if (outfname)
402 eina_tmpstr_del(outfname); 402 {
403 unlink(outfname);
404 eina_tmpstr_del(outfname);
405 }
403 if (binf) 406 if (binf)
404 sc_closebin(binf, errnum != 0); 407 sc_closebin(binf, errnum != 0);
405 408
@@ -1203,10 +1206,8 @@ declloc(int fstatic)
1203 if (numdim > 0 && dim[numdim - 1] == 0) 1206 if (numdim > 0 && dim[numdim - 1] == 0)
1204 error(52); /* only last dimension may be variable length */ 1207 error(52); /* only last dimension may be variable length */
1205 size = needsub(&idxtag[numdim]); /* get size; size==0 for "var[]" */ 1208 size = needsub(&idxtag[numdim]); /* get size; size==0 for "var[]" */
1206#if INT_MAX < CELL_MAX 1209 if ((unsigned long long)size * sizeof(cell) > MIN(INT_MAX, CELL_MAX))
1207 if (size > INT_MAX)
1208 error(105); /* overflow, exceeding capacity */ 1210 error(105); /* overflow, exceeding capacity */
1209#endif
1210 dim[numdim++] = (int)size; 1211 dim[numdim++] = (int)size;
1211 } /* while */ 1212 } /* while */
1212 if (ident == iARRAY || fstatic) 1213 if (ident == iARRAY || fstatic)
@@ -1237,6 +1238,9 @@ declloc(int fstatic)
1237 } 1238 }
1238 else 1239 else
1239 { 1240 {
1241 if (((unsigned long long)declared + (unsigned long long)size) * sizeof(cell) >
1242 MIN(INT_MAX, CELL_MAX))
1243 error(105);
1240 declared += (int)size; /* variables are put on stack, 1244 declared += (int)size; /* variables are put on stack,
1241 * adjust "declared" */ 1245 * adjust "declared" */
1242 sym = 1246 sym =
diff --git a/src/lib/ecore_input/ecore_input_joystick.c b/src/lib/ecore_input/ecore_input_joystick.c
index 28f527bc89..7793c3bf35 100644
--- a/src/lib/ecore_input/ecore_input_joystick.c
+++ b/src/lib/ecore_input/ecore_input_joystick.c
@@ -484,7 +484,7 @@ _joystick_register(const char* syspath)
484 mapper = _joystick_mapping_info_get(syspath); 484 mapper = _joystick_mapping_info_get(syspath);
485 if (!mapper) 485 if (!mapper)
486 { 486 {
487 ERR("Unsupported joystick."); 487 WRN("Unsupported joystick.");
488 goto register_failed; 488 goto register_failed;
489 } 489 }
490 490
diff --git a/src/lib/ecore_wl2/ecore_wl2_subsurf.c b/src/lib/ecore_wl2/ecore_wl2_subsurf.c
index 980c2eed47..5409fd2b26 100644
--- a/src/lib/ecore_wl2/ecore_wl2_subsurf.c
+++ b/src/lib/ecore_wl2/ecore_wl2_subsurf.c
@@ -65,6 +65,9 @@ ecore_wl2_subsurface_new(Ecore_Wl2_Window *window)
65 goto sub_surf_err; 65 goto sub_surf_err;
66 } 66 }
67 67
68 /* A sub-surface is initially in the synchronized mode. */
69 subsurf->sync = EINA_TRUE;
70
68 window->subsurfs = 71 window->subsurfs =
69 eina_inlist_append(window->subsurfs, EINA_INLIST_GET(subsurf)); 72 eina_inlist_append(window->subsurfs, EINA_INLIST_GET(subsurf));
70 73
diff --git a/src/lib/edje/edje_edit.c b/src/lib/edje/edje_edit.c
index 1dad199055..4ee1f03580 100644
--- a/src/lib/edje/edje_edit.c
+++ b/src/lib/edje/edje_edit.c
@@ -6292,6 +6292,7 @@ _edje_edit_state_alloc(int type, Edje *ed)
6292 Edje_Part_Description_Common *pd = NULL; 6292 Edje_Part_Description_Common *pd = NULL;
6293 6293
6294 ce = eina_hash_find(ed->file->collection, ed->group); 6294 ce = eina_hash_find(ed->file->collection, ed->group);
6295 if (!ce) return NULL;
6295 6296
6296 switch (type) 6297 switch (type)
6297 { 6298 {
@@ -13361,7 +13362,7 @@ _edje_generate_source_of_style(Edje *ed, const char *name, Eina_Strbuf *buf)
13361} 13362}
13362 13363
13363static Eina_Bool 13364static Eina_Bool
13364_edje_generate_source_of_program(Evas_Object *obj, const char *program, Eina_Strbuf *buf) 13365_edje_generate_source_of_program(Evas_Object *obj, const char *prog, Eina_Strbuf *buf)
13365{ 13366{
13366 Eina_List *l, *ll; 13367 Eina_List *l, *ll;
13367 const char *s; 13368 const char *s;
@@ -13370,15 +13371,13 @@ _edje_generate_source_of_program(Evas_Object *obj, const char *program, Eina_Str
13370 Eina_Bool ret = EINA_TRUE; 13371 Eina_Bool ret = EINA_TRUE;
13371 Eina_Bool no_transition = EINA_FALSE; 13372 Eina_Bool no_transition = EINA_FALSE;
13372 const char *api_name, *api_description; 13373 const char *api_name, *api_description;
13373 Edje_Program *epr;
13374 int tweenmode = 0; 13374 int tweenmode = 0;
13375 13375
13376 GET_ED_OR_RETURN(EINA_FALSE); 13376 GET_ED_OR_RETURN(EINA_FALSE);
13377 GET_EED_OR_RETURN(EINA_FALSE); 13377 GET_EED_OR_RETURN(EINA_FALSE);
13378 GET_EPR_OR_RETURN(EINA_FALSE);
13378 13379
13379 epr = _edje_program_get_byname(obj, program); 13380 BUF_APPENDF(I3 "program { name: \"%s\";\n", prog);
13380
13381 BUF_APPENDF(I3 "program { name: \"%s\";\n", program);
13382 13381
13383 /* Signal */ 13382 /* Signal */
13384 s = eina_stringshare_add(epr->signal); 13383 s = eina_stringshare_add(epr->signal);
@@ -13414,7 +13413,7 @@ _edje_generate_source_of_program(Evas_Object *obj, const char *program, Eina_Str
13414 if (epr->state) 13413 if (epr->state)
13415 { 13414 {
13416 BUF_APPENDF(I4 "action: STATE_SET \"%s\" %.2f;\n", epr->state, 13415 BUF_APPENDF(I4 "action: STATE_SET \"%s\" %.2f;\n", epr->state,
13417 edje_edit_program_value_get(obj, program)); 13416 edje_edit_program_value_get(obj, prog));
13418 } 13417 }
13419 break; 13418 break;
13420 13419
diff --git a/src/lib/edje/edje_embryo.c b/src/lib/edje/edje_embryo.c
index df102b35b8..bb3828ab3d 100644
--- a/src/lib/edje/edje_embryo.c
+++ b/src/lib/edje/edje_embryo.c
@@ -2089,6 +2089,11 @@ _edje_embryo_fn_custom_state(Embryo_Program *ep, Embryo_Cell *params)
2089 if (!(parent = _edje_part_description_find(ed, rp, name, val, EINA_TRUE))) 2089 if (!(parent = _edje_part_description_find(ed, rp, name, val, EINA_TRUE)))
2090 return 0; 2090 return 0;
2091 2091
2092 rp->custom = eina_mempool_malloc(_edje_real_part_state_mp, sizeof (Edje_Real_Part_State));
2093 if (!rp->custom) return 0;
2094
2095 memset(rp->custom, 0, sizeof (Edje_Real_Part_State));
2096
2092 /* now create the custom state */ 2097 /* now create the custom state */
2093 switch (rp->part->type) 2098 switch (rp->part->type)
2094 { 2099 {
@@ -2102,8 +2107,9 @@ case EDJE_PART_TYPE_##Short: \
2102 Edje_Part_Description_##Type * new; \ 2107 Edje_Part_Description_##Type * new; \
2103 tmp = (Edje_Part_Description_##Type *)parent; \ 2108 tmp = (Edje_Part_Description_##Type *)parent; \
2104 new = calloc(1, sizeof (Edje_Part_Description_##Type)); \ 2109 new = calloc(1, sizeof (Edje_Part_Description_##Type)); \
2110 if (!new) break; \
2105 new->Spec = tmp->Spec; \ 2111 new->Spec = tmp->Spec; \
2106 d = &new->common; \ 2112 To = &new->common; \
2107 break; \ 2113 break; \
2108} 2114}
2109 2115
@@ -2122,17 +2128,13 @@ case EDJE_PART_TYPE_##Short: \
2122 ALLOC_COPY_DESC(VECTOR, Vector, d, vg); 2128 ALLOC_COPY_DESC(VECTOR, Vector, d, vg);
2123 } 2129 }
2124 2130
2125 if (!d) return 0; 2131 if (!d)
2126
2127 rp->custom = eina_mempool_malloc(_edje_real_part_state_mp, sizeof (Edje_Real_Part_State));
2128 if (!rp->custom)
2129 { 2132 {
2130 free(d); 2133 eina_mempool_free(_edje_real_part_state_mp, rp->custom);
2134 rp->custom = NULL;
2131 return 0; 2135 return 0;
2132 } 2136 }
2133 2137
2134 memset(rp->custom, 0, sizeof (Edje_Real_Part_State));
2135
2136 *d = *parent; 2138 *d = *parent;
2137 2139
2138 d->state.name = (char *)eina_stringshare_add("custom"); 2140 d->state.name = (char *)eina_stringshare_add("custom");
diff --git a/src/lib/edje/edje_entry.c b/src/lib/edje/edje_entry.c
index 81046a3716..442a5c6d38 100644
--- a/src/lib/edje/edje_entry.c
+++ b/src/lib/edje/edje_entry.c
@@ -1196,79 +1196,82 @@ _anchors_update(Evas_Textblock_Cursor *c EINA_UNUSED, Evas_Object *o, Entry *en)
1196 free(sel); 1196 free(sel);
1197 an->sel = eina_list_remove_list(an->sel, an->sel); 1197 an->sel = eina_list_remove_list(an->sel, an->sel);
1198 } 1198 }
1199 Evas_Textblock_Rectangle *r, *r_last; 1199 if (range)
1200
1201 r = range->data;
1202 r_last = eina_list_last_data_get(range);
1203 if (r->y != r_last->y)
1204 {
1205 /* For multiple range */
1206 r->h = r->y + r_last->y + r_last->h;
1207 }
1208 /* For vertically layout entry */
1209 if (_is_anchors_outside_viewport(y, r->y, r->h, vy, tvh))
1210 {
1211 EINA_LIST_FREE(range, r)
1212 free(r);
1213 continue;
1214 }
1215 else
1216 { 1200 {
1217 /* XXX: Should consider for horizontal entry but has 1201 Evas_Textblock_Rectangle *r, *r_last;
1218 * very minimal usage. Probably we should get the min x
1219 * and max w for range and then decide whether it is in
1220 * the viewport or not. Unnecessary calculation for this
1221 * minimal usage. Please test with large number of anchors
1222 * after implementing it, if its needed to be.
1223 */
1224 }
1225 for (ll = range; ll; ll = eina_list_next(ll))
1226 {
1227 Evas_Object *ob;
1228 1202
1229 sel = calloc(1, sizeof(Sel)); 1203 r = range->data;
1230 if (!sel) 1204 r_last = eina_list_last_data_get(range);
1205 if (r->y != r_last->y)
1231 { 1206 {
1232 ERR("Running very low on memory"); 1207 /* For multiple range */
1233 break; 1208 r->h = r->y + r_last->y + r_last->h;
1234 } 1209 }
1235 an->sel = eina_list_append(an->sel, sel); 1210 /* For vertically layout entry */
1236 if (en->rp->part->source5) 1211 if (_is_anchors_outside_viewport(y, r->y, r->h, vy, tvh))
1237 { 1212 {
1238 ob = edje_object_add(ed->base.evas); 1213 EINA_LIST_FREE(range, r)
1239 edje_object_file_set(ob, ed->path, en->rp->part->source5); 1214 free(r);
1240 evas_object_smart_member_add(ob, smart); 1215 continue;
1241 evas_object_stack_below(ob, o);
1242 evas_object_clip_set(ob, clip);
1243 evas_object_pass_events_set(ob, EINA_TRUE);
1244 sel->obj_bg = ob;
1245 _edje_subobj_register(ed, sel->obj_bg);
1246 } 1216 }
1247 1217 else
1248 if (en->rp->part->source6) 1218 {
1219 /* XXX: Should consider for horizontal entry but has
1220 * very minimal usage. Probably we should get the min x
1221 * and max w for range and then decide whether it is in
1222 * the viewport or not. Unnecessary calculation for this
1223 * minimal usage. Please test with large number of anchors
1224 * after implementing it, if its needed to be.
1225 */
1226 }
1227 for (ll = range; ll; ll = eina_list_next(ll))
1249 { 1228 {
1250 ob = edje_object_add(ed->base.evas); 1229 Evas_Object *ob;
1251 edje_object_file_set(ob, ed->path, en->rp->part->source6); 1230
1231 sel = calloc(1, sizeof(Sel));
1232 if (!sel)
1233 {
1234 ERR("Running very low on memory");
1235 break;
1236 }
1237 an->sel = eina_list_append(an->sel, sel);
1238 if (en->rp->part->source5)
1239 {
1240 ob = edje_object_add(ed->base.evas);
1241 edje_object_file_set(ob, ed->path, en->rp->part->source5);
1242 evas_object_smart_member_add(ob, smart);
1243 evas_object_stack_below(ob, o);
1244 evas_object_clip_set(ob, clip);
1245 evas_object_pass_events_set(ob, EINA_TRUE);
1246 sel->obj_bg = ob;
1247 _edje_subobj_register(ed, sel->obj_bg);
1248 }
1249
1250 if (en->rp->part->source6)
1251 {
1252 ob = edje_object_add(ed->base.evas);
1253 edje_object_file_set(ob, ed->path, en->rp->part->source6);
1254 evas_object_smart_member_add(ob, smart);
1255 evas_object_stack_above(ob, o);
1256 evas_object_clip_set(ob, clip);
1257 evas_object_pass_events_set(ob, EINA_TRUE);
1258 sel->obj_fg = ob;
1259 _edje_subobj_register(ed, sel->obj_fg);
1260 }
1261
1262 ob = evas_object_rectangle_add(ed->base.evas);
1263 evas_object_color_set(ob, 0, 0, 0, 0);
1252 evas_object_smart_member_add(ob, smart); 1264 evas_object_smart_member_add(ob, smart);
1253 evas_object_stack_above(ob, o); 1265 evas_object_stack_above(ob, o);
1254 evas_object_clip_set(ob, clip); 1266 evas_object_clip_set(ob, clip);
1255 evas_object_pass_events_set(ob, EINA_TRUE); 1267 evas_object_repeat_events_set(ob, EINA_TRUE);
1256 sel->obj_fg = ob; 1268 evas_object_event_callback_add(ob, EVAS_CALLBACK_MOUSE_DOWN, _edje_anchor_mouse_down_cb, an);
1257 _edje_subobj_register(ed, sel->obj_fg); 1269 evas_object_event_callback_add(ob, EVAS_CALLBACK_MOUSE_UP, _edje_anchor_mouse_up_cb, an);
1270 evas_object_event_callback_add(ob, EVAS_CALLBACK_MOUSE_MOVE, _edje_anchor_mouse_move_cb, an);
1271 evas_object_event_callback_add(ob, EVAS_CALLBACK_MOUSE_IN, _edje_anchor_mouse_in_cb, an);
1272 evas_object_event_callback_add(ob, EVAS_CALLBACK_MOUSE_OUT, _edje_anchor_mouse_out_cb, an);
1273 sel->obj = ob;
1258 } 1274 }
1259
1260 ob = evas_object_rectangle_add(ed->base.evas);
1261 evas_object_color_set(ob, 0, 0, 0, 0);
1262 evas_object_smart_member_add(ob, smart);
1263 evas_object_stack_above(ob, o);
1264 evas_object_clip_set(ob, clip);
1265 evas_object_repeat_events_set(ob, EINA_TRUE);
1266 evas_object_event_callback_add(ob, EVAS_CALLBACK_MOUSE_DOWN, _edje_anchor_mouse_down_cb, an);
1267 evas_object_event_callback_add(ob, EVAS_CALLBACK_MOUSE_UP, _edje_anchor_mouse_up_cb, an);
1268 evas_object_event_callback_add(ob, EVAS_CALLBACK_MOUSE_MOVE, _edje_anchor_mouse_move_cb, an);
1269 evas_object_event_callback_add(ob, EVAS_CALLBACK_MOUSE_IN, _edje_anchor_mouse_in_cb, an);
1270 evas_object_event_callback_add(ob, EVAS_CALLBACK_MOUSE_OUT, _edje_anchor_mouse_out_cb, an);
1271 sel->obj = ob;
1272 } 1275 }
1273 } 1276 }
1274 1277
@@ -1737,13 +1740,6 @@ _compose_seq_reset(Entry *en)
1737 en->composing = EINA_FALSE; 1740 en->composing = EINA_FALSE;
1738} 1741}
1739 1742
1740#define KEYCODE_A 65
1741#define KEYCODE_C 67
1742#define KEYCODE_V 86
1743#define KEYCODE_X 88
1744#define KEYCODE_Y 89
1745#define KEYCODE_Z 90
1746
1747static void 1743static void
1748_edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) 1744_edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1749{ 1745{
@@ -2085,9 +2081,9 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
2085 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; 2081 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2086 } 2082 }
2087#if defined(__APPLE__) && defined(__MACH__) 2083#if defined(__APPLE__) && defined(__MACH__)
2088 else if ((super) && (!shift) && (!strcmp(ev->keyname, "v"))) 2084 else if ((super) && (!shift) && (!strcmp(ev->key, "v")))
2089#else 2085#else
2090 else if ((control) && (!shift) && (!strcmp(ev->keyname, "v"))) 2086 else if ((control) && (!shift) && (!strcmp(ev->key, "v")))
2091#endif 2087#endif
2092 { 2088 {
2093 _compose_seq_reset(en); 2089 _compose_seq_reset(en);
@@ -2096,9 +2092,9 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
2096 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; 2092 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2097 } 2093 }
2098#if defined(__APPLE__) && defined(__MACH__) 2094#if defined(__APPLE__) && defined(__MACH__)
2099 else if ((super) && (!strcmp(ev->keyname, "a") || ev->keycode == KEYCODE_A)) 2095 else if ((super) && (!strcmp(ev->key, "a")))
2100#else 2096#else
2101 else if ((control) && (!strcmp(ev->keyname, "a") || ev->keycode == KEYCODE_A)) 2097 else if ((control) && (!strcmp(ev->key, "a")))
2102#endif 2098#endif
2103 { 2099 {
2104 _compose_seq_reset(en); 2100 _compose_seq_reset(en);
@@ -2114,9 +2110,9 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
2114 } 2110 }
2115 } 2111 }
2116#if defined(__APPLE__) && defined(__MACH__) 2112#if defined(__APPLE__) && defined(__MACH__)
2117 else if ((super) && (((!shift) && (!strcmp(ev->keyname, "c") || ev->keycode == KEYCODE_C)) || !strcmp(ev->key, "Insert"))) 2113 else if ((super) && (((!shift) && !strcmp(ev->key, "c")) || !strcmp(ev->key, "Insert")))
2118#else 2114#else
2119 else if ((control) && (((!shift) && (!strcmp(ev->keyname, "c") || ev->keycode == KEYCODE_C)) || !strcmp(ev->key, "Insert"))) 2115 else if ((control) && (((!shift) && !strcmp(ev->key, "c")) || !strcmp(ev->key, "Insert")))
2120#endif 2116#endif
2121 { 2117 {
2122 _compose_seq_reset(en); 2118 _compose_seq_reset(en);
@@ -2124,9 +2120,9 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
2124 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; 2120 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2125 } 2121 }
2126#if defined(__APPLE__) && defined(__MACH__) 2122#if defined(__APPLE__) && defined(__MACH__)
2127 else if ((super) && (!shift) && (((!strcmp(ev->keyname, "x") || ev->keycode == KEYCODE_X) || (!strcmp(ev->keyname, "m"))))) 2123 else if ((super) && (!shift) && ((!strcmp(ev->key, "x") || (!strcmp(ev->key, "m")))))
2128#else 2124#else
2129 else if ((control) && (!shift) && (((!strcmp(ev->keyname, "x") || ev->keycode == KEYCODE_X) || (!strcmp(ev->keyname, "m"))))) 2125 else if ((control) && (!shift) && ((!strcmp(ev->key, "x") || (!strcmp(ev->key, "m")))))
2130#endif 2126#endif
2131 { 2127 {
2132 _compose_seq_reset(en); 2128 _compose_seq_reset(en);
@@ -2134,9 +2130,9 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
2134 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; 2130 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2135 } 2131 }
2136#if defined(__APPLE__) && defined(__MACH__) 2132#if defined(__APPLE__) && defined(__MACH__)
2137 else if ((super) && (!strcmp(ev->keyname, "z") || ev->keycode == KEYCODE_Z)) 2133 else if ((super) && (!strcmp(ev->key, "z")))
2138#else 2134#else
2139 else if ((control) && (!strcmp(ev->keyname, "z") || ev->keycode == KEYCODE_Z)) 2135 else if ((control) && (!strcmp(ev->key, "z")))
2140#endif 2136#endif
2141 { 2137 {
2142 _compose_seq_reset(en); 2138 _compose_seq_reset(en);
@@ -2153,9 +2149,9 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
2153 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; 2149 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2154 } 2150 }
2155#if defined(__APPLE__) && defined(__MACH__) 2151#if defined(__APPLE__) && defined(__MACH__)
2156 else if ((super) && (!shift) && (!strcmp(ev->keyname, "y") || ev->keycode == KEYCODE_Y)) 2152 else if ((super) && (!shift) && (!strcmp(ev->key, "y")))
2157#else 2153#else
2158 else if ((control) && (!shift) && (!strcmp(ev->keyname, "y") || ev->keycode == KEYCODE_Y)) 2154 else if ((control) && (!shift) && (!strcmp(ev->key, "y")))
2159#endif 2155#endif
2160 { 2156 {
2161 _compose_seq_reset(en); 2157 _compose_seq_reset(en);
diff --git a/src/lib/edje/edje_program.c b/src/lib/edje/edje_program.c
index f823c871a2..875bd1d3fd 100644
--- a/src/lib/edje/edje_program.c
+++ b/src/lib/edje/edje_program.c
@@ -1350,7 +1350,7 @@ _edje_seat_emit(Edje *ed, Efl_Input_Device *dev, const char *sig, const char *sr
1350 if (dev) seat = efl_input_device_seat_get(dev); 1350 if (dev) seat = efl_input_device_seat_get(dev);
1351 if (seat) 1351 if (seat)
1352 { 1352 {
1353 sname = strdup(efl_name_get(seat)); 1353 sname = eina_strdup(efl_name_get(seat));
1354 mdata = _edje_signal_data_setup(NULL, NULL, sname, free); 1354 mdata = _edje_signal_data_setup(NULL, NULL, sname, free);
1355 } 1355 }
1356 /* keep sending old style signals for legacy compatibility, but provide */ 1356 /* keep sending old style signals for legacy compatibility, but provide */
diff --git a/src/lib/efl_canvas_wl/efl_canvas_wl.c b/src/lib/efl_canvas_wl/efl_canvas_wl.c
index 6430ff84a0..15f5c255b2 100644
--- a/src/lib/efl_canvas_wl/efl_canvas_wl.c
+++ b/src/lib/efl_canvas_wl/efl_canvas_wl.c
@@ -4170,6 +4170,7 @@ static void
4170comp_render_pre_proxied(Eo *o, Evas *e, void *event_info) 4170comp_render_pre_proxied(Eo *o, Evas *e, void *event_info)
4171{ 4171{
4172 Comp_Surface *cs = evas_object_data_get(o, "comp_surface"); 4172 Comp_Surface *cs = evas_object_data_get(o, "comp_surface");
4173 EINA_SAFETY_ON_NULL_RETURN(cs);
4173 Comp_Buffer *buffer = cs->buffer[!cs->render_queue]; 4174 Comp_Buffer *buffer = cs->buffer[!cs->render_queue];
4174 4175
4175 //fprintf(stderr, "PROXY RENDER_PRE %d\n", buffer ? wl_resource_get_id(buffer->res) : -1); 4176 //fprintf(stderr, "PROXY RENDER_PRE %d\n", buffer ? wl_resource_get_id(buffer->res) : -1);
diff --git a/src/lib/elementary/efl_ui_internal_text_interactive.c b/src/lib/elementary/efl_ui_internal_text_interactive.c
index 9906afb2dc..d1d374adb3 100644
--- a/src/lib/elementary/efl_ui_internal_text_interactive.c
+++ b/src/lib/elementary/efl_ui_internal_text_interactive.c
@@ -1186,16 +1186,14 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void
1186 { 1186 {
1187 if (multiline) 1187 if (multiline)
1188 { 1188 {
1189 //FIXME this should be Fixed when multiline set works fine with PARAGRAPH_SEPARATOR 1189 if (shift || efl_canvas_textblock_newline_as_paragraph_separator_get(obj))
1190 //Now only \n can work with multiline set
1191 //if (shift || efl_canvas_textblock_newline_as_paragraph_separator_get(obj))
1192 { 1190 {
1193 string = "\n"; 1191 string = "\n";
1194 } 1192 }
1195 /*else 1193 else
1196 { 1194 {
1197 string = _PARAGRAPH_SEPARATOR_UTF8; 1195 string = _PARAGRAPH_SEPARATOR_UTF8;
1198 }*/ 1196 }
1199 } 1197 }
1200 } 1198 }
1201 1199
@@ -1377,9 +1375,9 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void
1377 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; 1375 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
1378 } 1376 }
1379#if defined(__APPLE__) && defined(__MACH__) 1377#if defined(__APPLE__) && defined(__MACH__)
1380 else if ((super) && (!strcmp(ev->keyname, "a"))) 1378 else if ((super) && (!strcmp(ev->key, "a")))
1381#else 1379#else
1382 else if ((control) && (!strcmp(ev->keyname, "a"))) 1380 else if ((control) && (!strcmp(ev->key, "a")))
1383#endif 1381#endif
1384 { 1382 {
1385 _compose_seq_reset(en); 1383 _compose_seq_reset(en);
@@ -1395,9 +1393,9 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void
1395 } 1393 }
1396 } 1394 }
1397#if defined(__APPLE__) && defined(__MACH__) 1395#if defined(__APPLE__) && defined(__MACH__)
1398 else if ((super) && (!strcmp(ev->keyname, "z"))) 1396 else if ((super) && (!strcmp(ev->key, "z")))
1399#else 1397#else
1400 else if ((control) && (!strcmp(ev->keyname, "z"))) 1398 else if ((control) && (!strcmp(ev->key, "z")))
1401#endif 1399#endif
1402 { 1400 {
1403 _compose_seq_reset(en); 1401 _compose_seq_reset(en);
@@ -1414,9 +1412,9 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void
1414 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; 1412 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
1415 } 1413 }
1416#if defined(__APPLE__) && defined(__MACH__) 1414#if defined(__APPLE__) && defined(__MACH__)
1417 else if ((super) && (!shift) && (!strcmp(ev->keyname, "y"))) 1415 else if ((super) && (!shift) && (!strcmp(ev->key, "y")))
1418#else 1416#else
1419 else if ((control) && (!shift) && (!strcmp(ev->keyname, "y"))) 1417 else if ((control) && (!shift) && (!strcmp(ev->key, "y")))
1420#endif 1418#endif
1421 { 1419 {
1422 _compose_seq_reset(en); 1420 _compose_seq_reset(en);
diff --git a/src/lib/elementary/efl_ui_textbox.c b/src/lib/elementary/efl_ui_textbox.c
index bd97b47db7..22c731f94b 100644
--- a/src/lib/elementary/efl_ui_textbox.c
+++ b/src/lib/elementary/efl_ui_textbox.c
@@ -99,6 +99,7 @@ struct _Efl_Ui_Textbox_Data
99 Eina_Bool text_changed : 1; 99 Eina_Bool text_changed : 1;
100 Eina_Bool calc_force : 1; 100 Eina_Bool calc_force : 1;
101 Eina_Bool cursor_update : 1; 101 Eina_Bool cursor_update : 1;
102 Eina_Bool color_is_set : 1;
102}; 103};
103 104
104struct _Anchor 105struct _Anchor
@@ -1607,13 +1608,18 @@ _update_text_theme(Eo *obj, Efl_Ui_Textbox_Data *sd)
1607 } 1608 }
1608 1609
1609 // color 1610 // color
1610 if (disabled) 1611 if (!sd->color_is_set)
1611 colorcode = efl_layout_group_data_get(wd->resize_obj, "style.color_disabled"); 1612 {
1612 if (!colorcode) 1613 // If user set color by him self, we will not change it back even if
1613 colorcode = efl_layout_group_data_get(wd->resize_obj, "style.color"); 1614 // control become disabled.
1614 if (colorcode && _format_color_parse(colorcode, strlen(colorcode), &r, &g, &b, &a)) 1615 if (disabled)
1615 { 1616 colorcode = efl_layout_group_data_get(wd->resize_obj, "style.color_disabled");
1616 efl_text_color_set(sd->text_obj, r, g, b, a); 1617 if (!colorcode)
1618 colorcode = efl_layout_group_data_get(wd->resize_obj, "style.color");
1619 if (colorcode && _format_color_parse(colorcode, strlen(colorcode), &r, &g, &b, &a))
1620 {
1621 efl_text_color_set(sd->text_obj, r, g, b, a);
1622 }
1617 } 1623 }
1618 1624
1619 // Guide Text 1625 // Guide Text
@@ -1811,6 +1817,12 @@ _efl_ui_textbox_efl_text_format_password_set(Eo *obj, Efl_Ui_Textbox_Data *sd, E
1811 } 1817 }
1812} 1818}
1813 1819
1820EOLIAN static void
1821_efl_ui_textbox_efl_text_style_text_color_set(Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *pd, unsigned char r, unsigned char g, unsigned char b, unsigned char a)
1822{
1823 pd->color_is_set = EINA_TRUE;
1824 efl_text_color_set(pd->text_obj, r, g, b, a);
1825}
1814static void 1826static void
1815_efl_ui_textbox_calc_force(Eo *obj, Efl_Ui_Textbox_Data *sd) 1827_efl_ui_textbox_calc_force(Eo *obj, Efl_Ui_Textbox_Data *sd)
1816{ 1828{
diff --git a/src/lib/elementary/efl_ui_textbox.eo b/src/lib/elementary/efl_ui_textbox.eo
index 9cd5c520b5..1c63b602a1 100644
--- a/src/lib/elementary/efl_ui_textbox.eo
+++ b/src/lib/elementary/efl_ui_textbox.eo
@@ -112,6 +112,7 @@ class Efl.Ui.Textbox extends Efl.Ui.Layout_Base implements Efl.Input.Clickable,
112 Efl.Ui.Widget.disabled {set;} 112 Efl.Ui.Widget.disabled {set;}
113 Efl.Text_Format.password {set;} 113 Efl.Text_Format.password {set;}
114 Efl.Text_Format.multiline {set;} 114 Efl.Text_Format.multiline {set;}
115 Efl.Text_Style.text_color { set; }
115 Efl.Access.Object.state_set { get; } 116 Efl.Access.Object.state_set { get; }
116 Efl.Access.Object.i18n_name { get; } 117 Efl.Access.Object.i18n_name { get; }
117 Efl.Access.Text.access_text { get; } 118 Efl.Access.Text.access_text { get; }
diff --git a/src/lib/elementary/efl_ui_timepicker.c b/src/lib/elementary/efl_ui_timepicker.c
index d66ed0e853..9dfcd89b14 100644
--- a/src/lib/elementary/efl_ui_timepicker.c
+++ b/src/lib/elementary/efl_ui_timepicker.c
@@ -90,14 +90,14 @@ _field_changed_cb(void *data, const Efl_Event *ev)
90 if (ev->object == pd->hour) 90 if (ev->object == pd->hour)
91 { 91 {
92 pd->cur_time[TIMEPICKER_HOUR] = efl_ui_range_value_get(pd->hour); 92 pd->cur_time[TIMEPICKER_HOUR] = efl_ui_range_value_get(pd->hour);
93 if (!pd->is_24hour && !strcmp(efl_text_get(pd->ampm), "PM")) 93 if (!pd->is_24hour && eina_streq(efl_text_get(pd->ampm), "PM"))
94 pd->cur_time[TIMEPICKER_HOUR] += 12; 94 pd->cur_time[TIMEPICKER_HOUR] += 12;
95 } 95 }
96 else if (ev->object == pd->min) 96 else if (ev->object == pd->min)
97 pd->cur_time[TIMEPICKER_MIN] = efl_ui_range_value_get(pd->min); 97 pd->cur_time[TIMEPICKER_MIN] = efl_ui_range_value_get(pd->min);
98 else 98 else
99 { 99 {
100 if (!strcmp(efl_text_get(pd->ampm), "PM")) 100 if (eina_streq(efl_text_get(pd->ampm), "PM"))
101 { 101 {
102 efl_text_set(pd->ampm, "AM"); 102 efl_text_set(pd->ampm, "AM");
103 pd->cur_time[TIMEPICKER_HOUR] -= 12; 103 pd->cur_time[TIMEPICKER_HOUR] -= 12;
diff --git a/src/lib/elementary/elm_access.c b/src/lib/elementary/elm_access.c
index 9b33f4de40..75329e51b6 100644
--- a/src/lib/elementary/elm_access.c
+++ b/src/lib/elementary/elm_access.c
@@ -520,6 +520,7 @@ _access_highlight_next_get(Evas_Object *obj, Elm_Focus_Direction dir)
520 if (ho) 520 if (ho)
521 { 521 {
522 Elm_Access_Info *info = _elm_access_info_get(ho); 522 Elm_Access_Info *info = _elm_access_info_get(ho);
523 EINA_SAFETY_ON_NULL_RETURN_VAL(info, ret);
523 if (type == ELM_ACCESS_ACTION_HIGHLIGHT_NEXT && info->next) 524 if (type == ELM_ACCESS_ACTION_HIGHLIGHT_NEXT && info->next)
524 target = info->next; 525 target = info->next;
525 else if (type == ELM_ACCESS_ACTION_HIGHLIGHT_PREV && info->prev) 526 else if (type == ELM_ACCESS_ACTION_HIGHLIGHT_PREV && info->prev)
diff --git a/src/lib/elementary/elm_code_widget.c b/src/lib/elementary/elm_code_widget.c
index 0507abd909..59298a0462 100644
--- a/src/lib/elementary/elm_code_widget.c
+++ b/src/lib/elementary/elm_code_widget.c
@@ -1811,17 +1811,6 @@ _elm_code_widget_key_down_cb(void *data, Evas *evas EINA_UNUSED,
1811 1811
1812 _elm_code_widget_selection_type_set(widget, ELM_CODE_WIDGET_SELECTION_KEYBOARD); 1812 _elm_code_widget_selection_type_set(widget, ELM_CODE_WIDGET_SELECTION_KEYBOARD);
1813 _elm_code_widget_selection_in_progress_set(widget, EINA_TRUE); 1813 _elm_code_widget_selection_in_progress_set(widget, EINA_TRUE);
1814
1815 if (pd->selection && pd->selection->start_line == pd->selection->end_line)
1816 {
1817 if ((pd->selection->end_col == pd->selection->start_col && !backwards) ||
1818 (pd->selection->end_col > pd->selection->start_col))
1819 elm_code_widget_cursor_position_set(widget, pd->selection->end_line, pd->selection->end_col+1);
1820 }
1821 else if (pd->selection && pd->selection->end_line > pd->selection->start_line)
1822 {
1823 elm_code_widget_cursor_position_set(widget, pd->selection->end_line, pd->selection->end_col+1);
1824 }
1825 } 1814 }
1826 else 1815 else
1827 elm_code_widget_selection_clear(widget); 1816 elm_code_widget_selection_clear(widget);
@@ -1853,6 +1842,20 @@ _elm_code_widget_key_down_cb(void *data, Evas *evas EINA_UNUSED,
1853 1842
1854 elm_code_widget_selection_end(widget, pd->cursor_line, pd->cursor_col - (adjust?1:0)); 1843 elm_code_widget_selection_end(widget, pd->cursor_line, pd->cursor_col - (adjust?1:0));
1855 _elm_code_widget_selection_in_progress_set(widget, EINA_FALSE); 1844 _elm_code_widget_selection_in_progress_set(widget, EINA_FALSE);
1845
1846 if (pd->selection)
1847 {
1848 if (pd->selection->end_line < pd->selection->start_line)
1849 {
1850 elm_code_widget_cursor_position_set(widget, pd->selection->end_line, pd->selection->end_col);
1851 }
1852 else if ((pd->selection->end_col == pd->selection->start_col && !backwards) ||
1853 (pd->selection->end_col > pd->selection->start_col) ||
1854 (pd->selection->end_line > pd->selection->start_line))
1855 {
1856 elm_code_widget_cursor_position_set(widget, pd->selection->end_line, pd->selection->end_col+1);
1857 }
1858 }
1856 } 1859 }
1857 } 1860 }
1858 1861
@@ -2121,7 +2124,7 @@ _elm_code_widget_resize(Elm_Code_Widget *widget, Elm_Code_Line *newline)
2121 if (!newline && viewport) 2124 if (!newline && viewport)
2122 { 2125 {
2123 /* Where possible render additional lines to the viewport. */ 2126 /* Where possible render additional lines to the viewport. */
2124 _elm_code_widget_fill_range(widget, pd, first_row, last_row + 64 < (unsigned int) h ? last_row + 64 : last_row, NULL); 2127 _elm_code_widget_fill_range(widget, pd, first_row, last_row + 64, NULL);
2125 return; 2128 return;
2126 } 2129 }
2127 2130
diff --git a/src/lib/elementary/elm_gengrid.c b/src/lib/elementary/elm_gengrid.c
index baf4f8a56f..132b7aa14f 100644
--- a/src/lib/elementary/elm_gengrid.c
+++ b/src/lib/elementary/elm_gengrid.c
@@ -2849,6 +2849,7 @@ _item_move_cb(void *data, double pos)
2849 double frame = pos; 2849 double frame = pos;
2850 Evas_Coord xx1, yy1, xx2, yy2; 2850 Evas_Coord xx1, yy1, xx2, yy2;
2851 double dx, dy; 2851 double dx, dy;
2852 Eina_Bool ret = EINA_TRUE;
2852 2853
2853 switch (sd->reorder.tween_mode) 2854 switch (sd->reorder.tween_mode)
2854 { 2855 {
@@ -2910,10 +2911,11 @@ _item_move_cb(void *data, double pos)
2910 efl_event_callback_legacy_call 2911 efl_event_callback_legacy_call
2911 (sd->obj, ELM_GENGRID_EVENT_MOVED, EO_OBJ(sd->reorder.it1)); 2912 (sd->obj, ELM_GENGRID_EVENT_MOVED, EO_OBJ(sd->reorder.it1));
2912 sd->reorder.running = EINA_FALSE; 2913 sd->reorder.running = EINA_FALSE;
2914 ret = EINA_FALSE;
2913 } 2915 }
2914 _elm_widget_focus_highlight_start(sd->obj); 2916 _elm_widget_focus_highlight_start(sd->obj);
2915 2917
2916 return EINA_TRUE; 2918 return ret;
2917} 2919}
2918 2920
2919static void 2921static void
diff --git a/src/lib/elput/elput_logind.c b/src/lib/elput/elput_logind.c
index 09aeece0ec..5182aefdbe 100644
--- a/src/lib/elput/elput_logind.c
+++ b/src/lib/elput/elput_logind.c
@@ -37,13 +37,42 @@ _elput_sd_init(void)
37 } 37 }
38 if (!_libsystemd) 38 if (!_libsystemd)
39 { 39 {
40 _libsystemd = eina_module_new("libelogind-shared.so.0"); 40 const char *s = getenv("EFL_ELOGIND_LIB");
41 if (_libsystemd) 41
42 if (s)
43 {
44 _libsystemd = eina_module_new(s);
45 if (_libsystemd)
46 {
47 if (!eina_module_load(_libsystemd))
48 {
49 eina_module_free(_libsystemd);
50 _libsystemd = NULL;
51 }
52 }
53 }
54 if (!_libsystemd)
55 {
56 _libsystemd = eina_module_new("libelogind-shared.so.0");
57 if (_libsystemd)
58 {
59 if (!eina_module_load(_libsystemd))
60 {
61 eina_module_free(_libsystemd);
62 _libsystemd = NULL;
63 }
64 }
65 }
66 if (!_libsystemd)
42 { 67 {
43 if (!eina_module_load(_libsystemd)) 68 _libsystemd = eina_module_new("libelogind.so.0");
69 if (_libsystemd)
44 { 70 {
45 eina_module_free(_libsystemd); 71 if (!eina_module_load(_libsystemd))
46 _libsystemd = NULL; 72 {
73 eina_module_free(_libsystemd);
74 _libsystemd = NULL;
75 }
47 } 76 }
48 } 77 }
49 } 78 }
@@ -52,7 +81,7 @@ _elput_sd_init(void)
52 _libsystemd_broken = EINA_TRUE; 81 _libsystemd_broken = EINA_TRUE;
53 return; 82 return;
54 } 83 }
55 // sd_session_get_vt == newere in systemd 207 84 // sd_session_get_vt == newer in systemd 207
56 _elput_sd_session_get_vt = 85 _elput_sd_session_get_vt =
57 eina_module_symbol_get(_libsystemd, "sd_session_get_vt"); 86 eina_module_symbol_get(_libsystemd, "sd_session_get_vt");
58 // sd_session_get_tty == older api in ssystemd 198 87 // sd_session_get_tty == older api in ssystemd 198
diff --git a/src/lib/eo/eo_base_class.c b/src/lib/eo/eo_base_class.c
index 565f4805e8..e7445021bd 100644
--- a/src/lib/eo/eo_base_class.c
+++ b/src/lib/eo/eo_base_class.c
@@ -38,6 +38,7 @@ struct _Efl_Event_Forwarder
38 38
39struct _Efl_Event_Callback_Frame 39struct _Efl_Event_Callback_Frame
40{ 40{
41 const Efl_Event_Description *desc;
41 Efl_Event_Callback_Frame *next; 42 Efl_Event_Callback_Frame *next;
42 unsigned int idx; 43 unsigned int idx;
43 unsigned int inserted_before; 44 unsigned int inserted_before;
@@ -65,8 +66,6 @@ struct _Efl_Object_Data
65 66
66 Efl_Object_Extension *ext; 67 Efl_Object_Extension *ext;
67 68
68 Eina_Inlist *current;
69
70 Efl_Event_Callback_Frame *event_frame; 69 Efl_Event_Callback_Frame *event_frame;
71 Eo_Callback_Description **callbacks; 70 Eo_Callback_Description **callbacks;
72#ifdef EFL64 71#ifdef EFL64
@@ -238,9 +237,9 @@ _efl_invalidate(_Eo_Object *obj)
238 237
239 id = _eo_obj_id_get(obj); 238 id = _eo_obj_id_get(obj);
240 239
241 efl_event_callback_call(id, EFL_EVENT_INVALIDATE, NULL);
242
243 pd = efl_data_scope_get(id, EFL_OBJECT_CLASS); 240 pd = efl_data_scope_get(id, EFL_OBJECT_CLASS);
241 if (pd->event_cb_EFL_EVENT_INVALIDATE)
242 efl_event_callback_call(id, EFL_EVENT_INVALIDATE, NULL);
244 243
245 efl_invalidate(id); 244 efl_invalidate(id);
246 245
@@ -1576,7 +1575,8 @@ _efl_object_event_callback_priority_add(Eo *obj, Efl_Object_Data *pd,
1576 _eo_callbacks_sorted_insert(pd, cb); 1575 _eo_callbacks_sorted_insert(pd, cb);
1577 _special_event_count_inc(obj, pd, &(cb->items.item)); 1576 _special_event_count_inc(obj, pd, &(cb->items.item));
1578 1577
1579 efl_event_callback_call(obj, EFL_EVENT_CALLBACK_ADD, (void *)arr); 1578 if (pd->event_cb_EFL_EVENT_CALLBACK_ADD)
1579 efl_event_callback_call(obj, EFL_EVENT_CALLBACK_ADD, (void *)arr);
1580 1580
1581 return EINA_TRUE; 1581 return EINA_TRUE;
1582 1582
@@ -1602,8 +1602,8 @@ _efl_object_event_callback_clean(Eo *obj, Efl_Object_Data *pd,
1602 pd->need_cleaning = EINA_TRUE; 1602 pd->need_cleaning = EINA_TRUE;
1603 else 1603 else
1604 _eo_callback_remove(obj, pd, cb); 1604 _eo_callback_remove(obj, pd, cb);
1605 1605 if (pd->event_cb_EFL_EVENT_CALLBACK_DEL)
1606 efl_event_callback_call(obj, EFL_EVENT_CALLBACK_DEL, (void *)array); 1606 efl_event_callback_call(obj, EFL_EVENT_CALLBACK_DEL, (void *)array);
1607} 1607}
1608 1608
1609EOLIAN static Eina_Bool 1609EOLIAN static Eina_Bool
@@ -1730,7 +1730,8 @@ _efl_object_event_callback_array_priority_add(Eo *obj, Efl_Object_Data *pd,
1730 ev_array[i].priority = 0; 1730 ev_array[i].priority = 0;
1731 ev_array[i].func = NULL; 1731 ev_array[i].func = NULL;
1732 ev_array[i].user_data = NULL; 1732 ev_array[i].user_data = NULL;
1733 efl_event_callback_call(obj, EFL_EVENT_CALLBACK_ADD, ev_array); 1733 if (pd->event_cb_EFL_EVENT_CALLBACK_ADD)
1734 efl_event_callback_call(obj, EFL_EVENT_CALLBACK_ADD, ev_array);
1734 1735
1735 return EINA_TRUE; 1736 return EINA_TRUE;
1736 1737
@@ -2035,11 +2036,12 @@ _event_callback_call(Eo *obj_id, Efl_Object_Data *pd,
2035 Eina_Bool legacy_compare) 2036 Eina_Bool legacy_compare)
2036{ 2037{
2037 Eo_Callback_Description **cb; 2038 Eo_Callback_Description **cb;
2038 Eo_Current_Callback_Description *lookup, saved; 2039 Efl_Event_Callback_Frame *restart_lookup = NULL; //a pointer to a frame, which is high up the stack, which we use to restore
2039 Efl_Event ev; 2040 Efl_Event ev;
2040 unsigned int idx; 2041 unsigned int idx;
2041 Eina_Bool callback_already_stopped, ret; 2042 Eina_Bool callback_already_stopped, ret;
2042 Efl_Event_Callback_Frame frame = { 2043 Efl_Event_Callback_Frame frame = {
2044 .desc = desc,
2043 .next = NULL, 2045 .next = NULL,
2044 .idx = 0, 2046 .idx = 0,
2045 .inserted_before = 0, 2047 .inserted_before = 0,
@@ -2069,7 +2071,6 @@ _event_callback_call(Eo *obj_id, Efl_Object_Data *pd,
2069 2071
2070 EVENT_STACK_PUSH(pd, &frame); 2072 EVENT_STACK_PUSH(pd, &frame);
2071 2073
2072 lookup = NULL;
2073 callback_already_stopped = pd->callback_stopped; 2074 callback_already_stopped = pd->callback_stopped;
2074 pd->callback_stopped = EINA_FALSE; 2075 pd->callback_stopped = EINA_FALSE;
2075 ret = EINA_TRUE; 2076 ret = EINA_TRUE;
@@ -2109,9 +2110,6 @@ restart_back:
2109 (event_freeze_count || pd->event_freeze_count)) 2110 (event_freeze_count || pd->event_freeze_count))
2110 continue; 2111 continue;
2111 2112
2112 // Handle nested restart of walking list
2113 if (lookup) lookup->current = idx - 1;
2114
2115 it->func((void *) (*cb)->func_data, &ev); 2113 it->func((void *) (*cb)->func_data, &ev);
2116 /* Abort callback calling if the func says so. */ 2114 /* Abort callback calling if the func says so. */
2117 if (pd->callback_stopped) 2115 if (pd->callback_stopped)
@@ -2119,10 +2117,6 @@ restart_back:
2119 ret = EINA_FALSE; 2117 ret = EINA_FALSE;
2120 goto end; 2118 goto end;
2121 } 2119 }
2122 // We have actually walked this list during a nested call
2123 if (lookup &&
2124 lookup->current == 0)
2125 goto end;
2126 } 2120 }
2127 } 2121 }
2128 else 2122 else
@@ -2133,9 +2127,6 @@ restart_back:
2133 (event_freeze_count || pd->event_freeze_count)) 2127 (event_freeze_count || pd->event_freeze_count))
2134 continue; 2128 continue;
2135 2129
2136 // Handle nested restart of walking list
2137 if (lookup) lookup->current = idx - 1;
2138
2139 (*cb)->items.item.func((void *) (*cb)->func_data, &ev); 2130 (*cb)->items.item.func((void *) (*cb)->func_data, &ev);
2140 /* Abort callback calling if the func says so. */ 2131 /* Abort callback calling if the func says so. */
2141 if (pd->callback_stopped) 2132 if (pd->callback_stopped)
@@ -2143,23 +2134,21 @@ restart_back:
2143 ret = EINA_FALSE; 2134 ret = EINA_FALSE;
2144 goto end; 2135 goto end;
2145 } 2136 }
2146 // We have actually walked this list during a nested call
2147 if (lookup &&
2148 lookup->current == 0)
2149 goto end;
2150 } 2137 }
2151 } 2138 }
2152 idx += frame.inserted_before; 2139 /*
2140 * copy back the idx that might have changed due to restarts, (theoretically only needed with restarts, condition made everything slower)
2141 * additionally adjust to event subscriptions that have been added in a event callback
2142 */
2143 idx = frame.idx + frame.inserted_before;
2153 frame.inserted_before = 0; 2144 frame.inserted_before = 0;
2154 } 2145 }
2155 2146
2156end: 2147end:
2157 // Handling restarting list walking complete exit. 2148 // Handling restarting list walking complete exit.
2158 if (lookup) lookup->current = 0; 2149 // This must be 1, we copy back the frame idx at the end of the for loop.
2159 if (lookup == &saved) 2150 // The next iteration then decrements the idx by 1 which results in the effective running idx of that frame beeing 0
2160 { 2151 if (restart_lookup) restart_lookup->idx = 1;
2161 pd->current = eina_inlist_remove(pd->current, EINA_INLIST_GET(lookup));
2162 }
2163 2152
2164 EVENT_STACK_POP(pd); 2153 EVENT_STACK_POP(pd);
2165 2154
@@ -2169,26 +2158,22 @@ end:
2169 2158
2170 return ret; 2159 return ret;
2171restart: 2160restart:
2172 EINA_INLIST_FOREACH(pd->current, lookup) 2161 // Search for the next frame that has the same event description
2162 for (restart_lookup = frame.next; restart_lookup; restart_lookup = restart_lookup->next)
2173 { 2163 {
2174 if (lookup->desc == desc) break; 2164 if (restart_lookup->desc == desc) break;
2175 } 2165 }
2176 2166
2177 // This is the first event to trigger it, so register it here 2167 // Ensure that the idx is the next from the previous run, minimum number 0
2178 if (!lookup) 2168 if (restart_lookup) {
2179 { 2169 idx = restart_lookup->idx - 1;
2180 // This following trick get us a zero allocation list 2170 } else {
2181 saved.desc = desc; 2171 idx = 0;
2182 saved.current = 0; 2172 }
2183 lookup = &saved; 2173 // If this is 0, then we are restarting
2184 // Ideally there will most of the time be only one item in this list 2174 if (!idx)
2185 // But just to speed up things, prepend so we find it fast at the end 2175 idx = pd->callbacks_count;
2186 // of this function
2187 pd->current = eina_inlist_prepend(pd->current, EINA_INLIST_GET(lookup));
2188 }
2189 2176
2190 if (!lookup->current) lookup->current = pd->callbacks_count;
2191 idx = lookup->current;
2192 goto restart_back; 2177 goto restart_back;
2193} 2178}
2194 2179
diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c
index 4c6fc865d8..e9b89dec98 100644
--- a/src/lib/evas/canvas/evas_object_textblock.c
+++ b/src/lib/evas/canvas/evas_object_textblock.c
@@ -578,8 +578,6 @@ static void evas_object_textblock_coords_recalc(Evas_Object *eo_obj,
578 void *type_private_data); 578 void *type_private_data);
579static void _canvas_text_format_changed(Eo *eo_obj, Efl_Canvas_Textblock_Data *o); 579static void _canvas_text_format_changed(Eo *eo_obj, Efl_Canvas_Textblock_Data *o);
580 580
581static void _evas_textblock_cursor_paragraph_first(Efl_Text_Cursor_Handle *cur,
582 Eina_Bool emit_change);
583static const Evas_Object_Func object_func = 581static const Evas_Object_Func object_func =
584{ 582{
585 /* methods (compulsory) */ 583 /* methods (compulsory) */
@@ -968,12 +966,6 @@ _line_free(Evas_Object_Textblock_Line *ln)
968 */ 966 */
969 967
970 968
971/**
972 * @internal
973 * @var escape_values_e_sorted[]
974 * This array consists of Escape_Value structure sorted by escape string
975 * And new added value must be placed sorted position, and reflected on escape_values_v_sorted
976 */
977typedef struct _Escape_Value Escape_Value; 969typedef struct _Escape_Value Escape_Value;
978 970
979struct _Escape_Value 971struct _Escape_Value
@@ -986,7 +978,27 @@ struct _Escape_Value
986 978
987#define ESCAPE_VALUE(e,v) {e,v,strlen(e),strlen(v)} 979#define ESCAPE_VALUE(e,v) {e,v,strlen(e),strlen(v)}
988 980
989static const Escape_Value escape_values_e_sorted[] = { 981/**
982 * @internal
983 * @var html_common_escapes[]
984 * This array consists of most common html escapes values as _Escape_Value structure
985 */
986static const Escape_Value html_common_escapes[] = {
987 ESCAPE_VALUE("&amp;", "\x26"),
988 ESCAPE_VALUE("&apos;", "\x27"),
989 ESCAPE_VALUE("&gt;", "\x3e"),
990 ESCAPE_VALUE("&lt;", "\x3c"),
991 ESCAPE_VALUE("&quot;", "\x22"),
992};
993
994
995/**
996 * @internal
997 * @var escape_values_e_common_sorted[]
998 * This array consists of rest html escapes values as _Escape_Value structure
999 */
1000
1001static const Escape_Value html_escapes[] = {
990 ESCAPE_VALUE("&Aacute;", "\xc3\x81"), 1002 ESCAPE_VALUE("&Aacute;", "\xc3\x81"),
991 ESCAPE_VALUE("&Acirc;", "\xc3\x82"), 1003 ESCAPE_VALUE("&Acirc;", "\xc3\x82"),
992 ESCAPE_VALUE("&Aelig;", "\xc3\x86"), 1004 ESCAPE_VALUE("&Aelig;", "\xc3\x86"),
@@ -1104,7 +1116,7 @@ static const Escape_Value escape_values_e_sorted[] = {
1104 ESCAPE_VALUE("&psi;", "\xce\xa8"), 1116 ESCAPE_VALUE("&psi;", "\xce\xa8"),
1105 ESCAPE_VALUE("&raquo;", "\xc2\xbb"), 1117 ESCAPE_VALUE("&raquo;", "\xc2\xbb"),
1106 ESCAPE_VALUE("&rarr;", "\xe2\x86\x92"), 1118 ESCAPE_VALUE("&rarr;", "\xe2\x86\x92"),
1107 ESCAPE_VALUE("&rarr;", "\xe2\x87\x92"), 1119 ESCAPE_VALUE("&rArr;", "\xe2\x87\x92"),
1108 ESCAPE_VALUE("&reg;", "\xc2\xae"), 1120 ESCAPE_VALUE("&reg;", "\xc2\xae"),
1109 ESCAPE_VALUE("&rho;", "\xce\xa1"), 1121 ESCAPE_VALUE("&rho;", "\xce\xa1"),
1110 ESCAPE_VALUE("&rlm;", "\xe2\x80\x8f"), 1122 ESCAPE_VALUE("&rlm;", "\xe2\x80\x8f"),
@@ -1136,188 +1148,182 @@ static const Escape_Value escape_values_e_sorted[] = {
1136 ESCAPE_VALUE("&zwnj;", "\xe2\x80\x8c"), 1148 ESCAPE_VALUE("&zwnj;", "\xe2\x80\x8c"),
1137}; 1149};
1138 1150
1151static int
1152_escape_key_sort(const void *a, const void *b)
1153{
1154 const char *k_a = (*(const Escape_Value **) a)->escape;
1155 const char *k_b = (*(const Escape_Value **) b)->escape;
1156 return strcmp(k_a, k_b);
1157}
1139 1158
1140/** 1159static int
1141 * @internal 1160_escape_value_sort(const void *a, const void *b)
1142 * @var escape_values_e_common_sorted[] 1161{
1143 * same as escape_values_e_sorted with small subset of common escapes 1162 const char *v_a = (*(const Escape_Value **) a)->value;
1144 */ 1163 const char *v_b = (*(const Escape_Value **) b)->value;
1145static const Escape_Value escape_values_e_common_sorted[] = { 1164 return strcmp(v_a, v_b);
1146 ESCAPE_VALUE("&amp;", "\x26"), 1165}
1147 ESCAPE_VALUE("&apos;", "\x27"),
1148 ESCAPE_VALUE("&gt;", "\x3e"),
1149 ESCAPE_VALUE("&lt;", "\x3c"),
1150 ESCAPE_VALUE("&quot;", "\x22"),
1151};
1152 1166
1153/** 1167static Escape_Value **
1154 * @internal 1168escape_sorted_common_key_copy()
1155 * @var escape_values_v_sorted[] 1169{
1156 * This array consists of Escape_Value structure sorted by escape value 1170 int i;
1157 * And new added value must be placed sorted position, and reflected on escape_values_e_sorted 1171 int len;
1158 */ 1172 const Escape_Value *source;
1159static const Escape_Value escape_values_v_sorted[] = { 1173 int (*compare_fun)(const void*,const void*);
1160 ESCAPE_VALUE("&nbsp;", "\xc2\xa0"),
1161 ESCAPE_VALUE("&iexcl;", "\xc2\xa1"),
1162 ESCAPE_VALUE("&cent;", "\xc2\xa2"),
1163 ESCAPE_VALUE("&pound;", "\xc2\xa3"),
1164 ESCAPE_VALUE("&curren;", "\xc2\xa4"),
1165 ESCAPE_VALUE("&yen;", "\xc2\xa5"),
1166 ESCAPE_VALUE("&brvbar;", "\xc2\xa6"),
1167 ESCAPE_VALUE("&sect;", "\xc2\xa7"),
1168 ESCAPE_VALUE("&uml;", "\xc2\xa8"),
1169 ESCAPE_VALUE("&copy;", "\xc2\xa9"),
1170 ESCAPE_VALUE("&ordf;", "\xc2\xaa"),
1171 ESCAPE_VALUE("&laquo;", "\xc2\xab"),
1172 ESCAPE_VALUE("&not;", "\xc2\xac"),
1173 ESCAPE_VALUE("&shy;", "\xc2\xad"),
1174 ESCAPE_VALUE("&reg;", "\xc2\xae"),
1175 ESCAPE_VALUE("&macr;", "\xc2\xaf"),
1176 ESCAPE_VALUE("&deg;", "\xc2\xb0"),
1177 ESCAPE_VALUE("&plusmn;", "\xc2\xb1"),
1178 ESCAPE_VALUE("&sup2;", "\xc2\xb2"),
1179 ESCAPE_VALUE("&sup3;", "\xc2\xb3"),
1180 ESCAPE_VALUE("&acute;", "\xc2\xb4"),
1181 ESCAPE_VALUE("&micro;", "\xc2\xb5"),
1182 ESCAPE_VALUE("&para;", "\xc2\xb6"),
1183 ESCAPE_VALUE("&middot;", "\xc2\xb7"),
1184 ESCAPE_VALUE("&cedil;", "\xc2\xb8"),
1185 ESCAPE_VALUE("&sup1;", "\xc2\xb9"),
1186 ESCAPE_VALUE("&ordm;", "\xc2\xba"),
1187 ESCAPE_VALUE("&raquo;", "\xc2\xbb"),
1188 ESCAPE_VALUE("&frac14;", "\xc2\xbc"),
1189 ESCAPE_VALUE("&frac12;", "\xc2\xbd"),
1190 ESCAPE_VALUE("&frac34;", "\xc2\xbe"),
1191 ESCAPE_VALUE("&iquest;", "\xc2\xbf"),
1192 ESCAPE_VALUE("&Agrave;", "\xc3\x80"),
1193 ESCAPE_VALUE("&Aacute;", "\xc3\x81"),
1194 ESCAPE_VALUE("&Acirc;", "\xc3\x82"),
1195 ESCAPE_VALUE("&Atilde;", "\xc3\x83"),
1196 ESCAPE_VALUE("&Auml;", "\xc3\x84"),
1197 ESCAPE_VALUE("&Aring;", "\xc3\x85"),
1198 ESCAPE_VALUE("&Aelig;", "\xc3\x86"),
1199 ESCAPE_VALUE("&Ccedil;", "\xc3\x87"),
1200 ESCAPE_VALUE("&Egrave;", "\xc3\x88"),
1201 ESCAPE_VALUE("&Eacute;", "\xc3\x89"),
1202 ESCAPE_VALUE("&Ecirc;", "\xc3\x8a"),
1203 ESCAPE_VALUE("&Euml;", "\xc3\x8b"),
1204 ESCAPE_VALUE("&Igrave;", "\xc3\x8c"),
1205 ESCAPE_VALUE("&Iacute;", "\xc3\x8d"),
1206 ESCAPE_VALUE("&Icirc;", "\xc3\x8e"),
1207 ESCAPE_VALUE("&Iuml;", "\xc3\x8f"),
1208 ESCAPE_VALUE("&Eth;", "\xc3\x90"),
1209 ESCAPE_VALUE("&Ntilde;", "\xc3\x91"),
1210 ESCAPE_VALUE("&Ograve;", "\xc3\x92"),
1211 ESCAPE_VALUE("&Oacute;", "\xc3\x93"),
1212 ESCAPE_VALUE("&Ocirc;", "\xc3\x94"),
1213 ESCAPE_VALUE("&Otilde;", "\xc3\x95"),
1214 ESCAPE_VALUE("&Ouml;", "\xc3\x96"),
1215 ESCAPE_VALUE("&times;", "\xc3\x97"),
1216 ESCAPE_VALUE("&Oslash;", "\xc3\x98"),
1217 ESCAPE_VALUE("&Ugrave;", "\xc3\x99"),
1218 ESCAPE_VALUE("&Uacute;", "\xc3\x9a"),
1219 ESCAPE_VALUE("&Ucirc;", "\xc3\x9b"),
1220 ESCAPE_VALUE("&Yacute;", "\xc3\x9d"),
1221 ESCAPE_VALUE("&Thorn;", "\xc3\x9e"),
1222 ESCAPE_VALUE("&szlig;", "\xc3\x9f"),
1223 ESCAPE_VALUE("&agrave;", "\xc3\xa0"),
1224 ESCAPE_VALUE("&aacute;", "\xc3\xa1"),
1225 ESCAPE_VALUE("&acirc;", "\xc3\xa2"),
1226 ESCAPE_VALUE("&atilde;", "\xc3\xa3"),
1227 ESCAPE_VALUE("&auml;", "\xc3\xa4"),
1228 ESCAPE_VALUE("&aring;", "\xc3\xa5"),
1229 ESCAPE_VALUE("&aelig;", "\xc3\xa6"),
1230 ESCAPE_VALUE("&ccedil;", "\xc3\xa7"),
1231 ESCAPE_VALUE("&egrave;", "\xc3\xa8"),
1232 ESCAPE_VALUE("&eacute;", "\xc3\xa9"),
1233 ESCAPE_VALUE("&ecirc;", "\xc3\xaa"),
1234 ESCAPE_VALUE("&euml;", "\xc3\xab"),
1235 ESCAPE_VALUE("&igrave;", "\xc3\xac"),
1236 ESCAPE_VALUE("&iacute;", "\xc3\xad"),
1237 ESCAPE_VALUE("&icirc;", "\xc3\xae"),
1238 ESCAPE_VALUE("&iuml;", "\xc3\xaf"),
1239 ESCAPE_VALUE("&eth;", "\xc3\xb0"),
1240 ESCAPE_VALUE("&ntilde;", "\xc3\xb1"),
1241 ESCAPE_VALUE("&ograve;", "\xc3\xb2"),
1242 ESCAPE_VALUE("&oacute;", "\xc3\xb3"),
1243 ESCAPE_VALUE("&ocirc;", "\xc3\xb4"),
1244 ESCAPE_VALUE("&otilde;", "\xc3\xb5"),
1245 ESCAPE_VALUE("&ouml;", "\xc3\xb6"),
1246 ESCAPE_VALUE("&divide;", "\xc3\xb7"),
1247 ESCAPE_VALUE("&oslash;", "\xc3\xb8"),
1248 ESCAPE_VALUE("&ugrave;", "\xc3\xb9"),
1249 ESCAPE_VALUE("&uacute;", "\xc3\xba"),
1250 ESCAPE_VALUE("&ucirc;", "\xc3\xbb"),
1251 ESCAPE_VALUE("&uuml;", "\xc3\xbc"),
1252 ESCAPE_VALUE("&yacute;", "\xc3\xbd"),
1253 ESCAPE_VALUE("&thorn;", "\xc3\xbe"),
1254 ESCAPE_VALUE("&yuml;", "\xc3\xbf"),
1255 ESCAPE_VALUE("&alpha;", "\xce\x91"),
1256 ESCAPE_VALUE("&beta;", "\xce\x92"),
1257 ESCAPE_VALUE("&gamma;", "\xce\x93"),
1258 ESCAPE_VALUE("&delta;", "\xce\x94"),
1259 ESCAPE_VALUE("&epsilon;", "\xce\x95"),
1260 ESCAPE_VALUE("&zeta;", "\xce\x96"),
1261 ESCAPE_VALUE("&eta;", "\xce\x97"),
1262 ESCAPE_VALUE("&theta;", "\xce\x98"),
1263 ESCAPE_VALUE("&iota;", "\xce\x99"),
1264 ESCAPE_VALUE("&kappa;", "\xce\x9a"),
1265 ESCAPE_VALUE("&lambda;", "\xce\x9b"),
1266 ESCAPE_VALUE("&mu;", "\xce\x9c"),
1267 ESCAPE_VALUE("&nu;", "\xce\x9d"),
1268 ESCAPE_VALUE("&xi;", "\xce\x9e"),
1269 ESCAPE_VALUE("&omicron;", "\xce\x9f"),
1270 ESCAPE_VALUE("&pi;", "\xce\xa0"),
1271 ESCAPE_VALUE("&rho;", "\xce\xa1"),
1272 ESCAPE_VALUE("&sigma;", "\xce\xa3"),
1273 ESCAPE_VALUE("&tau;", "\xce\xa4"),
1274 ESCAPE_VALUE("&upsilon;", "\xce\xa5"),
1275 ESCAPE_VALUE("&phi;", "\xce\xa6"),
1276 ESCAPE_VALUE("&chi;", "\xce\xa7"),
1277 ESCAPE_VALUE("&psi;", "\xce\xa8"),
1278 ESCAPE_VALUE("&omega;", "\xce\xa9"),
1279 ESCAPE_VALUE("&zwnj;", "\xe2\x80\x8c"),
1280 ESCAPE_VALUE("&zwj;", "\xe2\x80\x8d"),
1281 ESCAPE_VALUE("&lrm;", "\xe2\x80\x8e"),
1282 ESCAPE_VALUE("&rlm;", "\xe2\x80\x8f"),
1283 ESCAPE_VALUE("&dagger;", "\xe2\x80\xa0"),
1284 ESCAPE_VALUE("&Dagger;", "\xe2\x80\xa1"),
1285 ESCAPE_VALUE("&bull;", "\xe2\x80\xa2"),
1286 ESCAPE_VALUE("&hellip;", "\xe2\x80\xa6"),
1287 ESCAPE_VALUE("&euro;", "\xe2\x82\xac"),
1288 ESCAPE_VALUE("&larr;", "\xe2\x86\x90"),
1289 ESCAPE_VALUE("&uarr;", "\xe2\x86\x91"),
1290 ESCAPE_VALUE("&rarr;", "\xe2\x86\x92"),
1291 ESCAPE_VALUE("&darr;", "\xe2\x86\x93"),
1292 ESCAPE_VALUE("&harr;", "\xe2\x86\x94"),
1293 ESCAPE_VALUE("&larr;", "\xe2\x87\x90"),
1294 ESCAPE_VALUE("&rarr;", "\xe2\x87\x92"),
1295 ESCAPE_VALUE("&forall;", "\xe2\x88\x80"),
1296 ESCAPE_VALUE("&exist;", "\xe2\x88\x83"),
1297 ESCAPE_VALUE("&nabla;", "\xe2\x88\x87"),
1298 ESCAPE_VALUE("&prod;", "\xe2\x88\x8f"),
1299 ESCAPE_VALUE("&sum;", "\xe2\x88\x91"),
1300 ESCAPE_VALUE("&and;", "\xe2\x88\xa7"),
1301 ESCAPE_VALUE("&or;", "\xe2\x88\xa8"),
1302 ESCAPE_VALUE("&int;", "\xe2\x88\xab"),
1303 ESCAPE_VALUE("&ne;", "\xe2\x89\xa0"),
1304 ESCAPE_VALUE("&equiv;", "\xe2\x89\xa1"),
1305 ESCAPE_VALUE("&oplus;", "\xe2\x8a\x95"),
1306 ESCAPE_VALUE("&perp;", "\xe2\x8a\xa5"),
1307};
1308 1174
1309/** 1175 len = sizeof(html_common_escapes) / sizeof(Escape_Value);
1310 * @internal 1176 source = html_common_escapes;
1311 * @var escape_values_v_common_sorted[] 1177
1312 * same as escape_values_v_sorted with small subset of common escapes 1178 compare_fun = _escape_key_sort;
1313 */ 1179
1314static const Escape_Value escape_values_v_common_sorted[] = { 1180 Escape_Value **ret_list = malloc(len * sizeof(Escape_Value *));
1315 ESCAPE_VALUE("&quot;", "\x22"), 1181 for (i = 0 ; i < len ; i++)
1316 ESCAPE_VALUE("&amp;", "\x26"), 1182 {
1317 ESCAPE_VALUE("&apos;", "\x27"), 1183 ret_list[i] = (Escape_Value *)(&source[i]);
1318 ESCAPE_VALUE("&lt;", "\x3c"), 1184 }
1319 ESCAPE_VALUE("&gt;", "\x3e"), 1185
1320}; 1186 qsort(&ret_list[0], len, sizeof(Escape_Value *), compare_fun);
1187 return ret_list;
1188}
1189
1190static Escape_Value **
1191escape_sorted_common_value_copy()
1192{
1193 int i;
1194 int len;
1195 const Escape_Value *source;
1196 int (*compare_fun)(const void*,const void*);
1197
1198 len = sizeof(html_common_escapes) / sizeof(Escape_Value);
1199 source = html_common_escapes;
1200
1201 compare_fun = _escape_value_sort;
1202
1203 Escape_Value **ret_list = malloc(len * sizeof(Escape_Value *));
1204 for (i = 0 ; i < len ; i++)
1205 {
1206 ret_list[i] = (Escape_Value *)(&source[i]);
1207 }
1208
1209 qsort(&ret_list[0], len, sizeof(Escape_Value *), compare_fun);
1210 return ret_list;
1211}
1212
1213static Escape_Value **
1214escape_sorted_rest_key_copy()
1215{
1216 int i;
1217 int len;
1218 const Escape_Value *source;
1219 int (*compare_fun)(const void*,const void*);
1220
1221 len = sizeof(html_escapes) / sizeof(Escape_Value);
1222 source = html_escapes;
1223
1224 compare_fun = _escape_key_sort;
1225
1226 Escape_Value **ret_list = malloc(len * sizeof(Escape_Value *));
1227 for (i = 0 ; i < len ; i++)
1228 {
1229 ret_list[i] = (Escape_Value *)(&source[i]);
1230 }
1231
1232 qsort(&ret_list[0], len, sizeof(Escape_Value *), compare_fun);
1233 return ret_list;
1234}
1235
1236static Escape_Value **
1237escape_sorted_rest_value_copy()
1238{
1239 int i;
1240 int len;
1241 const Escape_Value *source;
1242 int (*compare_fun)(const void*,const void*);
1243 len = sizeof(html_escapes) / sizeof(Escape_Value);
1244 source = html_escapes;
1245
1246 compare_fun = _escape_value_sort;
1247
1248 Escape_Value **ret_list = malloc(len * sizeof(Escape_Value *));
1249 for (i = 0 ; i < len ; i++)
1250 {
1251 ret_list[i] = (Escape_Value *)(&source[i]);
1252 }
1253
1254 qsort(&ret_list[0], len, sizeof(Escape_Value *), compare_fun);
1255 return ret_list;
1256}
1257
1258static Escape_Value **
1259get_html_escape_array_common_key_sorted(size_t *p_len)
1260{
1261 static Escape_Value **escape_values_common_k_sorted = NULL;
1262
1263 static size_t common_len = sizeof(html_common_escapes) / sizeof(Escape_Value);
1264
1265 Escape_Value **ret_list = NULL;
1266
1267 if (!escape_values_common_k_sorted)
1268 escape_values_common_k_sorted = escape_sorted_common_key_copy();
1269 ret_list = escape_values_common_k_sorted;
1270 if(p_len) *p_len = common_len;
1271
1272
1273 return ret_list;
1274}
1275
1276static Escape_Value **
1277get_html_escape_array_common_value_sorted(size_t *p_len)
1278{
1279 static Escape_Value **escape_values_common_v_sorted = NULL;
1280
1281 static size_t common_len = sizeof(html_common_escapes) / sizeof(Escape_Value);
1282
1283 Escape_Value **ret_list = NULL;
1284
1285 if (!escape_values_common_v_sorted)
1286 escape_values_common_v_sorted = escape_sorted_common_value_copy();
1287 ret_list = escape_values_common_v_sorted;
1288 if(p_len) *p_len = common_len;
1289
1290
1291 return ret_list;
1292}
1293
1294static Escape_Value **
1295get_html_escape_array_rest_key_sorted(size_t *p_len)
1296{
1297 static Escape_Value **escape_values_k_sorted = NULL;
1298
1299 static size_t rest_len = sizeof(html_escapes) / sizeof(Escape_Value);
1300
1301 Escape_Value **ret_list = NULL;
1302
1303 if (!escape_values_k_sorted)
1304 escape_values_k_sorted = escape_sorted_rest_key_copy();
1305 ret_list = escape_values_k_sorted;
1306 if(p_len) *p_len = rest_len;
1307
1308 return ret_list;
1309}
1310
1311static Escape_Value **
1312get_html_escape_array_rest_value_sorted(size_t *p_len)
1313{
1314 static Escape_Value **escape_values_v_sorted = NULL;
1315
1316 static size_t rest_len = sizeof(html_escapes) / sizeof(Escape_Value);
1317
1318 Escape_Value **ret_list = NULL;
1319
1320 if (!escape_values_v_sorted)
1321 escape_values_v_sorted = escape_sorted_rest_value_copy();
1322 ret_list = escape_values_v_sorted;
1323 if(p_len) *p_len = rest_len;
1324
1325 return ret_list;
1326}
1321 1327
1322/** 1328/**
1323 * @internal 1329 * @internal
@@ -8490,22 +8496,25 @@ _escaped_is_eq_and_advance(const char *s, const char *s_end,
8490 * @param escape_values_len is the len of Escape_Value array 8496 * @param escape_values_len is the len of Escape_Value array
8491 */ 8497 */
8492static int 8498static int
8493_escaped_string_search(const char *s, size_t s_len, const Escape_Value escape_values[], const size_t escape_values_len) 8499_escaped_string_search(const char *s, size_t s_len, Escape_Value **escape_values, const size_t escape_values_len)
8494{ 8500{
8501 if (!escape_values)
8502 return -1;
8503
8495 int l = 0; 8504 int l = 0;
8496 int r = escape_values_len - 1; 8505 int r = escape_values_len - 1;
8497 while (l <= r) 8506 while (l <= r)
8498 { 8507 {
8499 int m = (l + r) / 2; 8508 int m = (l + r) / 2;
8500 int res = strncmp(s, escape_values[m].escape, MAX(escape_values[m].escape_len, s_len)); 8509 int res = strncmp(s, escape_values[m]->escape, MAX(escape_values[m]->escape_len, s_len));
8501 if (res == 0) 8510 if (res == 0)
8502 { 8511 {
8503 //Handle special case when s_len is less than escape_len 8512 //Handle special case when s_len is less than escape_len
8504 //then we will continue searching 8513 //then we will continue searching
8505 //example ("&gt;",1,....) 8514 //example ("&gt;",1,....)
8506 if (escape_values[m].escape_len > s_len) 8515 if (escape_values[m]->escape_len > s_len)
8507 res = -1; 8516 res = -1;
8508 else if (escape_values[m].escape_len < s_len) 8517 else if (escape_values[m]->escape_len < s_len)
8509 res = 1; 8518 res = 1;
8510 else return m; 8519 else return m;
8511 } 8520 }
@@ -8525,14 +8534,17 @@ _escaped_string_search(const char *s, size_t s_len, const Escape_Value escape_va
8525 * @param escape_values_len is the len of Escape_Value array 8534 * @param escape_values_len is the len of Escape_Value array
8526 */ 8535 */
8527static int 8536static int
8528_escaped_value_search(const char *s, const Escape_Value escape_values[], const size_t escape_values_len) 8537_escaped_value_search(const char *s, Escape_Value **escape_values , const size_t escape_values_len)
8529{ 8538{
8539 if (!escape_values)
8540 return -1;
8541
8530 int l = 0; 8542 int l = 0;
8531 int r = escape_values_len - 1; 8543 int r = escape_values_len - 1;
8532 while (l <= r) 8544 while (l <= r)
8533 { 8545 {
8534 int m = (l + r) / 2; 8546 int m = (l + r) / 2;
8535 int res = strncmp(s, escape_values[m].value, escape_values[m].value_len); 8547 int res = strncmp(s, escape_values[m]->value, escape_values[m]->value_len);
8536 if (res == 0) 8548 if (res == 0)
8537 return m; 8549 return m;
8538 if (res > 0) 8550 if (res > 0)
@@ -8553,21 +8565,22 @@ _escaped_value_search(const char *s, const Escape_Value escape_values[], const s
8553static inline const char * 8565static inline const char *
8554_escaped_char_match(const char *s, int *adv) 8566_escaped_char_match(const char *s, int *adv)
8555{ 8567{
8556 static const size_t escape_common_size = sizeof(escape_values_v_common_sorted) / sizeof(Escape_Value); 8568 size_t len = 0;
8557 int n_ret = _escaped_value_search(s, escape_values_v_common_sorted, escape_common_size); 8569 Escape_Value **list = get_html_escape_array_common_value_sorted(&len);
8570 int n_ret = _escaped_value_search(s, list, len);
8558 if (n_ret != -1) 8571 if (n_ret != -1)
8559 { 8572 {
8560 *adv = (int) escape_values_v_common_sorted[n_ret].value_len; 8573 *adv = (int) list[n_ret]->value_len;
8561 return escape_values_v_common_sorted[n_ret].escape; 8574 return list[n_ret]->escape;
8562 } 8575 }
8563 else 8576 else
8564 { 8577 {
8565 static const size_t escape_size = sizeof(escape_values_v_sorted) / sizeof(Escape_Value); 8578 list = get_html_escape_array_rest_value_sorted(&len);
8566 n_ret = _escaped_value_search(s, escape_values_v_sorted, escape_size); 8579 n_ret = _escaped_value_search(s, list, len);
8567 if (n_ret != -1) 8580 if (n_ret != -1)
8568 { 8581 {
8569 *adv = (int)escape_values_v_sorted[n_ret].value_len; 8582 *adv = (int)list[n_ret]->value_len;
8570 return escape_values_v_sorted[n_ret].escape; 8583 return list[n_ret]->escape;
8571 } 8584 }
8572 } 8585 }
8573 return NULL; 8586 return NULL;
@@ -8623,18 +8636,22 @@ _escaped_char_get(const char *s, const char *s_end)
8623 } 8636 }
8624 else 8637 else
8625 { 8638 {
8626 static const size_t escape_common_size = sizeof(escape_values_e_common_sorted) / sizeof(Escape_Value); 8639 size_t len = 0;
8627 int n_ret = _escaped_string_search(s, s_end-s, escape_values_e_common_sorted, escape_common_size); 8640 Escape_Value **list;
8641 list = get_html_escape_array_common_key_sorted(&len);
8642 int n_ret = _escaped_string_search(s, s_end-s, list, len);
8628 if (n_ret != -1) 8643 if (n_ret != -1)
8629 { 8644 {
8630 return escape_values_e_common_sorted[n_ret].value; 8645 return list[n_ret]->value;
8631 } 8646 }
8632 else 8647 else
8633 { 8648 {
8634 static const size_t escape_size = sizeof(escape_values_e_sorted) / sizeof(Escape_Value); 8649 list = get_html_escape_array_rest_key_sorted(&len);
8635 n_ret = _escaped_string_search(s, s_end-s, escape_values_e_sorted, escape_size); 8650 n_ret = _escaped_string_search(s, s_end-s, list, len);
8636 if (n_ret != -1) 8651 if (n_ret != -1)
8637 return escape_values_e_sorted[n_ret].value; 8652 {
8653 return list[n_ret]->value;
8654 }
8638 } 8655 }
8639 } 8656 }
8640 8657
@@ -8735,16 +8752,36 @@ _evas_object_textblock_text_markup_set(Eo *eo_obj, Efl_Canvas_Textblock_Data *o,
8735 } 8752 }
8736 _nodes_clear(eo_obj); 8753 _nodes_clear(eo_obj);
8737 8754
8738 Efl_Text_Cursor_Handle *co = o->cursor; 8755 if (o->cursor->pos != 0)
8739 co->node = _evas_textblock_node_text_new(); 8756 {
8757 o->cursor->changed = EINA_TRUE;
8758 o->cursor->pos = 0;
8759 }
8760
8740 o->text_nodes = _NODE_TEXT(eina_inlist_append( 8761 o->text_nodes = _NODE_TEXT(eina_inlist_append(
8741 EINA_INLIST_GET(o->text_nodes), 8762 EINA_INLIST_GET(o->text_nodes),
8742 EINA_INLIST_GET(co->node))); 8763 EINA_INLIST_GET(_evas_textblock_node_text_new())));
8743 8764 o->cursor->node = o->text_nodes;
8744 evas_textblock_cursor_paragraph_first(o->cursor);
8745 8765
8746 evas_object_textblock_text_markup_prepend(o->cursor, text); 8766 evas_object_textblock_text_markup_prepend(o->cursor, text);
8747 8767
8768 Eina_List *l;
8769 Efl_Text_Cursor_Handle *cur;
8770 EINA_LIST_FOREACH(o->cursors, l, cur)
8771 {
8772 cur->node = o->text_nodes;
8773 if (cur->pos != 0)
8774 {
8775 cur->pos = 0;
8776 cur->changed = EINA_TRUE;
8777 }
8778 }
8779 _cursor_emit_if_changed(o->cursor);
8780 EINA_LIST_FOREACH(o->cursors, l, cur)
8781 {
8782 _cursor_emit_if_changed(cur);
8783 }
8784
8748 /*If there was no text markup_prepend will not call change function 8785 /*If there was no text markup_prepend will not call change function
8749 So we will call it inside markup_set*/ 8786 So we will call it inside markup_set*/
8750 if (!text || !*text) 8787 if (!text || !*text)
@@ -8753,26 +8790,6 @@ _evas_object_textblock_text_markup_set(Eo *eo_obj, Efl_Canvas_Textblock_Data *o,
8753 _evas_textblock_changed(o, eo_obj); 8790 _evas_textblock_changed(o, eo_obj);
8754 } 8791 }
8755 8792
8756 efl_event_freeze(eo_obj);
8757 /* Point all the cursors to the starrt */
8758 {
8759 Eina_List *l;
8760 Efl_Text_Cursor_Handle *cur;
8761
8762 /*update all cursors positions first, without emitting change*/
8763 EINA_LIST_FOREACH(o->cursors, l, cur)
8764 {
8765 _evas_textblock_cursor_paragraph_first(cur, EINA_FALSE);
8766 }
8767 /*emitting change event for all cursors, after all of them are ready*/
8768 EINA_LIST_FOREACH(o->cursors, l, cur)
8769 {
8770 _evas_textblock_cursor_object_changed(cur);
8771 }
8772
8773 }
8774 efl_event_thaw(eo_obj);
8775
8776 o->markup_text = text; 8793 o->markup_text = text;
8777} 8794}
8778 8795
@@ -10020,8 +10037,8 @@ found:
10020 _evas_textblock_changed(o, eo_obj); 10037 _evas_textblock_changed(o, eo_obj);
10021} 10038}
10022 10039
10023static void 10040EAPI void
10024_evas_textblock_cursor_paragraph_first(Efl_Text_Cursor_Handle *cur, Eina_Bool emit_change) 10041evas_textblock_cursor_paragraph_first(Efl_Text_Cursor_Handle *cur)
10025{ 10042{
10026 if (!cur) return; 10043 if (!cur) return;
10027 Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); 10044 Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS);
@@ -10029,14 +10046,7 @@ _evas_textblock_cursor_paragraph_first(Efl_Text_Cursor_Handle *cur, Eina_Bool em
10029 Efl_Canvas_Textblock_Data *o = efl_data_scope_get(cur->obj, MY_CLASS); 10046 Efl_Canvas_Textblock_Data *o = efl_data_scope_get(cur->obj, MY_CLASS);
10030 cur->node = o->text_nodes; 10047 cur->node = o->text_nodes;
10031 cur->pos = 0; 10048 cur->pos = 0;
10032 if (emit_change) 10049 _evas_textblock_cursor_object_changed(cur);
10033 _evas_textblock_cursor_object_changed(cur);
10034}
10035
10036EAPI void
10037evas_textblock_cursor_paragraph_first(Efl_Text_Cursor_Handle *cur)
10038{
10039 _evas_textblock_cursor_paragraph_first(cur, EINA_TRUE);
10040} 10050}
10041 10051
10042EAPI void 10052EAPI void
diff --git a/src/lib/evas/common/evas_image_main.c b/src/lib/evas/common/evas_image_main.c
index 57a9a8c0c5..dc8596a4d8 100644
--- a/src/lib/evas/common/evas_image_main.c
+++ b/src/lib/evas/common/evas_image_main.c
@@ -1122,6 +1122,7 @@ evas_common_image_set_alpha_sparse(Image_Entry *ie)
1122 if (!ie->flags.alpha) return; 1122 if (!ie->flags.alpha) return;
1123 1123
1124 s = evas_cache_image_pixels(ie); 1124 s = evas_cache_image_pixels(ie);
1125 if (!s) return;
1125 se = s + (ie->w * ie->h); 1126 se = s + (ie->w * ie->h);
1126 while (s < se) 1127 while (s < se)
1127 { 1128 {
diff --git a/src/lib/evas/filters/evas_filter_parser.c b/src/lib/evas/filters/evas_filter_parser.c
index 19de8249b2..a53a3dd89e 100644
--- a/src/lib/evas/filters/evas_filter_parser.c
+++ b/src/lib/evas/filters/evas_filter_parser.c
@@ -3436,7 +3436,7 @@ _instr2cmd_transform(Evas_Filter_Context *ctx,
3436 INSTR_PARAM_CHECK(src); 3436 INSTR_PARAM_CHECK(src);
3437 INSTR_PARAM_CHECK(dst); 3437 INSTR_PARAM_CHECK(dst);
3438 3438
3439 if (!strcasecmp(op, "vflip")) 3439 if (op && !strcasecmp(op, "vflip"))
3440 flags = EVAS_FILTER_TRANSFORM_VFLIP; 3440 flags = EVAS_FILTER_TRANSFORM_VFLIP;
3441 else 3441 else
3442 { 3442 {
diff --git a/src/lib/evil/evil_main.c b/src/lib/evil/evil_main.c
index 6a3678f0a1..803e47fc30 100644
--- a/src/lib/evil/evil_main.c
+++ b/src/lib/evil/evil_main.c
@@ -23,17 +23,6 @@ evil_init(void)
23 if (++_evil_init_count != 1) 23 if (++_evil_init_count != 1)
24 return _evil_init_count; 24 return _evil_init_count;
25 25
26 {
27 DWORD v;
28
29 v = GetVersion();
30 if (!v || ((DWORD)(LOBYTE(LOWORD(v))) < 6))
31 {
32 fprintf(stderr, "Windows XP not supported anymore, exiting.\n");
33 return 0;
34 }
35 }
36
37 QueryPerformanceFrequency(&freq); 26 QueryPerformanceFrequency(&freq);
38 27
39 _evil_time_freq = freq.QuadPart; 28 _evil_time_freq = freq.QuadPart;
diff --git a/src/modules/evas/engines/gl_common/evas_gl_core.c b/src/modules/evas/engines/gl_common/evas_gl_core.c
index 96d0807c39..786c54c825 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_core.c
+++ b/src/modules/evas/engines/gl_common/evas_gl_core.c
@@ -88,7 +88,13 @@ error:
88static void 88static void
89_internal_resources_destroy(void *eng_data, EVGL_Resource *rsc) 89_internal_resources_destroy(void *eng_data, EVGL_Resource *rsc)
90{ 90{
91 if ((!eng_data) || (!rsc)) return; 91 if (!rsc) return;
92
93 if (!eng_data)
94 {
95 free(rsc);
96 return;
97 }
92 98
93 if (rsc->context) 99 if (rsc->context)
94 evgl_engine->funcs->context_destroy(eng_data, rsc->context); 100 evgl_engine->funcs->context_destroy(eng_data, rsc->context);
diff --git a/src/modules/evas/engines/wayland_shm/evas_engine.c b/src/modules/evas/engines/wayland_shm/evas_engine.c
index 3a3623a567..041dfa9e54 100644
--- a/src/modules/evas/engines/wayland_shm/evas_engine.c
+++ b/src/modules/evas/engines/wayland_shm/evas_engine.c
@@ -243,6 +243,8 @@ eng_image_native_set(void *engine EINA_UNUSED, void *image, void *native)
243 NULL, 1, 243 NULL, 1,
244 EVAS_COLORSPACE_ARGB8888); 244 EVAS_COLORSPACE_ARGB8888);
245 245
246 EINA_SAFETY_ON_NULL_RETURN_VAL(im2, im);
247
246 if (im->native.data) 248 if (im->native.data)
247 { 249 {
248 if (im->native.func.free) 250 if (im->native.func.free)
diff --git a/src/tests/elementary/efl_ui_test_text.c b/src/tests/elementary/efl_ui_test_text.c
index 3eb9909d53..ad876c6bcd 100644
--- a/src/tests/elementary/efl_ui_test_text.c
+++ b/src/tests/elementary/efl_ui_test_text.c
@@ -300,6 +300,29 @@ EFL_START_TEST(text_editable)
300} 300}
301EFL_END_TEST 301EFL_END_TEST
302 302
303EFL_START_TEST(text_on_startup)
304{
305 Eo *txt, *win;
306 win = win_add();
307 unsigned char r,g,b,a;
308 txt = efl_add(EFL_UI_TEXTBOX_CLASS, win,
309 efl_text_color_set(efl_added, 0, 255, 0, 255),
310 efl_text_font_size_set(efl_added, 50),
311 efl_text_font_family_set(efl_added, "Arial"));
312
313 ck_assert_int_eq(efl_text_font_size_get(txt), 50);
314 ck_assert_str_eq(efl_text_font_family_get(txt), "Arial");
315 efl_text_color_get(txt, &r, &g, &b, &a);
316 ck_assert_int_eq(r, 0);
317 ck_assert_int_eq(g, 255);
318 ck_assert_int_eq(b, 0);
319 ck_assert_int_eq(a, 255);
320
321 efl_del(txt);
322 efl_del(win);
323}
324EFL_END_TEST
325
303EFL_START_TEST(text_multiline_selection) 326EFL_START_TEST(text_multiline_selection)
304{ 327{
305 Eo *txt, *win; 328 Eo *txt, *win;
@@ -473,4 +496,5 @@ void efl_ui_test_text(TCase *tc)
473 tcase_add_test(tc, text_multiline_selection); 496 tcase_add_test(tc, text_multiline_selection);
474 tcase_add_test(tc, text_singleline_cursor_movement); 497 tcase_add_test(tc, text_singleline_cursor_movement);
475 tcase_add_test(tc, text_multiline_singleline_cursor_pos); 498 tcase_add_test(tc, text_multiline_singleline_cursor_pos);
499 tcase_add_test(tc, text_on_startup);
476} 500}
diff --git a/src/tests/elementary/elm_test_entry.c b/src/tests/elementary/elm_test_entry.c
index 93951d9e45..f3e5c1225c 100644
--- a/src/tests/elementary/elm_test_entry.c
+++ b/src/tests/elementary/elm_test_entry.c
@@ -622,7 +622,7 @@ EFL_START_TEST(elm_entry_keycode)
622 Evas *e = evas_object_evas_get(entry); 622 Evas *e = evas_object_evas_get(entry);
623 elm_object_focus_set(entry, EINA_TRUE); 623 elm_object_focus_set(entry, EINA_TRUE);
624 evas_key_modifier_on(e, "Control"); 624 evas_key_modifier_on(e, "Control");
625 evas_event_feed_key_down_with_keycode(e, "", "", "", "", time(NULL), NULL, 65); 625 evas_event_feed_key_down_with_keycode(e, "", "a", "", "", time(NULL), NULL, 38);
626 ecore_main_loop_iterate(); 626 ecore_main_loop_iterate();
627 evas_event_feed_key_down(e, "BackSpace", "BackSpace", "\b", "\b", time(NULL), NULL); 627 evas_event_feed_key_down(e, "BackSpace", "BackSpace", "\b", "\b", time(NULL), NULL);
628 ck_assert_str_eq(elm_object_text_get(entry), ""); 628 ck_assert_str_eq(elm_object_text_get(entry), "");
diff --git a/src/tests/eo/signals/signals_main.c b/src/tests/eo/signals/signals_main.c
index c3b1648c17..859e145ecb 100644
--- a/src/tests/eo/signals/signals_main.c
+++ b/src/tests/eo/signals/signals_main.c
@@ -74,6 +74,22 @@ _restart_3_cb(void *data, const Efl_Event *event)
74 called++; 74 called++;
75} 75}
76 76
77static void
78_restart_3_no_stop_cb(void *data, const Efl_Event *event)
79{
80 fprintf(stderr, "restart 3 no stop inside: %i\n", inside);
81 fprintf(stderr, "restart 3 no stop exit inside: %i (%i)\n", inside, called);
82
83 if (!inside)
84 {
85 inside = EINA_TRUE;
86 efl_event_callback_call(event->object, event->desc, data);
87 inside = EINA_FALSE;
88 }
89
90 called++;
91}
92
77int 93int
78main(int argc, char *argv[]) 94main(int argc, char *argv[])
79{ 95{
@@ -219,8 +235,21 @@ main(int argc, char *argv[])
219 efl_event_callback_legacy_call(obj, EV_RESTART, NULL); 235 efl_event_callback_legacy_call(obj, EV_RESTART, NULL);
220 fail_if(inside); 236 fail_if(inside);
221 fail_if(called != 3); 237 fail_if(called != 3);
222
223 efl_unref(obj); 238 efl_unref(obj);
239
240 pd = NULL;
241 inside = EINA_FALSE;
242 called = 0;
243
244 obj = efl_add_ref(SIMPLE_CLASS, NULL);
245 efl_event_callback_add(obj, EV_RESTART, _restart_3_no_stop_cb, NULL);
246 efl_event_callback_add(obj, EV_RESTART, _null_cb, NULL);
247 efl_event_callback_add(obj, EV_RESTART, _restart_3_no_stop_cb, NULL);
248 efl_event_callback_call(obj, EV_RESTART, NULL);
249 fail_if(inside);
250 fail_if(called != 2);
251
252
224 efl_object_shutdown(); 253 efl_object_shutdown();
225 return 0; 254 return 0;
226} 255}
diff --git a/src/tests/evas/evas_test_textblock.c b/src/tests/evas/evas_test_textblock.c
index 707c72f22c..6bdf25a19d 100644
--- a/src/tests/evas/evas_test_textblock.c
+++ b/src/tests/evas/evas_test_textblock.c
@@ -4847,6 +4847,26 @@ EFL_START_TEST(efl_canvas_textblock_cursor)
4847} 4847}
4848EFL_END_TEST 4848EFL_END_TEST
4849 4849
4850EFL_START_TEST(efl_canvas_textblock_cursor_change)
4851{
4852 START_EFL_CANVAS_TEXTBLOCK_TEST();
4853 (void) cur_obj;
4854 int changed_emit1 = 0;
4855 int changed_emit2 = 0;
4856 Efl_Object *cur1, *cur2;
4857 cur1 = efl_canvas_textblock_cursor_create(txt);
4858 cur2 = efl_canvas_textblock_cursor_create(txt);
4859 efl_text_set(txt, "Hello World");
4860 efl_text_cursor_object_position_set(cur1, 0);
4861 efl_text_cursor_object_position_set(cur2, 1);
4862 efl_event_callback_add(cur1, EFL_TEXT_CURSOR_OBJECT_EVENT_CHANGED, _increment_int_changed, &changed_emit1);
4863 efl_event_callback_add(cur2, EFL_TEXT_CURSOR_OBJECT_EVENT_CHANGED, _increment_int_changed, &changed_emit2);
4864 efl_text_set(txt, "");
4865 ck_assert_int_eq(changed_emit1, 0);
4866 ck_assert_int_eq(changed_emit2, 1);
4867}
4868EFL_END_TEST
4869
4850 4870
4851EFL_START_TEST(efl_canvas_textblock_markup) 4871EFL_START_TEST(efl_canvas_textblock_markup)
4852{ 4872{
@@ -5143,6 +5163,7 @@ void evas_test_textblock(TCase *tc)
5143 tcase_add_test(tc, efl_canvas_textblock_simple); 5163 tcase_add_test(tc, efl_canvas_textblock_simple);
5144 tcase_add_test(tc, efl_text); 5164 tcase_add_test(tc, efl_text);
5145 tcase_add_test(tc, efl_canvas_textblock_cursor); 5165 tcase_add_test(tc, efl_canvas_textblock_cursor);
5166 tcase_add_test(tc, efl_canvas_textblock_cursor_change);
5146 tcase_add_test(tc, efl_canvas_textblock_markup); 5167 tcase_add_test(tc, efl_canvas_textblock_markup);
5147 tcase_add_test(tc, efl_canvas_textblock_markup_invalid_escape); 5168 tcase_add_test(tc, efl_canvas_textblock_markup_invalid_escape);
5148 tcase_add_test(tc, efl_text_font); 5169 tcase_add_test(tc, efl_text_font);