change gadcon waiting classes list to a hash in order to remove some strcmps

SVN revision: 74487
This commit is contained in:
Mike Blumenkrantz 2012-07-27 12:26:41 +00:00
parent 36872afc13
commit 5db9d9fb00
3 changed files with 38 additions and 14 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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;
}