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);
+ }
}