fix inconsistency with propagating signals and messages. now messages
authorraster <raster>
Fri, 18 Nov 2011 10:35:38 +0000 (10:35 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Fri, 18 Nov 2011 10:35:38 +0000 (10:35 +0000)
AND signals should propagate to children the SAME WAY - that means
children you added explicitly in the edje file and not form c code get
propagated to.

git-svn-id: http://svn.enlightenment.org/svn/e/trunk/edje@65384 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/edje_embryo.c
src/lib/edje_entry.c
src/lib/edje_load.c
src/lib/edje_lua2.c
src/lib/edje_message_queue.c
src/lib/edje_private.h
src/lib/edje_program.c
src/lib/edje_util.c

index 378a1fb..c89a4f4 100644 (file)
@@ -2609,6 +2609,7 @@ _edje_embryo_fn_part_swallow(Embryo_Program *ep, Embryo_Cell *params)
         return 0;
      }
    edje_object_part_swallow(ed->obj, rp->part->name, new_obj);
+   _edje_subobj_register(ed, new_obj);
 
    return 0;
 }
index d561456..7f0eb14 100644 (file)
@@ -464,8 +464,6 @@ _sel_clear(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o __UNUSED__, Entry
         Sel *sel;
 
         sel = en->sel->data;
-        en->rp->edje->subobjs = eina_list_remove(en->rp->edje->subobjs, sel->obj_bg);
-        en->rp->edje->subobjs = eina_list_remove(en->rp->edje->subobjs, sel->obj_fg);
         if (sel->obj_bg) evas_object_del(sel->obj_bg);
         if (sel->obj_fg) evas_object_del(sel->obj_fg);
         free(sel);
@@ -497,8 +495,6 @@ _sel_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
         while (en->sel)
           {
              sel = en->sel->data;
-             en->rp->edje->subobjs = eina_list_remove(en->rp->edje->subobjs, sel->obj_bg);
-             en->rp->edje->subobjs = eina_list_remove(en->rp->edje->subobjs, sel->obj_fg);
              if (sel->obj_bg) evas_object_del(sel->obj_bg);
              if (sel->obj_fg) evas_object_del(sel->obj_fg);
              free(sel);
@@ -520,7 +516,7 @@ _sel_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
                   evas_object_pass_events_set(ob, EINA_TRUE);
                   evas_object_show(ob);
                   sel->obj_bg = ob;
-                  en->rp->edje->subobjs = eina_list_append(en->rp->edje->subobjs, sel->obj_bg);
+                  _edje_subobj_register(en->rp->edje, sel->obj_bg);
 
                   ob = edje_object_add(en->rp->edje->base.evas);
                   edje_object_file_set(ob, en->rp->edje->path, en->rp->part->source2);
@@ -530,7 +526,7 @@ _sel_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
                   evas_object_pass_events_set(ob, EINA_TRUE);
                   evas_object_show(ob);
                   sel->obj_fg = ob;
-                  en->rp->edje->subobjs = eina_list_append(en->rp->edje->subobjs, sel->obj_fg);
+                  _edje_subobj_register(en->rp->edje, sel->obj_fg);
                }
           }
      }
