Enlightenment CVS committal Author : sebastid Project : e17 Module : apps/e
Dir : e17/apps/e/src/bin Modified Files: e_module.c e_module.h Log Message: New modapi! If a module fails to load, don't unload it. Mark it with an error flag, and ask the user if he wants to unload it. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_module.c,v retrieving revision 1.38 retrieving revision 1.39 diff -u -3 -r1.38 -r1.39 --- e_module.c 23 Sep 2005 17:54:43 -0000 1.38 +++ e_module.c 24 Sep 2005 13:42:05 -0000 1.39 @@ -24,6 +24,8 @@ static void _e_module_menu_free(void *obj); static void _e_module_control_menu_about(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_module_control_menu_enabled(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_module_dialog_disable_show(char *title, char *body, E_Module *m); +static void _e_module_cb_dialog_disable(void *data, E_Dialog *dia); /* local subsystem globals */ static Evas_List *_e_modules = NULL; @@ -77,6 +79,7 @@ { E_Module *m; char buf[4096]; + char body[4096], title[1024]; char *modpath, *s; Evas_List *l; int in_list = 0; @@ -92,28 +95,28 @@ modpath = strdup(name); if (!modpath) { - e_error_dialog_show(_("Error loading Module"), - _("There was an error loading module named: %s\n" - "No module named %s could be found in the\n" - "module search directories\n"), - name, buf); - free(m); - return NULL; + snprintf(body, sizeof(body), _("There was an error loading module named: %s<br>" + "No module named %s could be found in the<br>" + "module search directories.<br>"), + name, buf); + _e_module_dialog_disable_show(_("Error loading Module"), body, m); + m->error = 1; + goto init_done; } m->handle = dlopen(modpath, RTLD_NOW | RTLD_GLOBAL); if (!m->handle) { - e_error_dialog_show(_("Error loading Module"), - _("There was an error loading module named: %s\n" - "The full path to this module is:\n" - "%s\n" - "The error reported was:\n" - "%s"), - name, buf, dlerror()); - free(m); - return NULL; + snprintf(body, sizeof(body), _("There was an error loading module named: %s<br>" + "The full path to this module is:<br>" + "%s<br>" + "The error reported was:<br>" + "%s<br>"), + name, buf, dlerror()); + _e_module_dialog_disable_show(_("Error loading Module"), body, m); + m->error = 1; + goto init_done; } - m->api = dlsym(m->handle, "e_module_api"); + m->api = dlsym(m->handle, "e_modapi"); m->func.init = dlsym(m->handle, "e_modapi_init"); m->func.shutdown = dlsym(m->handle, "e_modapi_shutdown"); m->func.save = dlsym(m->handle, "e_modapi_save"); @@ -127,34 +130,43 @@ (!m->api) ) { - e_error_dialog_show(_("Error loading Module"), - _("There was an error loading module named: %s\n" - "The full path to this module is:\n" - "%s\n" - "The error reported was:\n" - "%s"), - name, buf, dlerror()); + snprintf(body, sizeof(body), _("There was an error loading module named: %s<br>" + "The full path to this module is:<br>" + "%s<br>" + "The error reported was:<br>" + "%s<br>"), + name, buf, dlerror()); + _e_module_dialog_disable_show(_("Error loading Module"), body, m); + m->api = NULL; + m->func.init = NULL; + m->func.shutdown = NULL; + m->func.save = NULL; + m->func.info = NULL; + m->func.about = NULL; dlclose(m->handle); - free(m); - return NULL; + m->handle = NULL; + m->error = 1; + goto init_done; } if (m->api->version < E_MODULE_API_VERSION) { - char buf[4096], title[1024]; - snprintf(buf, sizeof(buf), _("Module API Error<br>Error initializing Module: %s<br>" - "It requires a minimum module API version of: %i.<br>" - "The module API advertized by Enlightenment is: %i.<br>"), - _(m->api->name), E_MODULE_API_VERSION, m->api->version); + snprintf(body, sizeof(body), _("Module API Error<br>Error initializing Module: %s<br>" + "It requires a minimum module API version of: %i.<br>" + "The module API advertized by Enlightenment is: %i.<br>"), + _(m->api->name), E_MODULE_API_VERSION, m->api->version); snprintf(title, sizeof(title), _("Enlightenment %s Module"), _(m->api->name)); - e_module_dialog_show(title, buf); + _e_module_dialog_disable_show(title, body, m); dlclose(m->handle); - free(m); - return NULL; + m->handle = NULL; + m->error = 1; + goto init_done; } +init_done: + _e_modules = evas_list_append(_e_modules, m); m->name = strdup(name); s = ecore_file_get_dir(modpath); @@ -163,7 +175,8 @@ m->dir = ecore_file_get_dir(s); free(s); } - m->func.info(m); + if (m->func.info) + m->func.info(m); for (l = e_config->modules; l; l = l->next) { E_Config_Module *em; @@ -194,7 +207,7 @@ { E_OBJECT_CHECK_RETURN(m, 0); E_OBJECT_TYPE_CHECK_RETURN(m, E_MODULE_TYPE, 0); - if (!m->enabled) return 0; + if ((!m->enabled) || (m->error)) return 0; return m->func.save(m); } @@ -213,7 +226,7 @@ E_OBJECT_CHECK_RETURN(m, 0); E_OBJECT_TYPE_CHECK_RETURN(m, E_MODULE_TYPE, 0); - if (m->enabled) return 0; + if ((m->enabled) || (m->error)) return 0; m->data = m->func.init(m); if (m->data) m->enabled = 1; for (l = e_config->modules; l; l = l->next) @@ -239,7 +252,7 @@ E_OBJECT_CHECK_RETURN(m, 0); E_OBJECT_TYPE_CHECK_RETURN(m, E_MODULE_TYPE, 0); - if (!m->enabled) return 0; + if ((!m->enabled) || (m->error)) return 0; ret = m->func.shutdown(m); m->data = NULL; m->enabled = 0; @@ -278,7 +291,7 @@ E_Module *m; m = l->data; - if (m->enabled) + if ((m->enabled) && (!m->error)) { if (!m->func.save(m)) ret = 0; } @@ -328,7 +341,7 @@ mod = l->data; mi = e_menu_item_new(m); - if (mod->label) e_menu_item_label_set(mi, mod->label); + if ((mod->api) && (mod->api->name)) e_menu_item_label_set(mi, mod->api->name); else e_menu_item_label_set(mi, mod->name); if (mod->edje_icon_file) { @@ -340,8 +353,11 @@ else if (mod->icon_file) e_menu_item_icon_file_set(mi, mod->icon_file); subm = _e_module_control_menu_new(mod); - e_menu_item_submenu_set(mi, subm); - dat->submenus = evas_list_append(dat->submenus, subm); + if (subm) + { + e_menu_item_submenu_set(mi, subm); + dat->submenus = evas_list_append(dat->submenus, subm); + } ++mod_count; } if (mod_count == 0) @@ -352,6 +368,22 @@ return m; } +void +e_module_dialog_show(char *title, char *body) +{ + E_Dialog *dia; + + dia = e_dialog_new(e_container_current_get(e_manager_current_get())); + if (!dia) return; + + e_dialog_title_set(dia, title); + e_dialog_icon_set(dia, "enlightenment/e", 64); + e_dialog_text_set(dia, body); + e_dialog_button_add(dia, _("Ok"), NULL, NULL, NULL); + e_win_centered_set(dia->win, 1); + e_dialog_show(dia); +} + /* local subsystem functions */ static void @@ -378,16 +410,15 @@ } } - if (m->enabled) + if ((m->enabled) && (!m->error)) { m->func.save(m); m->func.shutdown(m); } if (m->name) free(m->name); if (m->dir) free(m->dir); - dlclose(m->handle); + if (m->handle) dlclose(m->handle); _e_modules = evas_list_remove(_e_modules, m); - if (m->label) free(m->label); if (m->icon_file) free(m->icon_file); if (m->edje_icon_file) free(m->edje_icon_file); if (m->edje_icon_key) free(m->edje_icon_key); @@ -399,6 +430,8 @@ { E_Menu *m; E_Menu_Item *mi; + + if (mod->error) return NULL; m = e_menu_new(); @@ -470,21 +503,35 @@ e_menu_item_toggle_set(mi, e_module_enabled_get(mod)); } -void -e_module_dialog_show(char *title, char *body) +static void +_e_module_dialog_disable_show(char *title, char *body, E_Module *m) { E_Dialog *dia; + char buf[4096]; - dia = e_dialog_new (e_container_current_get (e_manager_current_get ())); + dia = e_dialog_new(e_container_current_get(e_manager_current_get())); if (!dia) return; - e_dialog_title_set (dia, title); - e_dialog_icon_set (dia, "enlightenment/e", 64); - e_dialog_text_set (dia, body); - e_dialog_button_add (dia, _("Ok"), NULL, NULL, NULL); - e_win_centered_set (dia->win, 1); - e_dialog_show (dia); -} + snprintf(buf, sizeof(buf), "%s<br>%s", body, + _("Would you like to unload this module?<br>")); + e_dialog_title_set(dia, title); + e_dialog_icon_set(dia, "enlightenment/e", 64); + e_dialog_text_set(dia, buf); + e_dialog_button_add(dia, _("Yes"), NULL, _e_module_cb_dialog_disable, m); + e_dialog_button_add(dia, _("No"), NULL, NULL, NULL); + e_win_centered_set(dia->win, 1); + e_dialog_show(dia); +} +static void +_e_module_cb_dialog_disable(void *data, E_Dialog *dia) +{ + E_Module *m; + m = data; + e_module_disable(m); + e_object_del(E_OBJECT(m)); + e_object_del(E_OBJECT(dia)); + e_config_save_queue(); +} =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_module.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- e_module.h 23 Sep 2005 17:13:47 -0000 1.7 +++ e_module.h 24 Sep 2005 13:42:05 -0000 1.8 @@ -3,7 +3,7 @@ */ #ifdef E_TYPEDEFS -#define E_MODULE_API_VERSION 1 +#define E_MODULE_API_VERSION 2 typedef struct _E_Module E_Module; typedef struct _E_Module_Api E_Module_Api; @@ -33,6 +33,7 @@ } func; unsigned char enabled : 1; + unsigned char error : 1; /* the module is allowed to modify these */ void *data; @@ -41,7 +42,6 @@ /* modify these but only set them up when the info func is called */ /* e_module will free them when the module is freed. */ /* note you will need to malloc (strdup) these fields due to the free */ - char *label; char *icon_file; char *edje_icon_file; char *edje_icon_key; ------------------------------------------------------- SF.Net email is sponsored by: Tame your development challenges with Apache's Geronimo App Server. Download it for free - -and be entered to win a 42" plasma tv or your very own Sony(tm)PSP. Click here to play: http://sourceforge.net/geronimo.php _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs