edje: fix cached edje modification issue

Summary:
_edje_part_***_set/get (for mouse_events, repeat_events, ignore_flags, mask_flags)
overwrite cached edje value. These behaviors affect all edje object added after
these changes, and result in not intended.

@fix

Reviewers: jpeg, cedric

Subscribers: akanad, woohyun

Differential Revision: https://phab.enlightenment.org/D4362

Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
This commit is contained in:
Jee-Yong Um 2017-02-07 15:08:19 -08:00 committed by Cedric BAIL
parent 9fa4a5fb6d
commit 57c14f1c55
6 changed files with 69 additions and 62 deletions

View File

@ -68,10 +68,10 @@ _edje_mouse_in_signal_cb(void *data, const Efl_Event *event)
rp = evas_object_data_get(event->object, "real_part");
if (rp)
{
if (!(ev->event_flags) || !(rp->part->ignore_flags & ev->event_flags))
_edje_seat_emit(ed, ev->device, "mouse,in", rp->part->name);
if (!(ev->event_flags) || !(rp->ignore_flags & ev->event_flags))
_edje_seat_emit(ed, ev->device, "mouse,in", rp->part->name);
ev->event_flags |= rp->part->mask_flags;
ev->event_flags |= rp->mask_flags;
}
}
@ -87,10 +87,10 @@ _edje_mouse_out_signal_cb(void *data, const Efl_Event *event)
rp = evas_object_data_get(event->object, "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_seat_emit(ed, ev->device, "mouse,out", rp->part->name);
ev->event_flags |= rp->part->mask_flags;
ev->event_flags |= rp->mask_flags;
}
}
@ -108,7 +108,7 @@ _edje_mouse_down_signal_cb(void *data, const Efl_Event *event)
rp = evas_object_data_get(event->object, "real_part");
if (!rp) return;
ignored = rp->part->ignore_flags & ev->event_flags;
ignored = rp->ignore_flags & ev->event_flags;
_edje_ref(ed);
_edje_util_freeze(ed);
@ -160,7 +160,7 @@ _edje_mouse_down_signal_cb(void *data, const Efl_Event *event)
_edje_util_thaw(ed);
_edje_unref(ed);
ev->event_flags |= rp->part->mask_flags;
ev->event_flags |= rp->mask_flags;
}
static void
@ -177,7 +177,7 @@ _edje_mouse_up_signal_cb(void *data, const Efl_Event *event)
rp = evas_object_data_get(event->object, "real_part");
if (!rp) return;
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, const Efl_Event *event)
_edje_util_thaw(ed);
_edje_unref(ed);
ev->event_flags |= rp->part->mask_flags;
ev->event_flags |= rp->mask_flags;
}
static void
@ -254,7 +254,7 @@ _edje_mouse_move_signal_cb(void *data, const Efl_Event *event)
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))
@ -344,7 +344,7 @@ _edje_mouse_move_signal_cb(void *data, const Efl_Event *event)
_edje_unref(ed);
_edje_util_thaw(ed);
ev->event_flags |= rp->part->mask_flags;
ev->event_flags |= rp->mask_flags;
}
static void
@ -360,7 +360,7 @@ _edje_mouse_wheel_signal_cb(void *data, const Efl_Event *event)
rp = evas_object_data_get(event->object, "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->wheel.dir == EFL_ORIENT_HORIZONTAL ? 1 : 0,
@ -368,7 +368,7 @@ _edje_mouse_wheel_signal_cb(void *data, const Efl_Event *event)
_edje_seat_emit(ed, ev->device, buf, rp->part->name);
}
ev->event_flags |= rp->part->mask_flags;
ev->event_flags |= rp->mask_flags;
}
}

View File

@ -3572,7 +3572,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;
}
@ -3594,7 +3594,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;
@ -3617,7 +3617,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;
}
@ -3639,7 +3639,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;
@ -3662,7 +3662,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;
}
@ -3684,7 +3684,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;
@ -3707,7 +3707,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;
}
@ -3729,7 +3729,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;

View File

@ -832,7 +832,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;
@ -855,7 +855,7 @@ _edje_anchor_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EIN
evas_textblock_cursor_format_prepend(an->end, "</>");
}
}
ev->event_flags |= rp->part->mask_flags;
ev->event_flags |= rp->mask_flags;
}
static void
@ -874,7 +874,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);
@ -914,7 +914,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
@ -936,7 +936,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;
@ -946,7 +946,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
@ -960,7 +960,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
@ -974,7 +974,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
@ -988,7 +988,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
@ -1002,7 +1002,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

View File

@ -1192,13 +1192,16 @@ _edje_object_file_set_internal(Evas_Object *obj, const Eina_File *file, const ch
evas_object_smart_member_add(rp->object, ed->obj);
// 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);
if (rp->repeat_events)
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);

View File

@ -2028,9 +2028,13 @@ struct _Edje_Real_Part
#endif
char clicked_button; // 1
unsigned char type; // 1
Evas_Event_Flags ignore_flags;
Evas_Event_Flags mask_flags;
unsigned char calculated : 2; // 1
unsigned char calculating : 2; // 0
Eina_Bool still_in : 1; // 0
unsigned char mouse_events : 1;
unsigned char repeat_events : 1;
#ifdef EDJE_CALC_CACHE
Eina_Bool invalidate : 1; // 0
#endif
@ -3077,14 +3081,14 @@ void _animation_get(Eo *obj, void *_pd, va_list *list);
void edje_signal_init(void);
void edje_signal_shutdown(void);
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);
/* part containers: box */
Eo *_edje_box_internal_proxy_get(Edje_Object *obj, Edje *ed, Edje_Real_Part *rp);

View File

@ -6288,10 +6288,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);
evas_object_repeat_events_set(obj_swallow, rp->part->repeat_events);
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);
@ -6513,21 +6513,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);
@ -6540,56 +6540,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;
}
/* Legacy APIs */