diff --git a/src/bin/e_gadcon.c b/src/bin/e_gadcon.c index 67070a8c6..2646d0785 100644 --- a/src/bin/e_gadcon.c +++ b/src/bin/e_gadcon.c @@ -195,6 +195,12 @@ static E_Gadcon_Client *drag_gcc = NULL; /* This is the gadcon client created on entering a new shelf */ static E_Gadcon_Client *new_gcc = NULL; +static inline void +_eina_list_free(Eina_List *l) +{ + eina_list_free(l); +} + /* externally accessible functions */ EINTERN int e_gadcon_init(void) @@ -230,7 +236,7 @@ EAPI void e_gadcon_provider_register(const E_Gadcon_Client_Class *cc) { E_Gadcon *gc; - Eina_List *l, *ll, *lll; + Eina_List *l, *ll; E_Config_Gadcon_Client *cf_gcc; EINA_SAFETY_ON_NULL_RETURN(cc->name); @@ -239,12 +245,12 @@ e_gadcon_provider_register(const E_Gadcon_Client_Class *cc) EINA_LIST_FOREACH(gadcons, l, gc) { e_gadcon_layout_freeze(gc->o_container); - EINA_LIST_FOREACH_SAFE(gc->waiting_classes, ll, lll, cf_gcc) - if (!e_util_strcmp(cf_gcc->name, cc->name)) - { + if (gc->awaiting_classes) + { + ll = eina_hash_set(gc->awaiting_classes, cc->name, NULL); + EINA_LIST_FREE(ll, cf_gcc) _e_gadcon_client_populate(gc, cc, cf_gcc); - gc->waiting_classes = eina_list_remove_list(gc->waiting_classes, ll); - } + } e_gadcon_layout_thaw(gc->o_container); } providers_list = eina_list_append(providers_list, cc); @@ -275,7 +281,7 @@ e_gadcon_provider_unregister(const E_Gadcon_Client_Class *cc) } EINA_LIST_FREE(dlist, gcc) { - gcc->gadcon->waiting_classes = eina_list_append(gcc->gadcon->waiting_classes, gcc->cf); + e_gadcon_client_queue(gcc->gadcon, gcc->cf); gcc->hidden = 0; e_gadcon_client_hide(gcc); e_object_del(E_OBJECT(gcc)); @@ -285,6 +291,18 @@ e_gadcon_provider_unregister(const E_Gadcon_Client_Class *cc) providers_list = eina_list_remove(providers_list, cc); } +EAPI void +e_gadcon_client_queue(E_Gadcon *gc, E_Config_Gadcon_Client *cf_gcc) +{ + Eina_List *l; + if (!gc->awaiting_classes) + gc->awaiting_classes = eina_hash_string_superfast_new((Eina_Free_Cb)_eina_list_free); + l = eina_hash_find(gc->awaiting_classes, cf_gcc->name); + if (eina_list_data_find(l, cf_gcc)) return; + l = eina_list_append(l, cf_gcc); + eina_hash_set(gc->awaiting_classes, cf_gcc->name, l); +} + EAPI Eina_List * e_gadcon_provider_list(void) { @@ -494,7 +512,7 @@ e_gadcon_populate(E_Gadcon *gc) if (!ret) break; } else - gc->waiting_classes = eina_list_append(gc->waiting_classes, cf_gcc); + e_gadcon_client_queue(gc, cf_gcc); } e_gadcon_layout_thaw(gc->o_container); return EINA_TRUE; @@ -513,7 +531,9 @@ e_gadcon_unpopulate(E_Gadcon *gc) gcc = eina_list_data_get(gc->clients); _e_gadcon_client_unpopulate(gcc); } - gc->waiting_classes = eina_list_free(gc->waiting_classes); + if (gc->awaiting_classes) + eina_hash_free(gc->awaiting_classes); + gc->awaiting_classes = NULL; } EAPI void @@ -810,9 +830,13 @@ EAPI void e_gadcon_client_config_del(E_Config_Gadcon *cf_gc, E_Config_Gadcon_Client *cf_gcc) { E_Gadcon *gc; - Eina_List *l; + Eina_List *l, *ll; EINA_LIST_FOREACH(gadcons, l, gc) - gc->waiting_classes = eina_list_remove(gc->waiting_classes, cf_gcc); + { + if (!gc->awaiting_classes) continue; + ll = eina_hash_find(gc->awaiting_classes, cf_gcc->name); + eina_hash_set(gc->awaiting_classes, cf_gcc->name, eina_list_remove(ll, cf_gcc)); + } if (!cf_gcc) return; if (cf_gcc->name) eina_stringshare_del(cf_gcc->name); if (cf_gcc->id) eina_stringshare_del(cf_gcc->id); diff --git a/src/bin/e_gadcon.h b/src/bin/e_gadcon.h index e149dd734..82f5355c7 100644 --- a/src/bin/e_gadcon.h +++ b/src/bin/e_gadcon.h @@ -78,7 +78,7 @@ struct _E_Gadcon Eina_List *clients; Eina_List *populate_requests; Eina_List *populated_classes; - Eina_List *waiting_classes; + Eina_Hash *awaiting_classes; /* E_Config_Gadcon_Client */ struct { @@ -284,6 +284,7 @@ EAPI void e_gadcon_client_config_del(E_Config_Gadcon *cf_gc, EAPI E_Gadcon_Client *e_gadcon_client_new(E_Gadcon *gc, const char *name, const char *id, const char *style, Evas_Object *base_obj); EAPI void e_gadcon_client_edit_begin(E_Gadcon_Client *gcc); EAPI void e_gadcon_client_edit_end(E_Gadcon_Client *gcc); +EAPI void e_gadcon_client_queue(E_Gadcon *gc, E_Config_Gadcon_Client *cf_gcc); EAPI void e_gadcon_client_show(E_Gadcon_Client *gcc); EAPI void e_gadcon_client_hide(E_Gadcon_Client *gcc); EAPI void e_gadcon_client_size_request(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h); diff --git a/src/modules/gadman/e_mod_gadman.c b/src/modules/gadman/e_mod_gadman.c index 657d6bb41..56297fbff 100644 --- a/src/modules/gadman/e_mod_gadman.c +++ b/src/modules/gadman/e_mod_gadman.c @@ -211,8 +211,7 @@ gadman_gadget_place(E_Gadcon_Client *gcc, const E_Gadcon_Client_Class *cc, E_Con /* Find provider */ if (!cc) { - if (!eina_list_data_find(gc->waiting_classes, cf)) - gc->waiting_classes = eina_list_append(gc->waiting_classes, cf); + e_gadcon_client_queue(gc, cf); e_gadcon_custom_populate_request(gc); return NULL; }