diff --git a/src/bin/e_int_config_modules.c b/src/bin/e_int_config_modules.c index aa187165d..52aa9903d 100644 --- a/src/bin/e_int_config_modules.c +++ b/src/bin/e_int_config_modules.c @@ -3,63 +3,97 @@ */ #include "e.h" -typedef struct _CFModule +typedef struct _CFModule CFModule; +typedef struct _CFType CFType; +typedef struct _CFTypes CFTypes; + +struct _CFModule { const char *short_name, *name, *comment; const char *icon, *orig_path, *type; int enabled, selected; -} CFModule; +}; -struct _E_Config_Dialog_Data +struct _CFType { - Evas_Object *o_avail, *o_loaded; + const char *key, *name; + Evas_Hash *modules; +}; + +struct _CFTypes +{ + const char *key, *name; +}; + +struct _E_Config_Dialog_Data +{ + Evas_Object *l_avail, *l_loaded; Evas_Object *b_load, *b_unload; Evas_Object *o_desc; }; -static void *_create_data (E_Config_Dialog *cfd); -static void _fill_data (E_Config_Dialog_Data *cfdata); -static void _free_data (E_Config_Dialog *cfd, - E_Config_Dialog_Data *cfdata); -static Evas_Object *_basic_create (E_Config_Dialog *cfd, Evas *evas, - E_Config_Dialog_Data *cfdata); +/* Key pairs for module types + * + * Should be in alphabetic order */ +const CFTypes _types[] = +{ + {"appearance", N_("Appearance")}, + {"config", N_("Configuration")}, + {"fileman", N_("File Manager")}, + {"shelf", N_("Shelf")}, + {"system", N_("System")}, + {NULL, NULL} +}; -/* Private Function Protos */ -static void _load_modules (const char *dir); -static int _modules_list_cb_sort (void *data1, void *data2); -static void _fill_avail_list (E_Config_Dialog_Data *cfdata); -static void _fill_loaded_list (E_Config_Dialog_Data *cfdata); -static void _avail_list_cb_change (void *data, Evas_Object *obj); -static void _loaded_list_cb_change (void *data, Evas_Object *obj); -static void _btn_cb_unload (void *data, void *data2); -static void _btn_cb_load (void *data, void *data2); -static int _upd_hdl_cb (void *data, int type, void *event); -static void _fill_list (Evas_Object *obj, const char *type, int enabled); -static int _find_module_category (const char *type, int enabled); +/* local function protos */ +static void *_create_data (E_Config_Dialog *cfd); +static void _fill_data (E_Config_Dialog_Data *cfdata); +static void _free_data (E_Config_Dialog *cfd, + E_Config_Dialog_Data *cfdata); +static Evas_Object *_basic_create (E_Config_Dialog *cfd, Evas *evas, + E_Config_Dialog_Data *cfdata); +static void _fill_type_hash (void); +static void _load_modules (const char *dir); +static void _fill_list (Evas_Object *obj, int enabled); +static Evas_Bool _types_hash_cb_free (Evas_Hash *hash __UNUSED__, + const char *key __UNUSED__, + void *data, void *fdata __UNUSED__); +static Evas_Bool _mod_hash_cb_free (Evas_Hash *hash __UNUSED__, + const char *key __UNUSED__, + void *data, void *fdata __UNUSED__); +static Evas_Bool _mod_hash_avail_list (Evas_Hash *hash __UNUSED__, + const char *key __UNUSED__, + void *data, void *fdata); +static Evas_Bool _mod_hash_load_list (Evas_Hash *hash __UNUSED__, + const char *key __UNUSED__, + void *data, void *fdata); +static int _mod_list_sort (void *data1, void *data2); +static void _list_widget_load (Evas_Object *obj, Evas_List *list); +static void _avail_list_cb_change (void *data, Evas_Object *obj); +static void _load_list_cb_change (void *data, Evas_Object *obj); +static void _unselect_all_modules (void); +static Evas_Bool _mod_hash_unselect (Evas_Hash *hash __UNUSED__, + const char *key __UNUSED__, + void *data, void *fdata __UNUSED__); +static void _select_all_modules (Evas_Object *obj, void *data); +static void _btn_cb_unload (void *data, void *data2); +static void _btn_cb_load (void *data, void *data2); +static Evas_Bool _mod_hash_load (Evas_Hash *hash __UNUSED__, + const char *key __UNUSED__, + void *data, void *fdata __UNUSED__); +static Evas_Bool _mod_hash_unload (Evas_Hash *hash __UNUSED__, + const char *key __UNUSED__, + void *data, void *fdata __UNUSED__); +static void _enable_modules (int enable); -/* Hash callback Protos */ -static Evas_Bool _modules_hash_cb_free (Evas_Hash *hash __UNUSED__, - const char *key __UNUSED__, - void *data, void *fdata __UNUSED__); -static Evas_Bool _modules_hash_cb_unsel (Evas_Hash *hash __UNUSED__, - const char *key __UNUSED__, - void *data, void *fdata __UNUSED__); -static Evas_Bool _modules_hash_cb_load (Evas_Hash *hash __UNUSED__, - const char *key __UNUSED__, - void *data, void *fdata __UNUSED__); -static Evas_Bool _modules_hash_cb_unload (Evas_Hash *hash __UNUSED__, - const char *key __UNUSED__, - void *data, void *fdata __UNUSED__); - -static Evas_Hash *modules = NULL; -static Evas_List *modules_list = NULL; -Ecore_Event_Handler *upd_hdl = NULL; +/* local variables */ +static Evas_Hash *types_hash = NULL; EAPI E_Config_Dialog * -e_int_config_modules(E_Container *con, const char *params __UNUSED__) +e_int_config_modules(E_Container *con, const char *params __UNUSED__) { - E_Config_Dialog *cfd; - E_Config_Dialog_View *v; + E_Config_Dialog *cfd = NULL; + E_Config_Dialog_View *v = NULL; if (e_config_dialog_find("E", "_config_modules_dialog")) return NULL; @@ -68,33 +102,39 @@ e_int_config_modules(E_Container *con, const char *params __UNUSED__) v->free_cfdata = _free_data; v->basic.create_widgets = _basic_create; - cfd = e_config_dialog_new(con, _("Module Settings"), - "E", "_config_modules_dialog", + cfd = e_config_dialog_new(con, _("Module Settings"), + "E", "_config_modules_dialog", "enlightenment/modules", 0, v, NULL); e_dialog_resizable_set(cfd->dia, 1); return cfd; } +/* local functions */ static void * -_create_data(E_Config_Dialog *cfd) +_create_data(E_Config_Dialog *cfd) { - E_Config_Dialog_Data *cfdata; + E_Config_Dialog_Data *cfdata = NULL; + + _fill_type_hash(); cfdata = E_NEW(E_Config_Dialog_Data, 1); + if (!cfdata) return NULL; _fill_data(cfdata); return cfdata; } -static void -_fill_data(E_Config_Dialog_Data *cfdata) +static void +_fill_data(E_Config_Dialog_Data *cfdata) { Evas_List *mdirs = NULL, *l = NULL; if (!cfdata) return; + + /* loop each path_modules dir and load modules for that path */ mdirs = e_path_dir_list_get(path_modules); - for (l = mdirs; l; l = l->next) + for (l = mdirs; l; l = l->next) { - E_Path_Dir *epd; + E_Path_Dir *epd = NULL; epd = l->data; if (!epd) continue; @@ -105,525 +145,511 @@ _fill_data(E_Config_Dialog_Data *cfdata) if (mdirs) e_path_dir_list_free(mdirs); } -static void -_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +static void +_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) { - if (upd_hdl) ecore_event_handler_del(upd_hdl); - upd_hdl = NULL; - - if (modules) + if (types_hash) { - evas_hash_foreach(modules, _modules_hash_cb_free, NULL); - evas_hash_free(modules); - modules = NULL; + evas_hash_foreach(types_hash, _types_hash_cb_free, NULL); + evas_hash_free(types_hash); + types_hash = NULL; } - while (modules_list) - { - char *m; - - m = modules_list->data; - modules_list = evas_list_remove_list(modules_list, modules_list); - free(m); - } - E_FREE(cfdata); } static Evas_Object * -_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) +_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) { - Evas_Object *ot, *of, *ow; + Evas_Object *o, *of, *ol; - ot = e_widget_table_add(evas, 0); + o = e_widget_list_add(evas, 0, 1); of = e_widget_frametable_add(evas, _("Available Modules"), 0); - ow = e_widget_ilist_add(evas, 24, 24, NULL); - cfdata->o_avail = ow; - e_widget_ilist_multi_select_set(ow, 1); - e_widget_on_change_hook_set(ow, _avail_list_cb_change, cfdata); - _fill_avail_list(cfdata); - e_widget_frametable_object_append(of, ow, 0, 0, 1, 1, 1, 1, 1, 1); - ow = e_widget_textblock_add(evas); - e_widget_min_size_set(ow, 200, 70); - //e_widget_can_focus_set(ow, 0); - cfdata->o_desc = ow; - e_widget_textblock_markup_set(ow, "Description: Unavailable."); - e_widget_frametable_object_append(of, ow, 0, 1, 1, 1, 1, 1, 1, 0); - - ow = e_widget_button_add(evas, _("Load Module"), NULL, _btn_cb_load, - cfdata, NULL); - cfdata->b_load = ow; - e_widget_disabled_set(ow, 1); - e_widget_frametable_object_append(of, ow, 0, 2, 1, 1, 1, 1, 1, 0); - e_widget_table_object_append(ot, of, 0, 0, 1, 1, 1, 1, 1, 1); + ol = e_widget_ilist_add(evas, 24, 24, NULL); + cfdata->l_avail = ol; + e_widget_ilist_multi_select_set(ol, 1); + e_widget_on_change_hook_set(ol, _avail_list_cb_change, cfdata); + _fill_list(ol, 0); + e_widget_frametable_object_append(of, ol, 0, 0, 1, 1, 1, 1, 1, 1); + ol = e_widget_textblock_add(evas); + e_widget_min_size_set(ol, 200, 70); + cfdata->o_desc = ol; + e_widget_textblock_markup_set(ol, _("Description: Unavailable")); + e_widget_frametable_object_append(of, ol, 0, 1, 1, 1, 1, 1, 1, 0); + ol = e_widget_button_add(evas, _("Load Module"), NULL, + _btn_cb_load, cfdata, NULL); + cfdata->b_load = ol; + e_widget_disabled_set(ol, 1); + e_widget_frametable_object_append(of, ol, 0, 2, 1, 1, 1, 1, 1, 0); + e_widget_list_object_append(o, of, 1, 1, 0.5); of = e_widget_frametable_add(evas, _("Loaded Modules"), 0); - ow = e_widget_ilist_add(evas, 24, 24, NULL); - cfdata->o_loaded = ow; - e_widget_ilist_multi_select_set(ow, 1); - e_widget_on_change_hook_set(ow, _loaded_list_cb_change, cfdata); - _fill_loaded_list(cfdata); - e_widget_frametable_object_append(of, ow, 0, 0, 2, 1, 1, 1, 1, 1); + ol = e_widget_ilist_add(evas, 24, 24, NULL); + cfdata->l_loaded = ol; + e_widget_ilist_multi_select_set(ol, 1); + e_widget_on_change_hook_set(ol, _load_list_cb_change, cfdata); + _fill_list(ol, 1); + e_widget_frametable_object_append(of, ol, 0, 0, 1, 1, 1, 1, 1, 1); + ol = e_widget_button_add(evas, _("Unload Module"), NULL, + _btn_cb_unload, cfdata, NULL); + cfdata->b_unload = ol; + e_widget_disabled_set(ol, 1); + e_widget_frametable_object_append(of, ol, 0, 1, 1, 1, 1, 1, 1, 0); + e_widget_list_object_append(o, of, 1, 1, 0.5); - ow = e_widget_button_add(evas, _("Unload Module"), NULL, _btn_cb_unload, - cfdata, NULL); - cfdata->b_unload = ow; - e_widget_disabled_set(ow, 1); - e_widget_frametable_object_append(of, ow, 0, 2, 2, 1, 1, 1, 1, 0); - - e_widget_table_object_append(ot, of, 1, 0, 1, 1, 1, 1, 1, 1); - - /* Setup Module update Handler */ - if (upd_hdl) ecore_event_handler_del(upd_hdl); - upd_hdl = NULL; - upd_hdl = ecore_event_handler_add(E_EVENT_MODULE_UPDATE, _upd_hdl_cb, cfdata); - - return ot; + return o; } -/* Private Functions */ -static void -_load_modules(const char *dir) +static void +_fill_type_hash(void) +{ + int i = 0; + + /* create the inital hash based on predefined list of types */ + for (i = 0; _types[i].name; i++) + { + CFType *cft = NULL; + + if (!_types[i].key) continue; + if (evas_hash_find(types_hash, _types[i].key)) continue; + + cft = E_NEW(CFType, 1); + if (!cft) continue; + cft->key = evas_stringshare_add(_types[i].key); + cft->name = evas_stringshare_add(_types[i].name); + types_hash = evas_hash_direct_add(types_hash, cft->key, cft); + } +} + +static void +_load_modules(const char *dir) { Ecore_List *files = NULL; - char *mod; + char *mod = NULL; + if (!dir) return; files = ecore_file_ls(dir); if (!files) return; + /* get all modules in this path_dir */ ecore_list_first_goto(files); - while ((mod = ecore_list_next(files))) + while ((mod = ecore_list_next(files))) { - const char *type; + Efreet_Desktop *desk = NULL; + CFType *cft = NULL; + CFModule *cfm = NULL; + const char *type = NULL; char buf[4096]; - Efreet_Desktop *desktop; - CFModule *module; + /* check that we have a desktop file for this module */ snprintf(buf, sizeof(buf), "%s/%s/module.desktop", dir, mod); if (!ecore_file_exists(buf)) continue; - desktop = efreet_desktop_get(buf); - if (!desktop) continue; - if (evas_hash_find(modules, desktop->name)) + desk = efreet_desktop_get(buf); + if (!desk) continue; + + /* does the ModuleType exist in desktop? */ + if (desk->x) + type = ecore_hash_get(desk->x, "X-Enlightenment-ModuleType"); + if (!type) type = evas_stringshare_add("shelf"); + + /* do we have this module already in it's type hash ? */ + cft = evas_hash_find(types_hash, type); + if ((cft) && (cft->modules)) { - efreet_desktop_free(desktop); - continue; + if (evas_hash_find(cft->modules, mod)) + { + if ((!desk->x) && (type)) evas_stringshare_del(type); + if (desk) efreet_desktop_free(desk); + continue; + } } - module = E_NEW(CFModule, 1); - module->short_name = evas_stringshare_add(mod); - if (desktop->name) module->name = evas_stringshare_add(desktop->name); - if (desktop->icon) module->icon = evas_stringshare_add(desktop->icon); - if (desktop->comment) - module->comment = evas_stringshare_add(desktop->comment); - if (desktop->orig_path) - module->orig_path = evas_stringshare_add(desktop->orig_path); - if (desktop->x) - { - type = ecore_hash_get(desktop->x, "X-Enlightenment-ModuleType"); - if (type) - module->type = evas_stringshare_add(type); - } - else - module->type = evas_stringshare_add("shelf"); - if (e_module_find(mod)) module->enabled = 1; + /* module not in it's type hash, add */ + cfm = E_NEW(CFModule, 1); + if (!cfm) continue; + cfm->short_name = evas_stringshare_add(mod); + if (desk->name) cfm->name = evas_stringshare_add(desk->name); + if (desk->icon) cfm->icon = evas_stringshare_add(desk->icon); + if (desk->comment) cfm->comment = evas_stringshare_add(desk->comment); + if (desk->orig_path) + cfm->orig_path = evas_stringshare_add(desk->orig_path); + cfm->type = evas_stringshare_add(type); + if ((!desk->x) && (type)) evas_stringshare_del(type); + efreet_desktop_free(desk); - modules = evas_hash_direct_add(modules, - evas_stringshare_add(desktop->name), - module); - modules_list = evas_list_append(modules_list, strdup(desktop->name)); - efreet_desktop_free(desktop); + if (e_module_find(mod)) cfm->enabled = 1; + cft->modules = evas_hash_direct_add(cft->modules, cfm->short_name, cfm); } free(mod); if (files) ecore_list_destroy(files); - - if (modules_list) - modules_list = evas_list_sort(modules_list, -1, _modules_list_cb_sort); } -static int -_modules_list_cb_sort(void *data1, void *data2) -{ - if (!data1) return 1; - if (!data2) return -1; - return (strcmp((char *)data1, (char *)data2)); -} - -static void -_fill_avail_list(E_Config_Dialog_Data *cfdata) +static void +_fill_list(Evas_Object *obj, int enabled) { Evas *evas; Evas_Coord w; + int i = 0; - if (!cfdata) return; - - evas = evas_object_evas_get(cfdata->o_avail); + /* freeze evas, edje, and list widget */ + evas = evas_object_evas_get(obj); evas_event_freeze(evas); edje_freeze(); - e_widget_ilist_freeze(cfdata->o_avail); - e_widget_ilist_clear(cfdata->o_avail); + e_widget_ilist_freeze(obj); + e_widget_ilist_clear(obj); - if (_find_module_category("appearance", 0)) + if (types_hash) { - e_widget_ilist_header_append(cfdata->o_avail, NULL, _("Appearance")); - _fill_list(cfdata->o_avail, "appearance", 0); + /* loop types, getting available modules (ie: not loaded) */ + for (i = 0; _types[i].name; i++) + { + CFType *cft = NULL; + Evas_List *l = NULL; + int count = 0; + + if (!_types[i].key) continue; + cft = evas_hash_find(types_hash, _types[i].key); + if (!cft) continue; + if (cft->modules) + { + if (!enabled) + evas_hash_foreach(cft->modules, _mod_hash_avail_list, &l); + else + evas_hash_foreach(cft->modules, _mod_hash_load_list, &l); + } + + if (l) count = evas_list_count(l); + if (count < 1) + { + if (l) evas_list_free(l); + continue; + } + /* We have at least one, append header */ + e_widget_ilist_header_append(obj, NULL, cft->name); + + /* sort the list if we have more than one */ + if (count > 1) + l = evas_list_sort(l, -1, _mod_list_sort); + + _list_widget_load(obj, l); + + if (l) evas_list_free(l); + } } - if (_find_module_category("config", 0)) - { - e_widget_ilist_header_append(cfdata->o_avail, NULL, _("Configuration")); - _fill_list(cfdata->o_avail, "config", 0); - } - if (_find_module_category("shelf", 0)) - { - e_widget_ilist_header_append(cfdata->o_avail, NULL, _("Shelf")); - _fill_list(cfdata->o_avail, "shelf", 0); - } - if (_find_module_category("system", 0)) - { - e_widget_ilist_header_append(cfdata->o_avail, NULL, _("System")); - _fill_list(cfdata->o_avail, "system", 0); - } - if (_find_module_category("fileman", 0)) - { - e_widget_ilist_header_append(cfdata->o_avail, NULL, _("Fileman")); - _fill_list(cfdata->o_avail, "fileman", 0); - } - - e_widget_ilist_go(cfdata->o_avail); - e_widget_min_size_get(cfdata->o_avail, &w, NULL); - e_widget_min_size_set(cfdata->o_avail, w, 200); - e_widget_ilist_thaw(cfdata->o_avail); + + e_widget_ilist_go(obj); + e_widget_min_size_get(obj, &w, NULL); + e_widget_min_size_set(obj, w, 200); + e_widget_ilist_thaw(obj); edje_thaw(); evas_event_thaw(evas); } -static void -_fill_loaded_list(E_Config_Dialog_Data *cfdata) +static Evas_Bool +_types_hash_cb_free(Evas_Hash *hash __UNUSED__, const char *key __UNUSED__, + void *data, void *fdata __UNUSED__) { - Evas *evas; - Evas_Coord w; + CFType *type = NULL; - if (!cfdata) return; - - evas = evas_object_evas_get(cfdata->o_loaded); - evas_event_freeze(evas); - edje_freeze(); - e_widget_ilist_freeze(cfdata->o_loaded); - e_widget_ilist_clear(cfdata->o_loaded); - - if (_find_module_category("appearance", 1)) + type = data; + if (!type) return 1; + if (type->key) evas_stringshare_del(type->key); + if (type->name) evas_stringshare_del(type->name); + if (type->modules) { - e_widget_ilist_header_append(cfdata->o_loaded, NULL, _("Appearance")); - _fill_list(cfdata->o_loaded, "appearance", 1); + evas_hash_foreach(type->modules, _mod_hash_cb_free, NULL); + evas_hash_free(type->modules); + type->modules = NULL; } - if (_find_module_category("config", 1)) - { - e_widget_ilist_header_append(cfdata->o_loaded, NULL, _("Configuration")); - _fill_list(cfdata->o_loaded, "config", 1); - } - if (_find_module_category("shelf", 1)) - { - e_widget_ilist_header_append(cfdata->o_loaded, NULL, _("Shelf")); - _fill_list(cfdata->o_loaded, "shelf", 1); - } - if (_find_module_category("system", 1)) - { - e_widget_ilist_header_append(cfdata->o_loaded, NULL, _("System")); - _fill_list(cfdata->o_loaded, "system", 1); - } - if (_find_module_category("fileman", 1)) - { - e_widget_ilist_header_append(cfdata->o_loaded, NULL, _("Fileman")); - _fill_list(cfdata->o_loaded, "fileman", 1); - } - - e_widget_ilist_go(cfdata->o_loaded); - e_widget_min_size_get(cfdata->o_loaded, &w, NULL); - e_widget_min_size_set(cfdata->o_loaded, w, 200); - e_widget_ilist_thaw(cfdata->o_loaded); - edje_thaw(); - evas_event_thaw(evas); + E_FREE(type); + return 1; } -static void -_avail_list_cb_change(void *data, Evas_Object *obj) +static Evas_Bool +_mod_hash_cb_free(Evas_Hash *hash __UNUSED__, const char *key __UNUSED__, + void *data, void *fdata __UNUSED__) { - E_Config_Dialog_Data *cfdata; - Evas_List *l = NULL; - int i; + CFModule *mod = NULL; + + mod = data; + if (!mod) return 1; + if (mod->short_name) evas_stringshare_del(mod->short_name); + if (mod->name) evas_stringshare_del(mod->name); + if (mod->icon) evas_stringshare_del(mod->icon); + if (mod->comment) evas_stringshare_del(mod->comment); + if (mod->orig_path) evas_stringshare_del(mod->orig_path); + if (mod->type) evas_stringshare_del(mod->type); + E_FREE(mod); + return 1; +} + +static Evas_Bool +_mod_hash_avail_list(Evas_Hash *hash __UNUSED__, const char *key __UNUSED__, + void *data, void *fdata) +{ + Evas_List **l; + CFModule *mod = NULL; + + mod = data; + if ((!mod) || (mod->enabled)) return 1; + l = fdata; + *l = evas_list_append(*l, mod); + return 1; +} + +static Evas_Bool +_mod_hash_load_list(Evas_Hash *hash __UNUSED__, const char *key __UNUSED__, + void *data, void *fdata) +{ + Evas_List **l; + CFModule *mod = NULL; + + mod = data; + if ((!mod) || (!mod->enabled)) return 1; + l = fdata; + *l = evas_list_append(*l, mod); + return 1; +} + +static int +_mod_list_sort(void *data1, void *data2) +{ + CFModule *m1, *m2; + + if (!(m1 = data1)) return 1; + if (!(m2 = data2)) return -1; + return (strcmp(m1->name, m2->name)); +} + +/* nice generic function to load an ilist with items */ +static void +_list_widget_load(Evas_Object *obj, Evas_List *list) +{ + Evas *evas; + Evas_List *ml = NULL; + + if ((!obj) || (!list)) return; + evas = evas_object_evas_get(obj); + for (ml = list; ml; ml = ml->next) + { + CFModule *mod = NULL; + Evas_Object *ic = NULL; + char *path; + char buf[4096]; + + mod = ml->data; + if (!mod) continue; + if (mod->orig_path) + { + path = ecore_file_dir_get(mod->orig_path); + snprintf(buf, sizeof(buf), "%s/%s.edj", path, mod->icon); + ic = e_util_icon_add(buf, evas); + free(path); + } + if (mod->name) + e_widget_ilist_append(obj, ic, mod->name, NULL, mod, NULL); + else if (mod->short_name) + e_widget_ilist_append(obj, ic, mod->short_name, NULL, mod, NULL); + } + if (ml) evas_list_free(ml); +} + +static void +_avail_list_cb_change(void *data, Evas_Object *obj) +{ + E_Config_Dialog_Data *cfdata = NULL; cfdata = data; if (!cfdata) return; - /* Loop the hash & unselect all */ - evas_hash_foreach(modules, _modules_hash_cb_unsel, NULL); - /* Unselect all in loaded list & disable buttons */ - e_widget_ilist_unselect(cfdata->o_loaded); + e_widget_ilist_unselect(cfdata->l_loaded); e_widget_disabled_set(cfdata->b_unload, 1); + e_widget_disabled_set(cfdata->b_load, 1); - /* Make sure something is selected, else disable the load button */ - if (e_widget_ilist_selected_count_get(cfdata->o_avail) <= 0) - { - e_widget_disabled_set(cfdata->b_load, 1); - return; - } + /* Unselect all modules */ + _unselect_all_modules(); - for (i = 0, l = e_widget_ilist_items_get(cfdata->o_avail); l; l = l->next, i++) - { - E_Ilist_Item *item = NULL; - CFModule *module = NULL; - const char *lbl; + /* Make sure something is selected */ + if (e_widget_ilist_selected_count_get(cfdata->l_avail) < 1) return; - item = l->data; - if ((!item) || (!item->selected)) continue; - lbl = e_widget_ilist_nth_label_get(cfdata->o_avail, i); - module = evas_hash_find(modules, lbl); - if (!module) continue; - if (module->comment) - e_widget_textblock_markup_set(cfdata->o_desc, module->comment); - else - e_widget_textblock_markup_set(cfdata->o_desc, "Description: Unavailable."); - module->selected = 1; - } - if (l) evas_list_free(l); + /* Select all modules in avail list that user wants */ + _select_all_modules(cfdata->l_avail, cfdata); + + /* Enable load button */ e_widget_disabled_set(cfdata->b_load, 0); } -static void -_loaded_list_cb_change(void *data, Evas_Object *obj) +static void +_load_list_cb_change(void *data, Evas_Object *obj) { - E_Config_Dialog_Data *cfdata; - Evas_List *l = NULL; - int i, c; + E_Config_Dialog_Data *cfdata = NULL; cfdata = data; if (!cfdata) return; - /* Loop the hash & unselect all */ - evas_hash_foreach(modules, _modules_hash_cb_unsel, NULL); - - /* Unselect all in avail list & disable buttons */ - e_widget_ilist_unselect(cfdata->o_avail); + /* Unselect all in avail list & disable button */ + e_widget_ilist_unselect(cfdata->l_avail); + e_widget_disabled_set(cfdata->b_unload, 1); e_widget_disabled_set(cfdata->b_load, 1); - /* Make sure something is selected, else disable the buttons */ - c = e_widget_ilist_selected_count_get(cfdata->o_loaded); - if (c <= 0) - { - e_widget_disabled_set(cfdata->b_unload, 1); - return; - } + /* Unselect all modules */ + _unselect_all_modules(); - for (i = 0, l = e_widget_ilist_items_get(cfdata->o_loaded); l; l = l->next, i++) - { - E_Ilist_Item *item = NULL; - CFModule *module = NULL; - const char *lbl; + /* Make sure something is selected */ + if (e_widget_ilist_selected_count_get(cfdata->l_loaded) < 1) return; - item = l->data; - if ((!item) || (!item->selected)) continue; - lbl = e_widget_ilist_nth_label_get(cfdata->o_loaded, i); - module = evas_hash_find(modules, lbl); - if (!module) continue; - if (module->comment) - e_widget_textblock_markup_set(cfdata->o_desc, module->comment); - else - e_widget_textblock_markup_set(cfdata->o_desc, "Description: Unavailable."); - module->selected = 1; - } - if (l) evas_list_free(l); + /* Select all modules in loaded list that user wants */ + _select_all_modules(cfdata->l_loaded, cfdata); + + /* Enable unload button */ e_widget_disabled_set(cfdata->b_unload, 0); } -static void -_btn_cb_unload(void *data, void *data2) +static void +_unselect_all_modules(void) { - E_Config_Dialog_Data *cfdata; + int i = 0; - cfdata = data; - if (!cfdata) return; + if (!types_hash) return; - evas_hash_foreach(modules, _modules_hash_cb_unload, NULL); + /* loop types, getting all modules */ + for (i = 0; _types[i].name; i++) + { + CFType *cft = NULL; - /* Loop the hash & unselect all */ - evas_hash_foreach(modules, _modules_hash_cb_unsel, NULL); - e_widget_ilist_unselect(cfdata->o_loaded); - e_widget_disabled_set(cfdata->b_unload, 1); - - e_widget_textblock_markup_set(cfdata->o_desc, "Description: Unavailable."); - _fill_avail_list(cfdata); - _fill_loaded_list(cfdata); + if (!_types[i].key) continue; + cft = evas_hash_find(types_hash, _types[i].key); + if ((!cft) || (!cft->modules)) continue; + evas_hash_foreach(cft->modules, _mod_hash_unselect, NULL); + } } -static void -_btn_cb_load(void *data, void *data2) +static Evas_Bool +_mod_hash_unselect(Evas_Hash *hash __UNUSED__, const char *key __UNUSED__, + void *data, void *fdata __UNUSED__) { - E_Config_Dialog_Data *cfdata; + CFModule *mod = NULL; - cfdata = data; - if (!cfdata) return; - - evas_hash_foreach(modules, _modules_hash_cb_load, NULL); - - /* Loop the hash & unselect all */ - evas_hash_foreach(modules, _modules_hash_cb_unsel, NULL); - e_widget_ilist_unselect(cfdata->o_avail); - e_widget_disabled_set(cfdata->b_load, 1); - - e_widget_textblock_markup_set(cfdata->o_desc, "Description: Unavailable."); - _fill_avail_list(cfdata); - _fill_loaded_list(cfdata); -} - -static int -_upd_hdl_cb(void *data, int type, void *event) -{ - E_Event_Module_Update *ev; - E_Config_Dialog_Data *cfdata; - - if (type != E_EVENT_MODULE_UPDATE) return 1; - cfdata = data; - if (!cfdata) return 1; - ev = event; - _fill_avail_list(cfdata); - _fill_loaded_list(cfdata); + mod = data; + if (!mod) return 1; + mod->selected = 0; return 1; } static void -_fill_list(Evas_Object *obj, const char *type, int enabled) +_select_all_modules(Evas_Object *obj, void *data) { - Evas *evas; Evas_List *l = NULL; + E_Config_Dialog_Data *cfdata = NULL; + int i = 0; - evas = evas_object_evas_get(obj); - for (l = modules_list; l; l = l->next) + cfdata = data; + if (!cfdata) return; + for (i = 0, l = e_widget_ilist_items_get(obj); l; l = l->next, i++) { - CFModule *module = NULL; - Evas_Object *ic = NULL; - char *name, *icon, *path; - char buf[4096]; + E_Ilist_Item *item = NULL; + CFModule *mod = NULL; - name = l->data; - if (!name) continue; - module = evas_hash_find(modules, name); - if ((!module) || (module->enabled != enabled) || (!module->icon)) - continue; - if (module->type) - { - if (strcmp(module->type, type)) continue; - } + item = l->data; + if ((!item) || (!item->selected)) continue; + mod = e_widget_ilist_nth_data_get(obj, i); + if (!mod) continue; + mod->selected = 1; + if (mod->comment) + e_widget_textblock_markup_set(cfdata->o_desc, mod->comment); else - if (strcmp(type, "shelf")) continue; - - if (module->orig_path) - { - path = ecore_file_dir_get(module->orig_path); - snprintf(buf, sizeof(buf), "%s/%s.edj", path, module->icon); - icon = strdup(buf); - free(path); - } - if (icon) - { - ic = e_util_icon_add(icon, evas); - free(icon); - } - if (module->name) - e_widget_ilist_append(obj, ic, module->name, NULL, NULL, NULL); - else if (module->short_name) - e_widget_ilist_append(obj, ic, module->short_name, NULL, NULL, NULL); + e_widget_textblock_markup_set(cfdata->o_desc, + _("Description: Unavailable")); } if (l) evas_list_free(l); } -static int -_find_module_category(const char *type, int enabled) +static void +_btn_cb_unload(void *data, void *data2) { - Evas_List *l = NULL; - - for (l = modules_list; l; l = l->next) - { - CFModule *module = NULL; - char *name; + E_Config_Dialog_Data *cfdata = NULL; - name = l->data; - if (!name) continue; - module = evas_hash_find(modules, name); - if ((!module) || (module->enabled != enabled) || (!module->icon)) - continue; - if (module->type) - { - if (strcmp(module->type, type)) continue; - return 1; - } + cfdata = data; + if (!cfdata) return; + + _enable_modules(0); + e_widget_disabled_set(cfdata->b_unload, 1); + e_widget_textblock_markup_set(cfdata->o_desc, _("Description: Unavailable")); + _fill_list(cfdata->l_avail, 0); + _fill_list(cfdata->l_loaded, 1); +} + +static void +_btn_cb_load(void *data, void *data2) +{ + E_Config_Dialog_Data *cfdata = NULL; + + cfdata = data; + if (!cfdata) return; + + _enable_modules(1); + e_widget_disabled_set(cfdata->b_load, 1); + e_widget_textblock_markup_set(cfdata->o_desc, _("Description: Unavailable")); + _fill_list(cfdata->l_avail, 0); + _fill_list(cfdata->l_loaded, 1); +} + +static void +_enable_modules(int enable) +{ + int i = 0; + + if (!types_hash) return; + + /* loop types, getting all modules */ + for (i = 0; _types[i].name; i++) + { + CFType *cft = NULL; + + if (!_types[i].key) continue; + cft = evas_hash_find(types_hash, _types[i].key); + if ((!cft) || (!cft->modules)) continue; + if (enable) + evas_hash_foreach(cft->modules, _mod_hash_load, NULL); else - if (!strcmp(type, "shelf")) return 1; + evas_hash_foreach(cft->modules, _mod_hash_unload, NULL); } - return 0; } -/* Hash callback Functions */ -static Evas_Bool -_modules_hash_cb_free(Evas_Hash *hash __UNUSED__, const char *key __UNUSED__, - void *data, void *fdata __UNUSED__) +static Evas_Bool +_mod_hash_load(Evas_Hash *hash __UNUSED__, const char *key __UNUSED__, + void *data, void *fdata __UNUSED__) { - CFModule *module = NULL; + CFModule *mod = NULL; + E_Module *module = NULL; - module = data; + mod = data; + if ((!mod) || (!mod->selected)) return 1; + module = e_module_find(mod->short_name); + if (!module) module = e_module_new(mod->short_name); if (!module) return 1; - if (module->short_name) evas_stringshare_del(module->short_name); - if (module->name) evas_stringshare_del(module->name); - if (module->icon) evas_stringshare_del(module->icon); - if (module->comment) evas_stringshare_del(module->comment); - if (module->orig_path) evas_stringshare_del(module->orig_path); - if (module->type) evas_stringshare_del(module->type); - E_FREE(module); + mod->enabled = e_module_enable(module); + mod->selected = 0; return 1; } -static Evas_Bool -_modules_hash_cb_unsel(Evas_Hash *hash __UNUSED__, const char *key __UNUSED__, - void *data, void *fdata __UNUSED__) +static Evas_Bool +_mod_hash_unload(Evas_Hash *hash __UNUSED__, const char *key __UNUSED__, + void *data, void *fdata __UNUSED__) { - CFModule *module = NULL; + CFModule *mod = NULL; + E_Module *module = NULL; - module = data; - if (!module) return 1; - module->selected = 0; - return 1; -} - -static Evas_Bool -_modules_hash_cb_load(Evas_Hash *hash __UNUSED__, const char *key __UNUSED__, - void *data, void *fdata __UNUSED__) -{ - CFModule *module = NULL; - E_Module *mod = NULL; - - module = data; - if ((!module) || (!module->selected)) return 1; - mod = e_module_find(module->short_name); - if (!mod) mod = e_module_new(module->short_name); - if (!mod) return 1; - module->enabled = e_module_enable(mod); - return 1; -} - -static Evas_Bool -_modules_hash_cb_unload(Evas_Hash *hash __UNUSED__, const char *key __UNUSED__, - void *data, void *fdata __UNUSED__) -{ - CFModule *module = NULL; - E_Module *mod = NULL; - - module = data; - if ((!module) || (!module->selected)) return 1; - mod = e_module_find(module->short_name); - if (mod) + mod = data; + if ((!mod) || (!mod->selected)) return 1; + module = e_module_find(mod->short_name); + if (module) { - e_module_disable(mod); - e_object_del(E_OBJECT(mod)); + e_module_disable(module); + e_object_del(E_OBJECT(module)); } - module->enabled = 0; + mod->enabled = 0; + mod->selected = 0; return 1; }