cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=57c14f1c55fc6fa9338c0291db66307bfeca305b

commit 57c14f1c55fc6fa9338c0291db66307bfeca305b
Author: Jee-Yong Um <jc9...@samsung.com>
Date:   Tue Feb 7 15:08:19 2017 -0800

    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 <ced...@osg.samsung.com>
---
 src/lib/edje/edje_callbacks.c | 26 +++++++++++++-------------
 src/lib/edje/edje_embryo.c    | 16 ++++++++--------
 src/lib/edje/edje_entry.c     | 20 ++++++++++----------
 src/lib/edje/edje_load.c      |  9 ++++++---
 src/lib/edje/edje_private.h   | 20 ++++++++++++--------
 src/lib/edje/edje_util.c      | 40 ++++++++++++++++++++--------------------
 6 files changed, 69 insertions(+), 62 deletions(-)

diff --git a/src/lib/edje/edje_callbacks.c b/src/lib/edje/edje_callbacks.c
index 8815489..ac6f52c 100644
--- a/src/lib/edje/edje_callbacks.c
+++ b/src/lib/edje/edje_callbacks.c
@@ -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;
      }
 }
 
diff --git a/src/lib/edje/edje_embryo.c b/src/lib/edje/edje_embryo.c
index c7c70f7..e6963b6 100644
--- a/src/lib/edje/edje_embryo.c
+++ b/src/lib/edje/edje_embryo.c
@@ -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;
 
diff --git a/src/lib/edje/edje_entry.c b/src/lib/edje/edje_entry.c
index 785f0c8..2f59eae 100644
--- a/src/lib/edje/edje_entry.c
+++ b/src/lib/edje/edje_entry.c
@@ -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
diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c
index 0f5424b..aa9c14c 100644
--- a/src/lib/edje/edje_load.c
+++ b/src/lib/edje/edje_load.c
@@ -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);
diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h
index b100365..11243a5 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -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);
diff --git a/src/lib/edje/edje_util.c b/src/lib/edje/edje_util.c
index 8eb729b..d8a29fe 100644
--- a/src/lib/edje/edje_util.c
+++ b/src/lib/edje/edje_util.c
@@ -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 */

-- 


Reply via email to