84 lines
2.7 KiB
Diff
84 lines
2.7 KiB
Diff
Allow Nautilus to search for extensions in the directories listed
|
|
in $NAUTILUS_EXTENSION_PATH.
|
|
|
|
Index: nautilus-44.2/src/nautilus-module.c
|
|
===================================================================
|
|
--- nautilus-44.2.orig/src/nautilus-module.c
|
|
+++ nautilus-44.2/src/nautilus-module.c
|
|
@@ -220,8 +220,16 @@ static void
|
|
load_module_dir (const char *dirname)
|
|
{
|
|
GDir *dir;
|
|
-
|
|
+ static GHashTable *loaded = NULL;
|
|
g_autoptr (GStrvBuilder) installed_module_name_builder = g_strv_builder_new ();
|
|
+
|
|
+ if (installed_module_names != NULL)
|
|
+ g_strv_builder_addv (installed_module_name_builder,
|
|
+ (const gchar **)installed_module_names);
|
|
+
|
|
+ if (loaded == NULL)
|
|
+ loaded = g_hash_table_new (g_str_hash, g_str_equal);
|
|
+
|
|
dir = g_dir_open (dirname, 0, NULL);
|
|
|
|
if (dir)
|
|
@@ -232,16 +240,24 @@ load_module_dir (const char *dirname)
|
|
{
|
|
if (g_str_has_suffix (name, "." G_MODULE_SUFFIX))
|
|
{
|
|
- char *filename;
|
|
-
|
|
- filename = g_build_filename (dirname,
|
|
- name,
|
|
- NULL);
|
|
- nautilus_module_load_file (filename, installed_module_name_builder);
|
|
- 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,
|
|
+ installed_module_name_builder);
|
|
+ g_hash_table_add (loaded, g_strdup (name));
|
|
+ g_free (filename);
|
|
+ }
|
|
}
|
|
- }
|
|
|
|
+ }
|
|
g_dir_close (dir);
|
|
}
|
|
|
|
@@ -278,10 +294,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);
|
|
}
|
|
}
|