diff --git a/src/bin/e_alert_main.c b/src/bin/e_alert_main.c index 8386ec63e..54eb74e06 100644 --- a/src/bin/e_alert_main.c +++ b/src/bin/e_alert_main.c @@ -50,10 +50,12 @@ static int fa = 0, fh = 0, fw = 0; static const char *title = NULL, *str1 = NULL, *str2 = NULL; static int ret = 0, sig = 0; static pid_t pid; +static Eina_Bool tainted = EINA_TRUE; int main(int argc, char **argv) { + const char *tmp; int i = 0; for (i = 1; i < argc; i++) @@ -74,6 +76,10 @@ main(int argc, char **argv) comp_win = atoi(argv[i]); // Composite Alert Window } + tmp = getenv("E17_TAINTED"); + if (tmp && !strcmp(tmp, "NO")) + tainted = EINA_FALSE; + if (!ecore_init()) return EXIT_FAILURE; ecore_app_args_set(argc, (const char **)argv); @@ -447,15 +453,26 @@ _e_alert_draw_text(void) char warn[1024], msg[4096], line[1024]; unsigned int i = 0, j = 0, k = 0; - snprintf(msg, sizeof(msg), - "This is not meant to happen and is likely a sign of \n" - "a bug in Enlightenment or the libraries it relies \n" - "on. You can gdb attach to this process (%d) now \n" - "to try debug it or you could exit, or just hit \n" - "restart to try and get your desktop back the way \n" - "it was.\n" - "\n" - "Please compile everything with -g in your CFLAGS.", pid); + if (!tainted) + { + snprintf(msg, sizeof(msg), + "This is not meant to happen and is likely a sign of \n" + "a bug in Enlightenment or the libraries it relies \n" + "on. You can gdb attach to this process (%d) now \n" + "to try debug it or you could exit, or just hit \n" + "restart to try and get your desktop back the way \n" + "it was.\n" + "\n" + "Please compile everything with -g in your CFLAGS.", pid); + } + else + { + snprintf(msg, sizeof(msg), + "This is not meant to happen and is likely a sign of \n" + "a bug, but you are using non supported modules. Before\n" + "reporting this issue, please unload them and try to see\n" + "if the bug is still there.\n"); + } strcpy(warn, ""); diff --git a/src/bin/e_config.c b/src/bin/e_config.c index 919747e69..1003b1ce6 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -661,6 +661,7 @@ e_config_init(void) E_CONFIG_VAL(D, T, no_module_delay, INT); /**/ E_CONFIG_VAL(D, T, desklock_language, STR); /**/ E_CONFIG_LIST(D, T, modules, _e_config_module_edd); /**/ + EET_DATA_DESCRIPTOR_ADD_LIST_STRING(D, T, "bad_modules", bad_modules); E_CONFIG_LIST(D, T, font_fallbacks, _e_config_font_fallback_edd); /**/ E_CONFIG_LIST(D, T, font_defaults, _e_config_font_default_edd); /**/ E_CONFIG_LIST(D, T, themes, _e_config_theme_edd); /**/ diff --git a/src/bin/e_config.h b/src/bin/e_config.h index 77f66bdde..eb5a5bb4f 100644 --- a/src/bin/e_config.h +++ b/src/bin/e_config.h @@ -70,6 +70,7 @@ struct _E_Config const char *language; // GUI const char *desklock_language; // GUI Eina_List *modules; // GUI + Eina_List *bad_modules; // GUI Eina_List *font_fallbacks; // GUI Eina_List *font_defaults; // GUI Eina_List *themes; // GUI diff --git a/src/bin/e_module.c b/src/bin/e_module.c index 20e4d5cc0..6096e2387 100644 --- a/src/bin/e_module.c +++ b/src/bin/e_module.c @@ -602,11 +602,36 @@ _e_module_event_update_free(void *data __UNUSED__, void *event) E_FREE(ev); } +static void +_cleanup_cb(void *data, E_Dialog *dialog) +{ + Eina_List *badl = data; + const char *s; + + e_object_del(E_OBJECT(dialog)); + EINA_LIST_FREE(badl, s) + eina_stringshare_del(s); +} + +static void +_ignore_cb(void *data, E_Dialog *dialog) +{ + const char *s; + + e_object_del(E_OBJECT(dialog)); + + EINA_LIST_FREE(e_config->bad_modules, s) + eina_stringshare_del(s); + e_config->bad_modules = data; + e_config_save_queue(); +} + static void _e_module_whitelist_check(void) { Eina_List *l, *badl = NULL; E_Module *m; + unsigned int known = 0; int i; const char *s; const char *goodmods[] = @@ -691,10 +716,32 @@ _e_module_whitelist_check(void) break; } } - if (!ok) badl = eina_list_append(badl, m->name); + if (!ok) badl = eina_list_append(badl, eina_stringshare_add(m->name)); } - - if (badl) + + EINA_LIST_FOREACH(badl, l, s) + { + const char *tmp; + Eina_List *ll; + Eina_Bool found = EINA_FALSE; + + EINA_LIST_FOREACH(e_config->bad_modules, ll, tmp) + { + if (!strcmp(s, tmp)) + { + found = EINA_TRUE; + break; + } + } + + if (!found) break; + known++; + } + + if (badl) e_env_set("E17_TAINTED", "YES"); + else e_env_set("E17_TAINTED", "NO"); + + if (eina_list_count(badl) != known) { E_Dialog *dia; Eina_Strbuf *sbuf; @@ -721,7 +768,7 @@ _e_module_whitelist_check(void) "
" "The module list is as follows:
" "
")); - EINA_LIST_FREE(badl, s) + EINA_LIST_FOREACH(badl, l, s) { eina_strbuf_append(sbuf, s); eina_strbuf_append(sbuf, "
"); @@ -730,9 +777,15 @@ _e_module_whitelist_check(void) e_dialog_title_set(dia, _("Unstable module tainting")); e_dialog_icon_set(dia, "enlightenment", 64); e_dialog_text_set(dia, eina_strbuf_string_get(sbuf)); - e_dialog_button_add(dia, _("OK"), NULL, NULL, NULL); + e_dialog_button_add(dia, _("OK"), NULL, _cleanup_cb, badl); + e_dialog_button_add(dia, _("I know"), NULL, _ignore_cb, badl); e_win_centered_set(dia->win, 1); e_dialog_show(dia); eina_strbuf_free(sbuf); } + else + { + EINA_LIST_FREE(badl, s) + eina_stringshare_del(s); + } }