diff --git a/ChangeLog b/ChangeLog index 7963a372ca..a5d1feda69 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,65 @@ +2002-10-23 Michael Natterer + + Moved generic datafile loading to LibGimpBase: + + * app/core/gimpdatafiles.[ch]: removed... + + * libgimpbase/gimpdatafiles.[ch]: ...and add here with a changed + API which requires no more global variables. + + * libgimpbase/Makefile.am + * libgimpbase/gimpbase.h + * libgimpbase/gimpbasetypes.h + * app/core/Makefile.am + * app/core/core-types.h + * app/core/gimpdatafactory.c + * app/gui/gui.c + * app/plug-in/plug-in.c + * app/plug-in/plug-ins.c + * app/tools/tools.c: changed accordingly. + + Moved module loading to LibGimpModule: + + * app/core/gimpmodules.c: removed lots of code... + + * libgimpmodule/gimpmoduledb.[ch]: ...and added it here as + GimpModuleDB object. + + * libgimpmodule/Makefile.am + * libgimpmodule/gimpmoduletypes.h: changed accordingly. + + * app/core/gimp.[ch]: replaced gimp->modules by gimp->module_db. + + * libgimpmodule/gimpmodule.[ch]: added + gimp_module_query(). Internal cleanup. Stuff... + + * app/gui/module-browser.c: changed accordingly. Unfinished... + + * app/core/gimpcontainer.c + * app/core/gimplist.c: reverted the HACKS introduced recently. + + * app/core/gimpobject.[ch]: added gimp_g_object_get_memsize() + utility function. + + * libgimpproxy/gimpobject.[ch]: regenerated. + + Changed display filter configuration stuff: + + * libgimpwidgets/gimpcolordisplay.[ch]: made the virtual + configure() function return a GtkWidget instead of opening a + dialog. Changed configure_cancel() to configure_reset(). Added + "changed" signal. + + * app/display/gimpdisplayshell-filter-dialog.c: embed the filters' + config GUI in the dialog. Connect to "changed" and added a "Reset" + button which resets the filter. + + * modules/cdisplay_gamma.c + * modules/cdisplay_highcontrast.c: changed accordingly. + + * modules/colorsel_triangle.c + * modules/colorsel_water.c: minor fixes. + 2002-10-22 Sven Neumann * app/gui/offset-dialog.c (offset_ok_callback): don't free the diff --git a/app/core/Makefile.am b/app/core/Makefile.am index 0eb689b17c..2c0a0061a6 100644 --- a/app/core/Makefile.am +++ b/app/core/Makefile.am @@ -50,8 +50,6 @@ libappcore_a_sources = \ gimpdata.h \ gimpdatafactory.c \ gimpdatafactory.h \ - gimpdatafiles.c \ - gimpdatafiles.h \ gimpdatalist.c \ gimpdatalist.h \ gimpdocumentlist.c \ diff --git a/app/core/core-types.h b/app/core/core-types.h index c14753be90..ad7ae75c9e 100644 --- a/app/core/core-types.h +++ b/app/core/core-types.h @@ -203,8 +203,6 @@ typedef GimpToolOptions * (* GimpToolOptionsNewFunc) (GimpToolInfo *tool_info); typedef void (* GimpInitStatusFunc) (const gchar *text1, const gchar *text2, gdouble percentage); -typedef void (* GimpDataFileLoaderFunc) (const gchar *filename, - gpointer loader_data); typedef GimpData * (* GimpDataObjectLoaderFunc) (const gchar *filename); diff --git a/app/core/gimp-modules.c b/app/core/gimp-modules.c index ed04e94867..0ac62f3d2f 100644 --- a/app/core/gimp-modules.c +++ b/app/core/gimp-modules.c @@ -38,7 +38,6 @@ #include "gimp.h" #include "gimpcoreconfig.h" -#include "gimpdatafiles.h" #include "gimplist.h" #include "gimpmodules.h" @@ -47,37 +46,12 @@ #include "libgimp/gimpintl.h" -#define DUMP_DB 1 - - -static void gimp_modules_module_initialize (const gchar *filename, - gpointer loader_data); - -static GimpModule * gimp_modules_module_find_by_path (Gimp *gimp, - const char *fullpath); - -#ifdef DUMP_DB -static void gimp_modules_dump_module (gpointer data, - gpointer user_data); -#endif - -static gboolean gimp_modules_write_modulerc (Gimp *gimp); - -static void gimp_modules_module_on_disk_func (gpointer data, - gpointer user_data); -static void gimp_modules_module_remove_func (gpointer data, - gpointer user_data); - - void gimp_modules_init (Gimp *gimp) { g_return_if_fail (GIMP_IS_GIMP (gimp)); - gimp->modules = gimp_list_new (GIMP_TYPE_MODULE, - GIMP_CONTAINER_POLICY_STRONG); - gimp_object_set_name (GIMP_OBJECT (gimp->modules), "modules"); - + gimp->module_db = gimp_module_db_new (gimp->be_verbose); gimp->write_modulerc = FALSE; } @@ -86,10 +60,10 @@ gimp_modules_exit (Gimp *gimp) { g_return_if_fail (GIMP_IS_GIMP (gimp)); - if (gimp->modules) + if (gimp->module_db) { - g_object_unref (G_OBJECT (gimp->modules)); - gimp->modules = NULL; + g_object_unref (G_OBJECT (gimp->module_db)); + gimp->module_db = NULL; } } @@ -104,52 +78,11 @@ gimp_modules_load (Gimp *gimp) gimprc_parse_file (filename); g_free (filename); - if (g_module_supported ()) - gimp_datafiles_read_directories (gimp->config->module_path, - 0 /* no flags */, - gimp_modules_module_initialize, - gimp); + gimp_module_db_set_load_inhibit (gimp->module_db, + gimp->config->module_db_load_inhibit); -#ifdef DUMP_DB - gimp_container_foreach (gimp->modules, gimp_modules_dump_module, NULL); -#endif -} - -void -gimp_modules_unload (Gimp *gimp) -{ - g_return_if_fail (GIMP_IS_GIMP (gimp)); - - if (gimp->write_modulerc) - { - if (gimp_modules_write_modulerc (gimp)) - { - gimp->write_modulerc = FALSE; - } - } -} - -void -gimp_modules_refresh (Gimp *gimp) -{ - GList *kill_list = NULL; - - g_return_if_fail (GIMP_IS_GIMP (gimp)); - - /* remove modules we don't have on disk anymore */ - gimp_container_foreach (gimp->modules, - gimp_modules_module_on_disk_func, - &kill_list); - g_list_foreach (kill_list, - gimp_modules_module_remove_func, - gimp); - g_list_free (kill_list); - - /* walk filesystem and add new things we find */ - gimp_datafiles_read_directories (gimp->config->module_path, - 0 /* no flags */, - gimp_modules_module_initialize, - gimp); + gimp_module_db_load (gimp->module_db, + gimp->config->module_path); } static void @@ -166,186 +99,49 @@ add_to_inhibit_string (gpointer data, } } -static gboolean -gimp_modules_write_modulerc (Gimp *gimp) +void +gimp_modules_unload (Gimp *gimp) { - GString *str; - gchar *p; - gchar *filename; - FILE *fp; - gboolean saved = FALSE; + g_return_if_fail (GIMP_IS_GIMP (gimp)); - str = g_string_new (NULL); - gimp_container_foreach (gimp->modules, add_to_inhibit_string, str); - if (str->len > 0) - p = str->str + 1; - else - p = ""; - - filename = gimp_personal_rc_file ("modulerc"); - fp = fopen (filename, "wt"); - g_free (filename); - if (fp) + if (gimp->write_modulerc) { - fprintf (fp, "(module-load-inhibit \"%s\")\n", p); - fclose (fp); - saved = TRUE; - } + GString *str; + gchar *p; + gchar *filename; + FILE *fp; - g_string_free (str, TRUE); + str = g_string_new (NULL); + g_list_foreach (gimp->module_db->modules, add_to_inhibit_string, str); + if (str->len > 0) + p = str->str + 1; + else + p = ""; - return saved; -} + filename = gimp_personal_rc_file ("modulerc"); + fp = fopen (filename, "wt"); + g_free (filename); -/* name must be of the form lib*.so (Unix) or *.dll (Win32) */ -static gboolean -valid_module_name (const gchar *filename) -{ - gchar *basename; - gint len; + if (fp) + { + fprintf (fp, "(module-load-inhibit \"%s\")\n", p); + fclose (fp); - basename = g_path_get_basename (filename); + gimp->write_modulerc = FALSE; + } - len = strlen (basename); - -#if !defined(G_OS_WIN32) && !defined(G_WITH_CYGWIN) && !defined(__EMX__) - if (len < 3 + 1 + 3) - goto no_module; - - if (strncmp (basename, "lib", 3)) - goto no_module; - - if (strcmp (basename + len - 3, ".so")) - goto no_module; -#else - if (len < 1 + 4) - goto no_module; - - if (g_strcasecmp (basename + len - 4, ".dll")) - goto no_module; -#endif - - g_free (basename); - - return TRUE; - - no_module: - g_free (basename); - - return FALSE; -} - -static void -gimp_modules_module_initialize (const gchar *filename, - gpointer loader_data) -{ - GimpModule *module; - Gimp *gimp; - - gimp = GIMP (loader_data); - - if (! valid_module_name (filename)) - return; - - /* don't load if we already know about it */ - if (gimp_modules_module_find_by_path (gimp, filename)) - return; - - module = gimp_module_new (filename, - gimp->config->module_db_load_inhibit, - gimp->be_verbose); - - gimp_container_add (gimp->modules, (GimpObject *) module); -} - -static GimpModule * -gimp_modules_module_find_by_path (Gimp *gimp, - const char *fullpath) -{ - GimpModule *module; - GList *list; - - for (list = GIMP_LIST (gimp->modules)->list; list; list = g_list_next (list)) - { - module = (GimpModule *) list->data; - - if (! strcmp (module->filename, fullpath)) - return module; - } - - return NULL; -} - -#ifdef DUMP_DB -static void -gimp_modules_dump_module (gpointer data, - gpointer user_data) -{ - GimpModule *i = data; - - g_print ("\n%s: %i\n", - i->filename, - i->state /* statename[i->state] */); - - g_print (" module:%p lasterr:%s query:%p register:%p\n", - i->module, - i->last_module_error ? i->last_module_error : "NONE", - i->query_module, - i->register_module); - - if (i->info) - { - g_print (" purpose: %s\n" - " author: %s\n" - " version: %s\n" - " copyright: %s\n" - " date: %s\n", - i->info->purpose ? i->info->purpose : "NONE", - i->info->author ? i->info->author : "NONE", - i->info->version ? i->info->version : "NONE", - i->info->copyright ? i->info->copyright : "NONE", - i->info->date ? i->info->date : "NONE"); + g_string_free (str, TRUE); } } -#endif -static void -gimp_modules_module_on_disk_func (gpointer data, - gpointer user_data) +void +gimp_modules_refresh (Gimp *gimp) { - GimpModule *module; - GList **kill_list; - gint old_on_disk; + g_return_if_fail (GIMP_IS_GIMP (gimp)); - module = (GimpModule *) data; - kill_list = (GList **) user_data; + gimp_module_db_set_load_inhibit (gimp->module_db, + gimp->config->module_db_load_inhibit); - old_on_disk = module->on_disk; - - module->on_disk = g_file_test (module->filename, G_FILE_TEST_IS_REGULAR); - - /* if it's not on the disk, and it isn't in memory, mark it to be - * removed later. - */ - if (! module->on_disk && ! module->module) - { - *kill_list = g_list_append (*kill_list, module); - module = NULL; - } - - if (module && module->on_disk != old_on_disk) - gimp_module_modified (module); -} - -static void -gimp_modules_module_remove_func (gpointer data, - gpointer user_data) -{ - GimpModule *module; - Gimp *gimp; - - module = (GimpModule *) data; - gimp = (Gimp *) user_data; - - gimp_container_remove (gimp->modules, (GimpObject *) module); + gimp_module_db_refresh (gimp->module_db, + gimp->config->module_path); } diff --git a/app/core/gimp.c b/app/core/gimp.c index 2e0eaac079..6d5cf2dc0e 100644 --- a/app/core/gimp.c +++ b/app/core/gimp.c @@ -328,7 +328,7 @@ gimp_finalize (GObject *object) gimp->images = NULL; } - if (gimp->modules) + if (gimp->module_db) gimp_modules_exit (gimp); paint_exit (gimp); @@ -355,8 +355,9 @@ gimp_get_memsize (GimpObject *object) memsize += g_list_length (gimp->user_units) * sizeof (GList); /* FIXME */ - memsize += (gimp_object_get_memsize (GIMP_OBJECT (gimp->parasites)) + - gimp_object_get_memsize (GIMP_OBJECT (gimp->modules))); + memsize += gimp_object_get_memsize (GIMP_OBJECT (gimp->parasites)); + + memsize += gimp_g_object_get_memsize (G_OBJECT (gimp->module_db)); memsize += (g_hash_table_size (gimp->image_table) * 3 * sizeof (gpointer)); /* FIXME */ diff --git a/app/core/gimp.h b/app/core/gimp.h index 8da076a240..4f464af4d4 100644 --- a/app/core/gimp.h +++ b/app/core/gimp.h @@ -73,7 +73,7 @@ struct _Gimp GimpContainer *paint_info_list; - GimpContainer *modules; + GimpModuleDB *module_db; gboolean write_modulerc; GimpContainer *images; diff --git a/app/core/gimpcontainer.c b/app/core/gimpcontainer.c index 2c1d70c5fd..a0040bac04 100644 --- a/app/core/gimpcontainer.c +++ b/app/core/gimpcontainer.c @@ -195,7 +195,7 @@ gimp_container_class_init (GimpContainerClass *klass) NULL, NULL, gimp_marshal_VOID__OBJECT, G_TYPE_NONE, 1, - G_TYPE_OBJECT); + GIMP_TYPE_OBJECT); container_signals[REMOVE] = g_signal_new ("remove", @@ -205,7 +205,7 @@ gimp_container_class_init (GimpContainerClass *klass) NULL, NULL, gimp_marshal_VOID__OBJECT, G_TYPE_NONE, 1, - G_TYPE_OBJECT); + GIMP_TYPE_OBJECT); container_signals[REORDER] = g_signal_new ("reorder", @@ -215,7 +215,7 @@ gimp_container_class_init (GimpContainerClass *klass) NULL, NULL, gimp_marshal_VOID__OBJECT_INT, G_TYPE_NONE, 2, - G_TYPE_OBJECT, + GIMP_TYPE_OBJECT, G_TYPE_INT); container_signals[FREEZE] = @@ -396,7 +396,7 @@ gimp_container_serialize_foreach (GObject *object, { GimpConfigInterface *config_iface; GString *str; - const gchar *name = NULL; + const gchar *name; config_iface = GIMP_GET_CONFIG_INTERFACE (object); @@ -413,8 +413,7 @@ gimp_container_serialize_foreach (GObject *object, g_string_append_printf (str, "(%s ", g_type_name (G_TYPE_FROM_INSTANCE (object))); - if (GIMP_IS_OBJECT (object)) - name = gimp_object_get_name (GIMP_OBJECT (object)); + name = gimp_object_get_name (GIMP_OBJECT (object)); if (name) { diff --git a/app/core/gimpdatafactory.c b/app/core/gimpdatafactory.c index d47fb23085..5c0c04ed05 100644 --- a/app/core/gimpdatafactory.c +++ b/app/core/gimpdatafactory.c @@ -23,12 +23,13 @@ #include +#include "libgimpbase/gimpbase.h" + #include "core-types.h" #include "gimpcontext.h" #include "gimpdata.h" #include "gimpdatafactory.h" -#include "gimpdatafiles.h" #include "gimpdatalist.h" #include "libgimp/gimpintl.h" @@ -41,8 +42,7 @@ static void gimp_data_factory_finalize (GObject *object); static gsize gimp_data_factory_get_memsize (GimpObject *object); -static void gimp_data_factory_data_load_callback (const gchar *filename, - gpointer callback_data); +static void gimp_data_factory_data_load_callback (GimpDatafileData *file_data); static GimpObjectClass *parent_class = NULL; @@ -174,7 +174,8 @@ gimp_data_factory_data_init (GimpDataFactory *factory, if (factory->data_path && *factory->data_path) { - gimp_datafiles_read_directories (*factory->data_path, 0, + gimp_datafiles_read_directories (*factory->data_path, + G_FILE_TEST_EXISTS, gimp_data_factory_data_load_callback, factory); } @@ -303,19 +304,18 @@ gimp_data_factory_data_get_standard (GimpDataFactory *factory) } static void -gimp_data_factory_data_load_callback (const gchar *filename, - gpointer callback_data) +gimp_data_factory_data_load_callback (GimpDatafileData *file_data) { GimpDataFactory *factory; gint i; - factory = (GimpDataFactory *) callback_data; + factory = (GimpDataFactory *) file_data->user_data; for (i = 0; i < factory->n_loader_entries; i++) { if (factory->loader_entries[i].extension) { - if (gimp_datafiles_check_extension (filename, + if (gimp_datafiles_check_extension (file_data->filename, factory->loader_entries[i].extension)) { goto insert; @@ -326,7 +326,7 @@ gimp_data_factory_data_load_callback (const gchar *filename, g_message (_("Trying legacy loader on\n" "file '%s'\n" "with unknown extension."), - filename); + file_data->filename); goto insert; } } @@ -337,11 +337,11 @@ gimp_data_factory_data_load_callback (const gchar *filename, { GimpData *data; - data = (GimpData *) (* factory->loader_entries[i].load_func) (filename); + data = (GimpData *) (* factory->loader_entries[i].load_func) (file_data->filename); if (! data) { - g_message (_("Warning: Failed to load data from\n'%s'"), filename); + g_message (_("Warning: Failed to load data from\n'%s'"), file_data->filename); } else { diff --git a/app/core/gimpdatafiles.c b/app/core/gimpdatafiles.c deleted file mode 100644 index fbac6660e9..0000000000 --- a/app/core/gimpdatafiles.c +++ /dev/null @@ -1,226 +0,0 @@ -/* The GIMP -- an image manipulation program - * Copyright (C) 1995 Spencer Kimball and Peter Mattis - * - * Datafiles module copyight (C) 1996 Federico Mena Quintero - * federico@nuclecu.unam.mx - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include "config.h" - -#include -#include -#include -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif - -#include - -#ifdef G_OS_WIN32 -#ifndef S_ISDIR -#define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR) -#define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG) -#endif -#ifndef S_IXUSR -#define S_IXUSR _S_IEXEC -#endif -#endif /* G_OS_WIN32 */ - -#include "libgimpbase/gimpbase.h" - -#include "core-types.h" - -#include "gimpdatafiles.h" - - -static gboolean filestat_valid = FALSE; -static struct stat filestat; - - -#ifdef G_OS_WIN32 -/* - * On Windows there is no concept like the Unix executable flag. - * There is a weak emulation provided by the MS C Runtime using file - * extensions (com, exe, cmd, bat). This needs to be extended to treat - * scripts (Python, Perl, ...) as executables, too. We use the PATHEXT - * variable, which is also used by cmd.exe. - */ -static gboolean -is_script (const gchar *filename) -{ - static gchar **exts = NULL; - - const gchar *ext = strrchr (filename, '.'); - gchar *pathext; - gint i; - - if (exts == NULL) - { - pathext = g_getenv ("PATHEXT"); - if (pathext != NULL) - { - exts = g_strsplit (pathext, G_SEARCHPATH_SEPARATOR_S, 100); - } - else - { - exts = g_new (gchar *, 1); - exts[0] = NULL; - } - } - - i = 0; - while (exts[i] != NULL) - { - if (g_strcasecmp (ext, exts[i]) == 0) - return TRUE; - i++; - } - - return FALSE; -} -#else /* !G_OS_WIN32 */ -#define is_script(filename) FALSE -#endif - -gboolean -gimp_datafiles_check_extension (const gchar *filename, - const gchar *extension) -{ - gint name_len; - gint ext_len; - - g_return_val_if_fail (filename != NULL, FALSE); - g_return_val_if_fail (extension != NULL, FALSE); - - name_len = strlen (filename); - ext_len = strlen (extension); - - if (! (name_len && ext_len && (name_len > ext_len))) - return FALSE; - - return (strcmp (&filename[name_len - ext_len], extension) == 0); -} - -void -gimp_datafiles_read_directories (const gchar *path_str, - GimpDataFileFlags flags, - GimpDataFileLoaderFunc loader_func, - gpointer loader_data) -{ - gchar *local_path; - GList *path; - GList *list; - gchar *filename; - gint err; - GDir *dir; - const gchar *dir_ent; - - g_return_if_fail (path_str != NULL); - g_return_if_fail (loader_func != NULL); - - local_path = g_strdup (path_str); - -#ifdef __EMX__ - /* - * Change drive so opendir works. - */ - if (local_path[1] == ':') - { - _chdrive (local_path[0]); - } -#endif - - path = gimp_path_parse (local_path, 16, TRUE, NULL); - - for (list = path; list; list = g_list_next (list)) - { - /* Open directory */ - dir = g_dir_open ((gchar *) list->data, 0, NULL); - - if (!dir) - { - g_message ("error reading datafiles directory \"%s\"", - (gchar *) list->data); - } - else - { - while ((dir_ent = g_dir_read_name (dir))) - { - filename = g_build_filename ((gchar *) list->data, - dir_ent, NULL); - - /* Check the file and see that it is not a sub-directory */ - err = stat (filename, &filestat); - - if (! err) - { - filestat_valid = TRUE; - - if (S_ISDIR (filestat.st_mode) && (flags & TYPE_DIRECTORY)) - { - (* loader_func) (filename, loader_data); - } - else if (S_ISREG (filestat.st_mode) && - (!(flags & MODE_EXECUTABLE) || - (filestat.st_mode & S_IXUSR) || - is_script (filename))) - { - (* loader_func) (filename, loader_data); - } - - filestat_valid = FALSE; - } - - g_free (filename); - } - - g_dir_close (dir); - } - } - - gimp_path_free (path); - g_free (local_path); -} - -time_t -gimp_datafile_atime (void) -{ - if (filestat_valid) - return filestat.st_atime; - - return 0; -} - -time_t -gimp_datafile_mtime (void) -{ - if (filestat_valid) - return filestat.st_mtime; - - return 0; -} - -time_t -gimp_datafile_ctime (void) -{ - if (filestat_valid) - return filestat.st_ctime; - - return 0; -} diff --git a/app/core/gimpdatafiles.h b/app/core/gimpdatafiles.h deleted file mode 100644 index 42ced3649c..0000000000 --- a/app/core/gimpdatafiles.h +++ /dev/null @@ -1,53 +0,0 @@ -/* The GIMP -- an image manipulation program - * Copyright (C) 1995 Spencer Kimball and Peter Mattis - * - * Datafiles module copyight (C) 1996 Federico Mena Quintero - * federico@nuclecu.unam.mx - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef __GIMP_DATAFILES_H__ -#define __GIMP_DATAFILES_H__ - -#include - - -typedef enum -{ - MODE_EXECUTABLE = 1 << 0, - TYPE_DIRECTORY = 1 << 1 -} GimpDataFileFlags; - - -gboolean gimp_datafiles_check_extension (const gchar *filename, - const gchar *extension); - -void gimp_datafiles_read_directories (const gchar *path_str, - GimpDataFileFlags flags, - GimpDataFileLoaderFunc loader_func, - gpointer loader_data); - -/* Return the current datafiles access, modification - * or change time. The current datafile is the one for - * which the "DataFileLoaderFunc" function has been called - * on. - */ -time_t gimp_datafile_atime (void); -time_t gimp_datafile_mtime (void); -time_t gimp_datafile_ctime (void); - - -#endif /* __GIMP_DATAFILES_H__ */ diff --git a/app/core/gimplist.c b/app/core/gimplist.c index 0fee97e1e4..f4933fdff7 100644 --- a/app/core/gimplist.c +++ b/app/core/gimplist.c @@ -131,7 +131,7 @@ gimp_list_dispose (GObject *object) while (list->list) { gimp_container_remove (GIMP_CONTAINER (list), - (GimpObject *) list->list->data); + GIMP_OBJECT (list->list->data)); } G_OBJECT_CLASS (parent_class)->dispose (object); @@ -155,8 +155,7 @@ gimp_list_get_memsize (GimpObject *object) for (list = gimp_list->list; list; list = g_list_next (list)) { - if (GIMP_IS_OBJECT (list->data)) - memsize += gimp_object_get_memsize (GIMP_OBJECT (list->data)); + memsize += gimp_object_get_memsize (GIMP_OBJECT (list->data)); } } @@ -280,7 +279,7 @@ gimp_list_new (GType children_type, { GimpList *list; - g_return_val_if_fail (g_type_is_a (children_type, G_TYPE_OBJECT), NULL); + g_return_val_if_fail (g_type_is_a (children_type, GIMP_TYPE_OBJECT), NULL); g_return_val_if_fail (policy == GIMP_CONTAINER_POLICY_STRONG || policy == GIMP_CONTAINER_POLICY_WEAK, NULL); diff --git a/app/core/gimpmodules.c b/app/core/gimpmodules.c index ed04e94867..0ac62f3d2f 100644 --- a/app/core/gimpmodules.c +++ b/app/core/gimpmodules.c @@ -38,7 +38,6 @@ #include "gimp.h" #include "gimpcoreconfig.h" -#include "gimpdatafiles.h" #include "gimplist.h" #include "gimpmodules.h" @@ -47,37 +46,12 @@ #include "libgimp/gimpintl.h" -#define DUMP_DB 1 - - -static void gimp_modules_module_initialize (const gchar *filename, - gpointer loader_data); - -static GimpModule * gimp_modules_module_find_by_path (Gimp *gimp, - const char *fullpath); - -#ifdef DUMP_DB -static void gimp_modules_dump_module (gpointer data, - gpointer user_data); -#endif - -static gboolean gimp_modules_write_modulerc (Gimp *gimp); - -static void gimp_modules_module_on_disk_func (gpointer data, - gpointer user_data); -static void gimp_modules_module_remove_func (gpointer data, - gpointer user_data); - - void gimp_modules_init (Gimp *gimp) { g_return_if_fail (GIMP_IS_GIMP (gimp)); - gimp->modules = gimp_list_new (GIMP_TYPE_MODULE, - GIMP_CONTAINER_POLICY_STRONG); - gimp_object_set_name (GIMP_OBJECT (gimp->modules), "modules"); - + gimp->module_db = gimp_module_db_new (gimp->be_verbose); gimp->write_modulerc = FALSE; } @@ -86,10 +60,10 @@ gimp_modules_exit (Gimp *gimp) { g_return_if_fail (GIMP_IS_GIMP (gimp)); - if (gimp->modules) + if (gimp->module_db) { - g_object_unref (G_OBJECT (gimp->modules)); - gimp->modules = NULL; + g_object_unref (G_OBJECT (gimp->module_db)); + gimp->module_db = NULL; } } @@ -104,52 +78,11 @@ gimp_modules_load (Gimp *gimp) gimprc_parse_file (filename); g_free (filename); - if (g_module_supported ()) - gimp_datafiles_read_directories (gimp->config->module_path, - 0 /* no flags */, - gimp_modules_module_initialize, - gimp); + gimp_module_db_set_load_inhibit (gimp->module_db, + gimp->config->module_db_load_inhibit); -#ifdef DUMP_DB - gimp_container_foreach (gimp->modules, gimp_modules_dump_module, NULL); -#endif -} - -void -gimp_modules_unload (Gimp *gimp) -{ - g_return_if_fail (GIMP_IS_GIMP (gimp)); - - if (gimp->write_modulerc) - { - if (gimp_modules_write_modulerc (gimp)) - { - gimp->write_modulerc = FALSE; - } - } -} - -void -gimp_modules_refresh (Gimp *gimp) -{ - GList *kill_list = NULL; - - g_return_if_fail (GIMP_IS_GIMP (gimp)); - - /* remove modules we don't have on disk anymore */ - gimp_container_foreach (gimp->modules, - gimp_modules_module_on_disk_func, - &kill_list); - g_list_foreach (kill_list, - gimp_modules_module_remove_func, - gimp); - g_list_free (kill_list); - - /* walk filesystem and add new things we find */ - gimp_datafiles_read_directories (gimp->config->module_path, - 0 /* no flags */, - gimp_modules_module_initialize, - gimp); + gimp_module_db_load (gimp->module_db, + gimp->config->module_path); } static void @@ -166,186 +99,49 @@ add_to_inhibit_string (gpointer data, } } -static gboolean -gimp_modules_write_modulerc (Gimp *gimp) +void +gimp_modules_unload (Gimp *gimp) { - GString *str; - gchar *p; - gchar *filename; - FILE *fp; - gboolean saved = FALSE; + g_return_if_fail (GIMP_IS_GIMP (gimp)); - str = g_string_new (NULL); - gimp_container_foreach (gimp->modules, add_to_inhibit_string, str); - if (str->len > 0) - p = str->str + 1; - else - p = ""; - - filename = gimp_personal_rc_file ("modulerc"); - fp = fopen (filename, "wt"); - g_free (filename); - if (fp) + if (gimp->write_modulerc) { - fprintf (fp, "(module-load-inhibit \"%s\")\n", p); - fclose (fp); - saved = TRUE; - } + GString *str; + gchar *p; + gchar *filename; + FILE *fp; - g_string_free (str, TRUE); + str = g_string_new (NULL); + g_list_foreach (gimp->module_db->modules, add_to_inhibit_string, str); + if (str->len > 0) + p = str->str + 1; + else + p = ""; - return saved; -} + filename = gimp_personal_rc_file ("modulerc"); + fp = fopen (filename, "wt"); + g_free (filename); -/* name must be of the form lib*.so (Unix) or *.dll (Win32) */ -static gboolean -valid_module_name (const gchar *filename) -{ - gchar *basename; - gint len; + if (fp) + { + fprintf (fp, "(module-load-inhibit \"%s\")\n", p); + fclose (fp); - basename = g_path_get_basename (filename); + gimp->write_modulerc = FALSE; + } - len = strlen (basename); - -#if !defined(G_OS_WIN32) && !defined(G_WITH_CYGWIN) && !defined(__EMX__) - if (len < 3 + 1 + 3) - goto no_module; - - if (strncmp (basename, "lib", 3)) - goto no_module; - - if (strcmp (basename + len - 3, ".so")) - goto no_module; -#else - if (len < 1 + 4) - goto no_module; - - if (g_strcasecmp (basename + len - 4, ".dll")) - goto no_module; -#endif - - g_free (basename); - - return TRUE; - - no_module: - g_free (basename); - - return FALSE; -} - -static void -gimp_modules_module_initialize (const gchar *filename, - gpointer loader_data) -{ - GimpModule *module; - Gimp *gimp; - - gimp = GIMP (loader_data); - - if (! valid_module_name (filename)) - return; - - /* don't load if we already know about it */ - if (gimp_modules_module_find_by_path (gimp, filename)) - return; - - module = gimp_module_new (filename, - gimp->config->module_db_load_inhibit, - gimp->be_verbose); - - gimp_container_add (gimp->modules, (GimpObject *) module); -} - -static GimpModule * -gimp_modules_module_find_by_path (Gimp *gimp, - const char *fullpath) -{ - GimpModule *module; - GList *list; - - for (list = GIMP_LIST (gimp->modules)->list; list; list = g_list_next (list)) - { - module = (GimpModule *) list->data; - - if (! strcmp (module->filename, fullpath)) - return module; - } - - return NULL; -} - -#ifdef DUMP_DB -static void -gimp_modules_dump_module (gpointer data, - gpointer user_data) -{ - GimpModule *i = data; - - g_print ("\n%s: %i\n", - i->filename, - i->state /* statename[i->state] */); - - g_print (" module:%p lasterr:%s query:%p register:%p\n", - i->module, - i->last_module_error ? i->last_module_error : "NONE", - i->query_module, - i->register_module); - - if (i->info) - { - g_print (" purpose: %s\n" - " author: %s\n" - " version: %s\n" - " copyright: %s\n" - " date: %s\n", - i->info->purpose ? i->info->purpose : "NONE", - i->info->author ? i->info->author : "NONE", - i->info->version ? i->info->version : "NONE", - i->info->copyright ? i->info->copyright : "NONE", - i->info->date ? i->info->date : "NONE"); + g_string_free (str, TRUE); } } -#endif -static void -gimp_modules_module_on_disk_func (gpointer data, - gpointer user_data) +void +gimp_modules_refresh (Gimp *gimp) { - GimpModule *module; - GList **kill_list; - gint old_on_disk; + g_return_if_fail (GIMP_IS_GIMP (gimp)); - module = (GimpModule *) data; - kill_list = (GList **) user_data; + gimp_module_db_set_load_inhibit (gimp->module_db, + gimp->config->module_db_load_inhibit); - old_on_disk = module->on_disk; - - module->on_disk = g_file_test (module->filename, G_FILE_TEST_IS_REGULAR); - - /* if it's not on the disk, and it isn't in memory, mark it to be - * removed later. - */ - if (! module->on_disk && ! module->module) - { - *kill_list = g_list_append (*kill_list, module); - module = NULL; - } - - if (module && module->on_disk != old_on_disk) - gimp_module_modified (module); -} - -static void -gimp_modules_module_remove_func (gpointer data, - gpointer user_data) -{ - GimpModule *module; - Gimp *gimp; - - module = (GimpModule *) data; - gimp = (Gimp *) user_data; - - gimp_container_remove (gimp->modules, (GimpObject *) module); + gimp_module_db_refresh (gimp->module_db, + gimp->config->module_path); } diff --git a/app/core/gimpobject.c b/app/core/gimpobject.c index 3ce5fbeec6..249edc40a9 100644 --- a/app/core/gimpobject.c +++ b/app/core/gimpobject.c @@ -314,18 +314,28 @@ gimp_object_get_memsize (GimpObject *object) return GIMP_OBJECT_GET_CLASS (object)->get_memsize (object); } -static gsize -gimp_object_real_get_memsize (GimpObject *object) +gsize +gimp_g_object_get_memsize (GObject *object) { GTypeQuery type_query; gsize memsize = 0; + g_return_val_if_fail (G_IS_OBJECT (object), 0); + g_type_query (G_TYPE_FROM_INSTANCE (object), &type_query); memsize += type_query.instance_size; + return memsize; +} + +static gsize +gimp_object_real_get_memsize (GimpObject *object) +{ + gsize memsize = 0; + if (object->name) memsize += strlen (object->name) + 1; - return memsize; + return memsize + gimp_g_object_get_memsize ((GObject *) object); } diff --git a/app/core/gimpobject.h b/app/core/gimpobject.h index 8da4c81e1b..cf02d88414 100644 --- a/app/core/gimpobject.h +++ b/app/core/gimpobject.h @@ -50,14 +50,15 @@ struct _GimpObjectClass }; -GType gimp_object_get_type (void) G_GNUC_CONST; +GType gimp_object_get_type (void) G_GNUC_CONST; -void gimp_object_set_name (GimpObject *object, - const gchar *name); -const gchar * gimp_object_get_name (const GimpObject *object); -void gimp_object_name_changed (GimpObject *object); +void gimp_object_set_name (GimpObject *object, + const gchar *name); +const gchar * gimp_object_get_name (const GimpObject *object); +void gimp_object_name_changed (GimpObject *object); -gsize gimp_object_get_memsize (GimpObject *object); +gsize gimp_object_get_memsize (GimpObject *object); +gsize gimp_g_object_get_memsize (GObject *object); #endif /* __GIMP_OBJECT_H__ */ diff --git a/app/dialogs/module-dialog.c b/app/dialogs/module-dialog.c index 2fb27904c7..a01bf96de0 100644 --- a/app/dialogs/module-dialog.c +++ b/app/dialogs/module-dialog.c @@ -30,19 +30,21 @@ #include "gui-types.h" #include "core/gimp.h" -#include "core/gimpcontainer.h" #include "core/gimpmodules.h" +#include "widgets/gimpviewabledialog.h" + #include "module-browser.h" #include "libgimp/gimpintl.h" -#define NUM_INFO_LINES 8 +#define NUM_INFO_LINES 9 enum { PATH_COLUMN, + AUTO_COLUMN, MODULE_COLUMN, NUM_COLUMNS }; @@ -57,7 +59,6 @@ struct _ModuleBrowser GimpModule *last_update; GtkWidget *button; GtkListStore *list; - GtkWidget *load_inhibit_check; GQuark modules_handler_id; Gimp *gimp; @@ -66,30 +67,32 @@ struct _ModuleBrowser /* local function prototypes */ -static void browser_popdown_callback (GtkWidget *widget, - gpointer data); -static void browser_destroy_callback (GtkWidget *widget, - ModuleBrowser *browser); -static void browser_load_inhibit_callback (GtkWidget *widget, - ModuleBrowser *browser); -static void browser_select_callback (GtkTreeSelection *sel, - ModuleBrowser *browser); -static void browser_load_unload_callback (GtkWidget *widget, - ModuleBrowser *browser); -static void browser_refresh_callback (GtkWidget *widget, - ModuleBrowser *browser); -static void make_list_item (gpointer data, - gpointer user_data); -static void browser_info_add (GimpContainer *container, - GimpModule *module, - ModuleBrowser *browser); -static void browser_info_remove (GimpContainer *container, - GimpModule *module, - ModuleBrowser *browser); -static void browser_info_update (GimpModule *module, - ModuleBrowser *browser); -static void browser_info_init (ModuleBrowser *browser, - GtkWidget *table); +static void browser_popdown_callback (GtkWidget *widget, + gpointer data); +static void browser_destroy_callback (GtkWidget *widget, + ModuleBrowser *browser); +static void browser_select_callback (GtkTreeSelection *sel, + ModuleBrowser *browser); +static void browser_autoload_toggled (GtkCellRendererToggle *celltoggle, + gchar *path_string, + ModuleBrowser *browser); +static void browser_load_unload_callback (GtkWidget *widget, + ModuleBrowser *browser); +static void browser_refresh_callback (GtkWidget *widget, + ModuleBrowser *browser); +static void make_list_item (gpointer data, + gpointer user_data); +static void browser_info_add (GimpModuleDB *db, + GimpModule *module, + ModuleBrowser *browser); +static void browser_info_remove (GimpModuleDB *db, + GimpModule *module, + ModuleBrowser *browser); +static void browser_info_update (GimpModuleDB *db, + GimpModule *module, + ModuleBrowser *browser); +static void browser_info_init (ModuleBrowser *browser, + GtkWidget *table); /* public functions */ @@ -97,31 +100,40 @@ static void browser_info_init (ModuleBrowser *browser, GtkWidget * module_browser_new (Gimp *gimp) { - GtkWidget *shell; - GtkWidget *hbox; - GtkWidget *vbox; - GtkWidget *listbox; - GtkWidget *button; - GtkWidget *tv; - ModuleBrowser *browser; - GtkTreeSelection *sel; - GtkTreeIter iter; + GtkWidget *shell; + GtkWidget *hbox; + GtkWidget *vbox; + GtkWidget *listbox; + GtkWidget *tv; + ModuleBrowser *browser; + GtkTreeSelection *sel; + GtkTreeIter iter; + GtkTreeViewColumn *col; + GtkCellRenderer *rend; g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); - shell = gimp_dialog_new (_("Module DB"), "module_db_dialog", - gimp_standard_help_func, - "dialogs/module_browser.html", - GTK_WIN_POS_NONE, - FALSE, TRUE, FALSE, + browser = g_new0 (ModuleBrowser, 1); - GTK_STOCK_CLOSE, browser_popdown_callback, - NULL, NULL, NULL, TRUE, TRUE, + browser->gimp = gimp; - NULL); + shell = gimp_viewable_dialog_new (NULL, + _("Module Browser"), "module_db_dialog", + GTK_STOCK_EXECUTE, + _("Browse & Manage Loadable Modules"), + gimp_standard_help_func, + "dialogs/module_browser.html", - vbox = gtk_vbox_new (FALSE, 5); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); + GTK_STOCK_REFRESH, browser_refresh_callback, + browser, NULL, NULL, FALSE, FALSE, + + GTK_STOCK_CLOSE, browser_popdown_callback, + NULL, NULL, NULL, TRUE, TRUE, + + NULL); + + vbox = gtk_vbox_new (FALSE, 6); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); gtk_container_add (GTK_CONTAINER (GTK_DIALOG (shell)->vbox), vbox); gtk_widget_show (vbox); @@ -135,45 +147,47 @@ module_browser_new (Gimp *gimp) gtk_widget_set_size_request (listbox, 125, 100); gtk_widget_show (listbox); - browser = g_new0 (ModuleBrowser, 1); - - browser->gimp = gimp; - browser->list = gtk_list_store_new (NUM_COLUMNS, - G_TYPE_STRING, G_TYPE_POINTER); + G_TYPE_STRING, G_TYPE_BOOLEAN, + G_TYPE_POINTER); tv = gtk_tree_view_new_with_model (GTK_TREE_MODEL (browser->list)); g_object_unref (browser->list); - gimp_container_foreach (gimp->modules, make_list_item, browser); + g_list_foreach (gimp->module_db->modules, make_list_item, browser); - gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tv), - -1, NULL, - gtk_cell_renderer_text_new (), - "text", PATH_COLUMN, - NULL); + rend = gtk_cell_renderer_toggle_new (); - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tv), FALSE); + g_signal_connect (G_OBJECT (rend), "toggled", + G_CALLBACK (browser_autoload_toggled), + browser); + + col = gtk_tree_view_column_new (); + gtk_tree_view_column_set_title (col, _("Autoload")); + gtk_tree_view_column_pack_start (col, rend, FALSE); + gtk_tree_view_column_add_attribute (col, rend, "active", AUTO_COLUMN); + + gtk_tree_view_append_column (GTK_TREE_VIEW (tv), col); + + rend = gtk_cell_renderer_text_new (); + col = gtk_tree_view_column_new_with_attributes (_("Module Path"), rend, + "text", PATH_COLUMN, + NULL); + + gtk_tree_view_append_column (GTK_TREE_VIEW (tv), col); gtk_container_add (GTK_CONTAINER (listbox), tv); gtk_widget_show (tv); - browser->table = gtk_table_new (5, NUM_INFO_LINES + 1, FALSE); + browser->table = gtk_table_new (2, NUM_INFO_LINES, FALSE); gtk_table_set_col_spacings (GTK_TABLE (browser->table), 4); gtk_box_pack_start (GTK_BOX (vbox), browser->table, FALSE, FALSE, 0); gtk_widget_show (browser->table); hbox = gtk_hbutton_box_new (); gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_SPREAD); - gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, FALSE, 5); + gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, FALSE, 0); gtk_widget_show (hbox); - button = gtk_button_new_with_label (_("Refresh")); - gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); - gtk_widget_show (button); - - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK (browser_refresh_callback), - browser); browser->button = gtk_button_new_with_label (""); browser->button_label = gtk_bin_get_child (GTK_BIN (browser->button)); @@ -185,7 +199,8 @@ module_browser_new (Gimp *gimp) browser); browser_info_init (browser, browser->table); - browser_info_update (browser->last_update, browser); + + browser_info_update (gimp->module_db, browser->last_update, browser); sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (tv)); @@ -196,20 +211,18 @@ module_browser_new (Gimp *gimp) if (gtk_tree_model_get_iter_root (GTK_TREE_MODEL (browser->list), &iter)) gtk_tree_selection_select_iter (sel, &iter); - /* hook the GimpContainer signals so we can refresh the display + /* hook the GimpModuleDB signals so we can refresh the display * appropriately. */ - browser->modules_handler_id = - gimp_container_add_handler (gimp->modules, "modified", - G_CALLBACK (browser_info_update), - browser); - - g_signal_connect (G_OBJECT (gimp->modules), "add", + g_signal_connect (G_OBJECT (gimp->module_db), "add", G_CALLBACK (browser_info_add), browser); - g_signal_connect (G_OBJECT (gimp->modules), "remove", + g_signal_connect (G_OBJECT (gimp->module_db), "remove", G_CALLBACK (browser_info_remove), browser); + g_signal_connect (G_OBJECT (gimp->module_db), "module_modified", + G_CALLBACK (browser_info_update), + browser); g_signal_connect (G_OBJECT (shell), "destroy", G_CALLBACK (browser_destroy_callback), @@ -232,36 +245,19 @@ static void browser_destroy_callback (GtkWidget *widget, ModuleBrowser *browser) { - g_signal_handlers_disconnect_by_func (G_OBJECT (browser->gimp->modules), + g_signal_handlers_disconnect_by_func (G_OBJECT (browser->gimp->module_db), browser_info_add, browser); - g_signal_handlers_disconnect_by_func (G_OBJECT (browser->gimp->modules), + g_signal_handlers_disconnect_by_func (G_OBJECT (browser->gimp->module_db), browser_info_remove, browser); - gimp_container_remove_handler (browser->gimp->modules, - browser->modules_handler_id); + g_signal_handlers_disconnect_by_func (G_OBJECT (browser->gimp->module_db), + browser_info_update, + browser); + g_free (browser); } -static void -browser_load_inhibit_callback (GtkWidget *widget, - ModuleBrowser *browser) -{ - gboolean new_value; - - g_return_if_fail (browser->last_update != NULL); - - new_value = ! GTK_TOGGLE_BUTTON (widget)->active; - - if (new_value == browser->last_update->load_inhibit) - return; - - browser->last_update->load_inhibit = new_value; - gimp_module_modified (browser->last_update); - - browser->gimp->write_modulerc = TRUE; -} - static void browser_select_callback (GtkTreeSelection *sel, ModuleBrowser *browser) @@ -278,7 +274,42 @@ browser_select_callback (GtkTreeSelection *sel, browser->last_update = module; - browser_info_update (browser->last_update, browser); + browser_info_update (browser->gimp->module_db, browser->last_update, browser); +} + +static void +browser_autoload_toggled (GtkCellRendererToggle *celltoggle, + gchar *path_string, + ModuleBrowser *browser) +{ + GtkTreePath *path; + GtkTreeIter iter; + gboolean active = FALSE; + GimpModule *module = NULL; + + path = gtk_tree_path_new_from_string (path_string); + if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (browser->list), &iter, path)) + { + g_warning ("%s: bad tree path?", G_STRLOC); + return; + } + gtk_tree_path_free (path); + + gtk_tree_model_get (GTK_TREE_MODEL (browser->list), &iter, + AUTO_COLUMN, &active, + MODULE_COLUMN, &module, + -1); + + if (module) + { + gimp_module_set_load_inhibit (module, active); + + browser->gimp->write_modulerc = TRUE; + + gtk_list_store_set (GTK_LIST_STORE (browser->list), &iter, + AUTO_COLUMN, ! active, + -1); + } } static void @@ -287,8 +318,15 @@ browser_load_unload_callback (GtkWidget *widget, { if (browser->last_update->state != GIMP_MODULE_STATE_LOADED_OK) { - if (g_type_module_use (G_TYPE_MODULE (browser->last_update))) - g_type_module_unuse (G_TYPE_MODULE (browser->last_update)); + if (browser->last_update->info) + { + if (g_type_module_use (G_TYPE_MODULE (browser->last_update))) + g_type_module_unuse (G_TYPE_MODULE (browser->last_update)); + } + else + { + gimp_module_query_module (browser->last_update); + } } gimp_module_modified (browser->last_update); @@ -315,20 +353,21 @@ make_list_item (gpointer data, gtk_list_store_append (browser->list, &iter); gtk_list_store_set (browser->list, &iter, PATH_COLUMN, module->filename, + AUTO_COLUMN, ! module->load_inhibit, MODULE_COLUMN, module, -1); } static void -browser_info_add (GimpContainer *container, - GimpModule *module, - ModuleBrowser *browser) +browser_info_add (GimpModuleDB *db, + GimpModule *module, + ModuleBrowser*browser) { make_list_item (module, browser); } static void -browser_info_remove (GimpContainer *container, +browser_info_remove (GimpModuleDB *db, GimpModule *mod, ModuleBrowser *browser) { @@ -359,19 +398,15 @@ browser_info_remove (GimpContainer *container, } static void -browser_info_update (GimpModule *module, +browser_info_update (GimpModuleDB *db, + GimpModule *module, ModuleBrowser *browser) { + GTypeModule *g_type_module; const gchar *text[NUM_INFO_LINES]; gint i; - static const gchar * const statename[] = - { - N_("Module error"), - N_("Loaded OK"), - N_("Load failed"), - N_("Unloaded OK") - }; + g_type_module = G_TYPE_MODULE (module); /* only update the info if we're actually showing it */ if (module != browser->last_update) @@ -383,7 +418,6 @@ browser_info_update (GimpModule *module, gtk_label_set_text (GTK_LABEL (browser->label[i]), ""); gtk_label_set_text (GTK_LABEL (browser->button_label), _("")); gtk_widget_set_sensitive (GTK_WIDGET (browser->button), FALSE); - gtk_widget_set_sensitive (GTK_WIDGET (browser->load_inhibit_check), FALSE); return; } @@ -406,19 +440,31 @@ browser_info_update (GimpModule *module, text[5] = module->on_disk ? _("On disk") : _("No longer available"); } - text[6] = gettext (statename[module->state]); + text[6] = gimp_module_state_name (module->state); if (module->state == GIMP_MODULE_STATE_ERROR && module->last_module_error) text[7] = module->last_module_error; else text[7] = "--"; - for (i = 0; i < NUM_INFO_LINES; i++) - gtk_label_set_text (GTK_LABEL (browser->label[i]), gettext (text[i])); + if (g_type_module->type_infos || g_type_module->interface_infos) + { + gchar *str; - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (browser->load_inhibit_check), - ! module->load_inhibit); - gtk_widget_set_sensitive (GTK_WIDGET (browser->load_inhibit_check), TRUE); + str = g_strdup_printf ("%d Types, %d Interfaces", + g_slist_length (g_type_module->type_infos), + g_slist_length (g_type_module->interface_infos)); + gtk_label_set_text (GTK_LABEL (browser->label[NUM_INFO_LINES - 1]), str); + g_free (str); + } + else + { + gtk_label_set_text (GTK_LABEL (browser->label[NUM_INFO_LINES - 1]), + "---"); + } + + for (i = 0; i < NUM_INFO_LINES - 1; i++) + gtk_label_set_text (GTK_LABEL (browser->label[i]), gettext (text[i])); /* work out what the button should do (if anything) */ switch (module->state) @@ -426,8 +472,13 @@ browser_info_update (GimpModule *module, case GIMP_MODULE_STATE_ERROR: case GIMP_MODULE_STATE_LOAD_FAILED: case GIMP_MODULE_STATE_UNLOADED_OK: - gtk_label_set_text (GTK_LABEL (browser->button_label), _("Load")); - gtk_widget_set_sensitive (GTK_WIDGET (browser->button), module->on_disk); + if (module->info) + gtk_label_set_text (GTK_LABEL (browser->button_label), _("Load")); + else + gtk_label_set_text (GTK_LABEL (browser->button_label), _("Query")); + + gtk_widget_set_sensitive (GTK_WIDGET (browser->button), + module->on_disk); break; case GIMP_MODULE_STATE_LOADED_OK: @@ -444,7 +495,7 @@ browser_info_init (ModuleBrowser *browser, GtkWidget *label; gint i; - static const gchar *text[] = + static const gchar * const text[] = { N_("Purpose:"), N_("Author:"), @@ -453,7 +504,8 @@ browser_info_init (ModuleBrowser *browser, N_("Date:"), N_("Location:"), N_("State:"), - N_("Last Error:") + N_("Last Error:"), + N_("Available Types:") }; for (i = 0; i < G_N_ELEMENTS (text); i++) @@ -471,15 +523,4 @@ browser_info_init (ModuleBrowser *browser, GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 2); gtk_widget_show (browser->label[i]); } - - browser->load_inhibit_check = - gtk_check_button_new_with_label (_("Autoload during start-up")); - gtk_table_attach (GTK_TABLE (table), browser->load_inhibit_check, - 0, 2, i, i + 1, - GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 2); - gtk_widget_show (browser->load_inhibit_check); - - g_signal_connect (G_OBJECT (browser->load_inhibit_check), "toggled", - G_CALLBACK (browser_load_inhibit_callback), - browser); } diff --git a/app/display/gimpdisplayshell-filter-dialog.c b/app/display/gimpdisplayshell-filter-dialog.c index 335963f3dc..c4831bb709 100644 --- a/app/display/gimpdisplayshell-filter-dialog.c +++ b/app/display/gimpdisplayshell-filter-dialog.c @@ -40,11 +40,11 @@ #define LIST_WIDTH 150 #define LIST_HEIGHT 100 -#define UPDATE_DISPLAY(shell) G_STMT_START \ -{ \ - gimp_display_shell_expose_full (shell); \ - gimp_display_shell_flush (shell); \ -} G_STMT_END +#define UPDATE_DISPLAY(cdd) G_STMT_START \ +{ \ + gimp_display_shell_expose_full ((cdd)->shell); \ + gimp_display_shell_flush ((cdd)->shell); \ +} G_STMT_END typedef struct _ColorDisplayDialog ColorDisplayDialog; @@ -61,16 +61,22 @@ struct _ColorDisplayDialog GtkTreeSelection *src_sel; GtkTreeSelection *dest_sel; + GimpColorDisplay *selected; + gboolean modified; GList *old_nodes; - GList *conf_nodes; GtkWidget *add_button; GtkWidget *remove_button; GtkWidget *up_button; GtkWidget *down_button; - GtkWidget *configure_button; + + GtkWidget *config_frame; + GtkWidget *config_box; + GtkWidget *config_widget; + + GtkWidget *reset_button; }; @@ -88,8 +94,6 @@ static void color_display_up_callback (GtkWidget *widget, ColorDisplayDialog *cdd); static void color_display_down_callback (GtkWidget *widget, ColorDisplayDialog *cdd); -static void color_display_configure_callback (GtkWidget *widget, - ColorDisplayDialog *cdd); static void dest_list_populate (GList *node_list, GtkTreeStore *dest); @@ -99,12 +103,18 @@ static void src_selection_changed (GtkTreeSelection *sel, static void dest_selection_changed (GtkTreeSelection *sel, ColorDisplayDialog *cdd); +static void selected_filter_changed (GimpColorDisplay *filter, + ColorDisplayDialog *cdd); +static void selected_filter_reset (GtkWidget *widget, + ColorDisplayDialog *cdd); + static void color_display_update_up_and_down (ColorDisplayDialog *cdd); static void make_dialog (ColorDisplayDialog *cdd) { + GtkWidget *main_vbox; GtkWidget *hbox; GtkWidget *editor; GtkWidget *scrolled_win; @@ -126,11 +136,15 @@ make_dialog (ColorDisplayDialog *cdd) NULL); - hbox = gtk_hbox_new (FALSE, 6); - gtk_container_set_border_width (GTK_CONTAINER (hbox), 6); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (cdd->dialog)->vbox), hbox, + main_vbox = gtk_vbox_new (FALSE, 6); + gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 6); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (cdd->dialog)->vbox), main_vbox, TRUE, TRUE, 0); + hbox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (main_vbox), hbox, TRUE, TRUE, 0); + gtk_widget_show (hbox); + scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), GTK_SHADOW_IN); @@ -220,18 +234,8 @@ make_dialog (ColorDisplayDialog *cdd) NULL, cdd); - cdd->configure_button = - gimp_editor_add_button (GIMP_EDITOR (editor), - GIMP_STOCK_EDIT, - _("Configure the selected filter"), - NULL, - G_CALLBACK (color_display_configure_callback), - NULL, - cdd); - gtk_widget_set_sensitive (cdd->up_button, FALSE); gtk_widget_set_sensitive (cdd->down_button, FALSE); - gtk_widget_set_sensitive (cdd->configure_button, FALSE); scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), @@ -262,7 +266,36 @@ make_dialog (ColorDisplayDialog *cdd) G_CALLBACK (dest_selection_changed), cdd); + /* the config frame */ + + cdd->config_frame = gtk_frame_new (NULL); + gtk_box_pack_start (GTK_BOX (main_vbox), cdd->config_frame, FALSE, FALSE, 0); + gtk_widget_show (cdd->config_frame); + + cdd->config_box = gtk_vbox_new (FALSE, 4); + gtk_container_set_border_width (GTK_CONTAINER (cdd->config_box), 4); + gtk_container_add (GTK_CONTAINER (cdd->config_frame), cdd->config_box); + gtk_widget_show (cdd->config_box); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_end (GTK_BOX (cdd->config_box), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); + + cdd->reset_button = gtk_button_new_from_stock (GIMP_STOCK_RESET); + gtk_box_pack_end (GTK_BOX (hbox), cdd->reset_button, FALSE, FALSE, 0); + gtk_widget_show (cdd->reset_button); + + gimp_help_set_help_data (cdd->reset_button, + _("Reset the selected filter to default values"), + NULL); + + g_signal_connect (G_OBJECT (cdd->reset_button), "clicked", + G_CALLBACK (selected_filter_reset), + cdd); + + dest_selection_changed (cdd->dest_sel, cdd); + + gtk_widget_show (main_vbox); } static void @@ -284,7 +317,7 @@ color_display_ok_callback (GtkWidget *widget, g_list_free (cdd->old_nodes); - UPDATE_DISPLAY (cdd->shell); + UPDATE_DISPLAY (cdd); } } @@ -313,7 +346,7 @@ color_display_cancel_callback (GtkWidget *widget, list = next; } - UPDATE_DISPLAY (cdd->shell); + UPDATE_DISPLAY (cdd); } } @@ -373,7 +406,7 @@ color_display_add_callback (GtkWidget *widget, color_display_update_up_and_down (cdd); - UPDATE_DISPLAY (cdd->shell); + UPDATE_DISPLAY (cdd); } } @@ -406,7 +439,7 @@ color_display_remove_callback (GtkWidget *widget, color_display_update_up_and_down (cdd); - UPDATE_DISPLAY (cdd->shell); + UPDATE_DISPLAY (cdd); } } @@ -447,7 +480,7 @@ color_display_up_callback (GtkWidget *widget, gtk_tree_selection_select_iter (cdd->dest_sel, &iter2); - UPDATE_DISPLAY (cdd->shell); + UPDATE_DISPLAY (cdd); } } @@ -488,36 +521,7 @@ color_display_down_callback (GtkWidget *widget, gtk_tree_selection_select_iter (cdd->dest_sel, &iter2); - UPDATE_DISPLAY (cdd->shell); - } -} - -static void -color_display_configure_callback (GtkWidget *widget, - ColorDisplayDialog *cdd) -{ - GtkTreeModel *model; - GtkTreeIter iter; - - if (gtk_tree_selection_get_selected (cdd->dest_sel, &model, &iter)) - { - GimpColorDisplay *filter; - GValue val = { 0, }; - - gtk_tree_model_get_value (model, &iter, 1, &val); - - filter = g_value_get_pointer (&val); - - g_value_unset (&val); - - if (! g_list_find (cdd->conf_nodes, filter)) - cdd->conf_nodes = g_list_append (cdd->conf_nodes, filter); - - gimp_color_display_configure (filter, NULL, NULL, NULL, NULL); - - cdd->modified = TRUE; - - UPDATE_DISPLAY (cdd->shell); + UPDATE_DISPLAY (cdd); } } @@ -614,6 +618,16 @@ dest_selection_changed (GtkTreeSelection *sel, GtkTreeIter iter; GimpColorDisplay *filter = NULL; + if (cdd->selected) + { + g_signal_handlers_disconnect_by_func (G_OBJECT (cdd->selected), + selected_filter_changed, + cdd); + g_object_remove_weak_pointer (G_OBJECT (cdd->selected), + (gpointer) &cdd->selected); + cdd->selected = NULL; + } + if (gtk_tree_selection_get_selected (sel, &model, &iter)) { GValue val = { 0, }; @@ -625,8 +639,63 @@ dest_selection_changed (GtkTreeSelection *sel, g_value_unset (&val); } - gtk_widget_set_sensitive (cdd->remove_button, (filter != NULL)); - gtk_widget_set_sensitive (cdd->configure_button, (filter != NULL)); + gtk_widget_set_sensitive (cdd->remove_button, (filter != NULL)); + gtk_widget_set_sensitive (cdd->reset_button, (filter != NULL)); + + if (cdd->config_widget) + gtk_container_remove (GTK_CONTAINER (cdd->config_box), cdd->config_widget); + + if (filter) + { + gchar *str; + + cdd->selected = filter; + + g_object_add_weak_pointer (G_OBJECT (filter), (gpointer) &cdd->selected); + g_signal_connect (G_OBJECT (cdd->selected), "changed", + G_CALLBACK (selected_filter_changed), + cdd); + + cdd->config_widget = gimp_color_display_configure (filter); + + str = g_strdup_printf (_("Configure Selected Filter: %s"), + GIMP_COLOR_DISPLAY_GET_CLASS (filter)->name); + gtk_frame_set_label (GTK_FRAME (cdd->config_frame), str); + g_free (str); + } + else + { + cdd->config_widget = gtk_label_new (_("No Filter Selected")); + gtk_widget_set_sensitive (cdd->config_widget, FALSE); + + gtk_frame_set_label (GTK_FRAME (cdd->config_frame), + _("Configure Selected Filter")); + } + + if (cdd->config_widget) + { + gtk_box_pack_start (GTK_BOX (cdd->config_box), cdd->config_widget, + FALSE, FALSE, 0); + gtk_widget_show (cdd->config_widget); + + g_object_add_weak_pointer (G_OBJECT (cdd->config_widget), + (gpointer) &cdd->config_widget); + } color_display_update_up_and_down (cdd); } + +static void +selected_filter_changed (GimpColorDisplay *filter, + ColorDisplayDialog *cdd) +{ + UPDATE_DISPLAY (cdd); +} + +static void +selected_filter_reset (GtkWidget *widget, + ColorDisplayDialog *cdd) +{ + if (cdd->selected) + gimp_color_display_configure_reset (cdd->selected); +} diff --git a/app/gui/gui.c b/app/gui/gui.c index 50f3dfa597..3e3cde931d 100644 --- a/app/gui/gui.c +++ b/app/gui/gui.c @@ -31,7 +31,6 @@ #include "core/gimp.h" #include "core/gimpcontainer.h" #include "core/gimpcontext.h" -#include "core/gimpdatafiles.h" #include "core/gimpimage.h" #include "display/gimpdisplay.h" @@ -72,8 +71,7 @@ static void gui_message (Gimp *gimp, static GimpObject * gui_display_new (GimpImage *gimage, guint scale); -static void gui_themes_dir_foreach_func (const gchar *filename, - gpointer loader_data); +static void gui_themes_dir_foreach_func (GimpDatafileData *file_data); static gint gui_rotate_the_shield_harmonics (GtkWidget *widget, GdkEvent *eevent, gpointer data); @@ -136,7 +134,7 @@ gui_themes_init (Gimp *gimp) if (gimprc.theme_path) { gimp_datafiles_read_directories (gimprc.theme_path, - TYPE_DIRECTORY, + G_FILE_TEST_IS_DIR, gui_themes_dir_foreach_func, gimp); } @@ -463,22 +461,21 @@ gui_display_new (GimpImage *gimage, } static void -gui_themes_dir_foreach_func (const gchar *filename, - gpointer loader_data) +gui_themes_dir_foreach_func (GimpDatafileData *file_data) { Gimp *gimp; gchar *basename; - gimp = (Gimp *) loader_data; + gimp = (Gimp *) file_data->user_data; - basename = g_path_get_basename (filename); + basename = g_path_get_basename (file_data->filename); if (gimp->be_verbose) - g_print (_("Adding theme '%s' (%s)\n"), basename, filename); + g_print (_("Adding theme '%s' (%s)\n"), basename, file_data->filename); g_hash_table_insert (themes_hash, basename, - g_strdup (filename)); + g_strdup (file_data->filename)); } static gint diff --git a/app/gui/module-browser.c b/app/gui/module-browser.c index 2fb27904c7..a01bf96de0 100644 --- a/app/gui/module-browser.c +++ b/app/gui/module-browser.c @@ -30,19 +30,21 @@ #include "gui-types.h" #include "core/gimp.h" -#include "core/gimpcontainer.h" #include "core/gimpmodules.h" +#include "widgets/gimpviewabledialog.h" + #include "module-browser.h" #include "libgimp/gimpintl.h" -#define NUM_INFO_LINES 8 +#define NUM_INFO_LINES 9 enum { PATH_COLUMN, + AUTO_COLUMN, MODULE_COLUMN, NUM_COLUMNS }; @@ -57,7 +59,6 @@ struct _ModuleBrowser GimpModule *last_update; GtkWidget *button; GtkListStore *list; - GtkWidget *load_inhibit_check; GQuark modules_handler_id; Gimp *gimp; @@ -66,30 +67,32 @@ struct _ModuleBrowser /* local function prototypes */ -static void browser_popdown_callback (GtkWidget *widget, - gpointer data); -static void browser_destroy_callback (GtkWidget *widget, - ModuleBrowser *browser); -static void browser_load_inhibit_callback (GtkWidget *widget, - ModuleBrowser *browser); -static void browser_select_callback (GtkTreeSelection *sel, - ModuleBrowser *browser); -static void browser_load_unload_callback (GtkWidget *widget, - ModuleBrowser *browser); -static void browser_refresh_callback (GtkWidget *widget, - ModuleBrowser *browser); -static void make_list_item (gpointer data, - gpointer user_data); -static void browser_info_add (GimpContainer *container, - GimpModule *module, - ModuleBrowser *browser); -static void browser_info_remove (GimpContainer *container, - GimpModule *module, - ModuleBrowser *browser); -static void browser_info_update (GimpModule *module, - ModuleBrowser *browser); -static void browser_info_init (ModuleBrowser *browser, - GtkWidget *table); +static void browser_popdown_callback (GtkWidget *widget, + gpointer data); +static void browser_destroy_callback (GtkWidget *widget, + ModuleBrowser *browser); +static void browser_select_callback (GtkTreeSelection *sel, + ModuleBrowser *browser); +static void browser_autoload_toggled (GtkCellRendererToggle *celltoggle, + gchar *path_string, + ModuleBrowser *browser); +static void browser_load_unload_callback (GtkWidget *widget, + ModuleBrowser *browser); +static void browser_refresh_callback (GtkWidget *widget, + ModuleBrowser *browser); +static void make_list_item (gpointer data, + gpointer user_data); +static void browser_info_add (GimpModuleDB *db, + GimpModule *module, + ModuleBrowser *browser); +static void browser_info_remove (GimpModuleDB *db, + GimpModule *module, + ModuleBrowser *browser); +static void browser_info_update (GimpModuleDB *db, + GimpModule *module, + ModuleBrowser *browser); +static void browser_info_init (ModuleBrowser *browser, + GtkWidget *table); /* public functions */ @@ -97,31 +100,40 @@ static void browser_info_init (ModuleBrowser *browser, GtkWidget * module_browser_new (Gimp *gimp) { - GtkWidget *shell; - GtkWidget *hbox; - GtkWidget *vbox; - GtkWidget *listbox; - GtkWidget *button; - GtkWidget *tv; - ModuleBrowser *browser; - GtkTreeSelection *sel; - GtkTreeIter iter; + GtkWidget *shell; + GtkWidget *hbox; + GtkWidget *vbox; + GtkWidget *listbox; + GtkWidget *tv; + ModuleBrowser *browser; + GtkTreeSelection *sel; + GtkTreeIter iter; + GtkTreeViewColumn *col; + GtkCellRenderer *rend; g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); - shell = gimp_dialog_new (_("Module DB"), "module_db_dialog", - gimp_standard_help_func, - "dialogs/module_browser.html", - GTK_WIN_POS_NONE, - FALSE, TRUE, FALSE, + browser = g_new0 (ModuleBrowser, 1); - GTK_STOCK_CLOSE, browser_popdown_callback, - NULL, NULL, NULL, TRUE, TRUE, + browser->gimp = gimp; - NULL); + shell = gimp_viewable_dialog_new (NULL, + _("Module Browser"), "module_db_dialog", + GTK_STOCK_EXECUTE, + _("Browse & Manage Loadable Modules"), + gimp_standard_help_func, + "dialogs/module_browser.html", - vbox = gtk_vbox_new (FALSE, 5); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); + GTK_STOCK_REFRESH, browser_refresh_callback, + browser, NULL, NULL, FALSE, FALSE, + + GTK_STOCK_CLOSE, browser_popdown_callback, + NULL, NULL, NULL, TRUE, TRUE, + + NULL); + + vbox = gtk_vbox_new (FALSE, 6); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); gtk_container_add (GTK_CONTAINER (GTK_DIALOG (shell)->vbox), vbox); gtk_widget_show (vbox); @@ -135,45 +147,47 @@ module_browser_new (Gimp *gimp) gtk_widget_set_size_request (listbox, 125, 100); gtk_widget_show (listbox); - browser = g_new0 (ModuleBrowser, 1); - - browser->gimp = gimp; - browser->list = gtk_list_store_new (NUM_COLUMNS, - G_TYPE_STRING, G_TYPE_POINTER); + G_TYPE_STRING, G_TYPE_BOOLEAN, + G_TYPE_POINTER); tv = gtk_tree_view_new_with_model (GTK_TREE_MODEL (browser->list)); g_object_unref (browser->list); - gimp_container_foreach (gimp->modules, make_list_item, browser); + g_list_foreach (gimp->module_db->modules, make_list_item, browser); - gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tv), - -1, NULL, - gtk_cell_renderer_text_new (), - "text", PATH_COLUMN, - NULL); + rend = gtk_cell_renderer_toggle_new (); - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tv), FALSE); + g_signal_connect (G_OBJECT (rend), "toggled", + G_CALLBACK (browser_autoload_toggled), + browser); + + col = gtk_tree_view_column_new (); + gtk_tree_view_column_set_title (col, _("Autoload")); + gtk_tree_view_column_pack_start (col, rend, FALSE); + gtk_tree_view_column_add_attribute (col, rend, "active", AUTO_COLUMN); + + gtk_tree_view_append_column (GTK_TREE_VIEW (tv), col); + + rend = gtk_cell_renderer_text_new (); + col = gtk_tree_view_column_new_with_attributes (_("Module Path"), rend, + "text", PATH_COLUMN, + NULL); + + gtk_tree_view_append_column (GTK_TREE_VIEW (tv), col); gtk_container_add (GTK_CONTAINER (listbox), tv); gtk_widget_show (tv); - browser->table = gtk_table_new (5, NUM_INFO_LINES + 1, FALSE); + browser->table = gtk_table_new (2, NUM_INFO_LINES, FALSE); gtk_table_set_col_spacings (GTK_TABLE (browser->table), 4); gtk_box_pack_start (GTK_BOX (vbox), browser->table, FALSE, FALSE, 0); gtk_widget_show (browser->table); hbox = gtk_hbutton_box_new (); gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_SPREAD); - gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, FALSE, 5); + gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, FALSE, 0); gtk_widget_show (hbox); - button = gtk_button_new_with_label (_("Refresh")); - gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); - gtk_widget_show (button); - - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK (browser_refresh_callback), - browser); browser->button = gtk_button_new_with_label (""); browser->button_label = gtk_bin_get_child (GTK_BIN (browser->button)); @@ -185,7 +199,8 @@ module_browser_new (Gimp *gimp) browser); browser_info_init (browser, browser->table); - browser_info_update (browser->last_update, browser); + + browser_info_update (gimp->module_db, browser->last_update, browser); sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (tv)); @@ -196,20 +211,18 @@ module_browser_new (Gimp *gimp) if (gtk_tree_model_get_iter_root (GTK_TREE_MODEL (browser->list), &iter)) gtk_tree_selection_select_iter (sel, &iter); - /* hook the GimpContainer signals so we can refresh the display + /* hook the GimpModuleDB signals so we can refresh the display * appropriately. */ - browser->modules_handler_id = - gimp_container_add_handler (gimp->modules, "modified", - G_CALLBACK (browser_info_update), - browser); - - g_signal_connect (G_OBJECT (gimp->modules), "add", + g_signal_connect (G_OBJECT (gimp->module_db), "add", G_CALLBACK (browser_info_add), browser); - g_signal_connect (G_OBJECT (gimp->modules), "remove", + g_signal_connect (G_OBJECT (gimp->module_db), "remove", G_CALLBACK (browser_info_remove), browser); + g_signal_connect (G_OBJECT (gimp->module_db), "module_modified", + G_CALLBACK (browser_info_update), + browser); g_signal_connect (G_OBJECT (shell), "destroy", G_CALLBACK (browser_destroy_callback), @@ -232,36 +245,19 @@ static void browser_destroy_callback (GtkWidget *widget, ModuleBrowser *browser) { - g_signal_handlers_disconnect_by_func (G_OBJECT (browser->gimp->modules), + g_signal_handlers_disconnect_by_func (G_OBJECT (browser->gimp->module_db), browser_info_add, browser); - g_signal_handlers_disconnect_by_func (G_OBJECT (browser->gimp->modules), + g_signal_handlers_disconnect_by_func (G_OBJECT (browser->gimp->module_db), browser_info_remove, browser); - gimp_container_remove_handler (browser->gimp->modules, - browser->modules_handler_id); + g_signal_handlers_disconnect_by_func (G_OBJECT (browser->gimp->module_db), + browser_info_update, + browser); + g_free (browser); } -static void -browser_load_inhibit_callback (GtkWidget *widget, - ModuleBrowser *browser) -{ - gboolean new_value; - - g_return_if_fail (browser->last_update != NULL); - - new_value = ! GTK_TOGGLE_BUTTON (widget)->active; - - if (new_value == browser->last_update->load_inhibit) - return; - - browser->last_update->load_inhibit = new_value; - gimp_module_modified (browser->last_update); - - browser->gimp->write_modulerc = TRUE; -} - static void browser_select_callback (GtkTreeSelection *sel, ModuleBrowser *browser) @@ -278,7 +274,42 @@ browser_select_callback (GtkTreeSelection *sel, browser->last_update = module; - browser_info_update (browser->last_update, browser); + browser_info_update (browser->gimp->module_db, browser->last_update, browser); +} + +static void +browser_autoload_toggled (GtkCellRendererToggle *celltoggle, + gchar *path_string, + ModuleBrowser *browser) +{ + GtkTreePath *path; + GtkTreeIter iter; + gboolean active = FALSE; + GimpModule *module = NULL; + + path = gtk_tree_path_new_from_string (path_string); + if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (browser->list), &iter, path)) + { + g_warning ("%s: bad tree path?", G_STRLOC); + return; + } + gtk_tree_path_free (path); + + gtk_tree_model_get (GTK_TREE_MODEL (browser->list), &iter, + AUTO_COLUMN, &active, + MODULE_COLUMN, &module, + -1); + + if (module) + { + gimp_module_set_load_inhibit (module, active); + + browser->gimp->write_modulerc = TRUE; + + gtk_list_store_set (GTK_LIST_STORE (browser->list), &iter, + AUTO_COLUMN, ! active, + -1); + } } static void @@ -287,8 +318,15 @@ browser_load_unload_callback (GtkWidget *widget, { if (browser->last_update->state != GIMP_MODULE_STATE_LOADED_OK) { - if (g_type_module_use (G_TYPE_MODULE (browser->last_update))) - g_type_module_unuse (G_TYPE_MODULE (browser->last_update)); + if (browser->last_update->info) + { + if (g_type_module_use (G_TYPE_MODULE (browser->last_update))) + g_type_module_unuse (G_TYPE_MODULE (browser->last_update)); + } + else + { + gimp_module_query_module (browser->last_update); + } } gimp_module_modified (browser->last_update); @@ -315,20 +353,21 @@ make_list_item (gpointer data, gtk_list_store_append (browser->list, &iter); gtk_list_store_set (browser->list, &iter, PATH_COLUMN, module->filename, + AUTO_COLUMN, ! module->load_inhibit, MODULE_COLUMN, module, -1); } static void -browser_info_add (GimpContainer *container, - GimpModule *module, - ModuleBrowser *browser) +browser_info_add (GimpModuleDB *db, + GimpModule *module, + ModuleBrowser*browser) { make_list_item (module, browser); } static void -browser_info_remove (GimpContainer *container, +browser_info_remove (GimpModuleDB *db, GimpModule *mod, ModuleBrowser *browser) { @@ -359,19 +398,15 @@ browser_info_remove (GimpContainer *container, } static void -browser_info_update (GimpModule *module, +browser_info_update (GimpModuleDB *db, + GimpModule *module, ModuleBrowser *browser) { + GTypeModule *g_type_module; const gchar *text[NUM_INFO_LINES]; gint i; - static const gchar * const statename[] = - { - N_("Module error"), - N_("Loaded OK"), - N_("Load failed"), - N_("Unloaded OK") - }; + g_type_module = G_TYPE_MODULE (module); /* only update the info if we're actually showing it */ if (module != browser->last_update) @@ -383,7 +418,6 @@ browser_info_update (GimpModule *module, gtk_label_set_text (GTK_LABEL (browser->label[i]), ""); gtk_label_set_text (GTK_LABEL (browser->button_label), _("")); gtk_widget_set_sensitive (GTK_WIDGET (browser->button), FALSE); - gtk_widget_set_sensitive (GTK_WIDGET (browser->load_inhibit_check), FALSE); return; } @@ -406,19 +440,31 @@ browser_info_update (GimpModule *module, text[5] = module->on_disk ? _("On disk") : _("No longer available"); } - text[6] = gettext (statename[module->state]); + text[6] = gimp_module_state_name (module->state); if (module->state == GIMP_MODULE_STATE_ERROR && module->last_module_error) text[7] = module->last_module_error; else text[7] = "--"; - for (i = 0; i < NUM_INFO_LINES; i++) - gtk_label_set_text (GTK_LABEL (browser->label[i]), gettext (text[i])); + if (g_type_module->type_infos || g_type_module->interface_infos) + { + gchar *str; - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (browser->load_inhibit_check), - ! module->load_inhibit); - gtk_widget_set_sensitive (GTK_WIDGET (browser->load_inhibit_check), TRUE); + str = g_strdup_printf ("%d Types, %d Interfaces", + g_slist_length (g_type_module->type_infos), + g_slist_length (g_type_module->interface_infos)); + gtk_label_set_text (GTK_LABEL (browser->label[NUM_INFO_LINES - 1]), str); + g_free (str); + } + else + { + gtk_label_set_text (GTK_LABEL (browser->label[NUM_INFO_LINES - 1]), + "---"); + } + + for (i = 0; i < NUM_INFO_LINES - 1; i++) + gtk_label_set_text (GTK_LABEL (browser->label[i]), gettext (text[i])); /* work out what the button should do (if anything) */ switch (module->state) @@ -426,8 +472,13 @@ browser_info_update (GimpModule *module, case GIMP_MODULE_STATE_ERROR: case GIMP_MODULE_STATE_LOAD_FAILED: case GIMP_MODULE_STATE_UNLOADED_OK: - gtk_label_set_text (GTK_LABEL (browser->button_label), _("Load")); - gtk_widget_set_sensitive (GTK_WIDGET (browser->button), module->on_disk); + if (module->info) + gtk_label_set_text (GTK_LABEL (browser->button_label), _("Load")); + else + gtk_label_set_text (GTK_LABEL (browser->button_label), _("Query")); + + gtk_widget_set_sensitive (GTK_WIDGET (browser->button), + module->on_disk); break; case GIMP_MODULE_STATE_LOADED_OK: @@ -444,7 +495,7 @@ browser_info_init (ModuleBrowser *browser, GtkWidget *label; gint i; - static const gchar *text[] = + static const gchar * const text[] = { N_("Purpose:"), N_("Author:"), @@ -453,7 +504,8 @@ browser_info_init (ModuleBrowser *browser, N_("Date:"), N_("Location:"), N_("State:"), - N_("Last Error:") + N_("Last Error:"), + N_("Available Types:") }; for (i = 0; i < G_N_ELEMENTS (text); i++) @@ -471,15 +523,4 @@ browser_info_init (ModuleBrowser *browser, GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 2); gtk_widget_show (browser->label[i]); } - - browser->load_inhibit_check = - gtk_check_button_new_with_label (_("Autoload during start-up")); - gtk_table_attach (GTK_TABLE (table), browser->load_inhibit_check, - 0, 2, i, i + 1, - GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 2); - gtk_widget_show (browser->load_inhibit_check); - - g_signal_connect (G_OBJECT (browser->load_inhibit_check), "toggled", - G_CALLBACK (browser_load_inhibit_callback), - browser); } diff --git a/app/plug-in/gimpplugin-message.c b/app/plug-in/gimpplugin-message.c index 2c8240ae7c..f3cc15f716 100644 --- a/app/plug-in/gimpplugin-message.c +++ b/app/plug-in/gimpplugin-message.c @@ -86,7 +86,6 @@ #include "core/gimp.h" #include "core/gimpcontext.h" #include "core/gimpcoreconfig.h" -#include "core/gimpdatafiles.h" #include "core/gimpdrawable.h" #include "core/gimpimage.h" diff --git a/app/plug-in/gimpplugin.c b/app/plug-in/gimpplugin.c index 2c8240ae7c..f3cc15f716 100644 --- a/app/plug-in/gimpplugin.c +++ b/app/plug-in/gimpplugin.c @@ -86,7 +86,6 @@ #include "core/gimp.h" #include "core/gimpcontext.h" #include "core/gimpcoreconfig.h" -#include "core/gimpdatafiles.h" #include "core/gimpdrawable.h" #include "core/gimpimage.h" diff --git a/app/plug-in/gimppluginmanager-call.c b/app/plug-in/gimppluginmanager-call.c index 2c8240ae7c..f3cc15f716 100644 --- a/app/plug-in/gimppluginmanager-call.c +++ b/app/plug-in/gimppluginmanager-call.c @@ -86,7 +86,6 @@ #include "core/gimp.h" #include "core/gimpcontext.h" #include "core/gimpcoreconfig.h" -#include "core/gimpdatafiles.h" #include "core/gimpdrawable.h" #include "core/gimpimage.h" diff --git a/app/plug-in/gimppluginmanager-run.c b/app/plug-in/gimppluginmanager-run.c index 2c8240ae7c..f3cc15f716 100644 --- a/app/plug-in/gimppluginmanager-run.c +++ b/app/plug-in/gimppluginmanager-run.c @@ -86,7 +86,6 @@ #include "core/gimp.h" #include "core/gimpcontext.h" #include "core/gimpcoreconfig.h" -#include "core/gimpdatafiles.h" #include "core/gimpdrawable.h" #include "core/gimpimage.h" diff --git a/app/plug-in/gimppluginmanager.c b/app/plug-in/gimppluginmanager.c index bd5573efd5..857d661a81 100644 --- a/app/plug-in/gimppluginmanager.c +++ b/app/plug-in/gimppluginmanager.c @@ -31,7 +31,6 @@ #include "core/gimp.h" #include "core/gimpcontext.h" #include "core/gimpcoreconfig.h" -#include "core/gimpdatafiles.h" #include "core/gimpdrawable.h" #include "core/gimpimage.h" @@ -57,8 +56,7 @@ struct _PlugInHelpPathDef }; -static void plug_ins_init_file (const gchar *filename, - gpointer loader_data); +static void plug_ins_init_file (GimpDatafileData *file_data); static void plug_ins_add_to_db (Gimp *gimp); static void plug_ins_proc_def_insert (PlugInProcDef *proc_def, void (* superceed_fn) (void *)); @@ -95,7 +93,7 @@ plug_ins_init (Gimp *gimp, /* search for binaries in the plug-in directory path */ gimp_datafiles_read_directories (gimp->config->plug_in_path, - MODE_EXECUTABLE, + G_FILE_TEST_IS_EXECUTABLE, plug_ins_init_file, NULL); /* read the pluginrc file for cached data */ @@ -515,15 +513,14 @@ plug_ins_help_path (gchar *prog_name) } static void -plug_ins_init_file (const gchar *filename, - gpointer loader_data) +plug_ins_init_file (GimpDatafileData *file_data) { GSList *tmp; PlugInDef *plug_in_def; gchar *plug_in_name; gchar *basename; - basename = g_path_get_basename (filename); + basename = g_path_get_basename (file_data->filename); for (tmp = plug_in_defs; tmp; tmp = g_slist_next (tmp)) { @@ -533,7 +530,8 @@ plug_ins_init_file (const gchar *filename, if (g_ascii_strcasecmp (basename, plug_in_name) == 0) { - g_print ("duplicate plug-in: \"%s\" (skipping)\n", filename); + g_print ("duplicate plug-in: \"%s\" (skipping)\n", + file_data->filename); return; } @@ -542,8 +540,8 @@ plug_ins_init_file (const gchar *filename, g_free (basename); - plug_in_def = plug_in_def_new (filename); - plug_in_def->mtime = gimp_datafile_mtime (); + plug_in_def = plug_in_def_new (file_data->filename); + plug_in_def->mtime = file_data->mtime; plug_in_def->query = TRUE; plug_in_defs = g_slist_append (plug_in_defs, plug_in_def); diff --git a/app/plug-in/gimppluginshm.c b/app/plug-in/gimppluginshm.c index 2c8240ae7c..f3cc15f716 100644 --- a/app/plug-in/gimppluginshm.c +++ b/app/plug-in/gimppluginshm.c @@ -86,7 +86,6 @@ #include "core/gimp.h" #include "core/gimpcontext.h" #include "core/gimpcoreconfig.h" -#include "core/gimpdatafiles.h" #include "core/gimpdrawable.h" #include "core/gimpimage.h" diff --git a/app/plug-in/plug-in-message.c b/app/plug-in/plug-in-message.c index 2c8240ae7c..f3cc15f716 100644 --- a/app/plug-in/plug-in-message.c +++ b/app/plug-in/plug-in-message.c @@ -86,7 +86,6 @@ #include "core/gimp.h" #include "core/gimpcontext.h" #include "core/gimpcoreconfig.h" -#include "core/gimpdatafiles.h" #include "core/gimpdrawable.h" #include "core/gimpimage.h" diff --git a/app/plug-in/plug-in-run.c b/app/plug-in/plug-in-run.c index 2c8240ae7c..f3cc15f716 100644 --- a/app/plug-in/plug-in-run.c +++ b/app/plug-in/plug-in-run.c @@ -86,7 +86,6 @@ #include "core/gimp.h" #include "core/gimpcontext.h" #include "core/gimpcoreconfig.h" -#include "core/gimpdatafiles.h" #include "core/gimpdrawable.h" #include "core/gimpimage.h" diff --git a/app/plug-in/plug-in-shm.c b/app/plug-in/plug-in-shm.c index 2c8240ae7c..f3cc15f716 100644 --- a/app/plug-in/plug-in-shm.c +++ b/app/plug-in/plug-in-shm.c @@ -86,7 +86,6 @@ #include "core/gimp.h" #include "core/gimpcontext.h" #include "core/gimpcoreconfig.h" -#include "core/gimpdatafiles.h" #include "core/gimpdrawable.h" #include "core/gimpimage.h" diff --git a/app/plug-in/plug-in.c b/app/plug-in/plug-in.c index 2c8240ae7c..f3cc15f716 100644 --- a/app/plug-in/plug-in.c +++ b/app/plug-in/plug-in.c @@ -86,7 +86,6 @@ #include "core/gimp.h" #include "core/gimpcontext.h" #include "core/gimpcoreconfig.h" -#include "core/gimpdatafiles.h" #include "core/gimpdrawable.h" #include "core/gimpimage.h" diff --git a/app/plug-in/plug-ins.c b/app/plug-in/plug-ins.c index bd5573efd5..857d661a81 100644 --- a/app/plug-in/plug-ins.c +++ b/app/plug-in/plug-ins.c @@ -31,7 +31,6 @@ #include "core/gimp.h" #include "core/gimpcontext.h" #include "core/gimpcoreconfig.h" -#include "core/gimpdatafiles.h" #include "core/gimpdrawable.h" #include "core/gimpimage.h" @@ -57,8 +56,7 @@ struct _PlugInHelpPathDef }; -static void plug_ins_init_file (const gchar *filename, - gpointer loader_data); +static void plug_ins_init_file (GimpDatafileData *file_data); static void plug_ins_add_to_db (Gimp *gimp); static void plug_ins_proc_def_insert (PlugInProcDef *proc_def, void (* superceed_fn) (void *)); @@ -95,7 +93,7 @@ plug_ins_init (Gimp *gimp, /* search for binaries in the plug-in directory path */ gimp_datafiles_read_directories (gimp->config->plug_in_path, - MODE_EXECUTABLE, + G_FILE_TEST_IS_EXECUTABLE, plug_ins_init_file, NULL); /* read the pluginrc file for cached data */ @@ -515,15 +513,14 @@ plug_ins_help_path (gchar *prog_name) } static void -plug_ins_init_file (const gchar *filename, - gpointer loader_data) +plug_ins_init_file (GimpDatafileData *file_data) { GSList *tmp; PlugInDef *plug_in_def; gchar *plug_in_name; gchar *basename; - basename = g_path_get_basename (filename); + basename = g_path_get_basename (file_data->filename); for (tmp = plug_in_defs; tmp; tmp = g_slist_next (tmp)) { @@ -533,7 +530,8 @@ plug_ins_init_file (const gchar *filename, if (g_ascii_strcasecmp (basename, plug_in_name) == 0) { - g_print ("duplicate plug-in: \"%s\" (skipping)\n", filename); + g_print ("duplicate plug-in: \"%s\" (skipping)\n", + file_data->filename); return; } @@ -542,8 +540,8 @@ plug_ins_init_file (const gchar *filename, g_free (basename); - plug_in_def = plug_in_def_new (filename); - plug_in_def->mtime = gimp_datafile_mtime (); + plug_in_def = plug_in_def_new (file_data->filename); + plug_in_def->mtime = file_data->mtime; plug_in_def->query = TRUE; plug_in_defs = g_slist_append (plug_in_defs, plug_in_def); diff --git a/app/tools/tools.c b/app/tools/tools.c index 804ea6cb39..7826793227 100644 --- a/app/tools/tools.c +++ b/app/tools/tools.c @@ -20,12 +20,13 @@ #include +#include "libgimpbase/gimpbase.h" + #include "tools-types.h" /*FIXME: remove when proper module loading is in place */ #include "core/gimp.h" #include "core/gimpcoreconfig.h" -#include "core/gimpdatafiles.h" /*end remove */ #include "libgimptool/gimptool.h" @@ -74,10 +75,11 @@ #include "gimpvectortool.h" void -cheesey_module_loading_hack (const gchar *filename, - gpointer loader_data) +cheesey_module_loading_hack (GimpDatafileData *file_data) { - gimp_tool_module_new (filename, tool_manager_register_tool, loader_data); + gimp_tool_module_new (file_data->filename, + tool_manager_register_tool, + file_data->user_data); } void diff --git a/app/widgets/gimpcolordisplayeditor.c b/app/widgets/gimpcolordisplayeditor.c index 335963f3dc..c4831bb709 100644 --- a/app/widgets/gimpcolordisplayeditor.c +++ b/app/widgets/gimpcolordisplayeditor.c @@ -40,11 +40,11 @@ #define LIST_WIDTH 150 #define LIST_HEIGHT 100 -#define UPDATE_DISPLAY(shell) G_STMT_START \ -{ \ - gimp_display_shell_expose_full (shell); \ - gimp_display_shell_flush (shell); \ -} G_STMT_END +#define UPDATE_DISPLAY(cdd) G_STMT_START \ +{ \ + gimp_display_shell_expose_full ((cdd)->shell); \ + gimp_display_shell_flush ((cdd)->shell); \ +} G_STMT_END typedef struct _ColorDisplayDialog ColorDisplayDialog; @@ -61,16 +61,22 @@ struct _ColorDisplayDialog GtkTreeSelection *src_sel; GtkTreeSelection *dest_sel; + GimpColorDisplay *selected; + gboolean modified; GList *old_nodes; - GList *conf_nodes; GtkWidget *add_button; GtkWidget *remove_button; GtkWidget *up_button; GtkWidget *down_button; - GtkWidget *configure_button; + + GtkWidget *config_frame; + GtkWidget *config_box; + GtkWidget *config_widget; + + GtkWidget *reset_button; }; @@ -88,8 +94,6 @@ static void color_display_up_callback (GtkWidget *widget, ColorDisplayDialog *cdd); static void color_display_down_callback (GtkWidget *widget, ColorDisplayDialog *cdd); -static void color_display_configure_callback (GtkWidget *widget, - ColorDisplayDialog *cdd); static void dest_list_populate (GList *node_list, GtkTreeStore *dest); @@ -99,12 +103,18 @@ static void src_selection_changed (GtkTreeSelection *sel, static void dest_selection_changed (GtkTreeSelection *sel, ColorDisplayDialog *cdd); +static void selected_filter_changed (GimpColorDisplay *filter, + ColorDisplayDialog *cdd); +static void selected_filter_reset (GtkWidget *widget, + ColorDisplayDialog *cdd); + static void color_display_update_up_and_down (ColorDisplayDialog *cdd); static void make_dialog (ColorDisplayDialog *cdd) { + GtkWidget *main_vbox; GtkWidget *hbox; GtkWidget *editor; GtkWidget *scrolled_win; @@ -126,11 +136,15 @@ make_dialog (ColorDisplayDialog *cdd) NULL); - hbox = gtk_hbox_new (FALSE, 6); - gtk_container_set_border_width (GTK_CONTAINER (hbox), 6); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (cdd->dialog)->vbox), hbox, + main_vbox = gtk_vbox_new (FALSE, 6); + gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 6); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (cdd->dialog)->vbox), main_vbox, TRUE, TRUE, 0); + hbox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (main_vbox), hbox, TRUE, TRUE, 0); + gtk_widget_show (hbox); + scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), GTK_SHADOW_IN); @@ -220,18 +234,8 @@ make_dialog (ColorDisplayDialog *cdd) NULL, cdd); - cdd->configure_button = - gimp_editor_add_button (GIMP_EDITOR (editor), - GIMP_STOCK_EDIT, - _("Configure the selected filter"), - NULL, - G_CALLBACK (color_display_configure_callback), - NULL, - cdd); - gtk_widget_set_sensitive (cdd->up_button, FALSE); gtk_widget_set_sensitive (cdd->down_button, FALSE); - gtk_widget_set_sensitive (cdd->configure_button, FALSE); scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), @@ -262,7 +266,36 @@ make_dialog (ColorDisplayDialog *cdd) G_CALLBACK (dest_selection_changed), cdd); + /* the config frame */ + + cdd->config_frame = gtk_frame_new (NULL); + gtk_box_pack_start (GTK_BOX (main_vbox), cdd->config_frame, FALSE, FALSE, 0); + gtk_widget_show (cdd->config_frame); + + cdd->config_box = gtk_vbox_new (FALSE, 4); + gtk_container_set_border_width (GTK_CONTAINER (cdd->config_box), 4); + gtk_container_add (GTK_CONTAINER (cdd->config_frame), cdd->config_box); + gtk_widget_show (cdd->config_box); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_end (GTK_BOX (cdd->config_box), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); + + cdd->reset_button = gtk_button_new_from_stock (GIMP_STOCK_RESET); + gtk_box_pack_end (GTK_BOX (hbox), cdd->reset_button, FALSE, FALSE, 0); + gtk_widget_show (cdd->reset_button); + + gimp_help_set_help_data (cdd->reset_button, + _("Reset the selected filter to default values"), + NULL); + + g_signal_connect (G_OBJECT (cdd->reset_button), "clicked", + G_CALLBACK (selected_filter_reset), + cdd); + + dest_selection_changed (cdd->dest_sel, cdd); + + gtk_widget_show (main_vbox); } static void @@ -284,7 +317,7 @@ color_display_ok_callback (GtkWidget *widget, g_list_free (cdd->old_nodes); - UPDATE_DISPLAY (cdd->shell); + UPDATE_DISPLAY (cdd); } } @@ -313,7 +346,7 @@ color_display_cancel_callback (GtkWidget *widget, list = next; } - UPDATE_DISPLAY (cdd->shell); + UPDATE_DISPLAY (cdd); } } @@ -373,7 +406,7 @@ color_display_add_callback (GtkWidget *widget, color_display_update_up_and_down (cdd); - UPDATE_DISPLAY (cdd->shell); + UPDATE_DISPLAY (cdd); } } @@ -406,7 +439,7 @@ color_display_remove_callback (GtkWidget *widget, color_display_update_up_and_down (cdd); - UPDATE_DISPLAY (cdd->shell); + UPDATE_DISPLAY (cdd); } } @@ -447,7 +480,7 @@ color_display_up_callback (GtkWidget *widget, gtk_tree_selection_select_iter (cdd->dest_sel, &iter2); - UPDATE_DISPLAY (cdd->shell); + UPDATE_DISPLAY (cdd); } } @@ -488,36 +521,7 @@ color_display_down_callback (GtkWidget *widget, gtk_tree_selection_select_iter (cdd->dest_sel, &iter2); - UPDATE_DISPLAY (cdd->shell); - } -} - -static void -color_display_configure_callback (GtkWidget *widget, - ColorDisplayDialog *cdd) -{ - GtkTreeModel *model; - GtkTreeIter iter; - - if (gtk_tree_selection_get_selected (cdd->dest_sel, &model, &iter)) - { - GimpColorDisplay *filter; - GValue val = { 0, }; - - gtk_tree_model_get_value (model, &iter, 1, &val); - - filter = g_value_get_pointer (&val); - - g_value_unset (&val); - - if (! g_list_find (cdd->conf_nodes, filter)) - cdd->conf_nodes = g_list_append (cdd->conf_nodes, filter); - - gimp_color_display_configure (filter, NULL, NULL, NULL, NULL); - - cdd->modified = TRUE; - - UPDATE_DISPLAY (cdd->shell); + UPDATE_DISPLAY (cdd); } } @@ -614,6 +618,16 @@ dest_selection_changed (GtkTreeSelection *sel, GtkTreeIter iter; GimpColorDisplay *filter = NULL; + if (cdd->selected) + { + g_signal_handlers_disconnect_by_func (G_OBJECT (cdd->selected), + selected_filter_changed, + cdd); + g_object_remove_weak_pointer (G_OBJECT (cdd->selected), + (gpointer) &cdd->selected); + cdd->selected = NULL; + } + if (gtk_tree_selection_get_selected (sel, &model, &iter)) { GValue val = { 0, }; @@ -625,8 +639,63 @@ dest_selection_changed (GtkTreeSelection *sel, g_value_unset (&val); } - gtk_widget_set_sensitive (cdd->remove_button, (filter != NULL)); - gtk_widget_set_sensitive (cdd->configure_button, (filter != NULL)); + gtk_widget_set_sensitive (cdd->remove_button, (filter != NULL)); + gtk_widget_set_sensitive (cdd->reset_button, (filter != NULL)); + + if (cdd->config_widget) + gtk_container_remove (GTK_CONTAINER (cdd->config_box), cdd->config_widget); + + if (filter) + { + gchar *str; + + cdd->selected = filter; + + g_object_add_weak_pointer (G_OBJECT (filter), (gpointer) &cdd->selected); + g_signal_connect (G_OBJECT (cdd->selected), "changed", + G_CALLBACK (selected_filter_changed), + cdd); + + cdd->config_widget = gimp_color_display_configure (filter); + + str = g_strdup_printf (_("Configure Selected Filter: %s"), + GIMP_COLOR_DISPLAY_GET_CLASS (filter)->name); + gtk_frame_set_label (GTK_FRAME (cdd->config_frame), str); + g_free (str); + } + else + { + cdd->config_widget = gtk_label_new (_("No Filter Selected")); + gtk_widget_set_sensitive (cdd->config_widget, FALSE); + + gtk_frame_set_label (GTK_FRAME (cdd->config_frame), + _("Configure Selected Filter")); + } + + if (cdd->config_widget) + { + gtk_box_pack_start (GTK_BOX (cdd->config_box), cdd->config_widget, + FALSE, FALSE, 0); + gtk_widget_show (cdd->config_widget); + + g_object_add_weak_pointer (G_OBJECT (cdd->config_widget), + (gpointer) &cdd->config_widget); + } color_display_update_up_and_down (cdd); } + +static void +selected_filter_changed (GimpColorDisplay *filter, + ColorDisplayDialog *cdd) +{ + UPDATE_DISPLAY (cdd); +} + +static void +selected_filter_reset (GtkWidget *widget, + ColorDisplayDialog *cdd) +{ + if (cdd->selected) + gimp_color_display_configure_reset (cdd->selected); +} diff --git a/devel-docs/ChangeLog b/devel-docs/ChangeLog index 3affd8864a..7f40ebbc9a 100644 --- a/devel-docs/ChangeLog +++ b/devel-docs/ChangeLog @@ -1,3 +1,20 @@ +2002-10-23 Michael Natterer + + * libgimpbase/libgimpbase-docs.sgml + * libgimpbase/libgimpbase-sections.txt + * libgimpbase/tmpl/gimpbasetypes.sgml + * libgimpbase/tmpl/gimpdatafiles.sgml: added GimpDatafiles + + * libgimpmodule/libgimpmodule-docs.sgml + * libgimpmodule/libgimpmodule-sections.txt + * libgimpmodule/tmpl/gimpmoduledb.sgml: added GimpModuleDB. + + * libgimpwidgets/libgimpwidgets.types: added gimp_dialog_get_type + + * libgimpmodule/tmpl/gimpmodule.sgml + * libgimpwidgets/tmpl/gimpcolordisplay.sgml + * libgimpwidgets/tmpl/gimpdialog.sgml: updated. + 2002-10-21 Michael Natterer * libgimpmodule/tmpl/gimpmoduletypes.sgml: removed because we diff --git a/devel-docs/libgimpbase/libgimpbase-docs.sgml b/devel-docs/libgimpbase/libgimpbase-docs.sgml index c9e40cbb18..a3b7aa3d1b 100644 --- a/devel-docs/libgimpbase/libgimpbase-docs.sgml +++ b/devel-docs/libgimpbase/libgimpbase-docs.sgml @@ -1,6 +1,7 @@ + @@ -20,6 +21,7 @@ &GimpBaseTypes; &GimpVersion; &GimpLimits; + &GimpDatafiles; &GimpEnv; &GimpParasite; &GimpParasiteIO; diff --git a/devel-docs/libgimpbase/libgimpbase-sections.txt b/devel-docs/libgimpbase/libgimpbase-sections.txt index f554aa8c57..4da866a630 100644 --- a/devel-docs/libgimpbase/libgimpbase-sections.txt +++ b/devel-docs/libgimpbase/libgimpbase-sections.txt @@ -5,6 +5,7 @@ GimpPDBProcType GimpPDBStatusType GimpMessageHandlerType GimpStackTraceMode +GimpDatafileLoaderFunc
@@ -162,3 +163,9 @@ GIMP_VERSION GIMP_CHECK_VERSION
+
+gimpdatafiles +GimpDatafileData +gimp_datafiles_check_extension +gimp_datafiles_read_directories +
diff --git a/devel-docs/libgimpbase/tmpl/gimpbasetypes.sgml b/devel-docs/libgimpbase/tmpl/gimpbasetypes.sgml index f8d87d63cc..00024e0c10 100644 --- a/devel-docs/libgimpbase/tmpl/gimpbasetypes.sgml +++ b/devel-docs/libgimpbase/tmpl/gimpbasetypes.sgml @@ -82,3 +82,11 @@ gimpbasetypes @GIMP_STACK_TRACE_QUERY: @GIMP_STACK_TRACE_ALWAYS: + + + + + +@file_data: + + diff --git a/devel-docs/libgimpbase/tmpl/gimpdatafiles.sgml b/devel-docs/libgimpbase/tmpl/gimpdatafiles.sgml new file mode 100644 index 0000000000..e2226f7fea --- /dev/null +++ b/devel-docs/libgimpbase/tmpl/gimpdatafiles.sgml @@ -0,0 +1,48 @@ + +gimpdatafiles + + + + + + + + + + + + + + + + + + + +@filename: +@atime: +@mtime: +@ctime: +@user_data: + + + + + + +@filename: +@extension: +@Returns: + + + + + + + +@path_str: +@flags: +@loader_func: +@user_data: + + diff --git a/devel-docs/libgimpmodule/libgimpmodule-docs.sgml b/devel-docs/libgimpmodule/libgimpmodule-docs.sgml index 68c81ca96b..88f40d9315 100644 --- a/devel-docs/libgimpmodule/libgimpmodule-docs.sgml +++ b/devel-docs/libgimpmodule/libgimpmodule-docs.sgml @@ -1,5 +1,6 @@ + ]> @@ -9,5 +10,6 @@ GIMP Module Library &GimpModule; + &GimpModuleDB; diff --git a/devel-docs/libgimpmodule/libgimpmodule-sections.txt b/devel-docs/libgimpmodule/libgimpmodule-sections.txt index af042c4620..116790f582 100644 --- a/devel-docs/libgimpmodule/libgimpmodule-sections.txt +++ b/devel-docs/libgimpmodule/libgimpmodule-sections.txt @@ -21,3 +21,22 @@ GIMP_MODULE_CLASS GIMP_IS_MODULE_CLASS GIMP_MODULE_GET_CLASS + +
+gimpmoduledb +GimpModuleDB +GimpModuleDB +gimp_module_db_new +gimp_module_db_set_load_inhibit +gimp_module_db_get_load_inhibit +gimp_module_db_load +gimp_module_db_refresh + +GIMP_MODULE_DB +GIMP_IS_MODULE_DB +GIMP_TYPE_MODULE_DB +gimp_module_db_get_type +GIMP_MODULE_DB_CLASS +GIMP_IS_MODULE_DB_CLASS +GIMP_MODULE_DB_GET_CLASS +
diff --git a/devel-docs/libgimpmodule/libgimpmodule.types b/devel-docs/libgimpmodule/libgimpmodule.types index 51fd56b3d2..f9aa6670ca 100644 --- a/devel-docs/libgimpmodule/libgimpmodule.types +++ b/devel-docs/libgimpmodule/libgimpmodule.types @@ -2,3 +2,5 @@ #include gimp_module_get_type +gimp_module_db_get_type + diff --git a/devel-docs/libgimpmodule/tmpl/gimpmodule.sgml b/devel-docs/libgimpmodule/tmpl/gimpmodule.sgml index 89857d4c17..7d9ae534d3 100644 --- a/devel-docs/libgimpmodule/tmpl/gimpmodule.sgml +++ b/devel-docs/libgimpmodule/tmpl/gimpmodule.sgml @@ -68,9 +68,11 @@ Common definitions for creating a pluggable GIMP module. @filename: -@inhibit_str: +@load_inhibit: @verbose: @Returns: + +@inhibit_str: @@ -87,6 +89,8 @@ Common definitions for creating a pluggable GIMP module. @module: +@load_inhibit: + @inhibit_list: diff --git a/devel-docs/libgimpmodule/tmpl/gimpmoduledb.sgml b/devel-docs/libgimpmodule/tmpl/gimpmoduledb.sgml new file mode 100644 index 0000000000..3097ce44b0 --- /dev/null +++ b/devel-docs/libgimpmodule/tmpl/gimpmoduledb.sgml @@ -0,0 +1,91 @@ + +GimpModuleDB + + + + + + + + + + + + + + + + + + + + + + + + + +@verbose: +@Returns: + + + + + + + +@db: +@load_inhibit: + + + + + + + +@db: +@Returns: + + + + + + + +@db: +@module_path: + + + + + + + +@db: +@module_path: + + + + + + + +@gimpmoduledb: the object which received the signal. +@arg1: + + + + + + +@gimpmoduledb: the object which received the signal. +@arg1: + + + + + + +@gimpmoduledb: the object which received the signal. +@arg1: + diff --git a/devel-docs/libgimpwidgets/libgimpwidgets.types b/devel-docs/libgimpwidgets/libgimpwidgets.types index eb24fefd2e..3f497fa4fc 100644 --- a/devel-docs/libgimpwidgets/libgimpwidgets.types +++ b/devel-docs/libgimpwidgets/libgimpwidgets.types @@ -6,6 +6,7 @@ gimp_chain_button_get_type gimp_color_button_get_type +gimp_dialog_get_type gimp_color_display_get_type gimp_color_selector_get_type gimp_color_select_get_type diff --git a/devel-docs/libgimpwidgets/tmpl/gimpcolordisplay.sgml b/devel-docs/libgimpwidgets/tmpl/gimpcolordisplay.sgml index abc7f9d9ae..6700e4cff6 100644 --- a/devel-docs/libgimpwidgets/tmpl/gimpcolordisplay.sgml +++ b/devel-docs/libgimpwidgets/tmpl/gimpcolordisplay.sgml @@ -83,17 +83,18 @@ display color correction module. @display: +@Returns: + @ok_func: @ok_data: @cancel_func: @cancel_data: - + -@display: - +@gimpcolordisplay: the object which received the signal. diff --git a/devel-docs/libgimpwidgets/tmpl/gimpdialog.sgml b/devel-docs/libgimpwidgets/tmpl/gimpdialog.sgml index 2ffe7eabdf..3e70530a60 100644 --- a/devel-docs/libgimpwidgets/tmpl/gimpdialog.sgml +++ b/devel-docs/libgimpwidgets/tmpl/gimpdialog.sgml @@ -20,7 +20,6 @@ dialog-related stuff. -@parent_instance: diff --git a/libgimpbase/Makefile.am b/libgimpbase/Makefile.am index fdb36ff82d..3a7078f0d1 100644 --- a/libgimpbase/Makefile.am +++ b/libgimpbase/Makefile.am @@ -69,32 +69,37 @@ lib_LTLIBRARIES = libgimpbase-1.3.la libgimpbase_1_3_la_SOURCES = \ gimpbase.h \ gimpbasetypes.h \ + gimplimits.h \ + gimpunit.h \ + gimpversion.h \ + \ + gimpdatafiles.c \ + gimpdatafiles.h \ gimpenv.c \ gimpenv.h \ - gimplimits.h \ - gimpsignal.c \ - gimpsignal.h \ gimpparasite.c \ gimpparasite.h \ gimpparasiteio.c \ gimpparasiteio.h \ gimpprotocol.c \ gimpprotocol.h \ - gimpunit.h \ - gimpversion.h \ + gimpsignal.c \ + gimpsignal.h \ gimpwire.c \ gimpwire.h libgimpbaseinclude_HEADERS = \ gimpbase.h \ gimpbasetypes.h \ - gimpenv.h \ gimplimits.h \ - gimpsignal.h \ + gimpunit.h \ + gimpversion.h \ + \ + gimpdatafiles.h \ + gimpenv.h \ gimpparasite.h \ gimpparasiteio.h \ - gimpunit.h \ - gimpversion.h + gimpsignal.h EXTRA_HEADERS = diff --git a/libgimpbase/gimpbase.h b/libgimpbase/gimpbase.h index d46108588d..758bc90ea5 100644 --- a/libgimpbase/gimpbase.h +++ b/libgimpbase/gimpbase.h @@ -23,6 +23,7 @@ #include +#include #include #include #include diff --git a/libgimpbase/gimpbasetypes.h b/libgimpbase/gimpbasetypes.h index ad202201f4..32d7fea488 100644 --- a/libgimpbase/gimpbasetypes.h +++ b/libgimpbase/gimpbasetypes.h @@ -29,7 +29,11 @@ G_BEGIN_DECLS /* For information look into the C source or the html documentation */ -typedef struct _GimpParasite GimpParasite; +typedef struct _GimpParasite GimpParasite; +typedef struct _GimpDatafileData GimpDatafileData; + + +typedef void (* GimpDatafileLoaderFunc) (GimpDatafileData *file_data); typedef enum diff --git a/libgimpbase/gimpdatafiles.c b/libgimpbase/gimpdatafiles.c index fbac6660e9..0faee255e4 100644 --- a/libgimpbase/gimpdatafiles.c +++ b/libgimpbase/gimpdatafiles.c @@ -42,15 +42,10 @@ #endif #endif /* G_OS_WIN32 */ -#include "libgimpbase/gimpbase.h" - -#include "core-types.h" +#include "gimpbasetypes.h" #include "gimpdatafiles.h" - - -static gboolean filestat_valid = FALSE; -static struct stat filestat; +#include "gimpenv.h" #ifdef G_OS_WIN32 @@ -114,26 +109,30 @@ gimp_datafiles_check_extension (const gchar *filename, if (! (name_len && ext_len && (name_len > ext_len))) return FALSE; - return (strcmp (&filename[name_len - ext_len], extension) == 0); + return (g_ascii_strcasecmp (&filename[name_len - ext_len], extension) == 0); } void gimp_datafiles_read_directories (const gchar *path_str, - GimpDataFileFlags flags, - GimpDataFileLoaderFunc loader_func, - gpointer loader_data) + GFileTest flags, + GimpDatafileLoaderFunc loader_func, + gpointer user_data) { - gchar *local_path; - GList *path; - GList *list; - gchar *filename; - gint err; - GDir *dir; - const gchar *dir_ent; + GimpDatafileData file_data = { 0 }; + struct stat filestat; + gchar *local_path; + GList *path; + GList *list; + gchar *filename; + gint err; + GDir *dir; + const gchar *dir_ent; g_return_if_fail (path_str != NULL); g_return_if_fail (loader_func != NULL); + file_data.user_data = user_data; + local_path = g_strdup (path_str); #ifdef __EMX__ @@ -150,10 +149,9 @@ gimp_datafiles_read_directories (const gchar *path_str, for (list = path; list; list = g_list_next (list)) { - /* Open directory */ dir = g_dir_open ((gchar *) list->data, 0, NULL); - if (!dir) + if (! dir) { g_message ("error reading datafiles directory \"%s\"", (gchar *) list->data); @@ -168,23 +166,41 @@ gimp_datafiles_read_directories (const gchar *path_str, /* Check the file and see that it is not a sub-directory */ err = stat (filename, &filestat); + file_data.filename = filename; + file_data.atime = filestat.st_atime; + file_data.mtime = filestat.st_mtime; + file_data.ctime = filestat.st_ctime; + if (! err) { - filestat_valid = TRUE; - - if (S_ISDIR (filestat.st_mode) && (flags & TYPE_DIRECTORY)) + if (flags & G_FILE_TEST_EXISTS) + { + (* loader_func) (&file_data); + } + else if ((flags & G_FILE_TEST_IS_REGULAR) && + S_ISREG (filestat.st_mode)) + { + (* loader_func) (&file_data); + } + else if ((flags & G_FILE_TEST_IS_DIR) && + S_ISDIR (filestat.st_mode)) { - (* loader_func) (filename, loader_data); + (* loader_func) (&file_data); } - else if (S_ISREG (filestat.st_mode) && - (!(flags & MODE_EXECUTABLE) || - (filestat.st_mode & S_IXUSR) || - is_script (filename))) +#ifdef G_OS_WIN32 + else if ((flags & G_FILE_TEST_IS_SYMLINK) && + S_ISLINK (filestat.st_mode)) { - (* loader_func) (filename, loader_data); + (* loader_func) (&file_data); + } +#endif + else if ((flags & G_FILE_TEST_IS_EXECUTABLE) && + ((filestat.st_mode & S_IXUSR) || + (S_ISREG (filestat.st_mode) && + is_script (filename)))) + { + (* loader_func) (&file_data); } - - filestat_valid = FALSE; } g_free (filename); @@ -197,30 +213,3 @@ gimp_datafiles_read_directories (const gchar *path_str, gimp_path_free (path); g_free (local_path); } - -time_t -gimp_datafile_atime (void) -{ - if (filestat_valid) - return filestat.st_atime; - - return 0; -} - -time_t -gimp_datafile_mtime (void) -{ - if (filestat_valid) - return filestat.st_mtime; - - return 0; -} - -time_t -gimp_datafile_ctime (void) -{ - if (filestat_valid) - return filestat.st_ctime; - - return 0; -} diff --git a/libgimpbase/gimpdatafiles.h b/libgimpbase/gimpdatafiles.h index 42ced3649c..6b36ed38d3 100644 --- a/libgimpbase/gimpdatafiles.h +++ b/libgimpbase/gimpdatafiles.h @@ -25,29 +25,25 @@ #include -typedef enum +struct _GimpDatafileData { - MODE_EXECUTABLE = 1 << 0, - TYPE_DIRECTORY = 1 << 1 -} GimpDataFileFlags; + const gchar *filename; + + time_t atime; + time_t mtime; + time_t ctime; + + gpointer user_data; +}; gboolean gimp_datafiles_check_extension (const gchar *filename, const gchar *extension); void gimp_datafiles_read_directories (const gchar *path_str, - GimpDataFileFlags flags, - GimpDataFileLoaderFunc loader_func, - gpointer loader_data); - -/* Return the current datafiles access, modification - * or change time. The current datafile is the one for - * which the "DataFileLoaderFunc" function has been called - * on. - */ -time_t gimp_datafile_atime (void); -time_t gimp_datafile_mtime (void); -time_t gimp_datafile_ctime (void); + GFileTest flags, + GimpDatafileLoaderFunc loader_func, + gpointer user_data); #endif /* __GIMP_DATAFILES_H__ */ diff --git a/libgimpmodule/Makefile.am b/libgimpmodule/Makefile.am index 5ab8ae03d5..5961aad1ed 100644 --- a/libgimpmodule/Makefile.am +++ b/libgimpmodule/Makefile.am @@ -61,11 +61,14 @@ lib_LTLIBRARIES = libgimpmodule-1.3.la libgimpmodule_1_3_la_SOURCES = \ gimpmoduletypes.h \ gimpmodule.c \ - gimpmodule.h + gimpmodule.h \ + gimpmoduledb.c \ + gimpmoduledb.h libgimpmoduleinclude_HEADERS = \ gimpmoduletypes.h \ - gimpmodule.h + gimpmodule.h \ + gimpmoduledb.h EXTRA_HEADERS = @@ -76,7 +79,9 @@ libgimpmodule_1_3_la_LDFLAGS = \ libgimpmodule_1_3_la_DEPENDENCIES = $(gimpmodule_def) -libgimpmodule_1_3_la_LIBADD = $(GLIB_LIBS) +libgimpmodule_1_3_la_LIBADD = \ + $(top_builddir)/libgimpbase/libgimpbase-$(LT_RELEASE).la \ + $(GLIB_LIBS) install-data-local: install-ms-lib install-libtool-import-lib diff --git a/libgimpmodule/gimpmodule.c b/libgimpmodule/gimpmodule.c index a1554be422..fe3fd73243 100644 --- a/libgimpmodule/gimpmodule.c +++ b/libgimpmodule/gimpmodule.c @@ -45,6 +45,8 @@ static void gimp_module_finalize (GObject *object); static gboolean gimp_module_load (GTypeModule *module); static void gimp_module_unload (GTypeModule *module); +static gboolean gimp_module_open (GimpModule *module); +static gboolean gimp_module_close (GimpModule *module); static void gimp_module_set_last_error (GimpModule *module, const gchar *error_str); @@ -158,10 +160,9 @@ gimp_module_finalize (GObject *object) static gboolean gimp_module_load (GTypeModule *module) { - GimpModule *gimp_module; - const GimpModuleInfo *info; - gpointer symbol; - gboolean retval; + GimpModule *gimp_module; + gpointer symbol; + gboolean retval; g_return_val_if_fail (GIMP_IS_MODULE (module), FALSE); @@ -173,63 +174,11 @@ gimp_module_load (GTypeModule *module) if (gimp_module->verbose) g_print (_("Loading module: '%s'\n"), gimp_module->filename); - gimp_module->module = g_module_open (gimp_module->filename, - G_MODULE_BIND_LAZY); + if (! gimp_module_open (gimp_module)) + return FALSE; - if (! gimp_module->module) - { - gimp_module->state = GIMP_MODULE_STATE_ERROR; - gimp_module_set_last_error (gimp_module, g_module_error ()); - - if (gimp_module->verbose) - g_message (_("Module '%s' load error:\n%s"), - gimp_module->filename, gimp_module->last_module_error); - return FALSE; - } - - /* find the gimp_module_query symbol */ - if (! g_module_symbol (gimp_module->module, "gimp_module_query", &symbol)) - { - gimp_module->state = GIMP_MODULE_STATE_ERROR; - - gimp_module_set_last_error (gimp_module, - "Missing gimp_module_query() symbol"); - - if (gimp_module->verbose) - g_print (_("Module '%s' load error:\n%s"), - gimp_module->filename, gimp_module->last_module_error); - g_module_close (gimp_module->module); - gimp_module->module = NULL; - return FALSE; - } - - gimp_module->query_module = symbol; - - info = gimp_module->query_module (module); - - if (gimp_module->info) - { - gimp_module_info_free (gimp_module->info); - gimp_module->info = NULL; - } - - if (! info) - { - gimp_module->state = GIMP_MODULE_STATE_ERROR; - - gimp_module_set_last_error (gimp_module, - "gimp_module_query() returned NULL"); - - if (gimp_module->verbose) - g_message (_("Module '%s' load error:\n%s"), - gimp_module->filename, gimp_module->last_module_error); - g_module_close (gimp_module->module); - gimp_module->module = NULL; - gimp_module->query_module = NULL; - return FALSE; - } - - gimp_module->info = gimp_module_info_copy (info); + if (! gimp_module_query_module (gimp_module)) + return FALSE; /* find the gimp_module_register symbol */ if (! g_module_symbol (gimp_module->module, "gimp_module_register", &symbol)) @@ -270,17 +219,15 @@ gimp_module_unload (GTypeModule *module) g_return_if_fail (gimp_module->module != NULL); - g_module_close (gimp_module->module); /* FIXME: error handling */ - gimp_module->module = NULL; - gimp_module->query_module = NULL; - gimp_module->register_module = NULL; - - gimp_module->state = GIMP_MODULE_STATE_UNLOADED_OK; + gimp_module_close (gimp_module); } + +/* public functions */ + GimpModule * gimp_module_new (const gchar *filename, - const gchar *inhibit_list, + gboolean load_inhibit, gboolean verbose) { GimpModule *module; @@ -289,11 +236,10 @@ gimp_module_new (const gchar *filename, module = g_object_new (GIMP_TYPE_MODULE, NULL); - module->filename = g_strdup (filename); - module->verbose = verbose ? TRUE : FALSE; - module->on_disk = TRUE; - - gimp_module_set_load_inhibit (module, inhibit_list); + module->filename = g_strdup (filename); + module->load_inhibit = load_inhibit ? TRUE : FALSE; + module->verbose = verbose ? TRUE : FALSE; + module->on_disk = TRUE; if (! module->load_inhibit) { @@ -311,6 +257,71 @@ gimp_module_new (const gchar *filename, return module; } +gboolean +gimp_module_query_module (GimpModule *module) +{ + const GimpModuleInfo *info; + gboolean close_module = FALSE; + gpointer symbol; + + g_return_val_if_fail (GIMP_IS_MODULE (module), FALSE); + + if (! module->module) + { + if (! gimp_module_open (module)) + return FALSE; + + close_module = TRUE; + } + + /* find the gimp_module_query symbol */ + if (! g_module_symbol (module->module, "gimp_module_query", &symbol)) + { + module->state = GIMP_MODULE_STATE_ERROR; + + gimp_module_set_last_error (module, "Missing gimp_module_query() symbol"); + + if (module->verbose) + g_print (_("Module '%s' load error:\n%s"), + module->filename, module->last_module_error); + + + gimp_module_close (module); + return FALSE; + } + + module->query_module = symbol; + + if (module->info) + { + gimp_module_info_free (module->info); + module->info = NULL; + } + + info = module->query_module (G_TYPE_MODULE (module)); + + if (! info) + { + module->state = GIMP_MODULE_STATE_ERROR; + + gimp_module_set_last_error (module, "gimp_module_query() returned NULL"); + + if (module->verbose) + g_message (_("Module '%s' load error:\n%s"), + module->filename, module->last_module_error); + + gimp_module_close (module); + return FALSE; + } + + module->info = gimp_module_info_copy (info); + + if (close_module) + return gimp_module_close (module); + + return TRUE; +} + void gimp_module_modified (GimpModule *module) { @@ -320,42 +331,69 @@ gimp_module_modified (GimpModule *module) } void -gimp_module_set_load_inhibit (GimpModule *module, - const gchar *inhibit_list) +gimp_module_set_load_inhibit (GimpModule *module, + gboolean load_inhibit) { - gchar *p; - gint pathlen; - const gchar *start; - const gchar *end; - g_return_if_fail (GIMP_IS_MODULE (module)); - g_return_if_fail (module->filename != NULL); - module->load_inhibit = FALSE; + if (load_inhibit != module->load_inhibit) + { + module->load_inhibit = load_inhibit ? TRUE : FALSE; - if (! inhibit_list || ! strlen (inhibit_list)) - return; + gimp_module_modified (module); + } +} - p = strstr (inhibit_list, module->filename); - if (!p) - return; - /* we have a substring, but check for colons either side */ - start = p; - while (start != inhibit_list && *start != G_SEARCHPATH_SEPARATOR) - start--; +/* private functions */ - if (*start == G_SEARCHPATH_SEPARATOR) - start++; +const gchar * +gimp_module_state_name (GimpModuleState state) +{ + static const gchar * const statenames[] = + { + N_("Module error"), + N_("Loaded OK"), + N_("Load failed"), + N_("Unloaded OK") + }; - end = strchr (p, G_SEARCHPATH_SEPARATOR); - if (! end) - end = inhibit_list + strlen (inhibit_list); + g_return_val_if_fail (state >= GIMP_MODULE_STATE_ERROR && + state <= GIMP_MODULE_STATE_UNLOADED_OK, NULL); - pathlen = strlen (module->filename); + return gettext (statenames[state]); +} - if ((end - start) == pathlen) - module->load_inhibit = TRUE; +static gboolean +gimp_module_open (GimpModule *module) +{ + module->module = g_module_open (module->filename, G_MODULE_BIND_LAZY); + + if (! module->module) + { + module->state = GIMP_MODULE_STATE_ERROR; + gimp_module_set_last_error (module, g_module_error ()); + + if (module->verbose) + g_message (_("Module '%s' load error:\n%s"), + module->filename, module->last_module_error); + return FALSE; + } + + return TRUE; +} + +static gboolean +gimp_module_close (GimpModule *module) +{ + g_module_close (module->module); /* FIXME: error handling */ + module->module = NULL; + module->query_module = NULL; + module->register_module = NULL; + + module->state = GIMP_MODULE_STATE_UNLOADED_OK; + + return TRUE; } static void diff --git a/libgimpmodule/gimpmodule.h b/libgimpmodule/gimpmodule.h index 08571bd738..3963fa6773 100644 --- a/libgimpmodule/gimpmodule.h +++ b/libgimpmodule/gimpmodule.h @@ -26,6 +26,8 @@ #include +#include + G_BEGIN_DECLS @@ -96,15 +98,19 @@ struct _GimpModuleClass }; -GType gimp_module_get_type (void) G_GNUC_CONST; +GType gimp_module_get_type (void) G_GNUC_CONST; -GimpModule * gimp_module_new (const gchar *filename, - const gchar *inhibit_str, - gboolean verbose); +GimpModule * gimp_module_new (const gchar *filename, + gboolean load_inhibit, + gboolean verbose); -void gimp_module_modified (GimpModule *module); -void gimp_module_set_load_inhibit (GimpModule *module, - const gchar *inhibit_list); +gboolean gimp_module_query_module (GimpModule *module); + +void gimp_module_modified (GimpModule *module); +void gimp_module_set_load_inhibit (GimpModule *module, + gboolean load_inhibit); + +const gchar * gimp_module_state_name (GimpModuleState state); /* GimpModuleInfo functions */ diff --git a/libgimpmodule/gimpmoduledb.c b/libgimpmodule/gimpmoduledb.c index ed04e94867..fc7bcb078d 100644 --- a/libgimpmodule/gimpmoduledb.c +++ b/libgimpmodule/gimpmoduledb.c @@ -32,126 +32,286 @@ #include #include "libgimpbase/gimpbase.h" -#include "libgimpmodule/gimpmodule.h" -#include "core-types.h" +#include "gimpmoduletypes.h" -#include "gimp.h" -#include "gimpcoreconfig.h" -#include "gimpdatafiles.h" -#include "gimplist.h" -#include "gimpmodules.h" - -#include "gimprc.h" +#include "gimpmodule.h" +#include "gimpmoduledb.h" #include "libgimp/gimpintl.h" +enum +{ + ADD, + REMOVE, + MODULE_MODIFIED, + LAST_SIGNAL +}; + + #define DUMP_DB 1 -static void gimp_modules_module_initialize (const gchar *filename, - gpointer loader_data); +static void gimp_module_db_class_init (GimpModuleDBClass *klass); +static void gimp_module_db_init (GimpModuleDB *db); -static GimpModule * gimp_modules_module_find_by_path (Gimp *gimp, - const char *fullpath); +static void gimp_module_db_finalize (GObject *object); + +static void gimp_module_db_module_initialize (GimpDatafileData *file_data); + +static GimpModule * gimp_module_db_module_find_by_path (GimpModuleDB *db, + const char *fullpath); #ifdef DUMP_DB -static void gimp_modules_dump_module (gpointer data, - gpointer user_data); +static void gimp_module_db_dump_module (gpointer data, + gpointer user_data); #endif -static gboolean gimp_modules_write_modulerc (Gimp *gimp); +#if 0 +static gboolean gimp_module_db_write_modulerc (GimpModuleDB *db); +#endif -static void gimp_modules_module_on_disk_func (gpointer data, - gpointer user_data); -static void gimp_modules_module_remove_func (gpointer data, - gpointer user_data); +static void gimp_module_db_module_on_disk_func (gpointer data, + gpointer user_data); +static void gimp_module_db_module_remove_func (gpointer data, + gpointer user_data); +static void gimp_module_db_module_modified (GimpModule *module, + GimpModuleDB *db); -void -gimp_modules_init (Gimp *gimp) +static GObjectClass *parent_class = NULL; + +static guint db_signals[LAST_SIGNAL] = { 0 }; + + +GType +gimp_module_db_get_type (void) { - g_return_if_fail (GIMP_IS_GIMP (gimp)); + static GType db_type = 0; - gimp->modules = gimp_list_new (GIMP_TYPE_MODULE, - GIMP_CONTAINER_POLICY_STRONG); - gimp_object_set_name (GIMP_OBJECT (gimp->modules), "modules"); + if (! db_type) + { + static const GTypeInfo db_info = + { + sizeof (GimpModuleDBClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) gimp_module_db_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GimpModuleDB), + 0, /* n_preallocs */ + (GInstanceInitFunc) gimp_module_db_init, + }; - gimp->write_modulerc = FALSE; + db_type = g_type_register_static (G_TYPE_OBJECT, + "GimpModuleDB", + &db_info, 0); + } + + return db_type; +} + +static void +gimp_module_db_class_init (GimpModuleDBClass *klass) +{ + GObjectClass *object_class; + + object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + db_signals[ADD] = + g_signal_new ("add", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GimpModuleDBClass, add), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + GIMP_TYPE_MODULE); + + db_signals[REMOVE] = + g_signal_new ("remove", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GimpModuleDBClass, remove), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + GIMP_TYPE_MODULE); + + db_signals[MODULE_MODIFIED] = + g_signal_new ("module_modified", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GimpModuleDBClass, module_modified), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + GIMP_TYPE_MODULE); + + object_class->finalize = gimp_module_db_finalize; + + klass->add = NULL; + klass->remove = NULL; +} + +static void +gimp_module_db_init (GimpModuleDB *db) +{ + db->modules = NULL; + db->load_inhibit = NULL; + db->verbose = FALSE; +} + +static void +gimp_module_db_finalize (GObject *object) +{ + GimpModuleDB *db; + + db = GIMP_MODULE_DB (object); + + if (db->modules) + { + g_list_free (db->modules); + db->modules = NULL; + } + + if (db->load_inhibit) + { + g_free (db->load_inhibit); + db->load_inhibit = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +GimpModuleDB * +gimp_module_db_new (gboolean verbose) +{ + GimpModuleDB *db; + + db = g_object_new (GIMP_TYPE_MODULE_DB, NULL); + + db->verbose = verbose ? TRUE : FALSE; + + return db; +} + +static gboolean +is_in_inhibit_list (const gchar *filename, + const gchar *inhibit_list) +{ + gchar *p; + gint pathlen; + const gchar *start; + const gchar *end; + + if (! inhibit_list || ! strlen (inhibit_list)) + return FALSE; + + p = strstr (inhibit_list, filename); + if (!p) + return FALSE; + + /* we have a substring, but check for colons either side */ + start = p; + while (start != inhibit_list && *start != G_SEARCHPATH_SEPARATOR) + start--; + + if (*start == G_SEARCHPATH_SEPARATOR) + start++; + + end = strchr (p, G_SEARCHPATH_SEPARATOR); + if (! end) + end = inhibit_list + strlen (inhibit_list); + + pathlen = strlen (filename); + + if ((end - start) == pathlen) + return TRUE; + + return FALSE; } void -gimp_modules_exit (Gimp *gimp) +gimp_module_db_set_load_inhibit (GimpModuleDB *db, + const gchar *load_inhibit) { - g_return_if_fail (GIMP_IS_GIMP (gimp)); + GimpModule *module; + GList *list; - if (gimp->modules) + g_return_if_fail (GIMP_IS_MODULE_DB (db)); + + if (db->load_inhibit) + g_free (db->load_inhibit); + + db->load_inhibit = g_strdup (load_inhibit); + + for (list = db->modules; list; list = g_list_next (list)) { - g_object_unref (G_OBJECT (gimp->modules)); - gimp->modules = NULL; + module = (GimpModule *) list->data; + + gimp_module_set_load_inhibit (module, + is_in_inhibit_list (module->filename, + load_inhibit)); } } -void -gimp_modules_load (Gimp *gimp) +const gchar * +gimp_module_db_get_load_inhibit (GimpModuleDB *db) { - gchar *filename; + g_return_val_if_fail (GIMP_IS_MODULE_DB (db), NULL); - g_return_if_fail (GIMP_IS_GIMP (gimp)); + return db->load_inhibit; +} - filename = gimp_personal_rc_file ("modulerc"); - gimprc_parse_file (filename); - g_free (filename); +void +gimp_module_db_load (GimpModuleDB *db, + const gchar *module_path) +{ + g_return_if_fail (GIMP_IS_MODULE_DB (db)); + g_return_if_fail (module_path != NULL); if (g_module_supported ()) - gimp_datafiles_read_directories (gimp->config->module_path, - 0 /* no flags */, - gimp_modules_module_initialize, - gimp); + gimp_datafiles_read_directories (module_path, + G_FILE_TEST_EXISTS, + gimp_module_db_module_initialize, + db); #ifdef DUMP_DB - gimp_container_foreach (gimp->modules, gimp_modules_dump_module, NULL); + g_list_foreach (db->modules, gimp_module_db_dump_module, NULL); #endif } void -gimp_modules_unload (Gimp *gimp) -{ - g_return_if_fail (GIMP_IS_GIMP (gimp)); - - if (gimp->write_modulerc) - { - if (gimp_modules_write_modulerc (gimp)) - { - gimp->write_modulerc = FALSE; - } - } -} - -void -gimp_modules_refresh (Gimp *gimp) +gimp_module_db_refresh (GimpModuleDB *db, + const gchar *module_path) { GList *kill_list = NULL; - g_return_if_fail (GIMP_IS_GIMP (gimp)); + g_return_if_fail (GIMP_IS_MODULE_DB (db)); + g_return_if_fail (module_path != NULL); /* remove modules we don't have on disk anymore */ - gimp_container_foreach (gimp->modules, - gimp_modules_module_on_disk_func, - &kill_list); + g_list_foreach (db->modules, + gimp_module_db_module_on_disk_func, + &kill_list); g_list_foreach (kill_list, - gimp_modules_module_remove_func, - gimp); + gimp_module_db_module_remove_func, + db); g_list_free (kill_list); /* walk filesystem and add new things we find */ - gimp_datafiles_read_directories (gimp->config->module_path, - 0 /* no flags */, - gimp_modules_module_initialize, - gimp); + gimp_datafiles_read_directories (module_path, + G_FILE_TEST_EXISTS, + gimp_module_db_module_initialize, + db); } +#if 0 static void add_to_inhibit_string (gpointer data, gpointer user_data) @@ -196,32 +356,24 @@ gimp_modules_write_modulerc (Gimp *gimp) return saved; } +#endif /* name must be of the form lib*.so (Unix) or *.dll (Win32) */ static gboolean valid_module_name (const gchar *filename) { gchar *basename; - gint len; basename = g_path_get_basename (filename); - len = strlen (basename); - #if !defined(G_OS_WIN32) && !defined(G_WITH_CYGWIN) && !defined(__EMX__) - if (len < 3 + 1 + 3) - goto no_module; - if (strncmp (basename, "lib", 3)) goto no_module; - if (strcmp (basename + len - 3, ".so")) + if (! gimp_datafiles_check_extension (basename, ".so")) goto no_module; #else - if (len < 1 + 4) - goto no_module; - - if (g_strcasecmp (basename + len - 4, ".dll")) + if (! gimp_datafiles_check_extension (basename, ".dll")) goto no_module; #endif @@ -236,36 +388,44 @@ valid_module_name (const gchar *filename) } static void -gimp_modules_module_initialize (const gchar *filename, - gpointer loader_data) +gimp_module_db_module_initialize (GimpDatafileData *file_data) { - GimpModule *module; - Gimp *gimp; + GimpModuleDB *db; + GimpModule *module; + gboolean load_inhibit; - gimp = GIMP (loader_data); + db = GIMP_MODULE_DB (file_data->user_data); - if (! valid_module_name (filename)) + if (! valid_module_name (file_data->filename)) return; /* don't load if we already know about it */ - if (gimp_modules_module_find_by_path (gimp, filename)) + if (gimp_module_db_module_find_by_path (db, file_data->filename)) return; - module = gimp_module_new (filename, - gimp->config->module_db_load_inhibit, - gimp->be_verbose); + load_inhibit = is_in_inhibit_list (file_data->filename, + db->load_inhibit); - gimp_container_add (gimp->modules, (GimpObject *) module); + module = gimp_module_new (file_data->filename, + load_inhibit, + db->verbose); + + g_signal_connect (G_OBJECT (module), "modified", + G_CALLBACK (gimp_module_db_module_modified), + db); + + db->modules = g_list_append (db->modules, module); + g_signal_emit (G_OBJECT (db), db_signals[ADD], 0, module); } static GimpModule * -gimp_modules_module_find_by_path (Gimp *gimp, - const char *fullpath) +gimp_module_db_module_find_by_path (GimpModuleDB *db, + const char *fullpath) { GimpModule *module; GList *list; - for (list = GIMP_LIST (gimp->modules)->list; list; list = g_list_next (list)) + for (list = db->modules; list; list = g_list_next (list)) { module = (GimpModule *) list->data; @@ -278,14 +438,14 @@ gimp_modules_module_find_by_path (Gimp *gimp, #ifdef DUMP_DB static void -gimp_modules_dump_module (gpointer data, - gpointer user_data) +gimp_module_db_dump_module (gpointer data, + gpointer user_data) { GimpModule *i = data; - g_print ("\n%s: %i\n", + g_print ("\n%s: %s\n", i->filename, - i->state /* statename[i->state] */); + gimp_module_state_name (i->state)); g_print (" module:%p lasterr:%s query:%p register:%p\n", i->module, @@ -310,8 +470,8 @@ gimp_modules_dump_module (gpointer data, #endif static void -gimp_modules_module_on_disk_func (gpointer data, - gpointer user_data) +gimp_module_db_module_on_disk_func (gpointer data, + gpointer user_data) { GimpModule *module; GList **kill_list; @@ -338,14 +498,26 @@ gimp_modules_module_on_disk_func (gpointer data, } static void -gimp_modules_module_remove_func (gpointer data, - gpointer user_data) +gimp_module_db_module_remove_func (gpointer data, + gpointer user_data) { - GimpModule *module; - Gimp *gimp; + GimpModule *module; + GimpModuleDB *db; - module = (GimpModule *) data; - gimp = (Gimp *) user_data; + module = (GimpModule *) data; + db = (GimpModuleDB *) user_data; - gimp_container_remove (gimp->modules, (GimpObject *) module); + g_signal_handlers_disconnect_by_func (G_OBJECT (module), + gimp_module_db_module_modified, + db); + + g_list_remove (db->modules, module); + g_signal_emit (G_OBJECT (db), db_signals[REMOVE], 0, module); +} + +static void +gimp_module_db_module_modified (GimpModule *module, + GimpModuleDB *db) +{ + g_signal_emit (G_OBJECT (db), db_signals[MODULE_MODIFIED], 0, module); } diff --git a/libgimpmodule/gimpmoduledb.h b/libgimpmodule/gimpmoduledb.h index 48aa49e665..7b83a41f03 100644 --- a/libgimpmodule/gimpmoduledb.h +++ b/libgimpmodule/gimpmoduledb.h @@ -19,17 +19,58 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef __GIMP_MODULES_H__ -#define __GIMP_MODULES_H__ +#ifndef __GIMP_MODULE_DB_H__ +#define __GIMP_MODULE_DB_H__ + +G_BEGIN_DECLS -void gimp_modules_init (Gimp *gimp); -void gimp_modules_exit (Gimp *gimp); - -void gimp_modules_load (Gimp *gimp); -void gimp_modules_unload (Gimp *gimp); - -void gimp_modules_refresh (Gimp *gimp); +#define GIMP_TYPE_MODULE_DB (gimp_module_db_get_type ()) +#define GIMP_MODULE_DB(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_MODULE_DB, GimpModuleDB)) +#define GIMP_MODULE_DB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_MODULE_DB, GimpModuleDBClass)) +#define GIMP_IS_MODULE_DB(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_MODULE_DB)) +#define GIMP_IS_MODULE_DB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_MODULE_DB)) +#define GIMP_MODULE_DB_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_MODULE_DB, GimpModuleDBClass)) -#endif /* __GIMP_MODULES_H__ */ +typedef struct _GimpModuleDBClass GimpModuleDBClass; + +struct _GimpModuleDB +{ + GObject parent_instance; + + GList *modules; + + gchar *load_inhibit; + gboolean verbose; +}; + +struct _GimpModuleDBClass +{ + GObjectClass parent_class; + + void (* add) (GimpModuleDB *db, + GimpModule *module); + void (* remove) (GimpModuleDB *db, + GimpModule *module); + void (* module_modified) (GimpModuleDB *db, + GimpModule *module); +}; + + +GType gimp_module_db_get_type (void) G_GNUC_CONST; +GimpModuleDB * gimp_module_db_new (gboolean verbose); + +void gimp_module_db_set_load_inhibit (GimpModuleDB *db, + const gchar *load_inhibit); +const gchar * gimp_module_db_get_load_inhibit (GimpModuleDB *db); + +void gimp_module_db_load (GimpModuleDB *db, + const gchar *module_path); +void gimp_module_db_refresh (GimpModuleDB *db, + const gchar *module_path); + + +G_END_DECLS + +#endif /* __GIMP_MODULE_DB_H__ */ diff --git a/libgimpmodule/gimpmoduletypes.h b/libgimpmodule/gimpmoduletypes.h index 65394d4c84..6108f62617 100644 --- a/libgimpmodule/gimpmoduletypes.h +++ b/libgimpmodule/gimpmoduletypes.h @@ -27,6 +27,7 @@ G_BEGIN_DECLS typedef struct _GimpModule GimpModule; typedef struct _GimpModuleInfo GimpModuleInfo; +typedef struct _GimpModuleDB GimpModuleDB; G_END_DECLS diff --git a/libgimpproxy/gimpobject.c b/libgimpproxy/gimpobject.c index 2361470c90..7526d6ba7f 100644 --- a/libgimpproxy/gimpobject.c +++ b/libgimpproxy/gimpobject.c @@ -319,20 +319,30 @@ gimp_object_get_memsize (GimpObject *object) return GIMP_OBJECT_GET_CLASS (object)->get_memsize (object); } -static gsize -gimp_object_real_get_memsize (GimpObject *object) +gsize +gimp_g_object_get_memsize (GObject *object) { GTypeQuery type_query; gsize memsize = 0; + g_return_val_if_fail (G_IS_OBJECT (object), 0); + g_type_query (G_TYPE_FROM_INSTANCE (object), &type_query); memsize += type_query.instance_size; + return memsize; +} + +static gsize +gimp_object_real_get_memsize (GimpObject *object) +{ + gsize memsize = 0; + if (object->name) memsize += strlen (object->name) + 1; - return memsize; + return memsize + gimp_g_object_get_memsize ((GObject *) object); } /* Generated data ends here */ diff --git a/libgimpproxy/gimpobject.h b/libgimpproxy/gimpobject.h index 1e921a92ca..dee06bd92e 100644 --- a/libgimpproxy/gimpobject.h +++ b/libgimpproxy/gimpobject.h @@ -55,14 +55,15 @@ struct _GimpObjectClass }; -GType gimp_object_get_type (void) G_GNUC_CONST; +GType gimp_object_get_type (void) G_GNUC_CONST; -void gimp_object_set_name (GimpObject *object, - const gchar *name); -const gchar * gimp_object_get_name (const GimpObject *object); -void gimp_object_name_changed (GimpObject *object); +void gimp_object_set_name (GimpObject *object, + const gchar *name); +const gchar * gimp_object_get_name (const GimpObject *object); +void gimp_object_name_changed (GimpObject *object); -gsize gimp_object_get_memsize (GimpObject *object); +gsize gimp_object_get_memsize (GimpObject *object); +gsize gimp_g_object_get_memsize (GObject *object); #endif /* __GIMP_OBJECT_H__ */ diff --git a/libgimpwidgets/gimpcolordisplay.c b/libgimpwidgets/gimpcolordisplay.c index ed0177a449..b801bc9dcd 100644 --- a/libgimpwidgets/gimpcolordisplay.c +++ b/libgimpwidgets/gimpcolordisplay.c @@ -30,12 +30,21 @@ #include "gimpcolordisplay.h" +enum +{ + CHANGED, + LAST_SIGNAL +}; + + static void gimp_color_display_class_init (GimpColorDisplayClass *klass); static void gimp_color_display_init (GimpColorDisplay *display); static GObjectClass *parent_class = NULL; +static guint display_signals[LAST_SIGNAL] = { 0 }; + GType gimp_color_display_get_type (void) @@ -70,12 +79,21 @@ gimp_color_display_class_init (GimpColorDisplayClass *klass) { parent_class = g_type_class_peek_parent (klass); - klass->clone = NULL; - klass->convert = NULL; - klass->load_state = NULL; - klass->save_state = NULL; - klass->configure = NULL; - klass->configure_cancel = NULL; + display_signals[CHANGED] = + g_signal_new ("changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GimpColorDisplayClass, changed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + klass->clone = NULL; + klass->convert = NULL; + klass->load_state = NULL; + klass->save_state = NULL; + klass->configure = NULL; + klass->configure_reset = NULL; } static void @@ -145,26 +163,30 @@ gimp_color_display_save_state (GimpColorDisplay *display) return NULL; } -void -gimp_color_display_configure (GimpColorDisplay *display, - GFunc ok_func, - gpointer ok_data, - GFunc cancel_func, - gpointer cancel_data) +GtkWidget * +gimp_color_display_configure (GimpColorDisplay *display) { - g_return_if_fail (GIMP_IS_COLOR_DISPLAY (display)); + g_return_val_if_fail (GIMP_IS_COLOR_DISPLAY (display), NULL); if (GIMP_COLOR_DISPLAY_GET_CLASS (display)->configure) - GIMP_COLOR_DISPLAY_GET_CLASS (display)->configure (display, - ok_func, ok_data, - cancel_func, cancel_data); + return GIMP_COLOR_DISPLAY_GET_CLASS (display)->configure (display); + + return NULL; } void -gimp_color_display_configure_cancel (GimpColorDisplay *display) +gimp_color_display_configure_reset (GimpColorDisplay *display) { g_return_if_fail (GIMP_IS_COLOR_DISPLAY (display)); - if (GIMP_COLOR_DISPLAY_GET_CLASS (display)->configure_cancel) - GIMP_COLOR_DISPLAY_GET_CLASS (display)->configure_cancel (display); + if (GIMP_COLOR_DISPLAY_GET_CLASS (display)->configure_reset) + GIMP_COLOR_DISPLAY_GET_CLASS (display)->configure_reset (display); +} + +void +gimp_color_display_changed (GimpColorDisplay *display) +{ + g_return_if_fail (GIMP_IS_COLOR_DISPLAY (display)); + + g_signal_emit (G_OBJECT (display), display_signals[CHANGED], 0); } diff --git a/libgimpwidgets/gimpcolordisplay.h b/libgimpwidgets/gimpcolordisplay.h index 21f74fd225..0fc705168a 100644 --- a/libgimpwidgets/gimpcolordisplay.h +++ b/libgimpwidgets/gimpcolordisplay.h @@ -47,46 +47,42 @@ struct _GimpColorDisplayClass const gchar *help_page; /* virtual functions */ - GimpColorDisplay * (* clone) (GimpColorDisplay *display); - void (* convert) (GimpColorDisplay *display, - guchar *buf, - gint width, - gint height, - gint bpp, - gint bpl); + GimpColorDisplay * (* clone) (GimpColorDisplay *display); + void (* convert) (GimpColorDisplay *display, + guchar *buf, + gint width, + gint height, + gint bpp, + gint bpl); + void (* load_state) (GimpColorDisplay *display, + GimpParasite *state); + GimpParasite * (* save_state) (GimpColorDisplay *display); + GtkWidget * (* configure) (GimpColorDisplay *display); + void (* configure_reset) (GimpColorDisplay *display); - void (* load_state) (GimpColorDisplay *display, - GimpParasite *state); - GimpParasite * (* save_state) (GimpColorDisplay *display); - void (* configure) (GimpColorDisplay *display, - GFunc ok_func, - gpointer ok_data, - GFunc cancel_func, - gpointer cancel_data); - void (* configure_cancel) (GimpColorDisplay *display); + /* signals */ + void (* changed) (GimpColorDisplay *display); }; -GType gimp_color_display_get_type (void) G_GNUC_CONST; -GimpColorDisplay * gimp_color_display_new (GType display_type); +GType gimp_color_display_get_type (void) G_GNUC_CONST; +GimpColorDisplay * gimp_color_display_new (GType display_type); -GimpColorDisplay * gimp_color_display_clone (GimpColorDisplay *display); +GimpColorDisplay * gimp_color_display_clone (GimpColorDisplay *display); -void gimp_color_display_convert (GimpColorDisplay *display, - guchar *buf, - gint width, - gint height, - gint bpp, - gint bpl); -void gimp_color_display_load_state (GimpColorDisplay *display, - GimpParasite *state); -GimpParasite * gimp_color_display_save_state (GimpColorDisplay *display); -void gimp_color_display_configure (GimpColorDisplay *display, - GFunc ok_func, - gpointer ok_data, - GFunc cancel_func, - gpointer cancel_data); -void gimp_color_display_configure_cancel (GimpColorDisplay *display); +void gimp_color_display_convert (GimpColorDisplay *display, + guchar *buf, + gint width, + gint height, + gint bpp, + gint bpl); +void gimp_color_display_load_state (GimpColorDisplay *display, + GimpParasite *state); +GimpParasite * gimp_color_display_save_state (GimpColorDisplay *display); +GtkWidget * gimp_color_display_configure (GimpColorDisplay *display); +void gimp_color_display_configure_reset (GimpColorDisplay *display); + +void gimp_color_display_changed (GimpColorDisplay *display); G_END_DECLS diff --git a/modules/cdisplay_gamma.c b/modules/cdisplay_gamma.c index f11f1326bb..d841cca29b 100644 --- a/modules/cdisplay_gamma.c +++ b/modules/cdisplay_gamma.c @@ -30,6 +30,9 @@ #include "libgimp/gimpintl.h" +#define DEFAULT_GAMMA 1.0 + + #define CDISPLAY_TYPE_GAMMA (cdisplay_gamma_type) #define CDISPLAY_GAMMA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CDISPLAY_TYPE_GAMMA, CdisplayGamma)) #define CDISPLAY_GAMMA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CDISPLAY_TYPE_GAMMA, CdisplayGammaClass)) @@ -44,16 +47,11 @@ struct _CdisplayGamma { GimpColorDisplay parent_instance; - GFunc ok_func; - gpointer ok_data; - GFunc cancel_func; - gpointer cancel_data; - gdouble gamma; guchar *lookup; - GtkWidget *shell; - GtkWidget *spinner; + GtkWidget *hbox; + GtkObject *adjustment; }; struct _CdisplayGammaClass @@ -78,17 +76,11 @@ static void cdisplay_gamma_convert (GimpColorDisplay *display, static void cdisplay_gamma_load_state (GimpColorDisplay *display, GimpParasite *state); static GimpParasite * cdisplay_gamma_save_state (GimpColorDisplay *display); -static void cdisplay_gamma_configure (GimpColorDisplay *display, - GFunc ok_func, - gpointer ok_data, - GFunc cancel_func, - gpointer cancel_data); -static void cdisplay_gamma_configure_cancel (GimpColorDisplay *display); +static GtkWidget * cdisplay_gamma_configure (GimpColorDisplay *display); +static void cdisplay_gamma_configure_reset (GimpColorDisplay *display); static void gamma_create_lookup_table (CdisplayGamma *gamma); -static void gamma_configure_ok_callback (GtkWidget *widget, - CdisplayGamma *gamma); -static void gamma_configure_cancel_callback (GtkWidget *widget, +static void gamma_configure_adj_callback (GtkAdjustment *adj, CdisplayGamma *gamma); @@ -158,16 +150,16 @@ cdisplay_gamma_class_init (CdisplayGammaClass *klass) parent_class = g_type_class_peek_parent (klass); - object_class->finalize = cdisplay_gamma_finalize; + object_class->finalize = cdisplay_gamma_finalize; - display_class->name = _("Gamma"); - display_class->help_page = "modules/gamma.html"; - display_class->clone = cdisplay_gamma_clone; - display_class->convert = cdisplay_gamma_convert; - display_class->load_state = cdisplay_gamma_load_state; - display_class->save_state = cdisplay_gamma_save_state; - display_class->configure = cdisplay_gamma_configure; - display_class->configure_cancel = cdisplay_gamma_configure_cancel; + display_class->name = _("Gamma"); + display_class->help_page = "modules/gamma.html"; + display_class->clone = cdisplay_gamma_clone; + display_class->convert = cdisplay_gamma_convert; + display_class->load_state = cdisplay_gamma_load_state; + display_class->save_state = cdisplay_gamma_save_state; + display_class->configure = cdisplay_gamma_configure; + display_class->configure_reset = cdisplay_gamma_configure_reset; } static void @@ -175,7 +167,7 @@ cdisplay_gamma_init (CdisplayGamma *gamma) { gint i; - gamma->gamma = 1.0; + gamma->gamma = DEFAULT_GAMMA; gamma->lookup = g_new (guchar, 256); for (i = 0; i < 256; i++) @@ -189,11 +181,8 @@ cdisplay_gamma_finalize (GObject *object) gamma = CDISPLAY_GAMMA (object); - if (gamma->shell) - { - gtk_widget_destroy (gamma->shell); - gamma->shell = NULL; - } + if (gamma->hbox) + gtk_widget_destroy (gamma->hbox); if (gamma->lookup) { @@ -309,74 +298,47 @@ cdisplay_gamma_save_state (GimpColorDisplay *display) sizeof (double), &buf); } -static void -cdisplay_gamma_configure (GimpColorDisplay *display, - GFunc ok_func, - gpointer ok_data, - GFunc cancel_func, - gpointer cancel_data) +static GtkWidget * +cdisplay_gamma_configure (GimpColorDisplay *display) { CdisplayGamma *gamma; - GtkWidget *hbox; GtkWidget *label; - GtkObject *adjustment; + GtkWidget *spinbutton; gamma = CDISPLAY_GAMMA (display); - if (!gamma->shell) - { - gamma->ok_func = ok_func; - gamma->ok_data = ok_data; - gamma->cancel_func = cancel_func; - gamma->cancel_data = cancel_data; + if (gamma->hbox) + gtk_widget_destroy (gamma->hbox); - gamma->shell = - gimp_dialog_new (_("Gamma"), "gamma", - gimp_standard_help_func, "modules/gamma.html", - GTK_WIN_POS_MOUSE, - FALSE, TRUE, FALSE, + gamma->hbox = gtk_hbox_new (FALSE, 4); + g_object_add_weak_pointer (G_OBJECT (gamma->hbox), (gpointer) &gamma->hbox); - GTK_STOCK_CANCEL, gamma_configure_cancel_callback, - gamma, NULL, NULL, FALSE, TRUE, + label = gtk_label_new ( _("Gamma:")); + gtk_box_pack_start (GTK_BOX (gamma->hbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); - GTK_STOCK_OK, gamma_configure_ok_callback, - gamma, NULL, NULL, TRUE, FALSE, + spinbutton = gimp_spin_button_new (&gamma->adjustment, + gamma->gamma, 0.01, 10.0, 0.01, 0.1, 0.0, + 0.1, 3); + gtk_box_pack_start (GTK_BOX (gamma->hbox), spinbutton, FALSE, FALSE, 0); + gtk_widget_show (spinbutton); - NULL); + g_signal_connect (G_OBJECT (gamma->adjustment), "value_changed", + G_CALLBACK (gamma_configure_adj_callback), + gamma); - hbox = gtk_hbox_new (FALSE, 2); - gtk_container_set_border_width (GTK_CONTAINER (hbox), 6); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (gamma->shell)->vbox), - hbox, FALSE, FALSE, 0); - - label = gtk_label_new ( _("Gamma:")); - gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); - gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0); - - adjustment = gtk_adjustment_new (gamma->gamma, 0.01, 10.0, 0.01, 0.1, 0.0); - gamma->spinner = gtk_spin_button_new (GTK_ADJUSTMENT (adjustment), - 0.1, 3); - gtk_box_pack_start (GTK_BOX (hbox), gamma->spinner, FALSE, FALSE, 0); - } - - gtk_widget_show_all (gamma->shell); + return gamma->hbox; } static void -cdisplay_gamma_configure_cancel (GimpColorDisplay *display) +cdisplay_gamma_configure_reset (GimpColorDisplay *display) { CdisplayGamma *gamma; gamma = CDISPLAY_GAMMA (display); - if (gamma->shell) - { - gtk_widget_destroy (gamma->shell); - gamma->shell = NULL; - } - - if (gamma->cancel_func) - gamma->cancel_func (gamma, gamma->cancel_data); + if (gamma->adjustment) + gtk_adjustment_set_value (GTK_ADJUSTMENT (gamma->adjustment), DEFAULT_GAMMA); } static void @@ -399,24 +361,12 @@ gamma_create_lookup_table (CdisplayGamma *gamma) } static void -gamma_configure_ok_callback (GtkWidget *widget, - CdisplayGamma *gamma) +gamma_configure_adj_callback (GtkAdjustment *adj, + CdisplayGamma *gamma) { - gamma->gamma = - gtk_spin_button_get_value (GTK_SPIN_BUTTON (gamma->spinner)); + gamma->gamma = adj->value; gamma_create_lookup_table (gamma); - gtk_widget_destroy (GTK_WIDGET (gamma->shell)); - gamma->shell = NULL; - - if (gamma->ok_func) - gamma->ok_func (gamma, gamma->ok_data); -} - -static void -gamma_configure_cancel_callback (GtkWidget *widget, - CdisplayGamma *gamma) -{ - gimp_color_display_configure_cancel (GIMP_COLOR_DISPLAY (gamma)); + gimp_color_display_changed (GIMP_COLOR_DISPLAY (gamma)); } diff --git a/modules/cdisplay_highcontrast.c b/modules/cdisplay_highcontrast.c index 0e62524a06..209a2092a8 100644 --- a/modules/cdisplay_highcontrast.c +++ b/modules/cdisplay_highcontrast.c @@ -30,6 +30,9 @@ #include "libgimp/gimpintl.h" +#define DEFAULT_CONTRAST 4.0 + + #define CDISPLAY_TYPE_CONTRAST (cdisplay_contrast_type) #define CDISPLAY_CONTRAST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CDISPLAY_TYPE_CONTRAST, CdisplayContrast)) #define CDISPLAY_CONTRAST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CDISPLAY_TYPE_CONTRAST, CdisplayContrastClass)) @@ -44,16 +47,11 @@ struct _CdisplayContrast { GimpColorDisplay parent_instance; - GFunc ok_func; - gpointer ok_data; - GFunc cancel_func; - gpointer cancel_data; - gdouble contrast; guchar *lookup; - GtkWidget *shell; - GtkWidget *spinner; + GtkWidget *hbox; + GtkObject *adjustment; }; struct _CdisplayContrastClass @@ -78,18 +76,12 @@ static void cdisplay_contrast_convert (GimpColorDisplay *display, static void cdisplay_contrast_load_state (GimpColorDisplay *display, GimpParasite *state); static GimpParasite * cdisplay_contrast_save_state (GimpColorDisplay *display); -static void cdisplay_contrast_configure (GimpColorDisplay *display, - GFunc ok_func, - gpointer ok_data, - GFunc cancel_func, - gpointer cancel_data); -static void cdisplay_contrast_configure_cancel (GimpColorDisplay *display); +static GtkWidget * cdisplay_contrast_configure (GimpColorDisplay *display); +static void cdisplay_contrast_configure_reset (GimpColorDisplay *display); static void contrast_create_lookup_table (CdisplayContrast *contrast); -static void contrast_configure_ok_callback (GtkWidget *widget, - CdisplayContrast *contrast); -static void contrast_configure_cancel_callback (GtkWidget *widget, - CdisplayContrast *contrast); +static void contrast_configure_adj_callback (GtkAdjustment *adj, + CdisplayContrast *contrast); static const GimpModuleInfo cdisplay_contrast_info = @@ -158,22 +150,22 @@ cdisplay_contrast_class_init (CdisplayContrastClass *klass) parent_class = g_type_class_peek_parent (klass); - object_class->finalize = cdisplay_contrast_finalize; + object_class->finalize = cdisplay_contrast_finalize; - display_class->name = _("Contrast"); - display_class->help_page = "modules/contrast.html"; - display_class->clone = cdisplay_contrast_clone; - display_class->convert = cdisplay_contrast_convert; - display_class->load_state = cdisplay_contrast_load_state; - display_class->save_state = cdisplay_contrast_save_state; - display_class->configure = cdisplay_contrast_configure; - display_class->configure_cancel = cdisplay_contrast_configure_cancel; + display_class->name = _("Contrast"); + display_class->help_page = "modules/contrast.html"; + display_class->clone = cdisplay_contrast_clone; + display_class->convert = cdisplay_contrast_convert; + display_class->load_state = cdisplay_contrast_load_state; + display_class->save_state = cdisplay_contrast_save_state; + display_class->configure = cdisplay_contrast_configure; + display_class->configure_reset = cdisplay_contrast_configure_reset; } static void cdisplay_contrast_init (CdisplayContrast *contrast) { - contrast->contrast = 4.0; + contrast->contrast = DEFAULT_CONTRAST; contrast->lookup = g_new (guchar, 256); contrast_create_lookup_table (contrast); @@ -186,11 +178,8 @@ cdisplay_contrast_finalize (GObject *object) contrast = CDISPLAY_CONTRAST (object); - if (contrast->shell) - { - gtk_widget_destroy (contrast->shell); - contrast->shell = NULL; - } + if (contrast->hbox) + gtk_widget_destroy (contrast->hbox); if (contrast->lookup) { @@ -306,74 +295,50 @@ cdisplay_contrast_save_state (GimpColorDisplay *display) sizeof (double), &buf); } -static void -cdisplay_contrast_configure (GimpColorDisplay *display, - GFunc ok_func, - gpointer ok_data, - GFunc cancel_func, - gpointer cancel_data) +static GtkWidget * +cdisplay_contrast_configure (GimpColorDisplay *display) { CdisplayContrast *contrast; - GtkWidget *hbox; GtkWidget *label; - GtkObject *adjustment; + GtkWidget *spinbutton; contrast = CDISPLAY_CONTRAST (display); - if (!contrast->shell) - { - contrast->ok_func = ok_func; - contrast->ok_data = ok_data; - contrast->cancel_func = cancel_func; - contrast->cancel_data = cancel_data; + if (contrast->hbox) + gtk_widget_destroy (contrast->hbox); - contrast->shell = - gimp_dialog_new (_("High Contrast"), "high_contrast", - gimp_standard_help_func, "modules/highcontrast.html", - GTK_WIN_POS_MOUSE, - FALSE, TRUE, FALSE, + contrast->hbox = gtk_hbox_new (FALSE, 2); + g_object_add_weak_pointer (G_OBJECT (contrast->hbox), + (gpointer) &contrast->hbox); - GTK_STOCK_CANCEL, contrast_configure_cancel_callback, - contrast, NULL, NULL, FALSE, TRUE, + label = gtk_label_new ( _("Contrast Cycles:")); + gtk_box_pack_start (GTK_BOX (contrast->hbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); - GTK_STOCK_OK, contrast_configure_ok_callback, - contrast, NULL, NULL, TRUE, FALSE, + spinbutton = gimp_spin_button_new (&contrast->adjustment, + contrast->contrast, + 0.01, 10.0, 0.01, 0.1, 0.0, + 0.1, 3); + gtk_box_pack_start (GTK_BOX (contrast->hbox), spinbutton, FALSE, FALSE, 0); + gtk_widget_show (spinbutton); - NULL); + g_signal_connect (G_OBJECT (contrast->adjustment), "value_changed", + G_CALLBACK (contrast_configure_adj_callback), + contrast); - hbox = gtk_hbox_new (FALSE, 2); - gtk_container_set_border_width (GTK_CONTAINER (hbox), 6); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (contrast->shell)->vbox), - hbox, FALSE, FALSE, 0); - - label = gtk_label_new ( _("Contrast Cycles:")); - gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); - gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0); - - adjustment = gtk_adjustment_new (contrast->contrast, 0.01, 10.0, 0.01, 0.1, 0.0); - contrast->spinner = gtk_spin_button_new (GTK_ADJUSTMENT (adjustment), - 0.1, 3); - gtk_box_pack_start (GTK_BOX (hbox), contrast->spinner, FALSE, FALSE, 0); - } - - gtk_widget_show_all (contrast->shell); + return contrast->hbox; } static void -cdisplay_contrast_configure_cancel (GimpColorDisplay *display) +cdisplay_contrast_configure_reset (GimpColorDisplay *display) { CdisplayContrast *contrast; contrast = CDISPLAY_CONTRAST (display); - if (contrast->shell) - { - gtk_widget_destroy (contrast->shell); - contrast->shell = NULL; - } - - if (contrast->cancel_func) - contrast->cancel_func (contrast, contrast->cancel_data); + if (contrast->adjustment) + gtk_adjustment_set_value (GTK_ADJUSTMENT (contrast->adjustment), + DEFAULT_CONTRAST); } static void @@ -392,24 +357,12 @@ contrast_create_lookup_table (CdisplayContrast *contrast) } static void -contrast_configure_ok_callback (GtkWidget *widget, - CdisplayContrast *contrast) +contrast_configure_adj_callback (GtkAdjustment *adj, + CdisplayContrast *contrast) { - contrast->contrast = - gtk_spin_button_get_value (GTK_SPIN_BUTTON (contrast->spinner)); + contrast->contrast = adj->value; contrast_create_lookup_table (contrast); - gtk_widget_destroy (GTK_WIDGET (contrast->shell)); - contrast->shell = NULL; - - if (contrast->ok_func) - contrast->ok_func (contrast, contrast->ok_data); -} - -static void -contrast_configure_cancel_callback (GtkWidget *widget, - CdisplayContrast *contrast) -{ - gimp_color_display_configure_cancel (GIMP_COLOR_DISPLAY (contrast)); + gimp_color_display_changed (GIMP_COLOR_DISPLAY (contrast)); } diff --git a/modules/colorsel_triangle.c b/modules/colorsel_triangle.c index 23725e7576..ea8a3f9df0 100644 --- a/modules/colorsel_triangle.c +++ b/modules/colorsel_triangle.c @@ -107,7 +107,7 @@ static gboolean colorsel_triangle_event (GtkWidget *widget, static const GimpModuleInfo colorsel_triangle_info = { - N_("Painter-style color selector as a pluggable color selector"), + N_("Painter-style triangle color selector"), "Simon Budig ", "v0.03", "(c) 1999, released under the GPL", diff --git a/modules/colorsel_water.c b/modules/colorsel_water.c index 2225da5e0c..748dbc37e3 100644 --- a/modules/colorsel_water.c +++ b/modules/colorsel_water.c @@ -104,7 +104,7 @@ static void pressure_adjust_update (GtkAdjustment *adj, static const GimpModuleInfo colorsel_water_info = { - N_("Watercolor style color selector as a pluggable module"), + N_("Watercolor style color selector"), "Raph Levien , Sven Neumann ", "v0.3", "(c) 1998-1999, released under the GPL", @@ -289,22 +289,6 @@ colorsel_water_update (ColorselWater *water) &water->rgb, &hsv); } - - - - - - - - - - - - - - - - static gdouble calc (gdouble x, gdouble y, @@ -318,7 +302,6 @@ calc (gdouble x, return 128 + (x - (IMAGE_SIZE >> 1)) * c - (y - (IMAGE_SIZE >> 1)) * s; } - /* Initialize the preview */ static void select_area_draw (GtkWidget *preview) @@ -352,7 +335,6 @@ select_area_draw (GtkWidget *preview) } } - static void add_pigment (ColorselWater *colorsel, gboolean erase, @@ -364,7 +346,7 @@ add_pigment (ColorselWater *colorsel, much *= (gdouble) colorsel->pressure_adjust; - if (erase) + if (erase) { colorsel->rgb.r = 1 - (1 - colorsel->rgb.r) * (1 - much); colorsel->rgb.g = 1 - (1 - colorsel->rgb.g) * (1 - much); @@ -429,7 +411,10 @@ button_press_event (GtkWidget *widget, water->last_x = event->x; water->last_y = event->y; - water->last_pressure = 1.0; /* FIXME: event->pressure */ + water->last_pressure = 0.5; + + gdk_event_get_axis ((GdkEvent *) event, GDK_AXIS_PRESSURE, + &water->last_pressure); water->button_state |= 1 << event->button;