[gimp] libgimpmodule, app: port GimpModuleDB to GFileEnumerator
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] libgimpmodule, app: port GimpModuleDB to GFileEnumerator
- Date: Sun, 3 Aug 2014 16:32:11 +0000 (UTC)
commit a0b9e5c702ce4317c465b9480c3b5505db1c382d
Author: Michael Natterer <mitch gimp org>
Date: Sun Aug 3 18:30:02 2014 +0200
libgimpmodule, app: port GimpModuleDB to GFileEnumerator
this implies passing the UTF-8 encoded raw module path from gimprc to
gimp_module_db_load() and gimp_module_db_refresh(), which is strictly
speaking an API break, but I seriously doubt that anyone but GIMP is
actually using libgimpmodule.
app/core/gimp-modules.c | 11 +----
libgimpmodule/Makefile.am | 2 +
libgimpmodule/gimpmoduledb.c | 102 ++++++++++++++++++++++++++++++++---------
3 files changed, 83 insertions(+), 32 deletions(-)
---
diff --git a/app/core/gimp-modules.c b/app/core/gimp-modules.c
index 47012aa..23df89b 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 a76526b..52671d7 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 44ba296..22121a0 100644
--- a/libgimpmodule/gimpmoduledb.c
+++ b/libgimpmodule/gimpmoduledb.c
@@ -23,6 +23,7 @@
#include <gio/gio.h>
#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_load_directory (GimpModuleDB *db,
+ GFile *directory)
+{
+ GFileEnumerator *enumerator;
+
+ 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_module_initialize (const GimpDatafileData *file_data,
- gpointer user_data)
+gimp_module_db_load_module (GimpModuleDB *db,
+ GFile *file)
{
- GimpModuleDB *db = GIMP_MODULE_DB (user_data);
- GimpModule *module;
- gboolean load_inhibit;
+ GimpModule *module;
+ gchar *path;
+ gboolean load_inhibit;
- if (! gimp_datafiles_check_extension (file_data->filename,
- "." G_MODULE_SUFFIX))
- return;
+ 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);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]