discomfitor pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=e54bb78a3e07bd1ec4be907054f18192c1548b7f
commit e54bb78a3e07bd1ec4be907054f18192c1548b7f Author: Mike Blumenkrantz <[email protected]> Date: Mon Mar 31 11:05:24 2014 -0400 edje emit refactored to streamline emit programs with targets --- src/lib/edje/edje_program.c | 322 +++++++++++++++++++++++--------------------- 1 file changed, 169 insertions(+), 153 deletions(-) diff --git a/src/lib/edje/edje_program.c b/src/lib/edje/edje_program.c index e4dbd7e..fbac564 100644 --- a/src/lib/edje/edje_program.c +++ b/src/lib/edje/edje_program.c @@ -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 --
