* edje: fix signal comming from aliased part.
authorcedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 12 Oct 2010 13:26:18 +0000 (13:26 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 12 Oct 2010 13:26:18 +0000 (13:26 +0000)
I needed to bump minor file format version, but it will only
change behaviour for people using alias for part and they
couldn't use the signal emitted by them.

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

src/bin/edje_cc_handlers.c
src/lib/edje_data.c
src/lib/edje_load.c
src/lib/edje_private.h

index fcf3113..558b3a7 100644 (file)
@@ -2015,13 +2015,21 @@ static void
 st_collections_group_parts_alias(void)
 {
    Edje_Part_Collection *pc;
+   const char *alias;
+   const char *aliased;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
 
+   alias = parse_str(0);
+   aliased = parse_str(1);
+
    if (!pc->alias) pc->alias = eina_hash_string_small_new(NULL);
-   eina_hash_add(pc->alias, parse_str(0), parse_str(1));
+   eina_hash_add(pc->alias, alias, aliased);
+
+   if (!pc->aliased) pc->aliased = eina_hash_string_small_new(NULL);
+   eina_hash_add(pc->aliased, aliased, alias);
 }
 
 
index d4ca34e..ac9a5a0 100644 (file)
@@ -777,6 +777,7 @@ _edje_edd_init(void)
    EET_DATA_DESCRIPTOR_ADD_HASH(_edje_edd_edje_part_collection, Edje_Part_Collection, "data", data, _edje_edd_edje_string);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "id", id, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_HASH_STRING(_edje_edd_edje_part_collection, Edje_Part_Collection, "alias", alias);
+   EET_DATA_DESCRIPTOR_ADD_HASH_STRING(_edje_edd_edje_part_collection, Edje_Part_Collection, "aliased", aliased);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "prop.min.w", prop.min.w, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "prop.min.h", prop.min.h, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "prop.max.w", prop.max.w, EET_T_INT);
index 52a72f6..c51220c 100644 (file)
@@ -1346,14 +1346,38 @@ _edje_object_pack_item_hints_set(Evas_Object *obj, Edje_Pack_Element *it)
    evas_object_resize(obj, w, h);
 }
 
+static const char *
+_edje_find_alias(Eina_Hash *aliased, char *src, int *length)
+{
+   const char *alias;
+   char *search;
+
+   *length = strlen(src);
+   if (*length == 0) return NULL;
+
+   alias = eina_hash_find(aliased, src);
+   if (alias) return alias;
+
+   search = strrchr(src, EDJE_PART_PATH_SEPARATOR);
+   if (search == NULL) return NULL;
+
+   *search = '\0';
+   alias = _edje_find_alias(aliased, src, length);
+   *search = EDJE_PART_PATH_SEPARATOR;
+
+   return alias;
+}
+
 static void
 _cb_signal_repeat(void *data, Evas_Object *obj, const char *signal, const char *source)
 {
    Evas_Object *parent;
    Edje                *ed;
+   Edje         *ed_parent;
    char                 new_src[4096]; /* XXX is this max reasonable? */
    size_t       length_parent = 0;
    size_t       length_source;
+   const char   *alias = NULL;
 
    parent = data;
    ed = _edje_fetch(obj);
@@ -1370,5 +1394,36 @@ _cb_signal_repeat(void *data, Evas_Object *obj, const char *signal, const char *
    new_src[length_parent] = EDJE_PART_PATH_SEPARATOR;
    memcpy(new_src + length_parent + 1, source, length_source + 1);
 
-   edje_object_signal_emit(parent, signal, new_src);
+   /* Handle alias renaming */
+   ed_parent = _edje_fetch(parent);
+   if (ed_parent && ed_parent->collection && ed_parent->collection->aliased)
+     {
+        int length;
+
+        alias = _edje_find_alias(ed_parent->collection->aliased, new_src, &length);
+
+        if (alias)
+          {
+             int origin;
+
+             /* Add back the end of the source */
+             origin = strlen(new_src);
+             length ++; /* Remove the trailing ':' from the count */
+             if (origin > length)
+               {
+                  char *tmp;
+                  int alias_length;
+
+                  alias_length = strlen(alias);
+                  tmp = alloca(alias_length + origin - length + 2);
+                  memcpy(tmp, alias, alias_length);
+                  tmp[alias_length] = EDJE_PART_PATH_SEPARATOR;
+                  memcpy(tmp + alias_length + 1, new_src + length, origin - length + 1);
+
+                  alias = tmp;
+               }
+          }
+     }
+
+   edje_object_signal_emit(parent, signal, alias ? alias : new_src);
 }
index a6c1dd8..7dee495 100644 (file)
@@ -172,7 +172,7 @@ struct _Edje_Smart_Api
 /* increment this when you add new feature to edje file format without
  * breaking backward compatibility.
  */
-#define EDJE_FILE_MINOR 0
+#define EDJE_FILE_MINOR 1
 
 /* FIXME:
  *
@@ -628,6 +628,7 @@ struct _Edje_Part_Collection
    int        id; /* the collection id */
 
    Eina_Hash *alias; /* aliasing part */
+   Eina_Hash *aliased; /* invert match of alias */
 
    struct {
       Edje_Size min, max;