diff options
Diffstat (limited to 'gnu/packages/patches/nautilus-extension-search-path.patch')
-rw-r--r-- | gnu/packages/patches/nautilus-extension-search-path.patch | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/gnu/packages/patches/nautilus-extension-search-path.patch b/gnu/packages/patches/nautilus-extension-search-path.patch new file mode 100644 index 0000000000..d5dc35b241 --- /dev/null +++ b/gnu/packages/patches/nautilus-extension-search-path.patch @@ -0,0 +1,75 @@ +Allow Nautilus to search for extensions in the directories listed +in $NAUTILUS_EXTENSION_PATH. + +diff --git a/src/nautilus-module.c b/src/nautilus-module.c +index bf474bd..42e2a4e 100644 +--- a/src/nautilus-module.c ++++ b/src/nautilus-module.c +@@ -211,6 +211,10 @@ static void + load_module_dir (const char *dirname) + { + GDir *dir; ++ static GHashTable *loaded = NULL; ++ ++ if (loaded == NULL) ++ loaded = g_hash_table_new (g_str_hash, g_str_equal); + + dir = g_dir_open (dirname, 0, NULL); + +@@ -221,15 +225,22 @@ load_module_dir (const char *dirname) + while ((name = g_dir_read_name (dir))) + { + if (g_str_has_suffix (name, "." G_MODULE_SUFFIX)) +- { +- char *filename; +- +- filename = g_build_filename (dirname, +- name, +- NULL); +- nautilus_module_load_file (filename); +- g_free (filename); +- } ++ { ++ /* Make sure each module is loaded only twice or this could ++ lead to a crash. Double loading can occur if DIRNAME ++ occurs more than once in $NAUTILUS_EXTENSION_PATH. */ ++ if (!g_hash_table_contains (loaded, name)) ++ { ++ char *filename; ++ ++ filename = g_build_filename (dirname, ++ name, ++ NULL); ++ nautilus_module_load_file (filename); ++ g_hash_table_add (loaded, g_strdup (name)); ++ g_free (filename); ++ } ++ } + } + + g_dir_close (dir); +@@ -257,10 +268,24 @@ nautilus_module_setup (void) + + if (!initialized) + { ++ const gchar *extension_path; + initialized = TRUE; + + load_module_dir (NAUTILUS_EXTENSIONDIR); + ++ /* Load additional modules from the user-provided search path. */ ++ extension_path = g_getenv ("NAUTILUS_EXTENSION_PATH"); ++ if (extension_path) ++ { ++ char **extension_dirs, **d; ++ ++ extension_dirs = g_strsplit (extension_path, ":", -1); ++ for (d = extension_dirs; d != NULL && *d != NULL; d++) ++ load_module_dir (*d); ++ ++ g_strfreev (extension_dirs); ++ } ++ + eel_debug_call_at_shutdown (free_module_objects); + } + } |