From 7059b80f85cdb95e68ed0d4faf7b3e56f0cf3e25 Mon Sep 17 00:00:00 2001 From: Jee-Yong Um Date: Tue, 25 Oct 2016 13:28:03 +0900 Subject: [PATCH] edje: fix cached edje modification issue Signed-Off-By: Jee-Yong Um Change-Id: I21f2f3a9992ff13988e19fbf5d9461f299920b03 --- src/lib/edje/edje_callbacks.c | 24 ++++++++++++------------ src/lib/edje/edje_embryo.c | 16 ++++++++-------- src/lib/edje/edje_entry.c | 20 ++++++++++---------- src/lib/edje/edje_load.c | 14 +++++++++++--- src/lib/edje/edje_private.h | 20 ++++++++++++-------- src/lib/edje/edje_util.c | 41 ++++++++++++++++++++--------------------- 6 files changed, 73 insertions(+), 62 deletions(-) diff --git a/src/lib/edje/edje_callbacks.c b/src/lib/edje/edje_callbacks.c index d9a83f6..e883099 100644 --- a/src/lib/edje/edje_callbacks.c +++ b/src/lib/edje/edje_callbacks.c @@ -63,10 +63,10 @@ _edje_mouse_in_signal_cb(void *data, Eo *obj, const Eo_Event_Description *desc E rp = evas_object_data_get(obj, "real_part"); if (rp) { - if (!(ev->event_flags) || !(rp->part->ignore_flags & ev->event_flags)) + if (!(ev->event_flags) || !(rp->ignore_flags & ev->event_flags)) _edje_emit(ed, "mouse,in", rp->part->name); - ev->event_flags |= rp->part->mask_flags; + ev->event_flags |= rp->mask_flags; } return EO_CALLBACK_CONTINUE; @@ -84,10 +84,10 @@ _edje_mouse_out_signal_cb(void *data, Eo *obj, const Eo_Event_Description *desc rp = evas_object_data_get(obj, "real_part"); if (rp) { - if (!(ev->event_flags) || !(rp->part->ignore_flags & ev->event_flags)) + if (!(ev->event_flags) || !(rp->ignore_flags & ev->event_flags)) _edje_emit(ed, "mouse,out", rp->part->name); - ev->event_flags |= rp->part->mask_flags; + ev->event_flags |= rp->mask_flags; } return EO_CALLBACK_CONTINUE; @@ -107,7 +107,7 @@ _edje_mouse_down_signal_cb(void *data, Eo *obj, const Eo_Event_Description *desc rp = evas_object_data_get(obj, "real_part"); if (!rp) return EO_CALLBACK_CONTINUE; - ignored = rp->part->ignore_flags & ev->event_flags; + ignored = rp->ignore_flags & ev->event_flags; _edje_ref(ed); _edje_util_freeze(ed); @@ -159,7 +159,7 @@ _edje_mouse_down_signal_cb(void *data, Eo *obj, const Eo_Event_Description *desc _edje_util_thaw(ed); _edje_unref(ed); - ev->event_flags |= rp->part->mask_flags; + ev->event_flags |= rp->mask_flags; return EO_CALLBACK_CONTINUE; } @@ -178,7 +178,7 @@ _edje_mouse_up_signal_cb(void *data, Eo *obj, const Eo_Event_Description *desc E rp = evas_object_data_get(obj, "real_part"); if (!rp) return EO_CALLBACK_CONTINUE; - ignored = rp->part->ignore_flags & ev->event_flags; + ignored = rp->ignore_flags & ev->event_flags; _edje_ref(ed); _edje_util_freeze(ed); @@ -234,7 +234,7 @@ _edje_mouse_up_signal_cb(void *data, Eo *obj, const Eo_Event_Description *desc E _edje_util_thaw(ed); _edje_unref(ed); - ev->event_flags |= rp->part->mask_flags; + ev->event_flags |= rp->mask_flags; return EO_CALLBACK_CONTINUE; } @@ -256,7 +256,7 @@ _edje_mouse_move_signal_cb(void *data, Eo *obj, const Eo_Event_Description *desc rp = ed->table_parts[rp->part->dragable.event_id % ed->table_parts_size]; } - ignored = rp->part->ignore_flags & ev->event_flags; + ignored = rp->ignore_flags & ev->event_flags; _edje_ref(ed); if ((!ev->event_flags) || (!ignored)) @@ -343,7 +343,7 @@ _edje_mouse_move_signal_cb(void *data, Eo *obj, const Eo_Event_Description *desc _edje_unref(ed); _edje_util_thaw(ed); - ev->event_flags |= rp->part->mask_flags; + ev->event_flags |= rp->mask_flags; return EO_CALLBACK_CONTINUE; } @@ -361,13 +361,13 @@ _edje_mouse_wheel_signal_cb(void *data, Eo *obj, const Eo_Event_Description *des rp = evas_object_data_get(obj, "real_part"); if (rp) { - if (!(ev->event_flags) || !(rp->part->ignore_flags & ev->event_flags)) + if (!(ev->event_flags) || !(rp->ignore_flags & ev->event_flags)) { snprintf(buf, sizeof(buf), "mouse,wheel,%i,%i", ev->direction, (ev->z < 0) ? (-1) : (1)); _edje_emit(ed, buf, rp->part->name); } - ev->event_flags |= rp->part->mask_flags; + ev->event_flags |= rp->mask_flags; } return EO_CALLBACK_CONTINUE; diff --git a/src/lib/edje/edje_embryo.c b/src/lib/edje/edje_embryo.c index f146a4d..8d0f756 100644 --- a/src/lib/edje/edje_embryo.c +++ b/src/lib/edje/edje_embryo.c @@ -3482,7 +3482,7 @@ _edje_embryo_fn_set_mouse_events(Embryo_Program *ep, Embryo_Cell *params) rp = ed->table_parts[part_id % ed->table_parts_size]; if (rp) - _edje_part_mouse_events_set(ed, rp, params[2]); + _edje_real_part_mouse_events_set(ed, rp, params[2]); return 0; } @@ -3504,7 +3504,7 @@ _edje_embryo_fn_get_mouse_events(Embryo_Program *ep, Embryo_Cell *params) rp = ed->table_parts[part_id % ed->table_parts_size]; if (rp) - return (Embryo_Cell)_edje_var_int_get(ed, (int)_edje_part_mouse_events_get(ed, rp)); + return (Embryo_Cell)_edje_var_int_get(ed, (int)_edje_real_part_mouse_events_get(ed, rp)); return 0; @@ -3527,7 +3527,7 @@ _edje_embryo_fn_set_repeat_events(Embryo_Program *ep, Embryo_Cell *params) rp = ed->table_parts[part_id % ed->table_parts_size]; if (rp) - _edje_part_repeat_events_set(ed, rp, params[2]); + _edje_real_part_repeat_events_set(ed, rp, params[2]); return 0; } @@ -3549,7 +3549,7 @@ _edje_embryo_fn_get_repeat_events(Embryo_Program *ep, Embryo_Cell *params) rp = ed->table_parts[part_id % ed->table_parts_size]; if (rp) - return (Embryo_Cell)_edje_var_int_get(ed, (int)_edje_part_repeat_events_get(ed, rp)); + return (Embryo_Cell)_edje_var_int_get(ed, (int)_edje_real_part_repeat_events_get(ed, rp)); return 0; @@ -3572,7 +3572,7 @@ _edje_embryo_fn_set_ignore_flags(Embryo_Program *ep, Embryo_Cell *params) rp = ed->table_parts[part_id % ed->table_parts_size]; if (rp) - _edje_part_ignore_flags_set(ed, rp, params[2]); + _edje_real_part_ignore_flags_set(ed, rp, params[2]); return 0; } @@ -3594,7 +3594,7 @@ _edje_embryo_fn_get_ignore_flags(Embryo_Program *ep, Embryo_Cell *params) rp = ed->table_parts[part_id % ed->table_parts_size]; if (rp) - return (Embryo_Cell)_edje_var_int_get(ed, (int)_edje_part_ignore_flags_get(ed, rp)); + return (Embryo_Cell)_edje_var_int_get(ed, (int)_edje_real_part_ignore_flags_get(ed, rp)); return 0; @@ -3617,7 +3617,7 @@ _edje_embryo_fn_set_mask_flags(Embryo_Program *ep, Embryo_Cell *params) rp = ed->table_parts[part_id % ed->table_parts_size]; if (rp) - _edje_part_mask_flags_set(ed, rp, params[2]); + _edje_real_part_mask_flags_set(ed, rp, params[2]); return 0; } @@ -3639,7 +3639,7 @@ _edje_embryo_fn_get_mask_flags(Embryo_Program *ep, Embryo_Cell *params) rp = ed->table_parts[part_id % ed->table_parts_size]; if (rp) - return (Embryo_Cell)_edje_var_int_get(ed, (int)_edje_part_mask_flags_get(ed, rp)); + return (Embryo_Cell)_edje_var_int_get(ed, (int)_edje_real_part_mask_flags_get(ed, rp)); return 0; diff --git a/src/lib/edje/edje_entry.c b/src/lib/edje/edje_entry.c index 92913e7..9ffecfc 100644 --- a/src/lib/edje/edje_entry.c +++ b/src/lib/edje/edje_entry.c @@ -766,7 +766,7 @@ _edje_anchor_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EIN (en->select_allow)) return; - ignored = rp->part->ignore_flags & ev->event_flags; + ignored = rp->ignore_flags & ev->event_flags; if ((!ev->event_flags) || (!ignored)) { n = an->name; @@ -781,7 +781,7 @@ _edje_anchor_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EIN snprintf(buf, len, "anchor,mouse,down,%i,%s", ev->button, n); _edje_emit(ed, buf, rp->part->name); } - ev->event_flags |= rp->part->mask_flags; + ev->event_flags |= rp->mask_flags; } static void @@ -800,7 +800,7 @@ _edje_anchor_mouse_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_ (!rp->typedata.text)) return; en = rp->typedata.text->entry_data; - ignored = rp->part->ignore_flags & ev->event_flags; + ignored = rp->ignore_flags & ev->event_flags; n = an->name; if (!n) n = ""; len = 200 + strlen(n); @@ -819,7 +819,7 @@ _edje_anchor_mouse_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_ snprintf(buf, len, "anchor,mouse,clicked,%i,%s", ev->button, n); _edje_emit(ed, buf, rp->part->name); } - ev->event_flags |= rp->part->mask_flags; + ev->event_flags |= rp->mask_flags; } static void @@ -841,7 +841,7 @@ _edje_anchor_mouse_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EIN (en->select_allow)) return; - ignored = rp->part->ignore_flags & ev->event_flags; + ignored = rp->ignore_flags & ev->event_flags; if ((!ev->event_flags) || (!ignored)) { n = an->name; @@ -851,7 +851,7 @@ _edje_anchor_mouse_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EIN snprintf(buf, len, "anchor,mouse,move,%s", n); _edje_emit(ed, buf, rp->part->name); } - ev->event_flags |= rp->part->mask_flags; + ev->event_flags |= rp->mask_flags; } static void @@ -865,7 +865,7 @@ _edje_anchor_mouse_in_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_ size_t len; int ignored; - ignored = rp->part->ignore_flags & ev->event_flags; + ignored = rp->ignore_flags & ev->event_flags; if ((!ev->event_flags) || (!ignored)) { /* set to allow handling in elementary, in case we have @@ -879,7 +879,7 @@ _edje_anchor_mouse_in_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_ snprintf(buf, len, "anchor,mouse,in,%s", n); _edje_emit(ed, buf, rp->part->name); } - ev->event_flags |= rp->part->mask_flags; + ev->event_flags |= rp->mask_flags; } static void @@ -893,7 +893,7 @@ _edje_anchor_mouse_out_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA int ignored; Edje *ed = an->en->ed; - ignored = rp->part->ignore_flags & ev->event_flags; + ignored = rp->ignore_flags & ev->event_flags; if ((!ev->event_flags) || (!ignored)) { /* set to allow handling in elementary, in case we have @@ -907,7 +907,7 @@ _edje_anchor_mouse_out_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA snprintf(buf, len, "anchor,mouse,out,%s", n); _edje_emit(ed, buf, rp->part->name); } - ev->event_flags |= rp->part->mask_flags; + ev->event_flags |= rp->mask_flags; } static void diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c index 35125b7..4cb916f 100644 --- a/src/lib/edje/edje_load.c +++ b/src/lib/edje/edje_load.c @@ -858,14 +858,22 @@ _edje_object_file_set_internal(Evas_Object *obj, const Eina_File *file, const ch else evas_object_smart_member_add(rp->object, ed->obj); + if (ep->type != EDJE_PART_TYPE_SPACER) + { + if (ep->ignore_flags) rp->ignore_flags = ep->ignore_flags; + if (ep->mask_flags) rp->mask_flags = ep->mask_flags; + } + // evas_object_layer_set(rp->object, evas_object_layer_get(ed->obj)); + rp->mouse_events = ep->mouse_events; + rp->repeat_events = ep->repeat_events; + if (ep->type != EDJE_PART_TYPE_SWALLOW && ep->type != EDJE_PART_TYPE_GROUP && ep->type != EDJE_PART_TYPE_EXTERNAL) { - if (ep->mouse_events) + if (rp->mouse_events) { _edje_callbacks_add(rp->object, ed, rp); - if (ep->repeat_events) - evas_object_repeat_events_set(rp->object, 1); + evas_object_repeat_events_set(rp->object, rp->repeat_events); if (ep->pointer_mode != EVAS_OBJECT_POINTER_MODE_AUTOGRAB) evas_object_pointer_mode_set(rp->object, ep->pointer_mode); diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h index fdc3bd3..7213afb 100644 --- a/src/lib/edje/edje_private.h +++ b/src/lib/edje/edje_private.h @@ -1999,6 +1999,8 @@ struct _Edje_Real_Part #ifdef EDJE_CALC_CACHE int state; // 4 #endif + Evas_Event_Flags ignore_flags; + Evas_Event_Flags mask_flags; //TIZEN_ONLY(20160923): introduction of text marquee double text_marquee_prev_time; Ecore_Animator *text_marquee_animator; @@ -2015,6 +2017,8 @@ struct _Edje_Real_Part //TIZEN_ONLY(20160923): introduction of text marquee unsigned char text_marquee_to_left : 1; // + unsigned char mouse_events : 1; + unsigned char repeat_events : 1; }; // 128 // WITH EDJE_CALC_CACHE: 407 @@ -3039,14 +3043,14 @@ typedef Eina_Bool (*Edje_Module_Plugin_Run) (const Evas_Object *obj, const char #endif // -Eina_Bool _edje_part_mouse_events_get(Edje *ed, Edje_Real_Part *rp); -void _edje_part_mouse_events_set(Edje *ed, Edje_Real_Part *rp, Eina_Bool mouse_events); -Eina_Bool _edje_part_repeat_events_get(Edje *ed, Edje_Real_Part *rp); -void _edje_part_repeat_events_set(Edje *ed, Edje_Real_Part *rp, Eina_Bool repeat_events); -Evas_Event_Flags _edje_part_ignore_flags_get(Edje *ed, Edje_Real_Part *rp); -void _edje_part_ignore_flags_set(Edje *ed, Edje_Real_Part *rp, Evas_Event_Flags ignore_flags); -Evas_Event_Flags _edje_part_mask_flags_get(Edje *ed, Edje_Real_Part *rp); -void _edje_part_mask_flags_set(Edje *ed, Edje_Real_Part *rp, Evas_Event_Flags mask_flags); +Eina_Bool _edje_real_part_mouse_events_get(Edje *ed, Edje_Real_Part *rp); +void _edje_real_part_mouse_events_set(Edje *ed, Edje_Real_Part *rp, Eina_Bool mouse_events); +Eina_Bool _edje_real_part_repeat_events_get(Edje *ed, Edje_Real_Part *rp); +void _edje_real_part_repeat_events_set(Edje *ed, Edje_Real_Part *rp, Eina_Bool repeat_events); +Evas_Event_Flags _edje_real_part_ignore_flags_get(Edje *ed, Edje_Real_Part *rp); +void _edje_real_part_ignore_flags_set(Edje *ed, Edje_Real_Part *rp, Evas_Event_Flags ignore_flags); +Evas_Event_Flags _edje_real_part_mask_flags_get(Edje *ed, Edje_Real_Part *rp); +void _edje_real_part_mask_flags_set(Edje *ed, Edje_Real_Part *rp, Evas_Event_Flags mask_flags); #ifdef HAVE_LIBREMIX #include diff --git a/src/lib/edje/edje_util.c b/src/lib/edje/edje_util.c index 1e75041..f354fb1 100644 --- a/src/lib/edje/edje_util.c +++ b/src/lib/edje/edje_util.c @@ -6181,11 +6181,10 @@ _edje_real_part_swallow(Edje *ed, if (hints_update) _edje_real_part_swallow_hints_update(rp); - if (rp->part->mouse_events) + if (rp->mouse_events) { _edje_callbacks_add(obj_swallow, ed, rp); - if (rp->part->repeat_events) - evas_object_repeat_events_set(obj_swallow, 1); + evas_object_repeat_events_set(obj_swallow, rp->repeat_events); if (rp->part->pointer_mode != EVAS_OBJECT_POINTER_MODE_AUTOGRAB) evas_object_pointer_mode_set(obj_swallow, rp->part->pointer_mode); evas_object_pass_events_set(obj_swallow, 0); @@ -6407,21 +6406,21 @@ edje_object_part_object_name_get(const Evas_Object *obj) } Eina_Bool -_edje_part_mouse_events_get(Edje *ed EINA_UNUSED, Edje_Real_Part *rp) +_edje_real_part_mouse_events_get(Edje *ed EINA_UNUSED, Edje_Real_Part *rp) { if (!rp) return EINA_FALSE; - return rp->part->mouse_events; + return rp->mouse_events; } void -_edje_part_mouse_events_set(Edje *ed EINA_UNUSED, Edje_Real_Part *rp, Eina_Bool mouse_events) +_edje_real_part_mouse_events_set(Edje *ed EINA_UNUSED, Edje_Real_Part *rp, Eina_Bool mouse_events) { if (!rp) return; - rp->part->mouse_events = !!mouse_events; + rp->mouse_events = !!mouse_events; - if (mouse_events) + if (rp->mouse_events) { evas_object_pass_events_set(rp->object, 0); _edje_callbacks_add(rp->object, ed, rp); @@ -6434,56 +6433,56 @@ _edje_part_mouse_events_set(Edje *ed EINA_UNUSED, Edje_Real_Part *rp, Eina_Bool } Eina_Bool -_edje_part_repeat_events_get(Edje *ed EINA_UNUSED, Edje_Real_Part *rp) +_edje_real_part_repeat_events_get(Edje *ed EINA_UNUSED, Edje_Real_Part *rp) { if (!rp) return EINA_FALSE; - return rp->part->repeat_events; + return rp->repeat_events; } void -_edje_part_repeat_events_set(Edje *ed EINA_UNUSED, Edje_Real_Part *rp, Eina_Bool repeat_events) +_edje_real_part_repeat_events_set(Edje *ed EINA_UNUSED, Edje_Real_Part *rp, Eina_Bool repeat_events) { if (!rp) return; - rp->part->repeat_events = !!repeat_events; + rp->repeat_events = !!repeat_events; - if (repeat_events) + if (rp->repeat_events) evas_object_repeat_events_set(rp->object, 1); else evas_object_repeat_events_set(rp->object, 0); } Evas_Event_Flags -_edje_part_ignore_flags_get(Edje *ed EINA_UNUSED, Edje_Real_Part *rp) +_edje_real_part_ignore_flags_get(Edje *ed EINA_UNUSED, Edje_Real_Part *rp) { if (!rp) return EVAS_EVENT_FLAG_NONE; - return rp->part->ignore_flags; + return rp->ignore_flags; } void -_edje_part_ignore_flags_set(Edje *ed EINA_UNUSED, Edje_Real_Part *rp, Evas_Event_Flags ignore_flags) +_edje_real_part_ignore_flags_set(Edje *ed EINA_UNUSED, Edje_Real_Part *rp, Evas_Event_Flags ignore_flags) { if (!rp) return; - rp->part->ignore_flags = ignore_flags; + rp->ignore_flags = ignore_flags; } Evas_Event_Flags -_edje_part_mask_flags_get(Edje *ed EINA_UNUSED, Edje_Real_Part *rp) +_edje_real_part_mask_flags_get(Edje *ed EINA_UNUSED, Edje_Real_Part *rp) { if (!rp) return EVAS_EVENT_FLAG_NONE; - return rp->part->mask_flags; + return rp->mask_flags; } void -_edje_part_mask_flags_set(Edje *ed EINA_UNUSED, Edje_Real_Part *rp, Evas_Event_Flags mask_flags) +_edje_real_part_mask_flags_set(Edje *ed EINA_UNUSED, Edje_Real_Part *rp, Evas_Event_Flags mask_flags) { if (!rp) return; - rp->part->mask_flags = mask_flags; + rp->mask_flags = mask_flags; } // TIZEN_ONLY(20150716): Add edje_object_part_text_freeze, thaw APIs for freezing cursor movements. -- 2.7.4