@@ -728,10 +724,6 @@ _anchors_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
                   while (an->sel)
                     {
                        sel = an->sel->data;
-                       en->rp->edje->subobjs = 
-                         eina_list_remove(en->rp->edje->subobjs, sel->obj_bg);
-                       en->rp->edje->subobjs = 
-                         eina_list_remove(en->rp->edje->subobjs, sel->obj_fg);
                        if (sel->obj_bg) evas_object_del(sel->obj_bg);
                        if (sel->obj_fg) evas_object_del(sel->obj_fg);
                        if (sel->obj) evas_object_del(sel->obj);
@@ -766,8 +758,6 @@ _anchors_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
                   while (an->sel)
                     {
                        sel = an->sel->data;
-                       en->rp->edje->subobjs = eina_list_remove(en->rp->edje->subobjs, sel->obj_bg);
-                       en->rp->edje->subobjs = eina_list_remove(en->rp->edje->subobjs, sel->obj_fg);
                        if (sel->obj_bg) evas_object_del(sel->obj_bg);
                        if (sel->obj_fg) evas_object_del(sel->obj_fg);
                        if (sel->obj) evas_object_del(sel->obj);
@@ -788,7 +778,7 @@ _anchors_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
                        evas_object_pass_events_set(ob, EINA_TRUE);
                        evas_object_show(ob);
                        sel->obj_bg = ob;
-                       en->rp->edje->subobjs = eina_list_append(en->rp->edje->subobjs, sel->obj_bg);
+                       _edje_subobj_register(en->rp->edje, sel->obj_bg);
 
                        ob = edje_object_add(en->rp->edje->base.evas);
                        edje_object_file_set(ob, en->rp->edje->path, en->rp->part->source6);
@@ -798,7 +788,7 @@ _anchors_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
                        evas_object_pass_events_set(ob, EINA_TRUE);
                        evas_object_show(ob);
                        sel->obj_fg = ob;
-                       en->rp->edje->subobjs = eina_list_append(en->rp->edje->subobjs, sel->obj_fg);
+                       _edje_subobj_register(en->rp->edje, sel->obj_fg);
 
                        ob = evas_object_rectangle_add(en->rp->edje->base.evas);
                        evas_object_color_set(ob, 0, 0, 0, 0);
@@ -878,8 +868,6 @@ _anchors_clear(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o __UNUSED__, E
         while (an->sel)
           {
              Sel *sel = an->sel->data;
-             en->rp->edje->subobjs = eina_list_remove(en->rp->edje->subobjs, sel->obj_bg);
-             en->rp->edje->subobjs = eina_list_remove(en->rp->edje->subobjs, sel->obj_fg);
              if (sel->obj_bg) evas_object_del(sel->obj_bg);
              if (sel->obj_fg) evas_object_del(sel->obj_fg);
              if (sel->obj) evas_object_del(sel->obj);
@@ -2012,7 +2000,7 @@ _edje_entry_real_part_init(Edje_Real_Part *rp)
    evas_object_stack_below(en->cursor_bg, rp->object);
    evas_object_clip_set(en->cursor_bg, evas_object_clip_get(rp->object));
    evas_object_pass_events_set(en->cursor_bg, EINA_TRUE);
-   rp->edje->subobjs = eina_list_append(rp->edje->subobjs, en->cursor_bg);
+   _edje_subobj_register(en->rp->edje, en->cursor_bg);
 
    en->cursor_fg = edje_object_add(rp->edje->base.evas);
    edje_object_file_set(en->cursor_fg, rp->edje->path, rp->part->source4);
@@ -2020,7 +2008,7 @@ _edje_entry_real_part_init(Edje_Real_Part *rp)
    evas_object_stack_above(en->cursor_fg, rp->object);
    evas_object_clip_set(en->cursor_fg, evas_object_clip_get(rp->object));
    evas_object_pass_events_set(en->cursor_fg, EINA_TRUE);
-   rp->edje->subobjs = eina_list_append(rp->edje->subobjs, en->cursor_fg);
+   _edje_subobj_register(en->rp->edje, en->cursor_fg);
 
    if (rp->part->entry_mode >= EDJE_ENTRY_EDIT_MODE_EDITABLE)
      {
@@ -2086,8 +2074,6 @@ _edje_entry_real_part_shutdown(Edje_Real_Part *rp)
 #ifdef HAVE_ECORE_IMF
    _preedit_clear(en);
 #endif
-   rp->edje->subobjs = eina_list_remove(rp->edje->subobjs, en->cursor_bg);
-   rp->edje->subobjs = eina_list_remove(rp->edje->subobjs, en->cursor_fg);
    evas_object_del(en->cursor_bg);
    evas_object_del(en->cursor_fg);
 
index a67fc01..a82f73a 100644 (file)
@@ -771,6 +771,8 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
                                 pack_it = NULL;
                              }
                         }
+                       if (source)
+                         _edje_subobj_register(ed, child_obj);
                    }
               }
 
index e5f1eac..8a081c9 100644 (file)
@@ -1410,6 +1410,7 @@ _elua_edje(lua_State *L)  // Stack usage [-?, +?, ?]
 {
    _ELUA_PLANT_EVAS_OBJECT(Edje_Lua_Evas_Object, _elua_evas_edje_meta, _elua_evas_obj_free)
    elo->evas_obj = edje_object_add(evas_object_evas_get(ed->obj));
+   _edje_subobj_register(ed, elo->evas_obj);
    _elua_polish_evas_object(ed, elo);
    return 1;
 }
index e06be09..2a761d9 100644 (file)
@@ -17,12 +17,19 @@ EAPI void
 edje_object_message_send(Evas_Object *obj, Edje_Message_Type type, int id, void *msg)
 {
    Edje *ed;
-   unsigned int i;
+   Eina_List *l;
+   Evas_Object *o;
 
    ed = _edje_fetch(obj);
    if (!ed) return;
-   
    _edje_message_send(ed, EDJE_QUEUE_SCRIPT, type, id, msg);
+   EINA_LIST_FOREACH(ed->subobjs, l, o)
+     {
+        edje_object_message_send(o, type, id, msg);
+     }
+/* old manual part walking code to send messages to children - should all
+ * be in subobjs if we care
+   unsigned int i;
 
    for (i = 0; i < ed->table_parts_size; i++)
      {
@@ -47,6 +54,7 @@ edje_object_message_send(Evas_Object *obj, Edje_Message_Type type, int id, void
                }
           }
      }
+ */
 }
 
 
@@ -208,10 +216,21 @@ _edje_message_shutdown(void)
 void
 _edje_message_cb_set(Edje *ed, void (*func) (void *data, Evas_Object *obj, Edje_Message_Type type, int id, void *msg), void *data)
 {
-   unsigned int i;
+   Eina_List *l;
+   Evas_Object *o;
 
    ed->message.func = func;
    ed->message.data = data;
+   EINA_LIST_FOREACH(ed->subobjs, l, o)
+     {
+        Edje *edj2 = _edje_fetch(o);
+        if (!edj2) continue;
+        _edje_message_cb_set(edj2, func, data);
+     }
+/* old manual part walking code to send messages to children - should all
+ * be in subobjs if we care
+   unsigned int i;
+   
    for (i = 0; i < ed->table_parts_size; i++)
      {
         Edje_Real_Part *rp = ed->table_parts[i];
@@ -234,6 +253,7 @@ _edje_message_cb_set(Edje *ed, void (*func) (void *data, Evas_Object *obj, Edje_
                }
           }
      }
+ */
 }
 
 Edje_Message *
index 4f626b2..fc4aeab 100644 (file)
@@ -1964,6 +1964,8 @@ void _edje_object_orientation_inform(Evas_Object *obj);
 void _edje_lib_ref(void);
 void _edje_lib_unref(void);
 
+void _edje_subobj_register(Edje *ed, Evas_Object *ob);
+
 void _edje_multisense_init(void);
 void _edje_multisense_shutdown(void);
 Eina_Bool _edje_multisense_internal_sound_sample_play(Edje *ed, const char *sample_name, const double speed);
index a0394d3..931977c 100644 (file)
@@ -846,12 +846,9 @@ _edje_emit(Edje *ed, const char *sig, const char *src)
 
 /* data should either be NULL or a malloc allocated data */
 void
-_edje_emit_full(Edje *ed, const char *sig, const char *src, void *data,
-      void (*free_func)(void *))
+_edje_emit_full(Edje *ed, const char *sig, const char *src, void *data, void (*free_func)(void *))
 {
    Edje_Message_Signal emsg;
-   Eina_List *l;
-   Evas_Object *obj;
    const char *sep;
 
    if (ed->delete_me) return;
@@ -991,6 +988,9 @@ _edje_emit_full(Edje *ed, const char *sig, const char *src, void *data,
      {
         emsg.data = NULL;
      }
+/* new sends code */
+   edje_object_message_send(ed->obj, EDJE_MESSAGE_SIGNAL, 0, &emsg);
+/* old send code - use api now
    _edje_message_send(ed, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg);
    EINA_LIST_FOREACH(ed->subobjs, l, obj)
      {
@@ -1001,7 +1001,7 @@ _edje_emit_full(Edje *ed, const char *sig, const char *src, void *data,
         if (ed2->delete_me) continue;
         _edje_message_send(ed2, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg);
      }
-
+ */
    if (emsg.data && (--(emsg.data->ref) == 0))
      {
         if (emsg.data->free_func)
index 77e7d5a..072a404 100644 (file)
@@ -4297,5 +4297,21 @@ edje_string_id_get(const Edje_String *es)
    return es->str;
 }
 
+static void
+_cb_subobj_del(void *data, __UNUSED__ Evas *e, Evas_Object *obj, __UNUSED__ void *event_info)
+{
+   Edje *ed = data;
+   ed->subobjs = eina_list_remove(ed->subobjs, obj);
+   evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL,
+                                       _cb_subobj_del, ed);
+}
+
+void
+_edje_subobj_register(Edje *ed, Evas_Object *ob)
+{
+   ed->subobjs = eina_list_append(ed->subobjs, ob);
+   evas_object_event_callback_add(ob, EVAS_CALLBACK_DEL,
+                                  _cb_subobj_del, ed);
+}
 
 /* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/