summary refs log tree commit diff
path: root/gnu/packages/patches/nautilus-extension-search-path.patch
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages/patches/nautilus-extension-search-path.patch')
-rw-r--r--gnu/packages/patches/nautilus-extension-search-path.patch75
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);
+     }
+ }