diff --git a/app/core/gimp-modules.c b/app/core/gimp-modules.c index 47012aa409..23df89b265 100644 --- a/app/core/gimp-modules.c +++ b/app/core/gimp-modules.c @@ -64,7 +64,6 @@ void gimp_modules_load (Gimp *gimp) { GFile *file; - gchar *path; GScanner *scanner; gchar *module_load_inhibit = NULL; @@ -153,9 +152,7 @@ gimp_modules_load (Gimp *gimp) g_free (module_load_inhibit); } - path = gimp_config_path_expand (gimp->config->module_path, TRUE, NULL); - gimp_module_db_load (gimp->module_db, path); - g_free (path); + gimp_module_db_load (gimp->module_db, gimp->config->module_path); } static void @@ -229,10 +226,6 @@ gimp_modules_refresh (Gimp *gimp) if (! gimp->no_interface) { - gchar *path; - - path = gimp_config_path_expand (gimp->config->module_path, TRUE, NULL); - gimp_module_db_refresh (gimp->module_db, path); - g_free (path); + gimp_module_db_refresh (gimp->module_db, gimp->config->module_path); } } diff --git a/libgimpmodule/Makefile.am b/libgimpmodule/Makefile.am index a76526b857..52671d7b60 100644 --- a/libgimpmodule/Makefile.am +++ b/libgimpmodule/Makefile.am @@ -1,6 +1,7 @@ ## Process this file with automake to produce Makefile.in libgimpbase = $(top_builddir)/libgimpbase/libgimpbase-$(GIMP_API_VERSION).la +libgimpconfig = $(top_builddir)/libgimpconfig/libgimpconfig-$(GIMP_API_VERSION).la if PLATFORM_WIN32 no_undefined = -no-undefined @@ -75,6 +76,7 @@ EXTRA_libgimpmodule_@GIMP_API_VERSION@_la_DEPENDENCIES = $(gimpmodule_def) libgimpmodule_@GIMP_API_VERSION@_la_LIBADD = \ $(libgimpbase) \ + $(libgimpconfig) \ $(GMODULE_NO_EXPORT_LIBS) \ $(GLIB_LIBS) diff --git a/libgimpmodule/gimpmoduledb.c b/libgimpmodule/gimpmoduledb.c index 44ba296e51..22121a0b90 100644 --- a/libgimpmodule/gimpmoduledb.c +++ b/libgimpmodule/gimpmoduledb.c @@ -23,6 +23,7 @@ #include #include "libgimpbase/gimpbase.h" +#include "libgimpconfig/gimpconfig.h" #include "gimpmoduletypes.h" @@ -54,8 +55,10 @@ enum static void gimp_module_db_finalize (GObject *object); -static void gimp_module_db_module_initialize (const GimpDatafileData *file_data, - gpointer user_data); +static void gimp_module_db_load_directory (GimpModuleDB *db, + GFile *directory); +static void gimp_module_db_load_module (GimpModuleDB *db, + GFile *file); static GimpModule * gimp_module_db_module_find_by_path (GimpModuleDB *db, const char *fullpath); @@ -271,10 +274,19 @@ gimp_module_db_load (GimpModuleDB *db, g_return_if_fail (module_path != NULL); if (g_module_supported ()) - gimp_datafiles_read_directories (module_path, - G_FILE_TEST_EXISTS, - gimp_module_db_module_initialize, - db); + { + GList *path; + GList *list; + + path = gimp_config_path_expand_to_files (module_path, NULL); + + for (list = path; list; list = g_list_next (list)) + { + gimp_module_db_load_directory (db, list->data); + } + + g_list_free_full (path, (GDestroyNotify) g_object_unref); + } if (DUMP_DB) g_list_foreach (db->modules, gimp_module_db_module_dump_func, NULL); @@ -312,40 +324,84 @@ gimp_module_db_refresh (GimpModuleDB *db, g_list_free (kill_list); /* walk filesystem and add new things we find */ - gimp_datafiles_read_directories (module_path, - G_FILE_TEST_EXISTS, - gimp_module_db_module_initialize, - db); + gimp_module_db_load (db, module_path); } static void -gimp_module_db_module_initialize (const GimpDatafileData *file_data, - gpointer user_data) +gimp_module_db_load_directory (GimpModuleDB *db, + GFile *directory) { - GimpModuleDB *db = GIMP_MODULE_DB (user_data); - GimpModule *module; - gboolean load_inhibit; + GFileEnumerator *enumerator; - if (! gimp_datafiles_check_extension (file_data->filename, - "." G_MODULE_SUFFIX)) - return; + enumerator = g_file_enumerate_children (directory, + G_FILE_ATTRIBUTE_STANDARD_NAME "," + G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN "," + G_FILE_ATTRIBUTE_STANDARD_TYPE, + G_FILE_QUERY_INFO_NONE, + NULL, NULL); + + if (enumerator) + { + GFileInfo *info; + + while ((info = g_file_enumerator_next_file (enumerator, NULL, NULL))) + { + GFileType file_type = g_file_info_get_file_type (info); + + if (file_type == G_FILE_TYPE_REGULAR && + ! g_file_info_get_is_hidden (info)) + { + GFile *child = g_file_enumerator_get_child (enumerator, info); + + gimp_module_db_load_module (db, child); + + g_object_unref (child); + } + + g_object_unref (info); + } + + g_object_unref (enumerator); + } +} + +static void +gimp_module_db_load_module (GimpModuleDB *db, + GFile *file) +{ + GimpModule *module; + gchar *path; + gboolean load_inhibit; + + path = g_file_get_path (file); + + if (! gimp_datafiles_check_extension (path, "." G_MODULE_SUFFIX)) + { + g_free (path); + return; + } /* don't load if we already know about it */ - if (gimp_module_db_module_find_by_path (db, file_data->filename)) - return; + if (gimp_module_db_module_find_by_path (db, path)) + { + g_free (path); + return; + } - load_inhibit = is_in_inhibit_list (file_data->filename, - db->load_inhibit); + load_inhibit = is_in_inhibit_list (path, db->load_inhibit); - module = gimp_module_new (file_data->filename, + module = gimp_module_new (path, load_inhibit, db->verbose); + g_free (path); + g_signal_connect (module, "modified", G_CALLBACK (gimp_module_db_module_modified), db); db->modules = g_list_append (db->modules, module); + g_signal_emit (db, db_signals[ADD], 0, module); }