mirror of https://github.com/GNOME/gimp.git
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.
This commit is contained in:
parent
9e265e7855
commit
a0b9e5c702
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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_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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue