edje emit refactored to streamline emit programs with targets
authorMike Blumenkrantz <zmike@samsung.com>
Mon, 31 Mar 2014 15:05:24 +0000 (11:05 -0400)
committerMike Blumenkrantz <zmike@samsung.com>
Fri, 25 Apr 2014 14:52:15 +0000 (10:52 -0400)
src/lib/edje/edje_program.c

index e4dbd7e..fbac564 100644 (file)
@@ -9,6 +9,164 @@ Ecore_Animator *_edje_timer = NULL;
 Eina_List      *_edje_animators = NULL;
 
 
+static Eina_Bool
+_edje_emit_aliased(Edje *ed, const char *part, const char *sig, const char *src)
+{
+   char *alias, *aliased;
+   int alien, nslen, length;
+
+   /* lookup for alias */
+   if ((!ed->collection) || (!ed->collection->alias)) return EINA_FALSE;
+   alias = eina_hash_find(ed->collection->alias, part);
+   if (!alias) return EINA_FALSE;
+
+   alien = strlen(alias);
+   nslen = strlen(sig);
+   length = alien + nslen + 2;
+
+   aliased = alloca(length);
+   memcpy(aliased, alias, alien);
+   aliased[alien] = EDJE_PART_PATH_SEPARATOR;
+   memcpy(aliased + alien + 1, sig, nslen + 1);
+
+   _edje_emit(ed, aliased, src);
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_edje_emit_child(Edje *ed, Edje_Real_Part *rp, const char *part, const char *sig, const char *src)
+{
+   Edje *ed2;
+   char *idx;
+
+   /* search for the index if present and remove it from the part */
+   idx = strchr(part, EDJE_PART_PATH_SEPARATOR_INDEXL);
+   if (idx)
+     {
+        char *end;
+
+        end = strchr(idx + 1, EDJE_PART_PATH_SEPARATOR_INDEXR);
+        if (end && end != idx + 1)
+          {
+             char *tmp;
+
+             tmp = alloca(end - idx);
+             memcpy(tmp, idx + 1, end - idx - 1);
+             tmp[end - idx - 1] = '\0';
+             *idx = '\0';
+             idx = tmp;
+          }
+        else
+          {
+             idx = NULL;
+          }
+     }
+
+   /* search for the right part now */
+   if (!rp)
+     rp = _edje_real_part_get(ed, part);
+   if (!rp) return ed->collection->broadcast_signal;
+
+   switch (rp->part->type)
+     {
+      case EDJE_PART_TYPE_GROUP:
+         if (((rp->type != EDJE_RP_TYPE_SWALLOW) ||
+              (!rp->typedata.swallow)) ||
+             (!rp->typedata.swallow->swallowed_object))
+           break;
+         ed2 = _edje_fetch(rp->typedata.swallow->swallowed_object);
+         if (!ed2) break;
+
+         _edje_emit(ed2, sig, src);
+         return EINA_FALSE;
+
+      case EDJE_PART_TYPE_EXTERNAL:
+         if (((rp->type != EDJE_RP_TYPE_SWALLOW) ||
+              (!rp->typedata.swallow)) ||
+             (!rp->typedata.swallow->swallowed_object))
+           break;
+
+         if (!idx)
+           {
+              _edje_external_signal_emit(rp->typedata.swallow->swallowed_object, sig, src);
+           }
+         else
+           {
+              Evas_Object *child;
+
+              child = _edje_children_get(rp, idx);
+              ed2 = _edje_fetch(child);
+              if (!ed2) break;
+              _edje_emit(ed2, sig, src);
+           }
+         return EINA_FALSE;
+
+      case EDJE_PART_TYPE_BOX:
+      case EDJE_PART_TYPE_TABLE:
+         if (idx)
+           {
+              Evas_Object *child;
+
+              child = _edje_children_get(rp, idx);
+              ed2 = _edje_fetch(child);
+              if (!ed2) break;
+              _edje_emit(ed2, sig, src);
+              return EINA_FALSE;
+           }
+         break ;
+
+      default:
+         //              ERR("SPANK SPANK SPANK !!!\nYou should never be here !");
+         break;
+     }
+   return ed->collection->broadcast_signal;
+}
+
+static void
+_edje_emit_send(Edje *ed, Eina_Bool broadcast, const char *sig, const char *src, void *data, Ecore_Cb free_func)
+{
+   Edje_Message_Signal emsg;
+
+   emsg.sig = sig;
+   emsg.src = src;
+   if (data)
+     {
+        emsg.data = calloc(1, sizeof(*(emsg.data)));
+        emsg.data->ref = 1;
+        emsg.data->data = data;
+        emsg.data->free_func = free_func;
+     }
+   else
+     {
+        emsg.data = NULL;
+     }
+   /* new sends code */
+   if (broadcast)
+     edje_object_message_send(ed->obj, EDJE_MESSAGE_SIGNAL, 0, &emsg);
+   else
+     _edje_util_message_send(ed, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg);
+   /* old send code - use api now
+      _edje_util_message_send(ed, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg);
+      EINA_LIST_FOREACH(ed->subobjs, l, obj)
+      {
+      Edje *ed2;
+
+      ed2 = _edje_fetch(obj);
+      if (!ed2) continue;
+      if (ed2->delete_me) continue;
+      _edje_util_message_send(ed2, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg);
+      }
+    */
+   if (emsg.data && (--(emsg.data->ref) == 0))
+     {
+        if (emsg.data->free_func)
+          {
+             emsg.data->free_func(emsg.data->data);
+          }
+        free(emsg.data);
+     }
+}
+
 /*============================================================================*
  *                                   API                                      *
  *============================================================================*/
@@ -632,13 +790,16 @@ low_mem_current:
            {
               EINA_LIST_FOREACH(pr->targets, l, pt)
                 {
-                   char buf[1024];
-
                    if (pt->id < 0) continue;
                    rp = ed->table_parts[pt->id % ed->table_parts_size];
                    if (!rp) continue;
-                   snprintf(buf, sizeof(buf), "%s:%s", rp->part->name, pr->state);
-                   _edje_emit(ed, buf, pr->state2);
+                   if (!_edje_emit_aliased(ed, rp->part->name, pr->state, pr->state2))
+                     {
+                        Eina_Bool broadcast;
+
+                        broadcast = _edje_emit_child(ed, rp, rp->part->name, pr->state, pr->state2);
+                        _edje_emit_send(ed, broadcast, pr->state, pr->state2, NULL, NULL);
+                     }
                 }
            }
          else
@@ -958,26 +1119,20 @@ _edje_emit(Edje *ed, const char *sig, const char *src)
 void
 _edje_emit_full(Edje *ed, const char *sig, const char *src, void *data, void (*free_func)(void *))
 {
-   Edje_Message_Signal emsg;
    const char *sep;
    Eina_Bool broadcast;
 
    if (!ed->collection) return;
    if (ed->delete_me) return;
-   broadcast = ed->collection->broadcast_signal;
 
    sep = strchr(sig, EDJE_PART_PATH_SEPARATOR);
-
    /* If we are not sending the signal to a part of the child, the
     * signal if for ourself
     */
    if (sep)
      {
-        Edje_Real_Part *rp = NULL;
         const char *newsig;
-        Edje *ed2;
         char *part;
-        char *idx;
         unsigned int length;
 
         /* the signal contains a colon, split the signal into "parts:signal" */
@@ -988,153 +1143,14 @@ _edje_emit_full(Edje *ed, const char *sig, const char *src, void *data, void (*f
 
         newsig = sep + 1;
 
-        /* lookup for alias */
-        if (ed->collection && ed->collection->alias)
-          {
-             char *alias;
-
-             alias = eina_hash_find(ed->collection->alias, part);
-             if (alias) {
-                  char *aliased;
-                  int alien;
-                  int nslen;
-
-                  alien = strlen(alias);
-                  nslen = strlen(newsig);
-                  length = alien + nslen + 2;
-
-                  aliased = alloca(length);
-                  memcpy(aliased, alias, alien);
-                  aliased[alien] = EDJE_PART_PATH_SEPARATOR;
-                  memcpy(aliased + alien + 1, newsig, nslen + 1);
-
-                  _edje_emit(ed, aliased, src);
-                  return;
-             }
-          }
-
-        /* search for the index if present and remove it from the part */
-        idx = strchr(part, EDJE_PART_PATH_SEPARATOR_INDEXL);
-        if (idx)
-          {
-             char *end;
-
-             end = strchr(idx + 1, EDJE_PART_PATH_SEPARATOR_INDEXR);
-             if (end && end != idx + 1)
-               {
-                  char *tmp;
-
-                  tmp = alloca(end - idx);
-                  memcpy(tmp, idx + 1, end - idx - 1);
-                  tmp[end - idx - 1] = '\0';
-                  *idx = '\0';
-                  idx = tmp;
-               }
-             else
-               {
-                  idx = NULL;
-               }
-          }
-
-        /* search for the right part now */
-        rp = _edje_real_part_get(ed, part);
-        if (!rp) goto end;
-
-        switch (rp->part->type)
-          {
-           case EDJE_PART_TYPE_GROUP:
-              if (((rp->type != EDJE_RP_TYPE_SWALLOW) ||
-                   (!rp->typedata.swallow)) ||
-                  (!rp->typedata.swallow->swallowed_object))
-                goto end;
-              ed2 = _edje_fetch(rp->typedata.swallow->swallowed_object);
-              if (!ed2) goto end;
-
-              _edje_emit(ed2, newsig, src);
-              broadcast = EINA_FALSE;
-              break;
-
-           case EDJE_PART_TYPE_EXTERNAL:
-              if (((rp->type != EDJE_RP_TYPE_SWALLOW) ||
-                   (!rp->typedata.swallow)) ||
-                  (!rp->typedata.swallow->swallowed_object))
-                break;
-
-              if (!idx)
-                {
-                   _edje_external_signal_emit(rp->typedata.swallow->swallowed_object, newsig, src);
-                }
-              else
-                {
-                   Evas_Object *child;
-
-                   child = _edje_children_get(rp, idx);
-                   ed2 = _edje_fetch(child);
-                   if (!ed2) goto end;
-                   _edje_emit(ed2, newsig, src);
-                }
-              broadcast = EINA_FALSE;
-              break ;
-
-           case EDJE_PART_TYPE_BOX:
-           case EDJE_PART_TYPE_TABLE:
-              if (idx)
-                {
-                   Evas_Object *child;
-
-                   child = _edje_children_get(rp, idx);
-                   ed2 = _edje_fetch(child);
-                   if (!ed2) goto end;
-                   _edje_emit(ed2, newsig, src);
-                   broadcast = EINA_FALSE;
-                }
-              break ;
-
-           default:
-              //              ERR("SPANK SPANK SPANK !!!\nYou should never be here !");
-              break;
-          }
-     }
+        if (_edje_emit_aliased(ed, part, newsig, src)) return;
 
-end:
-   emsg.sig = sig;
-   emsg.src = src;
-   if (data)
-     {
-        emsg.data = calloc(1, sizeof(*(emsg.data)));
-        emsg.data->ref = 1;
-        emsg.data->data = data;
-        emsg.data->free_func = free_func;
+        broadcast = _edje_emit_child(ed, NULL, part, newsig, src);
      }
    else
-     {
-        emsg.data = NULL;
-     }
-   /* new sends code */
-   if (broadcast)
-     edje_object_message_send(ed->obj, EDJE_MESSAGE_SIGNAL, 0, &emsg);
-   else
-     _edje_util_message_send(ed, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg);
-   /* old send code - use api now
-      _edje_util_message_send(ed, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg);
-      EINA_LIST_FOREACH(ed->subobjs, l, obj)
-      {
-      Edje *ed2;
+     broadcast = ed->collection->broadcast_signal;
 
-      ed2 = _edje_fetch(obj);
-      if (!ed2) continue;
-      if (ed2->delete_me) continue;
-      _edje_util_message_send(ed2, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg);
-      }
-    */
-   if (emsg.data && (--(emsg.data->ref) == 0))
-     {
-        if (emsg.data->free_func)
-          {
-             emsg.data->free_func(emsg.data->data);
-          }
-        free(emsg.data);
-     }
+   _edje_emit_send(ed, broadcast, sig, src, data, free_func);
 }
 
 struct _Edje_Program_Data