fix gadman to not crash with module load/unload, also dynamically update available gadgets list when new modules are loaded
SVN revision: 73165
This commit is contained in:
parent
1421e653bb
commit
25b6a1bd1d
|
@ -31,6 +31,15 @@ static void _cb_fm_change(void *data, Evas_Object *obj, void *event_info
|
|||
static void _cb_fm_sel_change(void *data, Evas_Object *obj, void *event_info);
|
||||
static void _cb_button_up(void *data1, void *data2);
|
||||
|
||||
static E_Config_Dialog *_cfd = NULL;
|
||||
|
||||
static int
|
||||
_close_cfdata(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata __UNUSED__)
|
||||
{
|
||||
_cfd = NULL;
|
||||
return 1;
|
||||
}
|
||||
|
||||
E_Config_Dialog *
|
||||
_config_gadman_module(E_Container *con, const char *params __UNUSED__)
|
||||
{
|
||||
|
@ -48,6 +57,7 @@ _config_gadman_module(E_Container *con, const char *params __UNUSED__)
|
|||
v->free_cfdata = _free_data;
|
||||
v->basic.create_widgets = _basic_create_widgets;
|
||||
v->basic.apply_cfdata = _basic_apply_data;
|
||||
v->close_cfdata = _close_cfdata;
|
||||
|
||||
snprintf(buf, sizeof(buf), "%s/e-module-gadman.edj", Man->module->dir);
|
||||
cfd = e_config_dialog_new(con, _("Gadgets Manager"),
|
||||
|
@ -55,6 +65,7 @@ _config_gadman_module(E_Container *con, const char *params __UNUSED__)
|
|||
buf, 0, v, Man);
|
||||
|
||||
Man->config_dialog = cfd;
|
||||
_cfd = cfd;
|
||||
return Man->config_dialog;
|
||||
}
|
||||
|
||||
|
@ -425,3 +436,9 @@ _cb_button_up(void *data1, void *data2 __UNUSED__)
|
|||
e_widget_scrollframe_child_pos_set(cfdata->o_sf, 0, 0);
|
||||
}
|
||||
|
||||
EAPI void
|
||||
e_config_gadman_list_refresh(void)
|
||||
{
|
||||
if (!_cfd) return;
|
||||
_fill_gadgets_list(_cfd->cfdata->o_avail);
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#define E_MOD_CONFIG_H
|
||||
|
||||
E_Config_Dialog *_config_gadman_module(E_Container *con, const char *params __UNUSED__);
|
||||
EAPI void e_config_gadman_list_refresh(void);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -39,6 +39,7 @@ static void on_menu_delete(void *data, E_Menu *m, E_Menu_Item *mi);
|
|||
static void on_menu_edit(void *data, E_Menu *m, E_Menu_Item *mi);
|
||||
static void on_menu_add(void *data, E_Menu *m, E_Menu_Item *mi);
|
||||
|
||||
static Eina_Bool _gadman_module_cb(void *d __UNUSED__, int type __UNUSED__, E_Event_Module_Update *ev);
|
||||
static int _e_gadman_client_add(void *data __UNUSED__, const E_Gadcon_Client_Class *cc);
|
||||
static void _e_gadman_client_remove(void *data __UNUSED__, E_Gadcon_Client *gcc);
|
||||
|
||||
|
@ -51,6 +52,7 @@ E_Gadcon_Client *current = NULL;
|
|||
Manager *Man = NULL;
|
||||
static E_Gadcon_Location *location = NULL;
|
||||
static Eina_List *_gadman_hdls = NULL;
|
||||
static Eina_Hash *_gadman_gadgets = NULL;
|
||||
|
||||
/* Implementation */
|
||||
void
|
||||
|
@ -97,6 +99,7 @@ gadman_init(E_Module *m)
|
|||
}
|
||||
}
|
||||
|
||||
_gadman_gadgets = eina_hash_string_superfast_new(NULL);
|
||||
_e_gadman_handlers_add();
|
||||
}
|
||||
|
||||
|
@ -136,6 +139,12 @@ gadman_shutdown(void)
|
|||
e_canvas_del(Man->top_ee);
|
||||
//ecore_evas_free(Man->top_ee);
|
||||
}
|
||||
if (_gadman_gadgets)
|
||||
{
|
||||
eina_hash_free_cb_set(_gadman_gadgets, EINA_FREE_CB(eina_list_free));
|
||||
eina_hash_free(_gadman_gadgets);
|
||||
}
|
||||
_gadman_gadgets = NULL;
|
||||
free(Man);
|
||||
Man = NULL;
|
||||
}
|
||||
|
@ -227,7 +236,12 @@ gadman_gadget_place(E_Config_Gadcon_Client *cf, Gadman_Layer_Type layer, E_Zone
|
|||
|
||||
if (gcc->gadcon->id == ID_GADMAN_LAYER_TOP)
|
||||
edje_object_signal_emit(gcc->o_frame, "e,state,visibility,hide", "e");
|
||||
|
||||
if (cc->name)
|
||||
{
|
||||
Eina_List *l;
|
||||
l = eina_hash_find(_gadman_gadgets, cc->name);
|
||||
eina_hash_set(_gadman_gadgets, cc->name, eina_list_append(l, gcc));
|
||||
}
|
||||
evas_object_show(gcc->o_frame);
|
||||
|
||||
return gcc;
|
||||
|
@ -297,10 +311,13 @@ void
|
|||
gadman_gadget_del(E_Gadcon_Client *gcc)
|
||||
{
|
||||
Gadman_Layer_Type layer = gcc->gadcon->id - ID_GADMAN_LAYER_BASE;
|
||||
Eina_List *l;
|
||||
|
||||
Man->gadgets[layer] = eina_list_remove(Man->gadgets[layer], gcc);
|
||||
|
||||
// edje_object_part_unswallow(gcc->o_frame, gcc->o_base);
|
||||
|
||||
l = eina_hash_find(_gadman_gadgets, gcc->name);
|
||||
eina_hash_set(_gadman_gadgets, gcc->name, eina_list_remove(l, gcc));
|
||||
if (gcc->cf) e_gadcon_client_config_del(gcc->gadcon->cf, gcc->cf);
|
||||
gcc->cf = NULL;
|
||||
e_object_del(E_OBJECT(gcc));
|
||||
|
@ -1393,16 +1410,13 @@ _e_gadman_client_remove(void *data __UNUSED__, E_Gadcon_Client *gcc)
|
|||
static void
|
||||
_e_gadman_handlers_add(void)
|
||||
{
|
||||
_gadman_hdls =
|
||||
eina_list_append(_gadman_hdls,
|
||||
ecore_event_handler_add(E_EVENT_ZONE_ADD,
|
||||
_e_gadman_cb_zone_add,
|
||||
NULL));
|
||||
_gadman_hdls =
|
||||
eina_list_append(_gadman_hdls,
|
||||
ecore_event_handler_add(E_EVENT_ZONE_DEL,
|
||||
_e_gadman_cb_zone_del,
|
||||
NULL));
|
||||
_gadman_hdls = eina_list_append(_gadman_hdls,
|
||||
ecore_event_handler_add(E_EVENT_ZONE_ADD, _e_gadman_cb_zone_add, NULL));
|
||||
_gadman_hdls = eina_list_append(_gadman_hdls,
|
||||
ecore_event_handler_add(E_EVENT_ZONE_DEL, _e_gadman_cb_zone_del, NULL));
|
||||
_gadman_hdls = eina_list_append(_gadman_hdls,
|
||||
ecore_event_handler_add(E_EVENT_MODULE_UPDATE, (Ecore_Event_Handler_Cb)_gadman_module_cb, NULL));
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1415,6 +1429,26 @@ _e_gadman_handler_del(void)
|
|||
ecore_event_handler_del(hdl);
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_gadman_module_cb(void *d __UNUSED__, int type __UNUSED__, E_Event_Module_Update *ev)
|
||||
{
|
||||
if (ev->enabled)
|
||||
e_config_gadman_list_refresh();
|
||||
else
|
||||
{
|
||||
Eina_List *l;
|
||||
E_Gadcon_Client *gcc;
|
||||
l = eina_hash_set(_gadman_gadgets, ev->name, NULL);
|
||||
if (!l) return ECORE_CALLBACK_RENEW;
|
||||
EINA_LIST_FREE(l, gcc)
|
||||
{
|
||||
gcc->cf = NULL;
|
||||
gadman_gadget_del(gcc);
|
||||
}
|
||||
}
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_e_gadman_cb_zone_add(void *data __UNUSED__, int type __UNUSED__, void *event)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue