Moved generic datafile loading to LibGimpBase:

2002-10-23  Michael Natterer  <mitch@gimp.org>

	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-23  Michael Natterer  <mitch@gimp.org>

	* 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.
This commit is contained in:
Michael Natterer 2002-10-23 14:55:07 +00:00 committed by Michael Natterer
parent 5f5e05a805
commit c7ac6aff52
63 changed files with 1790 additions and 1827 deletions

View file

@ -1,3 +1,65 @@
2002-10-23 Michael Natterer <mitch@gimp.org>
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 <sven@gimp.org> 2002-10-22 Sven Neumann <sven@gimp.org>
* app/gui/offset-dialog.c (offset_ok_callback): don't free the * app/gui/offset-dialog.c (offset_ok_callback): don't free the

View file

@ -50,8 +50,6 @@ libappcore_a_sources = \
gimpdata.h \ gimpdata.h \
gimpdatafactory.c \ gimpdatafactory.c \
gimpdatafactory.h \ gimpdatafactory.h \
gimpdatafiles.c \
gimpdatafiles.h \
gimpdatalist.c \ gimpdatalist.c \
gimpdatalist.h \ gimpdatalist.h \
gimpdocumentlist.c \ gimpdocumentlist.c \

View file

@ -203,8 +203,6 @@ typedef GimpToolOptions * (* GimpToolOptionsNewFunc) (GimpToolInfo *tool_info);
typedef void (* GimpInitStatusFunc) (const gchar *text1, typedef void (* GimpInitStatusFunc) (const gchar *text1,
const gchar *text2, const gchar *text2,
gdouble percentage); gdouble percentage);
typedef void (* GimpDataFileLoaderFunc) (const gchar *filename,
gpointer loader_data);
typedef GimpData * (* GimpDataObjectLoaderFunc) (const gchar *filename); typedef GimpData * (* GimpDataObjectLoaderFunc) (const gchar *filename);

View file

@ -38,7 +38,6 @@
#include "gimp.h" #include "gimp.h"
#include "gimpcoreconfig.h" #include "gimpcoreconfig.h"
#include "gimpdatafiles.h"
#include "gimplist.h" #include "gimplist.h"
#include "gimpmodules.h" #include "gimpmodules.h"
@ -47,37 +46,12 @@
#include "libgimp/gimpintl.h" #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 void
gimp_modules_init (Gimp *gimp) gimp_modules_init (Gimp *gimp)
{ {
g_return_if_fail (GIMP_IS_GIMP (gimp)); g_return_if_fail (GIMP_IS_GIMP (gimp));
gimp->modules = gimp_list_new (GIMP_TYPE_MODULE, gimp->module_db = gimp_module_db_new (gimp->be_verbose);
GIMP_CONTAINER_POLICY_STRONG);
gimp_object_set_name (GIMP_OBJECT (gimp->modules), "modules");
gimp->write_modulerc = FALSE; gimp->write_modulerc = FALSE;
} }
@ -86,10 +60,10 @@ gimp_modules_exit (Gimp *gimp)
{ {
g_return_if_fail (GIMP_IS_GIMP (gimp)); g_return_if_fail (GIMP_IS_GIMP (gimp));
if (gimp->modules) if (gimp->module_db)
{ {
g_object_unref (G_OBJECT (gimp->modules)); g_object_unref (G_OBJECT (gimp->module_db));
gimp->modules = NULL; gimp->module_db = NULL;
} }
} }
@ -104,52 +78,11 @@ gimp_modules_load (Gimp *gimp)
gimprc_parse_file (filename); gimprc_parse_file (filename);
g_free (filename); g_free (filename);
if (g_module_supported ()) gimp_module_db_set_load_inhibit (gimp->module_db,
gimp_datafiles_read_directories (gimp->config->module_path, gimp->config->module_db_load_inhibit);
0 /* no flags */,
gimp_modules_module_initialize,
gimp);
#ifdef DUMP_DB gimp_module_db_load (gimp->module_db,
gimp_container_foreach (gimp->modules, gimp_modules_dump_module, NULL); gimp->config->module_path);
#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);
} }
static void static void
@ -166,186 +99,49 @@ add_to_inhibit_string (gpointer data,
} }
} }
static gboolean void
gimp_modules_write_modulerc (Gimp *gimp) gimp_modules_unload (Gimp *gimp)
{ {
GString *str; g_return_if_fail (GIMP_IS_GIMP (gimp));
gchar *p;
gchar *filename;
FILE *fp;
gboolean saved = FALSE;
str = g_string_new (NULL); if (gimp->write_modulerc)
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)
{ {
fprintf (fp, "(module-load-inhibit \"%s\")\n", p); GString *str;
fclose (fp); gchar *p;
saved = TRUE; 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) */ if (fp)
static gboolean {
valid_module_name (const gchar *filename) fprintf (fp, "(module-load-inhibit \"%s\")\n", p);
{ fclose (fp);
gchar *basename;
gint len;
basename = g_path_get_basename (filename); gimp->write_modulerc = FALSE;
}
len = strlen (basename); g_string_free (str, TRUE);
#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");
} }
} }
#endif
static void void
gimp_modules_module_on_disk_func (gpointer data, gimp_modules_refresh (Gimp *gimp)
gpointer user_data)
{ {
GimpModule *module; g_return_if_fail (GIMP_IS_GIMP (gimp));
GList **kill_list;
gint old_on_disk;
module = (GimpModule *) data; gimp_module_db_set_load_inhibit (gimp->module_db,
kill_list = (GList **) user_data; gimp->config->module_db_load_inhibit);
old_on_disk = module->on_disk; gimp_module_db_refresh (gimp->module_db,
gimp->config->module_path);
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);
} }

View file

@ -328,7 +328,7 @@ gimp_finalize (GObject *object)
gimp->images = NULL; gimp->images = NULL;
} }
if (gimp->modules) if (gimp->module_db)
gimp_modules_exit (gimp); gimp_modules_exit (gimp);
paint_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 += g_list_length (gimp->user_units) * sizeof (GList); /* FIXME */
memsize += (gimp_object_get_memsize (GIMP_OBJECT (gimp->parasites)) + memsize += gimp_object_get_memsize (GIMP_OBJECT (gimp->parasites));
gimp_object_get_memsize (GIMP_OBJECT (gimp->modules)));
memsize += gimp_g_object_get_memsize (G_OBJECT (gimp->module_db));
memsize += (g_hash_table_size (gimp->image_table) * memsize += (g_hash_table_size (gimp->image_table) *
3 * sizeof (gpointer)); /* FIXME */ 3 * sizeof (gpointer)); /* FIXME */

View file

@ -73,7 +73,7 @@ struct _Gimp
GimpContainer *paint_info_list; GimpContainer *paint_info_list;
GimpContainer *modules; GimpModuleDB *module_db;
gboolean write_modulerc; gboolean write_modulerc;
GimpContainer *images; GimpContainer *images;

View file

@ -195,7 +195,7 @@ gimp_container_class_init (GimpContainerClass *klass)
NULL, NULL, NULL, NULL,
gimp_marshal_VOID__OBJECT, gimp_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
G_TYPE_OBJECT); GIMP_TYPE_OBJECT);
container_signals[REMOVE] = container_signals[REMOVE] =
g_signal_new ("remove", g_signal_new ("remove",
@ -205,7 +205,7 @@ gimp_container_class_init (GimpContainerClass *klass)
NULL, NULL, NULL, NULL,
gimp_marshal_VOID__OBJECT, gimp_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
G_TYPE_OBJECT); GIMP_TYPE_OBJECT);
container_signals[REORDER] = container_signals[REORDER] =
g_signal_new ("reorder", g_signal_new ("reorder",
@ -215,7 +215,7 @@ gimp_container_class_init (GimpContainerClass *klass)
NULL, NULL, NULL, NULL,
gimp_marshal_VOID__OBJECT_INT, gimp_marshal_VOID__OBJECT_INT,
G_TYPE_NONE, 2, G_TYPE_NONE, 2,
G_TYPE_OBJECT, GIMP_TYPE_OBJECT,
G_TYPE_INT); G_TYPE_INT);
container_signals[FREEZE] = container_signals[FREEZE] =
@ -396,7 +396,7 @@ gimp_container_serialize_foreach (GObject *object,
{ {
GimpConfigInterface *config_iface; GimpConfigInterface *config_iface;
GString *str; GString *str;
const gchar *name = NULL; const gchar *name;
config_iface = GIMP_GET_CONFIG_INTERFACE (object); config_iface = GIMP_GET_CONFIG_INTERFACE (object);
@ -413,8 +413,7 @@ gimp_container_serialize_foreach (GObject *object,
g_string_append_printf (str, "(%s ", g_string_append_printf (str, "(%s ",
g_type_name (G_TYPE_FROM_INSTANCE (object))); 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) if (name)
{ {

View file

@ -23,12 +23,13 @@
#include <glib-object.h> #include <glib-object.h>
#include "libgimpbase/gimpbase.h"
#include "core-types.h" #include "core-types.h"
#include "gimpcontext.h" #include "gimpcontext.h"
#include "gimpdata.h" #include "gimpdata.h"
#include "gimpdatafactory.h" #include "gimpdatafactory.h"
#include "gimpdatafiles.h"
#include "gimpdatalist.h" #include "gimpdatalist.h"
#include "libgimp/gimpintl.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 gsize gimp_data_factory_get_memsize (GimpObject *object);
static void gimp_data_factory_data_load_callback (const gchar *filename, static void gimp_data_factory_data_load_callback (GimpDatafileData *file_data);
gpointer callback_data);
static GimpObjectClass *parent_class = NULL; static GimpObjectClass *parent_class = NULL;
@ -174,7 +174,8 @@ gimp_data_factory_data_init (GimpDataFactory *factory,
if (factory->data_path && *factory->data_path) 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, gimp_data_factory_data_load_callback,
factory); factory);
} }
@ -303,19 +304,18 @@ gimp_data_factory_data_get_standard (GimpDataFactory *factory)
} }
static void static void
gimp_data_factory_data_load_callback (const gchar *filename, gimp_data_factory_data_load_callback (GimpDatafileData *file_data)
gpointer callback_data)
{ {
GimpDataFactory *factory; GimpDataFactory *factory;
gint i; gint i;
factory = (GimpDataFactory *) callback_data; factory = (GimpDataFactory *) file_data->user_data;
for (i = 0; i < factory->n_loader_entries; i++) for (i = 0; i < factory->n_loader_entries; i++)
{ {
if (factory->loader_entries[i].extension) 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)) factory->loader_entries[i].extension))
{ {
goto insert; goto insert;
@ -326,7 +326,7 @@ gimp_data_factory_data_load_callback (const gchar *filename,
g_message (_("Trying legacy loader on\n" g_message (_("Trying legacy loader on\n"
"file '%s'\n" "file '%s'\n"
"with unknown extension."), "with unknown extension."),
filename); file_data->filename);
goto insert; goto insert;
} }
} }
@ -337,11 +337,11 @@ gimp_data_factory_data_load_callback (const gchar *filename,
{ {
GimpData *data; GimpData *data;
data = (GimpData *) (* factory->loader_entries[i].load_func) (filename); data = (GimpData *) (* factory->loader_entries[i].load_func) (file_data->filename);
if (! data) 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 else
{ {

View file

@ -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 <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <glib-object.h>
#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;
}

View file

@ -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 <time.h>
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__ */

View file

@ -131,7 +131,7 @@ gimp_list_dispose (GObject *object)
while (list->list) while (list->list)
{ {
gimp_container_remove (GIMP_CONTAINER (list), gimp_container_remove (GIMP_CONTAINER (list),
(GimpObject *) list->list->data); GIMP_OBJECT (list->list->data));
} }
G_OBJECT_CLASS (parent_class)->dispose (object); 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)) 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; 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 || g_return_val_if_fail (policy == GIMP_CONTAINER_POLICY_STRONG ||
policy == GIMP_CONTAINER_POLICY_WEAK, NULL); policy == GIMP_CONTAINER_POLICY_WEAK, NULL);

View file

@ -38,7 +38,6 @@
#include "gimp.h" #include "gimp.h"
#include "gimpcoreconfig.h" #include "gimpcoreconfig.h"
#include "gimpdatafiles.h"
#include "gimplist.h" #include "gimplist.h"
#include "gimpmodules.h" #include "gimpmodules.h"
@ -47,37 +46,12 @@
#include "libgimp/gimpintl.h" #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 void
gimp_modules_init (Gimp *gimp) gimp_modules_init (Gimp *gimp)
{ {
g_return_if_fail (GIMP_IS_GIMP (gimp)); g_return_if_fail (GIMP_IS_GIMP (gimp));
gimp->modules = gimp_list_new (GIMP_TYPE_MODULE, gimp->module_db = gimp_module_db_new (gimp->be_verbose);
GIMP_CONTAINER_POLICY_STRONG);
gimp_object_set_name (GIMP_OBJECT (gimp->modules), "modules");
gimp->write_modulerc = FALSE; gimp->write_modulerc = FALSE;
} }
@ -86,10 +60,10 @@ gimp_modules_exit (Gimp *gimp)
{ {
g_return_if_fail (GIMP_IS_GIMP (gimp)); g_return_if_fail (GIMP_IS_GIMP (gimp));
if (gimp->modules) if (gimp->module_db)
{ {
g_object_unref (G_OBJECT (gimp->modules)); g_object_unref (G_OBJECT (gimp->module_db));
gimp->modules = NULL; gimp->module_db = NULL;
} }
} }
@ -104,52 +78,11 @@ gimp_modules_load (Gimp *gimp)
gimprc_parse_file (filename); gimprc_parse_file (filename);
g_free (filename); g_free (filename);
if (g_module_supported ()) gimp_module_db_set_load_inhibit (gimp->module_db,
gimp_datafiles_read_directories (gimp->config->module_path, gimp->config->module_db_load_inhibit);
0 /* no flags */,
gimp_modules_module_initialize,
gimp);
#ifdef DUMP_DB gimp_module_db_load (gimp->module_db,
gimp_container_foreach (gimp->modules, gimp_modules_dump_module, NULL); gimp->config->module_path);
#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);
} }
static void static void
@ -166,186 +99,49 @@ add_to_inhibit_string (gpointer data,
} }
} }
static gboolean void
gimp_modules_write_modulerc (Gimp *gimp) gimp_modules_unload (Gimp *gimp)
{ {
GString *str; g_return_if_fail (GIMP_IS_GIMP (gimp));
gchar *p;
gchar *filename;
FILE *fp;
gboolean saved = FALSE;
str = g_string_new (NULL); if (gimp->write_modulerc)
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)
{ {
fprintf (fp, "(module-load-inhibit \"%s\")\n", p); GString *str;
fclose (fp); gchar *p;
saved = TRUE; 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) */ if (fp)
static gboolean {
valid_module_name (const gchar *filename) fprintf (fp, "(module-load-inhibit \"%s\")\n", p);
{ fclose (fp);
gchar *basename;
gint len;
basename = g_path_get_basename (filename); gimp->write_modulerc = FALSE;
}
len = strlen (basename); g_string_free (str, TRUE);
#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");
} }
} }
#endif
static void void
gimp_modules_module_on_disk_func (gpointer data, gimp_modules_refresh (Gimp *gimp)
gpointer user_data)
{ {
GimpModule *module; g_return_if_fail (GIMP_IS_GIMP (gimp));
GList **kill_list;
gint old_on_disk;
module = (GimpModule *) data; gimp_module_db_set_load_inhibit (gimp->module_db,
kill_list = (GList **) user_data; gimp->config->module_db_load_inhibit);
old_on_disk = module->on_disk; gimp_module_db_refresh (gimp->module_db,
gimp->config->module_path);
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);
} }

View file

@ -314,18 +314,28 @@ gimp_object_get_memsize (GimpObject *object)
return GIMP_OBJECT_GET_CLASS (object)->get_memsize (object); return GIMP_OBJECT_GET_CLASS (object)->get_memsize (object);
} }
static gsize gsize
gimp_object_real_get_memsize (GimpObject *object) gimp_g_object_get_memsize (GObject *object)
{ {
GTypeQuery type_query; GTypeQuery type_query;
gsize memsize = 0; gsize memsize = 0;
g_return_val_if_fail (G_IS_OBJECT (object), 0);
g_type_query (G_TYPE_FROM_INSTANCE (object), &type_query); g_type_query (G_TYPE_FROM_INSTANCE (object), &type_query);
memsize += type_query.instance_size; memsize += type_query.instance_size;
return memsize;
}
static gsize
gimp_object_real_get_memsize (GimpObject *object)
{
gsize memsize = 0;
if (object->name) if (object->name)
memsize += strlen (object->name) + 1; memsize += strlen (object->name) + 1;
return memsize; return memsize + gimp_g_object_get_memsize ((GObject *) object);
} }

View file

@ -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, void gimp_object_set_name (GimpObject *object,
const gchar *name); const gchar *name);
const gchar * gimp_object_get_name (const GimpObject *object); const gchar * gimp_object_get_name (const GimpObject *object);
void gimp_object_name_changed (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__ */ #endif /* __GIMP_OBJECT_H__ */

View file

@ -30,19 +30,21 @@
#include "gui-types.h" #include "gui-types.h"
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontainer.h"
#include "core/gimpmodules.h" #include "core/gimpmodules.h"
#include "widgets/gimpviewabledialog.h"
#include "module-browser.h" #include "module-browser.h"
#include "libgimp/gimpintl.h" #include "libgimp/gimpintl.h"
#define NUM_INFO_LINES 8 #define NUM_INFO_LINES 9
enum enum
{ {
PATH_COLUMN, PATH_COLUMN,
AUTO_COLUMN,
MODULE_COLUMN, MODULE_COLUMN,
NUM_COLUMNS NUM_COLUMNS
}; };
@ -57,7 +59,6 @@ struct _ModuleBrowser
GimpModule *last_update; GimpModule *last_update;
GtkWidget *button; GtkWidget *button;
GtkListStore *list; GtkListStore *list;
GtkWidget *load_inhibit_check;
GQuark modules_handler_id; GQuark modules_handler_id;
Gimp *gimp; Gimp *gimp;
@ -66,30 +67,32 @@ struct _ModuleBrowser
/* local function prototypes */ /* local function prototypes */
static void browser_popdown_callback (GtkWidget *widget, static void browser_popdown_callback (GtkWidget *widget,
gpointer data); gpointer data);
static void browser_destroy_callback (GtkWidget *widget, static void browser_destroy_callback (GtkWidget *widget,
ModuleBrowser *browser); ModuleBrowser *browser);
static void browser_load_inhibit_callback (GtkWidget *widget, static void browser_select_callback (GtkTreeSelection *sel,
ModuleBrowser *browser); ModuleBrowser *browser);
static void browser_select_callback (GtkTreeSelection *sel, static void browser_autoload_toggled (GtkCellRendererToggle *celltoggle,
ModuleBrowser *browser); gchar *path_string,
static void browser_load_unload_callback (GtkWidget *widget, ModuleBrowser *browser);
ModuleBrowser *browser); static void browser_load_unload_callback (GtkWidget *widget,
static void browser_refresh_callback (GtkWidget *widget, ModuleBrowser *browser);
ModuleBrowser *browser); static void browser_refresh_callback (GtkWidget *widget,
static void make_list_item (gpointer data, ModuleBrowser *browser);
gpointer user_data); static void make_list_item (gpointer data,
static void browser_info_add (GimpContainer *container, gpointer user_data);
GimpModule *module, static void browser_info_add (GimpModuleDB *db,
ModuleBrowser *browser); GimpModule *module,
static void browser_info_remove (GimpContainer *container, ModuleBrowser *browser);
GimpModule *module, static void browser_info_remove (GimpModuleDB *db,
ModuleBrowser *browser); GimpModule *module,
static void browser_info_update (GimpModule *module, ModuleBrowser *browser);
ModuleBrowser *browser); static void browser_info_update (GimpModuleDB *db,
static void browser_info_init (ModuleBrowser *browser, GimpModule *module,
GtkWidget *table); ModuleBrowser *browser);
static void browser_info_init (ModuleBrowser *browser,
GtkWidget *table);
/* public functions */ /* public functions */
@ -97,31 +100,40 @@ static void browser_info_init (ModuleBrowser *browser,
GtkWidget * GtkWidget *
module_browser_new (Gimp *gimp) module_browser_new (Gimp *gimp)
{ {
GtkWidget *shell; GtkWidget *shell;
GtkWidget *hbox; GtkWidget *hbox;
GtkWidget *vbox; GtkWidget *vbox;
GtkWidget *listbox; GtkWidget *listbox;
GtkWidget *button; GtkWidget *tv;
GtkWidget *tv; ModuleBrowser *browser;
ModuleBrowser *browser; GtkTreeSelection *sel;
GtkTreeSelection *sel; GtkTreeIter iter;
GtkTreeIter iter; GtkTreeViewColumn *col;
GtkCellRenderer *rend;
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
shell = gimp_dialog_new (_("Module DB"), "module_db_dialog", browser = g_new0 (ModuleBrowser, 1);
gimp_standard_help_func,
"dialogs/module_browser.html",
GTK_WIN_POS_NONE,
FALSE, TRUE, FALSE,
GTK_STOCK_CLOSE, browser_popdown_callback, browser->gimp = gimp;
NULL, NULL, NULL, TRUE, TRUE,
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_STOCK_REFRESH, browser_refresh_callback,
gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); 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_container_add (GTK_CONTAINER (GTK_DIALOG (shell)->vbox), vbox);
gtk_widget_show (vbox); gtk_widget_show (vbox);
@ -135,45 +147,47 @@ module_browser_new (Gimp *gimp)
gtk_widget_set_size_request (listbox, 125, 100); gtk_widget_set_size_request (listbox, 125, 100);
gtk_widget_show (listbox); gtk_widget_show (listbox);
browser = g_new0 (ModuleBrowser, 1);
browser->gimp = gimp;
browser->list = gtk_list_store_new (NUM_COLUMNS, 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)); tv = gtk_tree_view_new_with_model (GTK_TREE_MODEL (browser->list));
g_object_unref (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), rend = gtk_cell_renderer_toggle_new ();
-1, NULL,
gtk_cell_renderer_text_new (),
"text", PATH_COLUMN,
NULL);
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_container_add (GTK_CONTAINER (listbox), tv);
gtk_widget_show (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_table_set_col_spacings (GTK_TABLE (browser->table), 4);
gtk_box_pack_start (GTK_BOX (vbox), browser->table, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), browser->table, FALSE, FALSE, 0);
gtk_widget_show (browser->table); gtk_widget_show (browser->table);
hbox = gtk_hbutton_box_new (); hbox = gtk_hbutton_box_new ();
gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_SPREAD); 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); 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 = gtk_button_new_with_label ("");
browser->button_label = gtk_bin_get_child (GTK_BIN (browser->button)); browser->button_label = gtk_bin_get_child (GTK_BIN (browser->button));
@ -185,7 +199,8 @@ module_browser_new (Gimp *gimp)
browser); browser);
browser_info_init (browser, browser->table); 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)); 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)) if (gtk_tree_model_get_iter_root (GTK_TREE_MODEL (browser->list), &iter))
gtk_tree_selection_select_iter (sel, &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. * appropriately.
*/ */
browser->modules_handler_id = g_signal_connect (G_OBJECT (gimp->module_db), "add",
gimp_container_add_handler (gimp->modules, "modified",
G_CALLBACK (browser_info_update),
browser);
g_signal_connect (G_OBJECT (gimp->modules), "add",
G_CALLBACK (browser_info_add), G_CALLBACK (browser_info_add),
browser); browser);
g_signal_connect (G_OBJECT (gimp->modules), "remove", g_signal_connect (G_OBJECT (gimp->module_db), "remove",
G_CALLBACK (browser_info_remove), G_CALLBACK (browser_info_remove),
browser); 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_signal_connect (G_OBJECT (shell), "destroy",
G_CALLBACK (browser_destroy_callback), G_CALLBACK (browser_destroy_callback),
@ -232,36 +245,19 @@ static void
browser_destroy_callback (GtkWidget *widget, browser_destroy_callback (GtkWidget *widget,
ModuleBrowser *browser) 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_info_add,
browser); 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_info_remove,
browser); browser);
gimp_container_remove_handler (browser->gimp->modules, g_signal_handlers_disconnect_by_func (G_OBJECT (browser->gimp->module_db),
browser->modules_handler_id); browser_info_update,
browser);
g_free (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 static void
browser_select_callback (GtkTreeSelection *sel, browser_select_callback (GtkTreeSelection *sel,
ModuleBrowser *browser) ModuleBrowser *browser)
@ -278,7 +274,42 @@ browser_select_callback (GtkTreeSelection *sel,
browser->last_update = module; 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 static void
@ -287,8 +318,15 @@ browser_load_unload_callback (GtkWidget *widget,
{ {
if (browser->last_update->state != GIMP_MODULE_STATE_LOADED_OK) if (browser->last_update->state != GIMP_MODULE_STATE_LOADED_OK)
{ {
if (g_type_module_use (G_TYPE_MODULE (browser->last_update))) if (browser->last_update->info)
g_type_module_unuse (G_TYPE_MODULE (browser->last_update)); {
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); 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_append (browser->list, &iter);
gtk_list_store_set (browser->list, &iter, gtk_list_store_set (browser->list, &iter,
PATH_COLUMN, module->filename, PATH_COLUMN, module->filename,
AUTO_COLUMN, ! module->load_inhibit,
MODULE_COLUMN, module, MODULE_COLUMN, module,
-1); -1);
} }
static void static void
browser_info_add (GimpContainer *container, browser_info_add (GimpModuleDB *db,
GimpModule *module, GimpModule *module,
ModuleBrowser *browser) ModuleBrowser*browser)
{ {
make_list_item (module, browser); make_list_item (module, browser);
} }
static void static void
browser_info_remove (GimpContainer *container, browser_info_remove (GimpModuleDB *db,
GimpModule *mod, GimpModule *mod,
ModuleBrowser *browser) ModuleBrowser *browser)
{ {
@ -359,19 +398,15 @@ browser_info_remove (GimpContainer *container,
} }
static void static void
browser_info_update (GimpModule *module, browser_info_update (GimpModuleDB *db,
GimpModule *module,
ModuleBrowser *browser) ModuleBrowser *browser)
{ {
GTypeModule *g_type_module;
const gchar *text[NUM_INFO_LINES]; const gchar *text[NUM_INFO_LINES];
gint i; gint i;
static const gchar * const statename[] = g_type_module = G_TYPE_MODULE (module);
{
N_("Module error"),
N_("Loaded OK"),
N_("Load failed"),
N_("Unloaded OK")
};
/* only update the info if we're actually showing it */ /* only update the info if we're actually showing it */
if (module != browser->last_update) 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->label[i]), "");
gtk_label_set_text (GTK_LABEL (browser->button_label), _("<No modules>")); gtk_label_set_text (GTK_LABEL (browser->button_label), _("<No modules>"));
gtk_widget_set_sensitive (GTK_WIDGET (browser->button), FALSE); gtk_widget_set_sensitive (GTK_WIDGET (browser->button), FALSE);
gtk_widget_set_sensitive (GTK_WIDGET (browser->load_inhibit_check), FALSE);
return; return;
} }
@ -406,19 +440,31 @@ browser_info_update (GimpModule *module,
text[5] = module->on_disk ? _("On disk") : _("No longer available"); 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) if (module->state == GIMP_MODULE_STATE_ERROR && module->last_module_error)
text[7] = module->last_module_error; text[7] = module->last_module_error;
else else
text[7] = "--"; text[7] = "--";
for (i = 0; i < NUM_INFO_LINES; i++) if (g_type_module->type_infos || g_type_module->interface_infos)
gtk_label_set_text (GTK_LABEL (browser->label[i]), gettext (text[i])); {
gchar *str;
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (browser->load_inhibit_check), str = g_strdup_printf ("%d Types, %d Interfaces",
! module->load_inhibit); g_slist_length (g_type_module->type_infos),
gtk_widget_set_sensitive (GTK_WIDGET (browser->load_inhibit_check), TRUE); 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) */ /* work out what the button should do (if anything) */
switch (module->state) switch (module->state)
@ -426,8 +472,13 @@ browser_info_update (GimpModule *module,
case GIMP_MODULE_STATE_ERROR: case GIMP_MODULE_STATE_ERROR:
case GIMP_MODULE_STATE_LOAD_FAILED: case GIMP_MODULE_STATE_LOAD_FAILED:
case GIMP_MODULE_STATE_UNLOADED_OK: case GIMP_MODULE_STATE_UNLOADED_OK:
gtk_label_set_text (GTK_LABEL (browser->button_label), _("Load")); if (module->info)
gtk_widget_set_sensitive (GTK_WIDGET (browser->button), module->on_disk); 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; break;
case GIMP_MODULE_STATE_LOADED_OK: case GIMP_MODULE_STATE_LOADED_OK:
@ -444,7 +495,7 @@ browser_info_init (ModuleBrowser *browser,
GtkWidget *label; GtkWidget *label;
gint i; gint i;
static const gchar *text[] = static const gchar * const text[] =
{ {
N_("Purpose:"), N_("Purpose:"),
N_("Author:"), N_("Author:"),
@ -453,7 +504,8 @@ browser_info_init (ModuleBrowser *browser,
N_("Date:"), N_("Date:"),
N_("Location:"), N_("Location:"),
N_("State:"), N_("State:"),
N_("Last Error:") N_("Last Error:"),
N_("Available Types:")
}; };
for (i = 0; i < G_N_ELEMENTS (text); i++) 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_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 2);
gtk_widget_show (browser->label[i]); 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);
} }

View file

@ -40,11 +40,11 @@
#define LIST_WIDTH 150 #define LIST_WIDTH 150
#define LIST_HEIGHT 100 #define LIST_HEIGHT 100
#define UPDATE_DISPLAY(shell) G_STMT_START \ #define UPDATE_DISPLAY(cdd) G_STMT_START \
{ \ { \
gimp_display_shell_expose_full (shell); \ gimp_display_shell_expose_full ((cdd)->shell); \
gimp_display_shell_flush (shell); \ gimp_display_shell_flush ((cdd)->shell); \
} G_STMT_END } G_STMT_END
typedef struct _ColorDisplayDialog ColorDisplayDialog; typedef struct _ColorDisplayDialog ColorDisplayDialog;
@ -61,16 +61,22 @@ struct _ColorDisplayDialog
GtkTreeSelection *src_sel; GtkTreeSelection *src_sel;
GtkTreeSelection *dest_sel; GtkTreeSelection *dest_sel;
GimpColorDisplay *selected;
gboolean modified; gboolean modified;
GList *old_nodes; GList *old_nodes;
GList *conf_nodes;
GtkWidget *add_button; GtkWidget *add_button;
GtkWidget *remove_button; GtkWidget *remove_button;
GtkWidget *up_button; GtkWidget *up_button;
GtkWidget *down_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); ColorDisplayDialog *cdd);
static void color_display_down_callback (GtkWidget *widget, static void color_display_down_callback (GtkWidget *widget,
ColorDisplayDialog *cdd); ColorDisplayDialog *cdd);
static void color_display_configure_callback (GtkWidget *widget,
ColorDisplayDialog *cdd);
static void dest_list_populate (GList *node_list, static void dest_list_populate (GList *node_list,
GtkTreeStore *dest); GtkTreeStore *dest);
@ -99,12 +103,18 @@ static void src_selection_changed (GtkTreeSelection *sel,
static void dest_selection_changed (GtkTreeSelection *sel, static void dest_selection_changed (GtkTreeSelection *sel,
ColorDisplayDialog *cdd); 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 color_display_update_up_and_down (ColorDisplayDialog *cdd);
static void static void
make_dialog (ColorDisplayDialog *cdd) make_dialog (ColorDisplayDialog *cdd)
{ {
GtkWidget *main_vbox;
GtkWidget *hbox; GtkWidget *hbox;
GtkWidget *editor; GtkWidget *editor;
GtkWidget *scrolled_win; GtkWidget *scrolled_win;
@ -126,11 +136,15 @@ make_dialog (ColorDisplayDialog *cdd)
NULL); NULL);
hbox = gtk_hbox_new (FALSE, 6); main_vbox = gtk_vbox_new (FALSE, 6);
gtk_container_set_border_width (GTK_CONTAINER (hbox), 6); gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (cdd->dialog)->vbox), hbox, gtk_box_pack_start (GTK_BOX (GTK_DIALOG (cdd->dialog)->vbox), main_vbox,
TRUE, TRUE, 0); 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); scrolled_win = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win),
GTK_SHADOW_IN); GTK_SHADOW_IN);
@ -220,18 +234,8 @@ make_dialog (ColorDisplayDialog *cdd)
NULL, NULL,
cdd); 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->up_button, FALSE);
gtk_widget_set_sensitive (cdd->down_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); scrolled_win = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win),
@ -262,7 +266,36 @@ make_dialog (ColorDisplayDialog *cdd)
G_CALLBACK (dest_selection_changed), G_CALLBACK (dest_selection_changed),
cdd); 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); 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 static void
@ -284,7 +317,7 @@ color_display_ok_callback (GtkWidget *widget,
g_list_free (cdd->old_nodes); 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; 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); 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); 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); 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); gtk_tree_selection_select_iter (cdd->dest_sel, &iter2);
UPDATE_DISPLAY (cdd->shell); UPDATE_DISPLAY (cdd);
}
}
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);
} }
} }
@ -614,6 +618,16 @@ dest_selection_changed (GtkTreeSelection *sel,
GtkTreeIter iter; GtkTreeIter iter;
GimpColorDisplay *filter = NULL; 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)) if (gtk_tree_selection_get_selected (sel, &model, &iter))
{ {
GValue val = { 0, }; GValue val = { 0, };
@ -625,8 +639,63 @@ dest_selection_changed (GtkTreeSelection *sel,
g_value_unset (&val); g_value_unset (&val);
} }
gtk_widget_set_sensitive (cdd->remove_button, (filter != NULL)); gtk_widget_set_sensitive (cdd->remove_button, (filter != NULL));
gtk_widget_set_sensitive (cdd->configure_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); 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);
}

View file

@ -31,7 +31,6 @@
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontainer.h" #include "core/gimpcontainer.h"
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "core/gimpdatafiles.h"
#include "core/gimpimage.h" #include "core/gimpimage.h"
#include "display/gimpdisplay.h" #include "display/gimpdisplay.h"
@ -72,8 +71,7 @@ static void gui_message (Gimp *gimp,
static GimpObject * gui_display_new (GimpImage *gimage, static GimpObject * gui_display_new (GimpImage *gimage,
guint scale); guint scale);
static void gui_themes_dir_foreach_func (const gchar *filename, static void gui_themes_dir_foreach_func (GimpDatafileData *file_data);
gpointer loader_data);
static gint gui_rotate_the_shield_harmonics (GtkWidget *widget, static gint gui_rotate_the_shield_harmonics (GtkWidget *widget,
GdkEvent *eevent, GdkEvent *eevent,
gpointer data); gpointer data);
@ -136,7 +134,7 @@ gui_themes_init (Gimp *gimp)
if (gimprc.theme_path) if (gimprc.theme_path)
{ {
gimp_datafiles_read_directories (gimprc.theme_path, gimp_datafiles_read_directories (gimprc.theme_path,
TYPE_DIRECTORY, G_FILE_TEST_IS_DIR,
gui_themes_dir_foreach_func, gui_themes_dir_foreach_func,
gimp); gimp);
} }
@ -463,22 +461,21 @@ gui_display_new (GimpImage *gimage,
} }
static void static void
gui_themes_dir_foreach_func (const gchar *filename, gui_themes_dir_foreach_func (GimpDatafileData *file_data)
gpointer loader_data)
{ {
Gimp *gimp; Gimp *gimp;
gchar *basename; 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) 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, g_hash_table_insert (themes_hash,
basename, basename,
g_strdup (filename)); g_strdup (file_data->filename));
} }
static gint static gint

View file

@ -30,19 +30,21 @@
#include "gui-types.h" #include "gui-types.h"
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontainer.h"
#include "core/gimpmodules.h" #include "core/gimpmodules.h"
#include "widgets/gimpviewabledialog.h"
#include "module-browser.h" #include "module-browser.h"
#include "libgimp/gimpintl.h" #include "libgimp/gimpintl.h"
#define NUM_INFO_LINES 8 #define NUM_INFO_LINES 9
enum enum
{ {
PATH_COLUMN, PATH_COLUMN,
AUTO_COLUMN,
MODULE_COLUMN, MODULE_COLUMN,
NUM_COLUMNS NUM_COLUMNS
}; };
@ -57,7 +59,6 @@ struct _ModuleBrowser
GimpModule *last_update; GimpModule *last_update;
GtkWidget *button; GtkWidget *button;
GtkListStore *list; GtkListStore *list;
GtkWidget *load_inhibit_check;
GQuark modules_handler_id; GQuark modules_handler_id;
Gimp *gimp; Gimp *gimp;
@ -66,30 +67,32 @@ struct _ModuleBrowser
/* local function prototypes */ /* local function prototypes */
static void browser_popdown_callback (GtkWidget *widget, static void browser_popdown_callback (GtkWidget *widget,
gpointer data); gpointer data);
static void browser_destroy_callback (GtkWidget *widget, static void browser_destroy_callback (GtkWidget *widget,
ModuleBrowser *browser); ModuleBrowser *browser);
static void browser_load_inhibit_callback (GtkWidget *widget, static void browser_select_callback (GtkTreeSelection *sel,
ModuleBrowser *browser); ModuleBrowser *browser);
static void browser_select_callback (GtkTreeSelection *sel, static void browser_autoload_toggled (GtkCellRendererToggle *celltoggle,
ModuleBrowser *browser); gchar *path_string,
static void browser_load_unload_callback (GtkWidget *widget, ModuleBrowser *browser);
ModuleBrowser *browser); static void browser_load_unload_callback (GtkWidget *widget,
static void browser_refresh_callback (GtkWidget *widget, ModuleBrowser *browser);
ModuleBrowser *browser); static void browser_refresh_callback (GtkWidget *widget,
static void make_list_item (gpointer data, ModuleBrowser *browser);
gpointer user_data); static void make_list_item (gpointer data,
static void browser_info_add (GimpContainer *container, gpointer user_data);
GimpModule *module, static void browser_info_add (GimpModuleDB *db,
ModuleBrowser *browser); GimpModule *module,
static void browser_info_remove (GimpContainer *container, ModuleBrowser *browser);
GimpModule *module, static void browser_info_remove (GimpModuleDB *db,
ModuleBrowser *browser); GimpModule *module,
static void browser_info_update (GimpModule *module, ModuleBrowser *browser);
ModuleBrowser *browser); static void browser_info_update (GimpModuleDB *db,
static void browser_info_init (ModuleBrowser *browser, GimpModule *module,
GtkWidget *table); ModuleBrowser *browser);
static void browser_info_init (ModuleBrowser *browser,
GtkWidget *table);
/* public functions */ /* public functions */
@ -97,31 +100,40 @@ static void browser_info_init (ModuleBrowser *browser,
GtkWidget * GtkWidget *
module_browser_new (Gimp *gimp) module_browser_new (Gimp *gimp)
{ {
GtkWidget *shell; GtkWidget *shell;
GtkWidget *hbox; GtkWidget *hbox;
GtkWidget *vbox; GtkWidget *vbox;
GtkWidget *listbox; GtkWidget *listbox;
GtkWidget *button; GtkWidget *tv;
GtkWidget *tv; ModuleBrowser *browser;
ModuleBrowser *browser; GtkTreeSelection *sel;
GtkTreeSelection *sel; GtkTreeIter iter;
GtkTreeIter iter; GtkTreeViewColumn *col;
GtkCellRenderer *rend;
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
shell = gimp_dialog_new (_("Module DB"), "module_db_dialog", browser = g_new0 (ModuleBrowser, 1);
gimp_standard_help_func,
"dialogs/module_browser.html",
GTK_WIN_POS_NONE,
FALSE, TRUE, FALSE,
GTK_STOCK_CLOSE, browser_popdown_callback, browser->gimp = gimp;
NULL, NULL, NULL, TRUE, TRUE,
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_STOCK_REFRESH, browser_refresh_callback,
gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); 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_container_add (GTK_CONTAINER (GTK_DIALOG (shell)->vbox), vbox);
gtk_widget_show (vbox); gtk_widget_show (vbox);
@ -135,45 +147,47 @@ module_browser_new (Gimp *gimp)
gtk_widget_set_size_request (listbox, 125, 100); gtk_widget_set_size_request (listbox, 125, 100);
gtk_widget_show (listbox); gtk_widget_show (listbox);
browser = g_new0 (ModuleBrowser, 1);
browser->gimp = gimp;
browser->list = gtk_list_store_new (NUM_COLUMNS, 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)); tv = gtk_tree_view_new_with_model (GTK_TREE_MODEL (browser->list));
g_object_unref (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), rend = gtk_cell_renderer_toggle_new ();
-1, NULL,
gtk_cell_renderer_text_new (),
"text", PATH_COLUMN,
NULL);
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_container_add (GTK_CONTAINER (listbox), tv);
gtk_widget_show (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_table_set_col_spacings (GTK_TABLE (browser->table), 4);
gtk_box_pack_start (GTK_BOX (vbox), browser->table, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), browser->table, FALSE, FALSE, 0);
gtk_widget_show (browser->table); gtk_widget_show (browser->table);
hbox = gtk_hbutton_box_new (); hbox = gtk_hbutton_box_new ();
gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_SPREAD); 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); 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 = gtk_button_new_with_label ("");
browser->button_label = gtk_bin_get_child (GTK_BIN (browser->button)); browser->button_label = gtk_bin_get_child (GTK_BIN (browser->button));
@ -185,7 +199,8 @@ module_browser_new (Gimp *gimp)
browser); browser);
browser_info_init (browser, browser->table); 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)); 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)) if (gtk_tree_model_get_iter_root (GTK_TREE_MODEL (browser->list), &iter))
gtk_tree_selection_select_iter (sel, &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. * appropriately.
*/ */
browser->modules_handler_id = g_signal_connect (G_OBJECT (gimp->module_db), "add",
gimp_container_add_handler (gimp->modules, "modified",
G_CALLBACK (browser_info_update),
browser);
g_signal_connect (G_OBJECT (gimp->modules), "add",
G_CALLBACK (browser_info_add), G_CALLBACK (browser_info_add),
browser); browser);
g_signal_connect (G_OBJECT (gimp->modules), "remove", g_signal_connect (G_OBJECT (gimp->module_db), "remove",
G_CALLBACK (browser_info_remove), G_CALLBACK (browser_info_remove),
browser); 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_signal_connect (G_OBJECT (shell), "destroy",
G_CALLBACK (browser_destroy_callback), G_CALLBACK (browser_destroy_callback),
@ -232,36 +245,19 @@ static void
browser_destroy_callback (GtkWidget *widget, browser_destroy_callback (GtkWidget *widget,
ModuleBrowser *browser) 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_info_add,
browser); 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_info_remove,
browser); browser);
gimp_container_remove_handler (browser->gimp->modules, g_signal_handlers_disconnect_by_func (G_OBJECT (browser->gimp->module_db),
browser->modules_handler_id); browser_info_update,
browser);
g_free (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 static void
browser_select_callback (GtkTreeSelection *sel, browser_select_callback (GtkTreeSelection *sel,
ModuleBrowser *browser) ModuleBrowser *browser)
@ -278,7 +274,42 @@ browser_select_callback (GtkTreeSelection *sel,
browser->last_update = module; 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 static void
@ -287,8 +318,15 @@ browser_load_unload_callback (GtkWidget *widget,
{ {
if (browser->last_update->state != GIMP_MODULE_STATE_LOADED_OK) if (browser->last_update->state != GIMP_MODULE_STATE_LOADED_OK)
{ {
if (g_type_module_use (G_TYPE_MODULE (browser->last_update))) if (browser->last_update->info)
g_type_module_unuse (G_TYPE_MODULE (browser->last_update)); {
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); 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_append (browser->list, &iter);
gtk_list_store_set (browser->list, &iter, gtk_list_store_set (browser->list, &iter,
PATH_COLUMN, module->filename, PATH_COLUMN, module->filename,
AUTO_COLUMN, ! module->load_inhibit,
MODULE_COLUMN, module, MODULE_COLUMN, module,
-1); -1);
} }
static void static void
browser_info_add (GimpContainer *container, browser_info_add (GimpModuleDB *db,
GimpModule *module, GimpModule *module,
ModuleBrowser *browser) ModuleBrowser*browser)
{ {
make_list_item (module, browser); make_list_item (module, browser);
} }
static void static void
browser_info_remove (GimpContainer *container, browser_info_remove (GimpModuleDB *db,
GimpModule *mod, GimpModule *mod,
ModuleBrowser *browser) ModuleBrowser *browser)
{ {
@ -359,19 +398,15 @@ browser_info_remove (GimpContainer *container,
} }
static void static void
browser_info_update (GimpModule *module, browser_info_update (GimpModuleDB *db,
GimpModule *module,
ModuleBrowser *browser) ModuleBrowser *browser)
{ {
GTypeModule *g_type_module;
const gchar *text[NUM_INFO_LINES]; const gchar *text[NUM_INFO_LINES];
gint i; gint i;
static const gchar * const statename[] = g_type_module = G_TYPE_MODULE (module);
{
N_("Module error"),
N_("Loaded OK"),
N_("Load failed"),
N_("Unloaded OK")
};
/* only update the info if we're actually showing it */ /* only update the info if we're actually showing it */
if (module != browser->last_update) 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->label[i]), "");
gtk_label_set_text (GTK_LABEL (browser->button_label), _("<No modules>")); gtk_label_set_text (GTK_LABEL (browser->button_label), _("<No modules>"));
gtk_widget_set_sensitive (GTK_WIDGET (browser->button), FALSE); gtk_widget_set_sensitive (GTK_WIDGET (browser->button), FALSE);
gtk_widget_set_sensitive (GTK_WIDGET (browser->load_inhibit_check), FALSE);
return; return;
} }
@ -406,19 +440,31 @@ browser_info_update (GimpModule *module,
text[5] = module->on_disk ? _("On disk") : _("No longer available"); 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) if (module->state == GIMP_MODULE_STATE_ERROR && module->last_module_error)
text[7] = module->last_module_error; text[7] = module->last_module_error;
else else
text[7] = "--"; text[7] = "--";
for (i = 0; i < NUM_INFO_LINES; i++) if (g_type_module->type_infos || g_type_module->interface_infos)
gtk_label_set_text (GTK_LABEL (browser->label[i]), gettext (text[i])); {
gchar *str;
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (browser->load_inhibit_check), str = g_strdup_printf ("%d Types, %d Interfaces",
! module->load_inhibit); g_slist_length (g_type_module->type_infos),
gtk_widget_set_sensitive (GTK_WIDGET (browser->load_inhibit_check), TRUE); 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) */ /* work out what the button should do (if anything) */
switch (module->state) switch (module->state)
@ -426,8 +472,13 @@ browser_info_update (GimpModule *module,
case GIMP_MODULE_STATE_ERROR: case GIMP_MODULE_STATE_ERROR:
case GIMP_MODULE_STATE_LOAD_FAILED: case GIMP_MODULE_STATE_LOAD_FAILED:
case GIMP_MODULE_STATE_UNLOADED_OK: case GIMP_MODULE_STATE_UNLOADED_OK:
gtk_label_set_text (GTK_LABEL (browser->button_label), _("Load")); if (module->info)
gtk_widget_set_sensitive (GTK_WIDGET (browser->button), module->on_disk); 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; break;
case GIMP_MODULE_STATE_LOADED_OK: case GIMP_MODULE_STATE_LOADED_OK:
@ -444,7 +495,7 @@ browser_info_init (ModuleBrowser *browser,
GtkWidget *label; GtkWidget *label;
gint i; gint i;
static const gchar *text[] = static const gchar * const text[] =
{ {
N_("Purpose:"), N_("Purpose:"),
N_("Author:"), N_("Author:"),
@ -453,7 +504,8 @@ browser_info_init (ModuleBrowser *browser,
N_("Date:"), N_("Date:"),
N_("Location:"), N_("Location:"),
N_("State:"), N_("State:"),
N_("Last Error:") N_("Last Error:"),
N_("Available Types:")
}; };
for (i = 0; i < G_N_ELEMENTS (text); i++) 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_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 2);
gtk_widget_show (browser->label[i]); 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);
} }

View file

@ -86,7 +86,6 @@
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "core/gimpcoreconfig.h" #include "core/gimpcoreconfig.h"
#include "core/gimpdatafiles.h"
#include "core/gimpdrawable.h" #include "core/gimpdrawable.h"
#include "core/gimpimage.h" #include "core/gimpimage.h"

View file

@ -86,7 +86,6 @@
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "core/gimpcoreconfig.h" #include "core/gimpcoreconfig.h"
#include "core/gimpdatafiles.h"
#include "core/gimpdrawable.h" #include "core/gimpdrawable.h"
#include "core/gimpimage.h" #include "core/gimpimage.h"

View file

@ -86,7 +86,6 @@
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "core/gimpcoreconfig.h" #include "core/gimpcoreconfig.h"
#include "core/gimpdatafiles.h"
#include "core/gimpdrawable.h" #include "core/gimpdrawable.h"
#include "core/gimpimage.h" #include "core/gimpimage.h"

View file

@ -86,7 +86,6 @@
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "core/gimpcoreconfig.h" #include "core/gimpcoreconfig.h"
#include "core/gimpdatafiles.h"
#include "core/gimpdrawable.h" #include "core/gimpdrawable.h"
#include "core/gimpimage.h" #include "core/gimpimage.h"

View file

@ -31,7 +31,6 @@
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "core/gimpcoreconfig.h" #include "core/gimpcoreconfig.h"
#include "core/gimpdatafiles.h"
#include "core/gimpdrawable.h" #include "core/gimpdrawable.h"
#include "core/gimpimage.h" #include "core/gimpimage.h"
@ -57,8 +56,7 @@ struct _PlugInHelpPathDef
}; };
static void plug_ins_init_file (const gchar *filename, static void plug_ins_init_file (GimpDatafileData *file_data);
gpointer loader_data);
static void plug_ins_add_to_db (Gimp *gimp); static void plug_ins_add_to_db (Gimp *gimp);
static void plug_ins_proc_def_insert (PlugInProcDef *proc_def, static void plug_ins_proc_def_insert (PlugInProcDef *proc_def,
void (* superceed_fn) (void *)); void (* superceed_fn) (void *));
@ -95,7 +93,7 @@ plug_ins_init (Gimp *gimp,
/* search for binaries in the plug-in directory path */ /* search for binaries in the plug-in directory path */
gimp_datafiles_read_directories (gimp->config->plug_in_path, gimp_datafiles_read_directories (gimp->config->plug_in_path,
MODE_EXECUTABLE, G_FILE_TEST_IS_EXECUTABLE,
plug_ins_init_file, NULL); plug_ins_init_file, NULL);
/* read the pluginrc file for cached data */ /* read the pluginrc file for cached data */
@ -515,15 +513,14 @@ plug_ins_help_path (gchar *prog_name)
} }
static void static void
plug_ins_init_file (const gchar *filename, plug_ins_init_file (GimpDatafileData *file_data)
gpointer loader_data)
{ {
GSList *tmp; GSList *tmp;
PlugInDef *plug_in_def; PlugInDef *plug_in_def;
gchar *plug_in_name; gchar *plug_in_name;
gchar *basename; 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)) 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) 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; return;
} }
@ -542,8 +540,8 @@ plug_ins_init_file (const gchar *filename,
g_free (basename); g_free (basename);
plug_in_def = plug_in_def_new (filename); plug_in_def = plug_in_def_new (file_data->filename);
plug_in_def->mtime = gimp_datafile_mtime (); plug_in_def->mtime = file_data->mtime;
plug_in_def->query = TRUE; plug_in_def->query = TRUE;
plug_in_defs = g_slist_append (plug_in_defs, plug_in_def); plug_in_defs = g_slist_append (plug_in_defs, plug_in_def);

View file

@ -86,7 +86,6 @@
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "core/gimpcoreconfig.h" #include "core/gimpcoreconfig.h"
#include "core/gimpdatafiles.h"
#include "core/gimpdrawable.h" #include "core/gimpdrawable.h"
#include "core/gimpimage.h" #include "core/gimpimage.h"

View file

@ -86,7 +86,6 @@
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "core/gimpcoreconfig.h" #include "core/gimpcoreconfig.h"
#include "core/gimpdatafiles.h"
#include "core/gimpdrawable.h" #include "core/gimpdrawable.h"
#include "core/gimpimage.h" #include "core/gimpimage.h"

View file

@ -86,7 +86,6 @@
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "core/gimpcoreconfig.h" #include "core/gimpcoreconfig.h"
#include "core/gimpdatafiles.h"
#include "core/gimpdrawable.h" #include "core/gimpdrawable.h"
#include "core/gimpimage.h" #include "core/gimpimage.h"

View file

@ -86,7 +86,6 @@
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "core/gimpcoreconfig.h" #include "core/gimpcoreconfig.h"
#include "core/gimpdatafiles.h"
#include "core/gimpdrawable.h" #include "core/gimpdrawable.h"
#include "core/gimpimage.h" #include "core/gimpimage.h"

View file

@ -86,7 +86,6 @@
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "core/gimpcoreconfig.h" #include "core/gimpcoreconfig.h"
#include "core/gimpdatafiles.h"
#include "core/gimpdrawable.h" #include "core/gimpdrawable.h"
#include "core/gimpimage.h" #include "core/gimpimage.h"

View file

@ -31,7 +31,6 @@
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "core/gimpcoreconfig.h" #include "core/gimpcoreconfig.h"
#include "core/gimpdatafiles.h"
#include "core/gimpdrawable.h" #include "core/gimpdrawable.h"
#include "core/gimpimage.h" #include "core/gimpimage.h"
@ -57,8 +56,7 @@ struct _PlugInHelpPathDef
}; };
static void plug_ins_init_file (const gchar *filename, static void plug_ins_init_file (GimpDatafileData *file_data);
gpointer loader_data);
static void plug_ins_add_to_db (Gimp *gimp); static void plug_ins_add_to_db (Gimp *gimp);
static void plug_ins_proc_def_insert (PlugInProcDef *proc_def, static void plug_ins_proc_def_insert (PlugInProcDef *proc_def,
void (* superceed_fn) (void *)); void (* superceed_fn) (void *));
@ -95,7 +93,7 @@ plug_ins_init (Gimp *gimp,
/* search for binaries in the plug-in directory path */ /* search for binaries in the plug-in directory path */
gimp_datafiles_read_directories (gimp->config->plug_in_path, gimp_datafiles_read_directories (gimp->config->plug_in_path,
MODE_EXECUTABLE, G_FILE_TEST_IS_EXECUTABLE,
plug_ins_init_file, NULL); plug_ins_init_file, NULL);
/* read the pluginrc file for cached data */ /* read the pluginrc file for cached data */
@ -515,15 +513,14 @@ plug_ins_help_path (gchar *prog_name)
} }
static void static void
plug_ins_init_file (const gchar *filename, plug_ins_init_file (GimpDatafileData *file_data)
gpointer loader_data)
{ {
GSList *tmp; GSList *tmp;
PlugInDef *plug_in_def; PlugInDef *plug_in_def;
gchar *plug_in_name; gchar *plug_in_name;
gchar *basename; 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)) 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) 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; return;
} }
@ -542,8 +540,8 @@ plug_ins_init_file (const gchar *filename,
g_free (basename); g_free (basename);
plug_in_def = plug_in_def_new (filename); plug_in_def = plug_in_def_new (file_data->filename);
plug_in_def->mtime = gimp_datafile_mtime (); plug_in_def->mtime = file_data->mtime;
plug_in_def->query = TRUE; plug_in_def->query = TRUE;
plug_in_defs = g_slist_append (plug_in_defs, plug_in_def); plug_in_defs = g_slist_append (plug_in_defs, plug_in_def);

View file

@ -20,12 +20,13 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include "libgimpbase/gimpbase.h"
#include "tools-types.h" #include "tools-types.h"
/*FIXME: remove when proper module loading is in place */ /*FIXME: remove when proper module loading is in place */
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcoreconfig.h" #include "core/gimpcoreconfig.h"
#include "core/gimpdatafiles.h"
/*end remove */ /*end remove */
#include "libgimptool/gimptool.h" #include "libgimptool/gimptool.h"
@ -74,10 +75,11 @@
#include "gimpvectortool.h" #include "gimpvectortool.h"
void void
cheesey_module_loading_hack (const gchar *filename, cheesey_module_loading_hack (GimpDatafileData *file_data)
gpointer loader_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 void

View file

@ -40,11 +40,11 @@
#define LIST_WIDTH 150 #define LIST_WIDTH 150
#define LIST_HEIGHT 100 #define LIST_HEIGHT 100
#define UPDATE_DISPLAY(shell) G_STMT_START \ #define UPDATE_DISPLAY(cdd) G_STMT_START \
{ \ { \
gimp_display_shell_expose_full (shell); \ gimp_display_shell_expose_full ((cdd)->shell); \
gimp_display_shell_flush (shell); \ gimp_display_shell_flush ((cdd)->shell); \
} G_STMT_END } G_STMT_END
typedef struct _ColorDisplayDialog ColorDisplayDialog; typedef struct _ColorDisplayDialog ColorDisplayDialog;
@ -61,16 +61,22 @@ struct _ColorDisplayDialog
GtkTreeSelection *src_sel; GtkTreeSelection *src_sel;
GtkTreeSelection *dest_sel; GtkTreeSelection *dest_sel;
GimpColorDisplay *selected;
gboolean modified; gboolean modified;
GList *old_nodes; GList *old_nodes;
GList *conf_nodes;
GtkWidget *add_button; GtkWidget *add_button;
GtkWidget *remove_button; GtkWidget *remove_button;
GtkWidget *up_button; GtkWidget *up_button;
GtkWidget *down_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); ColorDisplayDialog *cdd);
static void color_display_down_callback (GtkWidget *widget, static void color_display_down_callback (GtkWidget *widget,
ColorDisplayDialog *cdd); ColorDisplayDialog *cdd);
static void color_display_configure_callback (GtkWidget *widget,
ColorDisplayDialog *cdd);
static void dest_list_populate (GList *node_list, static void dest_list_populate (GList *node_list,
GtkTreeStore *dest); GtkTreeStore *dest);
@ -99,12 +103,18 @@ static void src_selection_changed (GtkTreeSelection *sel,
static void dest_selection_changed (GtkTreeSelection *sel, static void dest_selection_changed (GtkTreeSelection *sel,
ColorDisplayDialog *cdd); 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 color_display_update_up_and_down (ColorDisplayDialog *cdd);
static void static void
make_dialog (ColorDisplayDialog *cdd) make_dialog (ColorDisplayDialog *cdd)
{ {
GtkWidget *main_vbox;
GtkWidget *hbox; GtkWidget *hbox;
GtkWidget *editor; GtkWidget *editor;
GtkWidget *scrolled_win; GtkWidget *scrolled_win;
@ -126,11 +136,15 @@ make_dialog (ColorDisplayDialog *cdd)
NULL); NULL);
hbox = gtk_hbox_new (FALSE, 6); main_vbox = gtk_vbox_new (FALSE, 6);
gtk_container_set_border_width (GTK_CONTAINER (hbox), 6); gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (cdd->dialog)->vbox), hbox, gtk_box_pack_start (GTK_BOX (GTK_DIALOG (cdd->dialog)->vbox), main_vbox,
TRUE, TRUE, 0); 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); scrolled_win = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win),
GTK_SHADOW_IN); GTK_SHADOW_IN);
@ -220,18 +234,8 @@ make_dialog (ColorDisplayDialog *cdd)
NULL, NULL,
cdd); 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->up_button, FALSE);
gtk_widget_set_sensitive (cdd->down_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); scrolled_win = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win),
@ -262,7 +266,36 @@ make_dialog (ColorDisplayDialog *cdd)
G_CALLBACK (dest_selection_changed), G_CALLBACK (dest_selection_changed),
cdd); 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); 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 static void
@ -284,7 +317,7 @@ color_display_ok_callback (GtkWidget *widget,
g_list_free (cdd->old_nodes); 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; 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); 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); 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); 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); gtk_tree_selection_select_iter (cdd->dest_sel, &iter2);
UPDATE_DISPLAY (cdd->shell); UPDATE_DISPLAY (cdd);
}
}
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);
} }
} }
@ -614,6 +618,16 @@ dest_selection_changed (GtkTreeSelection *sel,
GtkTreeIter iter; GtkTreeIter iter;
GimpColorDisplay *filter = NULL; 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)) if (gtk_tree_selection_get_selected (sel, &model, &iter))
{ {
GValue val = { 0, }; GValue val = { 0, };
@ -625,8 +639,63 @@ dest_selection_changed (GtkTreeSelection *sel,
g_value_unset (&val); g_value_unset (&val);
} }
gtk_widget_set_sensitive (cdd->remove_button, (filter != NULL)); gtk_widget_set_sensitive (cdd->remove_button, (filter != NULL));
gtk_widget_set_sensitive (cdd->configure_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); 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);
}

View file

@ -1,3 +1,20 @@
2002-10-23 Michael Natterer <mitch@gimp.org>
* 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 <mitch@gimp.org> 2002-10-21 Michael Natterer <mitch@gimp.org>
* libgimpmodule/tmpl/gimpmoduletypes.sgml: removed because we * libgimpmodule/tmpl/gimpmoduletypes.sgml: removed because we

View file

@ -1,6 +1,7 @@
<!doctype book PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [ <!doctype book PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [
<!entity GimpBaseTypes SYSTEM "sgml/gimpbasetypes.sgml"> <!entity GimpBaseTypes SYSTEM "sgml/gimpbasetypes.sgml">
<!entity GimpLimits SYSTEM "sgml/gimplimits.sgml"> <!entity GimpLimits SYSTEM "sgml/gimplimits.sgml">
<!entity GimpDatafiles SYSTEM "sgml/gimpdatafiles.sgml">
<!entity GimpEnv SYSTEM "sgml/gimpenv.sgml"> <!entity GimpEnv SYSTEM "sgml/gimpenv.sgml">
<!entity GimpParasite SYSTEM "sgml/gimpparasite.sgml"> <!entity GimpParasite SYSTEM "sgml/gimpparasite.sgml">
<!entity GimpParasiteIO SYSTEM "sgml/gimpparasiteio.sgml"> <!entity GimpParasiteIO SYSTEM "sgml/gimpparasiteio.sgml">
@ -20,6 +21,7 @@
&GimpBaseTypes; &GimpBaseTypes;
&GimpVersion; &GimpVersion;
&GimpLimits; &GimpLimits;
&GimpDatafiles;
&GimpEnv; &GimpEnv;
&GimpParasite; &GimpParasite;
&GimpParasiteIO; &GimpParasiteIO;

View file

@ -5,6 +5,7 @@ GimpPDBProcType
GimpPDBStatusType GimpPDBStatusType
GimpMessageHandlerType GimpMessageHandlerType
GimpStackTraceMode GimpStackTraceMode
GimpDatafileLoaderFunc
</SECTION> </SECTION>
<SECTION> <SECTION>
@ -162,3 +163,9 @@ GIMP_VERSION
GIMP_CHECK_VERSION GIMP_CHECK_VERSION
</SECTION> </SECTION>
<SECTION>
<FILE>gimpdatafiles</FILE>
GimpDatafileData
gimp_datafiles_check_extension
gimp_datafiles_read_directories
</SECTION>

View file

@ -82,3 +82,11 @@ gimpbasetypes
@GIMP_STACK_TRACE_QUERY: @GIMP_STACK_TRACE_QUERY:
@GIMP_STACK_TRACE_ALWAYS: @GIMP_STACK_TRACE_ALWAYS:
<!-- ##### USER_FUNCTION GimpDatafileLoaderFunc ##### -->
<para>
</para>
@file_data:

View file

@ -0,0 +1,48 @@
<!-- ##### SECTION Title ##### -->
gimpdatafiles
<!-- ##### SECTION Short_Description ##### -->
<!-- ##### SECTION Long_Description ##### -->
<para>
</para>
<!-- ##### SECTION See_Also ##### -->
<para>
</para>
<!-- ##### STRUCT GimpDatafileData ##### -->
<para>
</para>
@filename:
@atime:
@mtime:
@ctime:
@user_data:
<!-- ##### FUNCTION gimp_datafiles_check_extension ##### -->
<para>
</para>
@filename:
@extension:
@Returns:
<!-- ##### FUNCTION gimp_datafiles_read_directories ##### -->
<para>
</para>
@path_str:
@flags:
@loader_func:
@user_data:

View file

@ -1,5 +1,6 @@
<!doctype book PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [ <!doctype book PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [
<!entity GimpModule SYSTEM "sgml/gimpmodule.sgml"> <!entity GimpModule SYSTEM "sgml/gimpmodule.sgml">
<!entity GimpModuleDB SYSTEM "sgml/gimpmoduledb.sgml">
]> ]>
<book id="index"> <book id="index">
<bookinfo> <bookinfo>
@ -9,5 +10,6 @@
<chapter id="libgimpmodule"> <chapter id="libgimpmodule">
<title>GIMP Module Library</title> <title>GIMP Module Library</title>
&GimpModule; &GimpModule;
&GimpModuleDB;
</chapter> </chapter>
</book> </book>

View file

@ -21,3 +21,22 @@ GIMP_MODULE_CLASS
GIMP_IS_MODULE_CLASS GIMP_IS_MODULE_CLASS
GIMP_MODULE_GET_CLASS GIMP_MODULE_GET_CLASS
</SECTION> </SECTION>
<SECTION>
<FILE>gimpmoduledb</FILE>
GimpModuleDB
<TITLE>GimpModuleDB</TITLE>
gimp_module_db_new
gimp_module_db_set_load_inhibit
gimp_module_db_get_load_inhibit
gimp_module_db_load
gimp_module_db_refresh
<SUBSECTION Standard>
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
</SECTION>

View file

@ -2,3 +2,5 @@
#include <libgimpmodule/gimpmodule.h> #include <libgimpmodule/gimpmodule.h>
gimp_module_get_type gimp_module_get_type
gimp_module_db_get_type

View file

@ -68,9 +68,11 @@ Common definitions for creating a pluggable GIMP module.
</para> </para>
@filename: @filename:
@inhibit_str: @load_inhibit:
@verbose: @verbose:
@Returns: @Returns:
<!-- # Unused Parameters # -->
@inhibit_str:
<!-- ##### FUNCTION gimp_module_modified ##### --> <!-- ##### FUNCTION gimp_module_modified ##### -->
@ -87,6 +89,8 @@ Common definitions for creating a pluggable GIMP module.
</para> </para>
@module: @module:
@load_inhibit:
<!-- # Unused Parameters # -->
@inhibit_list: @inhibit_list:

View file

@ -0,0 +1,91 @@
<!-- ##### SECTION Title ##### -->
GimpModuleDB
<!-- ##### SECTION Short_Description ##### -->
<!-- ##### SECTION Long_Description ##### -->
<para>
</para>
<!-- ##### SECTION See_Also ##### -->
<para>
</para>
<!-- ##### STRUCT GimpModuleDB ##### -->
<para>
</para>
<!-- ##### FUNCTION gimp_module_db_new ##### -->
<para>
</para>
@verbose:
@Returns:
<!-- ##### FUNCTION gimp_module_db_set_load_inhibit ##### -->
<para>
</para>
@db:
@load_inhibit:
<!-- ##### FUNCTION gimp_module_db_get_load_inhibit ##### -->
<para>
</para>
@db:
@Returns:
<!-- ##### FUNCTION gimp_module_db_load ##### -->
<para>
</para>
@db:
@module_path:
<!-- ##### FUNCTION gimp_module_db_refresh ##### -->
<para>
</para>
@db:
@module_path:
<!-- ##### SIGNAL GimpModuleDB::add ##### -->
<para>
</para>
@gimpmoduledb: the object which received the signal.
@arg1:
<!-- ##### SIGNAL GimpModuleDB::module-modified ##### -->
<para>
</para>
@gimpmoduledb: the object which received the signal.
@arg1:
<!-- ##### SIGNAL GimpModuleDB::remove ##### -->
<para>
</para>
@gimpmoduledb: the object which received the signal.
@arg1:

View file

@ -6,6 +6,7 @@
gimp_chain_button_get_type gimp_chain_button_get_type
gimp_color_button_get_type gimp_color_button_get_type
gimp_dialog_get_type
gimp_color_display_get_type gimp_color_display_get_type
gimp_color_selector_get_type gimp_color_selector_get_type
gimp_color_select_get_type gimp_color_select_get_type

View file

@ -83,17 +83,18 @@ display color correction module.
</para> </para>
@display: @display:
@Returns:
<!-- # Unused Parameters # -->
@ok_func: @ok_func:
@ok_data: @ok_data:
@cancel_func: @cancel_func:
@cancel_data: @cancel_data:
<!-- ##### FUNCTION gimp_color_display_configure_cancel ##### --> <!-- ##### SIGNAL GimpColorDisplay::changed ##### -->
<para> <para>
</para> </para>
@display: @gimpcolordisplay: the object which received the signal.

View file

@ -20,7 +20,6 @@ dialog-related stuff.
</para> </para>
@parent_instance:
<!-- ##### FUNCTION gimp_dialog_new ##### --> <!-- ##### FUNCTION gimp_dialog_new ##### -->
<para> <para>

View file

@ -69,32 +69,37 @@ lib_LTLIBRARIES = libgimpbase-1.3.la
libgimpbase_1_3_la_SOURCES = \ libgimpbase_1_3_la_SOURCES = \
gimpbase.h \ gimpbase.h \
gimpbasetypes.h \ gimpbasetypes.h \
gimplimits.h \
gimpunit.h \
gimpversion.h \
\
gimpdatafiles.c \
gimpdatafiles.h \
gimpenv.c \ gimpenv.c \
gimpenv.h \ gimpenv.h \
gimplimits.h \
gimpsignal.c \
gimpsignal.h \
gimpparasite.c \ gimpparasite.c \
gimpparasite.h \ gimpparasite.h \
gimpparasiteio.c \ gimpparasiteio.c \
gimpparasiteio.h \ gimpparasiteio.h \
gimpprotocol.c \ gimpprotocol.c \
gimpprotocol.h \ gimpprotocol.h \
gimpunit.h \ gimpsignal.c \
gimpversion.h \ gimpsignal.h \
gimpwire.c \ gimpwire.c \
gimpwire.h gimpwire.h
libgimpbaseinclude_HEADERS = \ libgimpbaseinclude_HEADERS = \
gimpbase.h \ gimpbase.h \
gimpbasetypes.h \ gimpbasetypes.h \
gimpenv.h \
gimplimits.h \ gimplimits.h \
gimpsignal.h \ gimpunit.h \
gimpversion.h \
\
gimpdatafiles.h \
gimpenv.h \
gimpparasite.h \ gimpparasite.h \
gimpparasiteio.h \ gimpparasiteio.h \
gimpunit.h \ gimpsignal.h
gimpversion.h
EXTRA_HEADERS = EXTRA_HEADERS =

View file

@ -23,6 +23,7 @@
#include <libgimpbase/gimpbasetypes.h> #include <libgimpbase/gimpbasetypes.h>
#include <libgimpbase/gimpdatafiles.h>
#include <libgimpbase/gimpenv.h> #include <libgimpbase/gimpenv.h>
#include <libgimpbase/gimplimits.h> #include <libgimpbase/gimplimits.h>
#include <libgimpbase/gimpparasite.h> #include <libgimpbase/gimpparasite.h>

View file

@ -29,7 +29,11 @@ G_BEGIN_DECLS
/* For information look into the C source or the html documentation */ /* 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 typedef enum

View file

@ -42,15 +42,10 @@
#endif #endif
#endif /* G_OS_WIN32 */ #endif /* G_OS_WIN32 */
#include "libgimpbase/gimpbase.h" #include "gimpbasetypes.h"
#include "core-types.h"
#include "gimpdatafiles.h" #include "gimpdatafiles.h"
#include "gimpenv.h"
static gboolean filestat_valid = FALSE;
static struct stat filestat;
#ifdef G_OS_WIN32 #ifdef G_OS_WIN32
@ -114,26 +109,30 @@ gimp_datafiles_check_extension (const gchar *filename,
if (! (name_len && ext_len && (name_len > ext_len))) if (! (name_len && ext_len && (name_len > ext_len)))
return FALSE; return FALSE;
return (strcmp (&filename[name_len - ext_len], extension) == 0); return (g_ascii_strcasecmp (&filename[name_len - ext_len], extension) == 0);
} }
void void
gimp_datafiles_read_directories (const gchar *path_str, gimp_datafiles_read_directories (const gchar *path_str,
GimpDataFileFlags flags, GFileTest flags,
GimpDataFileLoaderFunc loader_func, GimpDatafileLoaderFunc loader_func,
gpointer loader_data) gpointer user_data)
{ {
gchar *local_path; GimpDatafileData file_data = { 0 };
GList *path; struct stat filestat;
GList *list; gchar *local_path;
gchar *filename; GList *path;
gint err; GList *list;
GDir *dir; gchar *filename;
const gchar *dir_ent; gint err;
GDir *dir;
const gchar *dir_ent;
g_return_if_fail (path_str != NULL); g_return_if_fail (path_str != NULL);
g_return_if_fail (loader_func != NULL); g_return_if_fail (loader_func != NULL);
file_data.user_data = user_data;
local_path = g_strdup (path_str); local_path = g_strdup (path_str);
#ifdef __EMX__ #ifdef __EMX__
@ -150,10 +149,9 @@ gimp_datafiles_read_directories (const gchar *path_str,
for (list = path; list; list = g_list_next (list)) for (list = path; list; list = g_list_next (list))
{ {
/* Open directory */
dir = g_dir_open ((gchar *) list->data, 0, NULL); dir = g_dir_open ((gchar *) list->data, 0, NULL);
if (!dir) if (! dir)
{ {
g_message ("error reading datafiles directory \"%s\"", g_message ("error reading datafiles directory \"%s\"",
(gchar *) list->data); (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 */ /* Check the file and see that it is not a sub-directory */
err = stat (filename, &filestat); 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) if (! err)
{ {
filestat_valid = TRUE; if (flags & G_FILE_TEST_EXISTS)
{
if (S_ISDIR (filestat.st_mode) && (flags & TYPE_DIRECTORY)) (* 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) && #ifdef G_OS_WIN32
(!(flags & MODE_EXECUTABLE) || else if ((flags & G_FILE_TEST_IS_SYMLINK) &&
(filestat.st_mode & S_IXUSR) || S_ISLINK (filestat.st_mode))
is_script (filename)))
{ {
(* 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); g_free (filename);
@ -197,30 +213,3 @@ gimp_datafiles_read_directories (const gchar *path_str,
gimp_path_free (path); gimp_path_free (path);
g_free (local_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;
}

View file

@ -25,29 +25,25 @@
#include <time.h> #include <time.h>
typedef enum struct _GimpDatafileData
{ {
MODE_EXECUTABLE = 1 << 0, const gchar *filename;
TYPE_DIRECTORY = 1 << 1
} GimpDataFileFlags; time_t atime;
time_t mtime;
time_t ctime;
gpointer user_data;
};
gboolean gimp_datafiles_check_extension (const gchar *filename, gboolean gimp_datafiles_check_extension (const gchar *filename,
const gchar *extension); const gchar *extension);
void gimp_datafiles_read_directories (const gchar *path_str, void gimp_datafiles_read_directories (const gchar *path_str,
GimpDataFileFlags flags, GFileTest flags,
GimpDataFileLoaderFunc loader_func, GimpDatafileLoaderFunc loader_func,
gpointer loader_data); gpointer user_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__ */ #endif /* __GIMP_DATAFILES_H__ */

View file

@ -61,11 +61,14 @@ lib_LTLIBRARIES = libgimpmodule-1.3.la
libgimpmodule_1_3_la_SOURCES = \ libgimpmodule_1_3_la_SOURCES = \
gimpmoduletypes.h \ gimpmoduletypes.h \
gimpmodule.c \ gimpmodule.c \
gimpmodule.h gimpmodule.h \
gimpmoduledb.c \
gimpmoduledb.h
libgimpmoduleinclude_HEADERS = \ libgimpmoduleinclude_HEADERS = \
gimpmoduletypes.h \ gimpmoduletypes.h \
gimpmodule.h gimpmodule.h \
gimpmoduledb.h
EXTRA_HEADERS = EXTRA_HEADERS =
@ -76,7 +79,9 @@ libgimpmodule_1_3_la_LDFLAGS = \
libgimpmodule_1_3_la_DEPENDENCIES = $(gimpmodule_def) 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 install-data-local: install-ms-lib install-libtool-import-lib

View file

@ -45,6 +45,8 @@ static void gimp_module_finalize (GObject *object);
static gboolean gimp_module_load (GTypeModule *module); static gboolean gimp_module_load (GTypeModule *module);
static void gimp_module_unload (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, static void gimp_module_set_last_error (GimpModule *module,
const gchar *error_str); const gchar *error_str);
@ -158,10 +160,9 @@ gimp_module_finalize (GObject *object)
static gboolean static gboolean
gimp_module_load (GTypeModule *module) gimp_module_load (GTypeModule *module)
{ {
GimpModule *gimp_module; GimpModule *gimp_module;
const GimpModuleInfo *info; gpointer symbol;
gpointer symbol; gboolean retval;
gboolean retval;
g_return_val_if_fail (GIMP_IS_MODULE (module), FALSE); g_return_val_if_fail (GIMP_IS_MODULE (module), FALSE);
@ -173,63 +174,11 @@ gimp_module_load (GTypeModule *module)
if (gimp_module->verbose) if (gimp_module->verbose)
g_print (_("Loading module: '%s'\n"), gimp_module->filename); g_print (_("Loading module: '%s'\n"), gimp_module->filename);
gimp_module->module = g_module_open (gimp_module->filename, if (! gimp_module_open (gimp_module))
G_MODULE_BIND_LAZY); return FALSE;
if (! gimp_module->module) if (! gimp_module_query_module (gimp_module))
{ return FALSE;
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);
/* find the gimp_module_register symbol */ /* find the gimp_module_register symbol */
if (! g_module_symbol (gimp_module->module, "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_return_if_fail (gimp_module->module != NULL);
g_module_close (gimp_module->module); /* FIXME: error handling */ gimp_module_close (gimp_module);
gimp_module->module = NULL;
gimp_module->query_module = NULL;
gimp_module->register_module = NULL;
gimp_module->state = GIMP_MODULE_STATE_UNLOADED_OK;
} }
/* public functions */
GimpModule * GimpModule *
gimp_module_new (const gchar *filename, gimp_module_new (const gchar *filename,
const gchar *inhibit_list, gboolean load_inhibit,
gboolean verbose) gboolean verbose)
{ {
GimpModule *module; GimpModule *module;
@ -289,11 +236,10 @@ gimp_module_new (const gchar *filename,
module = g_object_new (GIMP_TYPE_MODULE, NULL); module = g_object_new (GIMP_TYPE_MODULE, NULL);
module->filename = g_strdup (filename); module->filename = g_strdup (filename);
module->verbose = verbose ? TRUE : FALSE; module->load_inhibit = load_inhibit ? TRUE : FALSE;
module->on_disk = TRUE; module->verbose = verbose ? TRUE : FALSE;
module->on_disk = TRUE;
gimp_module_set_load_inhibit (module, inhibit_list);
if (! module->load_inhibit) if (! module->load_inhibit)
{ {
@ -311,6 +257,71 @@ gimp_module_new (const gchar *filename,
return module; 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 void
gimp_module_modified (GimpModule *module) gimp_module_modified (GimpModule *module)
{ {
@ -320,42 +331,69 @@ gimp_module_modified (GimpModule *module)
} }
void void
gimp_module_set_load_inhibit (GimpModule *module, gimp_module_set_load_inhibit (GimpModule *module,
const gchar *inhibit_list) 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 (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)) gimp_module_modified (module);
return; }
}
p = strstr (inhibit_list, module->filename);
if (!p)
return;
/* we have a substring, but check for colons either side */ /* private functions */
start = p;
while (start != inhibit_list && *start != G_SEARCHPATH_SEPARATOR)
start--;
if (*start == G_SEARCHPATH_SEPARATOR) const gchar *
start++; 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); g_return_val_if_fail (state >= GIMP_MODULE_STATE_ERROR &&
if (! end) state <= GIMP_MODULE_STATE_UNLOADED_OK, NULL);
end = inhibit_list + strlen (inhibit_list);
pathlen = strlen (module->filename); return gettext (statenames[state]);
}
if ((end - start) == pathlen) static gboolean
module->load_inhibit = TRUE; 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 static void

View file

@ -26,6 +26,8 @@
#include <libgimpmodule/gimpmoduletypes.h> #include <libgimpmodule/gimpmoduletypes.h>
#include <libgimpmodule/gimpmoduledb.h>
G_BEGIN_DECLS 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, GimpModule * gimp_module_new (const gchar *filename,
const gchar *inhibit_str, gboolean load_inhibit,
gboolean verbose); gboolean verbose);
void gimp_module_modified (GimpModule *module); gboolean gimp_module_query_module (GimpModule *module);
void gimp_module_set_load_inhibit (GimpModule *module,
const gchar *inhibit_list); 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 */ /* GimpModuleInfo functions */

View file

@ -32,126 +32,286 @@
#include <glib-object.h> #include <glib-object.h>
#include "libgimpbase/gimpbase.h" #include "libgimpbase/gimpbase.h"
#include "libgimpmodule/gimpmodule.h"
#include "core-types.h" #include "gimpmoduletypes.h"
#include "gimp.h" #include "gimpmodule.h"
#include "gimpcoreconfig.h" #include "gimpmoduledb.h"
#include "gimpdatafiles.h"
#include "gimplist.h"
#include "gimpmodules.h"
#include "gimprc.h"
#include "libgimp/gimpintl.h" #include "libgimp/gimpintl.h"
enum
{
ADD,
REMOVE,
MODULE_MODIFIED,
LAST_SIGNAL
};
#define DUMP_DB 1 #define DUMP_DB 1
static void gimp_modules_module_initialize (const gchar *filename, static void gimp_module_db_class_init (GimpModuleDBClass *klass);
gpointer loader_data); static void gimp_module_db_init (GimpModuleDB *db);
static GimpModule * gimp_modules_module_find_by_path (Gimp *gimp, static void gimp_module_db_finalize (GObject *object);
const char *fullpath);
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 #ifdef DUMP_DB
static void gimp_modules_dump_module (gpointer data, static void gimp_module_db_dump_module (gpointer data,
gpointer user_data); gpointer user_data);
#endif #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, static void gimp_module_db_module_on_disk_func (gpointer data,
gpointer user_data); gpointer user_data);
static void gimp_modules_module_remove_func (gpointer data, static void gimp_module_db_module_remove_func (gpointer data,
gpointer user_data); gpointer user_data);
static void gimp_module_db_module_modified (GimpModule *module,
GimpModuleDB *db);
void static GObjectClass *parent_class = NULL;
gimp_modules_init (Gimp *gimp)
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, if (! db_type)
GIMP_CONTAINER_POLICY_STRONG); {
gimp_object_set_name (GIMP_OBJECT (gimp->modules), "modules"); 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 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)); module = (GimpModule *) list->data;
gimp->modules = NULL;
gimp_module_set_load_inhibit (module,
is_in_inhibit_list (module->filename,
load_inhibit));
} }
} }
void const gchar *
gimp_modules_load (Gimp *gimp) 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"); void
gimprc_parse_file (filename); gimp_module_db_load (GimpModuleDB *db,
g_free (filename); const gchar *module_path)
{
g_return_if_fail (GIMP_IS_MODULE_DB (db));
g_return_if_fail (module_path != NULL);
if (g_module_supported ()) if (g_module_supported ())
gimp_datafiles_read_directories (gimp->config->module_path, gimp_datafiles_read_directories (module_path,
0 /* no flags */, G_FILE_TEST_EXISTS,
gimp_modules_module_initialize, gimp_module_db_module_initialize,
gimp); db);
#ifdef DUMP_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 #endif
} }
void void
gimp_modules_unload (Gimp *gimp) gimp_module_db_refresh (GimpModuleDB *db,
{ const gchar *module_path)
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; 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 */ /* remove modules we don't have on disk anymore */
gimp_container_foreach (gimp->modules, g_list_foreach (db->modules,
gimp_modules_module_on_disk_func, gimp_module_db_module_on_disk_func,
&kill_list); &kill_list);
g_list_foreach (kill_list, g_list_foreach (kill_list,
gimp_modules_module_remove_func, gimp_module_db_module_remove_func,
gimp); db);
g_list_free (kill_list); g_list_free (kill_list);
/* walk filesystem and add new things we find */ /* walk filesystem and add new things we find */
gimp_datafiles_read_directories (gimp->config->module_path, gimp_datafiles_read_directories (module_path,
0 /* no flags */, G_FILE_TEST_EXISTS,
gimp_modules_module_initialize, gimp_module_db_module_initialize,
gimp); db);
} }
#if 0
static void static void
add_to_inhibit_string (gpointer data, add_to_inhibit_string (gpointer data,
gpointer user_data) gpointer user_data)
@ -196,32 +356,24 @@ gimp_modules_write_modulerc (Gimp *gimp)
return saved; return saved;
} }
#endif
/* name must be of the form lib*.so (Unix) or *.dll (Win32) */ /* name must be of the form lib*.so (Unix) or *.dll (Win32) */
static gboolean static gboolean
valid_module_name (const gchar *filename) valid_module_name (const gchar *filename)
{ {
gchar *basename; gchar *basename;
gint len;
basename = g_path_get_basename (filename); basename = g_path_get_basename (filename);
len = strlen (basename);
#if !defined(G_OS_WIN32) && !defined(G_WITH_CYGWIN) && !defined(__EMX__) #if !defined(G_OS_WIN32) && !defined(G_WITH_CYGWIN) && !defined(__EMX__)
if (len < 3 + 1 + 3)
goto no_module;
if (strncmp (basename, "lib", 3)) if (strncmp (basename, "lib", 3))
goto no_module; goto no_module;
if (strcmp (basename + len - 3, ".so")) if (! gimp_datafiles_check_extension (basename, ".so"))
goto no_module; goto no_module;
#else #else
if (len < 1 + 4) if (! gimp_datafiles_check_extension (basename, ".dll"))
goto no_module;
if (g_strcasecmp (basename + len - 4, ".dll"))
goto no_module; goto no_module;
#endif #endif
@ -236,36 +388,44 @@ valid_module_name (const gchar *filename)
} }
static void static void
gimp_modules_module_initialize (const gchar *filename, gimp_module_db_module_initialize (GimpDatafileData *file_data)
gpointer loader_data)
{ {
GimpModule *module; GimpModuleDB *db;
Gimp *gimp; 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; return;
/* don't load if we already know about it */ /* 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; return;
module = gimp_module_new (filename, load_inhibit = is_in_inhibit_list (file_data->filename,
gimp->config->module_db_load_inhibit, db->load_inhibit);
gimp->be_verbose);
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 * static GimpModule *
gimp_modules_module_find_by_path (Gimp *gimp, gimp_module_db_module_find_by_path (GimpModuleDB *db,
const char *fullpath) const char *fullpath)
{ {
GimpModule *module; GimpModule *module;
GList *list; 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; module = (GimpModule *) list->data;
@ -278,14 +438,14 @@ gimp_modules_module_find_by_path (Gimp *gimp,
#ifdef DUMP_DB #ifdef DUMP_DB
static void static void
gimp_modules_dump_module (gpointer data, gimp_module_db_dump_module (gpointer data,
gpointer user_data) gpointer user_data)
{ {
GimpModule *i = data; GimpModule *i = data;
g_print ("\n%s: %i\n", g_print ("\n%s: %s\n",
i->filename, i->filename,
i->state /* statename[i->state] */); gimp_module_state_name (i->state));
g_print (" module:%p lasterr:%s query:%p register:%p\n", g_print (" module:%p lasterr:%s query:%p register:%p\n",
i->module, i->module,
@ -310,8 +470,8 @@ gimp_modules_dump_module (gpointer data,
#endif #endif
static void static void
gimp_modules_module_on_disk_func (gpointer data, gimp_module_db_module_on_disk_func (gpointer data,
gpointer user_data) gpointer user_data)
{ {
GimpModule *module; GimpModule *module;
GList **kill_list; GList **kill_list;
@ -338,14 +498,26 @@ gimp_modules_module_on_disk_func (gpointer data,
} }
static void static void
gimp_modules_module_remove_func (gpointer data, gimp_module_db_module_remove_func (gpointer data,
gpointer user_data) gpointer user_data)
{ {
GimpModule *module; GimpModule *module;
Gimp *gimp; GimpModuleDB *db;
module = (GimpModule *) data; module = (GimpModule *) data;
gimp = (Gimp *) user_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);
} }

View file

@ -19,17 +19,58 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
#ifndef __GIMP_MODULES_H__ #ifndef __GIMP_MODULE_DB_H__
#define __GIMP_MODULES_H__ #define __GIMP_MODULE_DB_H__
G_BEGIN_DECLS
void gimp_modules_init (Gimp *gimp); #define GIMP_TYPE_MODULE_DB (gimp_module_db_get_type ())
void gimp_modules_exit (Gimp *gimp); #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))
void gimp_modules_load (Gimp *gimp); #define GIMP_IS_MODULE_DB(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_MODULE_DB))
void gimp_modules_unload (Gimp *gimp); #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))
void gimp_modules_refresh (Gimp *gimp);
#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__ */

View file

@ -27,6 +27,7 @@ G_BEGIN_DECLS
typedef struct _GimpModule GimpModule; typedef struct _GimpModule GimpModule;
typedef struct _GimpModuleInfo GimpModuleInfo; typedef struct _GimpModuleInfo GimpModuleInfo;
typedef struct _GimpModuleDB GimpModuleDB;
G_END_DECLS G_END_DECLS

View file

@ -319,20 +319,30 @@ gimp_object_get_memsize (GimpObject *object)
return GIMP_OBJECT_GET_CLASS (object)->get_memsize (object); return GIMP_OBJECT_GET_CLASS (object)->get_memsize (object);
} }
static gsize gsize
gimp_object_real_get_memsize (GimpObject *object) gimp_g_object_get_memsize (GObject *object)
{ {
GTypeQuery type_query; GTypeQuery type_query;
gsize memsize = 0; gsize memsize = 0;
g_return_val_if_fail (G_IS_OBJECT (object), 0);
g_type_query (G_TYPE_FROM_INSTANCE (object), &type_query); g_type_query (G_TYPE_FROM_INSTANCE (object), &type_query);
memsize += type_query.instance_size; memsize += type_query.instance_size;
return memsize;
}
static gsize
gimp_object_real_get_memsize (GimpObject *object)
{
gsize memsize = 0;
if (object->name) if (object->name)
memsize += strlen (object->name) + 1; memsize += strlen (object->name) + 1;
return memsize; return memsize + gimp_g_object_get_memsize ((GObject *) object);
} }
/* Generated data ends here */ /* Generated data ends here */

View file

@ -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, void gimp_object_set_name (GimpObject *object,
const gchar *name); const gchar *name);
const gchar * gimp_object_get_name (const GimpObject *object); const gchar * gimp_object_get_name (const GimpObject *object);
void gimp_object_name_changed (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__ */ #endif /* __GIMP_OBJECT_H__ */

View file

@ -30,12 +30,21 @@
#include "gimpcolordisplay.h" #include "gimpcolordisplay.h"
enum
{
CHANGED,
LAST_SIGNAL
};
static void gimp_color_display_class_init (GimpColorDisplayClass *klass); static void gimp_color_display_class_init (GimpColorDisplayClass *klass);
static void gimp_color_display_init (GimpColorDisplay *display); static void gimp_color_display_init (GimpColorDisplay *display);
static GObjectClass *parent_class = NULL; static GObjectClass *parent_class = NULL;
static guint display_signals[LAST_SIGNAL] = { 0 };
GType GType
gimp_color_display_get_type (void) 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); parent_class = g_type_class_peek_parent (klass);
klass->clone = NULL; display_signals[CHANGED] =
klass->convert = NULL; g_signal_new ("changed",
klass->load_state = NULL; G_TYPE_FROM_CLASS (klass),
klass->save_state = NULL; G_SIGNAL_RUN_FIRST,
klass->configure = NULL; G_STRUCT_OFFSET (GimpColorDisplayClass, changed),
klass->configure_cancel = NULL; 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 static void
@ -145,26 +163,30 @@ gimp_color_display_save_state (GimpColorDisplay *display)
return NULL; return NULL;
} }
void GtkWidget *
gimp_color_display_configure (GimpColorDisplay *display, gimp_color_display_configure (GimpColorDisplay *display)
GFunc ok_func,
gpointer ok_data,
GFunc cancel_func,
gpointer cancel_data)
{ {
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) if (GIMP_COLOR_DISPLAY_GET_CLASS (display)->configure)
GIMP_COLOR_DISPLAY_GET_CLASS (display)->configure (display, return GIMP_COLOR_DISPLAY_GET_CLASS (display)->configure (display);
ok_func, ok_data,
cancel_func, cancel_data); return NULL;
} }
void void
gimp_color_display_configure_cancel (GimpColorDisplay *display) gimp_color_display_configure_reset (GimpColorDisplay *display)
{ {
g_return_if_fail (GIMP_IS_COLOR_DISPLAY (display)); g_return_if_fail (GIMP_IS_COLOR_DISPLAY (display));
if (GIMP_COLOR_DISPLAY_GET_CLASS (display)->configure_cancel) if (GIMP_COLOR_DISPLAY_GET_CLASS (display)->configure_reset)
GIMP_COLOR_DISPLAY_GET_CLASS (display)->configure_cancel (display); 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);
} }

View file

@ -47,46 +47,42 @@ struct _GimpColorDisplayClass
const gchar *help_page; const gchar *help_page;
/* virtual functions */ /* virtual functions */
GimpColorDisplay * (* clone) (GimpColorDisplay *display); GimpColorDisplay * (* clone) (GimpColorDisplay *display);
void (* convert) (GimpColorDisplay *display, void (* convert) (GimpColorDisplay *display,
guchar *buf, guchar *buf,
gint width, gint width,
gint height, gint height,
gint bpp, gint bpp,
gint bpl); 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, /* signals */
GimpParasite *state); void (* changed) (GimpColorDisplay *display);
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);
}; };
GType gimp_color_display_get_type (void) G_GNUC_CONST; GType gimp_color_display_get_type (void) G_GNUC_CONST;
GimpColorDisplay * gimp_color_display_new (GType display_type); 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, void gimp_color_display_convert (GimpColorDisplay *display,
guchar *buf, guchar *buf,
gint width, gint width,
gint height, gint height,
gint bpp, gint bpp,
gint bpl); gint bpl);
void gimp_color_display_load_state (GimpColorDisplay *display, void gimp_color_display_load_state (GimpColorDisplay *display,
GimpParasite *state); GimpParasite *state);
GimpParasite * gimp_color_display_save_state (GimpColorDisplay *display); GimpParasite * gimp_color_display_save_state (GimpColorDisplay *display);
void gimp_color_display_configure (GimpColorDisplay *display, GtkWidget * gimp_color_display_configure (GimpColorDisplay *display);
GFunc ok_func, void gimp_color_display_configure_reset (GimpColorDisplay *display);
gpointer ok_data,
GFunc cancel_func, void gimp_color_display_changed (GimpColorDisplay *display);
gpointer cancel_data);
void gimp_color_display_configure_cancel (GimpColorDisplay *display);
G_END_DECLS G_END_DECLS

View file

@ -30,6 +30,9 @@
#include "libgimp/gimpintl.h" #include "libgimp/gimpintl.h"
#define DEFAULT_GAMMA 1.0
#define CDISPLAY_TYPE_GAMMA (cdisplay_gamma_type) #define CDISPLAY_TYPE_GAMMA (cdisplay_gamma_type)
#define CDISPLAY_GAMMA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CDISPLAY_TYPE_GAMMA, CdisplayGamma)) #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)) #define CDISPLAY_GAMMA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CDISPLAY_TYPE_GAMMA, CdisplayGammaClass))
@ -44,16 +47,11 @@ struct _CdisplayGamma
{ {
GimpColorDisplay parent_instance; GimpColorDisplay parent_instance;
GFunc ok_func;
gpointer ok_data;
GFunc cancel_func;
gpointer cancel_data;
gdouble gamma; gdouble gamma;
guchar *lookup; guchar *lookup;
GtkWidget *shell; GtkWidget *hbox;
GtkWidget *spinner; GtkObject *adjustment;
}; };
struct _CdisplayGammaClass struct _CdisplayGammaClass
@ -78,17 +76,11 @@ static void cdisplay_gamma_convert (GimpColorDisplay *display,
static void cdisplay_gamma_load_state (GimpColorDisplay *display, static void cdisplay_gamma_load_state (GimpColorDisplay *display,
GimpParasite *state); GimpParasite *state);
static GimpParasite * cdisplay_gamma_save_state (GimpColorDisplay *display); static GimpParasite * cdisplay_gamma_save_state (GimpColorDisplay *display);
static void cdisplay_gamma_configure (GimpColorDisplay *display, static GtkWidget * cdisplay_gamma_configure (GimpColorDisplay *display);
GFunc ok_func, static void cdisplay_gamma_configure_reset (GimpColorDisplay *display);
gpointer ok_data,
GFunc cancel_func,
gpointer cancel_data);
static void cdisplay_gamma_configure_cancel (GimpColorDisplay *display);
static void gamma_create_lookup_table (CdisplayGamma *gamma); static void gamma_create_lookup_table (CdisplayGamma *gamma);
static void gamma_configure_ok_callback (GtkWidget *widget, static void gamma_configure_adj_callback (GtkAdjustment *adj,
CdisplayGamma *gamma);
static void gamma_configure_cancel_callback (GtkWidget *widget,
CdisplayGamma *gamma); CdisplayGamma *gamma);
@ -158,16 +150,16 @@ cdisplay_gamma_class_init (CdisplayGammaClass *klass)
parent_class = g_type_class_peek_parent (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->name = _("Gamma");
display_class->help_page = "modules/gamma.html"; display_class->help_page = "modules/gamma.html";
display_class->clone = cdisplay_gamma_clone; display_class->clone = cdisplay_gamma_clone;
display_class->convert = cdisplay_gamma_convert; display_class->convert = cdisplay_gamma_convert;
display_class->load_state = cdisplay_gamma_load_state; display_class->load_state = cdisplay_gamma_load_state;
display_class->save_state = cdisplay_gamma_save_state; display_class->save_state = cdisplay_gamma_save_state;
display_class->configure = cdisplay_gamma_configure; display_class->configure = cdisplay_gamma_configure;
display_class->configure_cancel = cdisplay_gamma_configure_cancel; display_class->configure_reset = cdisplay_gamma_configure_reset;
} }
static void static void
@ -175,7 +167,7 @@ cdisplay_gamma_init (CdisplayGamma *gamma)
{ {
gint i; gint i;
gamma->gamma = 1.0; gamma->gamma = DEFAULT_GAMMA;
gamma->lookup = g_new (guchar, 256); gamma->lookup = g_new (guchar, 256);
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
@ -189,11 +181,8 @@ cdisplay_gamma_finalize (GObject *object)
gamma = CDISPLAY_GAMMA (object); gamma = CDISPLAY_GAMMA (object);
if (gamma->shell) if (gamma->hbox)
{ gtk_widget_destroy (gamma->hbox);
gtk_widget_destroy (gamma->shell);
gamma->shell = NULL;
}
if (gamma->lookup) if (gamma->lookup)
{ {
@ -309,74 +298,47 @@ cdisplay_gamma_save_state (GimpColorDisplay *display)
sizeof (double), &buf); sizeof (double), &buf);
} }
static void static GtkWidget *
cdisplay_gamma_configure (GimpColorDisplay *display, cdisplay_gamma_configure (GimpColorDisplay *display)
GFunc ok_func,
gpointer ok_data,
GFunc cancel_func,
gpointer cancel_data)
{ {
CdisplayGamma *gamma; CdisplayGamma *gamma;
GtkWidget *hbox;
GtkWidget *label; GtkWidget *label;
GtkObject *adjustment; GtkWidget *spinbutton;
gamma = CDISPLAY_GAMMA (display); gamma = CDISPLAY_GAMMA (display);
if (!gamma->shell) if (gamma->hbox)
{ gtk_widget_destroy (gamma->hbox);
gamma->ok_func = ok_func;
gamma->ok_data = ok_data;
gamma->cancel_func = cancel_func;
gamma->cancel_data = cancel_data;
gamma->shell = gamma->hbox = gtk_hbox_new (FALSE, 4);
gimp_dialog_new (_("Gamma"), "gamma", g_object_add_weak_pointer (G_OBJECT (gamma->hbox), (gpointer) &gamma->hbox);
gimp_standard_help_func, "modules/gamma.html",
GTK_WIN_POS_MOUSE,
FALSE, TRUE, FALSE,
GTK_STOCK_CANCEL, gamma_configure_cancel_callback, label = gtk_label_new ( _("Gamma:"));
gamma, NULL, NULL, FALSE, TRUE, gtk_box_pack_start (GTK_BOX (gamma->hbox), label, FALSE, FALSE, 0);
gtk_widget_show (label);
GTK_STOCK_OK, gamma_configure_ok_callback, spinbutton = gimp_spin_button_new (&gamma->adjustment,
gamma, NULL, NULL, TRUE, FALSE, 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); return gamma->hbox;
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);
} }
static void static void
cdisplay_gamma_configure_cancel (GimpColorDisplay *display) cdisplay_gamma_configure_reset (GimpColorDisplay *display)
{ {
CdisplayGamma *gamma; CdisplayGamma *gamma;
gamma = CDISPLAY_GAMMA (display); gamma = CDISPLAY_GAMMA (display);
if (gamma->shell) if (gamma->adjustment)
{ gtk_adjustment_set_value (GTK_ADJUSTMENT (gamma->adjustment), DEFAULT_GAMMA);
gtk_widget_destroy (gamma->shell);
gamma->shell = NULL;
}
if (gamma->cancel_func)
gamma->cancel_func (gamma, gamma->cancel_data);
} }
static void static void
@ -399,24 +361,12 @@ gamma_create_lookup_table (CdisplayGamma *gamma)
} }
static void static void
gamma_configure_ok_callback (GtkWidget *widget, gamma_configure_adj_callback (GtkAdjustment *adj,
CdisplayGamma *gamma) CdisplayGamma *gamma)
{ {
gamma->gamma = gamma->gamma = adj->value;
gtk_spin_button_get_value (GTK_SPIN_BUTTON (gamma->spinner));
gamma_create_lookup_table (gamma); gamma_create_lookup_table (gamma);
gtk_widget_destroy (GTK_WIDGET (gamma->shell)); gimp_color_display_changed (GIMP_COLOR_DISPLAY (gamma));
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));
} }

View file

@ -30,6 +30,9 @@
#include "libgimp/gimpintl.h" #include "libgimp/gimpintl.h"
#define DEFAULT_CONTRAST 4.0
#define CDISPLAY_TYPE_CONTRAST (cdisplay_contrast_type) #define CDISPLAY_TYPE_CONTRAST (cdisplay_contrast_type)
#define CDISPLAY_CONTRAST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CDISPLAY_TYPE_CONTRAST, CdisplayContrast)) #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)) #define CDISPLAY_CONTRAST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CDISPLAY_TYPE_CONTRAST, CdisplayContrastClass))
@ -44,16 +47,11 @@ struct _CdisplayContrast
{ {
GimpColorDisplay parent_instance; GimpColorDisplay parent_instance;
GFunc ok_func;
gpointer ok_data;
GFunc cancel_func;
gpointer cancel_data;
gdouble contrast; gdouble contrast;
guchar *lookup; guchar *lookup;
GtkWidget *shell; GtkWidget *hbox;
GtkWidget *spinner; GtkObject *adjustment;
}; };
struct _CdisplayContrastClass struct _CdisplayContrastClass
@ -78,18 +76,12 @@ static void cdisplay_contrast_convert (GimpColorDisplay *display,
static void cdisplay_contrast_load_state (GimpColorDisplay *display, static void cdisplay_contrast_load_state (GimpColorDisplay *display,
GimpParasite *state); GimpParasite *state);
static GimpParasite * cdisplay_contrast_save_state (GimpColorDisplay *display); static GimpParasite * cdisplay_contrast_save_state (GimpColorDisplay *display);
static void cdisplay_contrast_configure (GimpColorDisplay *display, static GtkWidget * cdisplay_contrast_configure (GimpColorDisplay *display);
GFunc ok_func, static void cdisplay_contrast_configure_reset (GimpColorDisplay *display);
gpointer ok_data,
GFunc cancel_func,
gpointer cancel_data);
static void cdisplay_contrast_configure_cancel (GimpColorDisplay *display);
static void contrast_create_lookup_table (CdisplayContrast *contrast); static void contrast_create_lookup_table (CdisplayContrast *contrast);
static void contrast_configure_ok_callback (GtkWidget *widget, static void contrast_configure_adj_callback (GtkAdjustment *adj,
CdisplayContrast *contrast); CdisplayContrast *contrast);
static void contrast_configure_cancel_callback (GtkWidget *widget,
CdisplayContrast *contrast);
static const GimpModuleInfo cdisplay_contrast_info = static const GimpModuleInfo cdisplay_contrast_info =
@ -158,22 +150,22 @@ cdisplay_contrast_class_init (CdisplayContrastClass *klass)
parent_class = g_type_class_peek_parent (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->name = _("Contrast");
display_class->help_page = "modules/contrast.html"; display_class->help_page = "modules/contrast.html";
display_class->clone = cdisplay_contrast_clone; display_class->clone = cdisplay_contrast_clone;
display_class->convert = cdisplay_contrast_convert; display_class->convert = cdisplay_contrast_convert;
display_class->load_state = cdisplay_contrast_load_state; display_class->load_state = cdisplay_contrast_load_state;
display_class->save_state = cdisplay_contrast_save_state; display_class->save_state = cdisplay_contrast_save_state;
display_class->configure = cdisplay_contrast_configure; display_class->configure = cdisplay_contrast_configure;
display_class->configure_cancel = cdisplay_contrast_configure_cancel; display_class->configure_reset = cdisplay_contrast_configure_reset;
} }
static void static void
cdisplay_contrast_init (CdisplayContrast *contrast) cdisplay_contrast_init (CdisplayContrast *contrast)
{ {
contrast->contrast = 4.0; contrast->contrast = DEFAULT_CONTRAST;
contrast->lookup = g_new (guchar, 256); contrast->lookup = g_new (guchar, 256);
contrast_create_lookup_table (contrast); contrast_create_lookup_table (contrast);
@ -186,11 +178,8 @@ cdisplay_contrast_finalize (GObject *object)
contrast = CDISPLAY_CONTRAST (object); contrast = CDISPLAY_CONTRAST (object);
if (contrast->shell) if (contrast->hbox)
{ gtk_widget_destroy (contrast->hbox);
gtk_widget_destroy (contrast->shell);
contrast->shell = NULL;
}
if (contrast->lookup) if (contrast->lookup)
{ {
@ -306,74 +295,50 @@ cdisplay_contrast_save_state (GimpColorDisplay *display)
sizeof (double), &buf); sizeof (double), &buf);
} }
static void static GtkWidget *
cdisplay_contrast_configure (GimpColorDisplay *display, cdisplay_contrast_configure (GimpColorDisplay *display)
GFunc ok_func,
gpointer ok_data,
GFunc cancel_func,
gpointer cancel_data)
{ {
CdisplayContrast *contrast; CdisplayContrast *contrast;
GtkWidget *hbox;
GtkWidget *label; GtkWidget *label;
GtkObject *adjustment; GtkWidget *spinbutton;
contrast = CDISPLAY_CONTRAST (display); contrast = CDISPLAY_CONTRAST (display);
if (!contrast->shell) if (contrast->hbox)
{ gtk_widget_destroy (contrast->hbox);
contrast->ok_func = ok_func;
contrast->ok_data = ok_data;
contrast->cancel_func = cancel_func;
contrast->cancel_data = cancel_data;
contrast->shell = contrast->hbox = gtk_hbox_new (FALSE, 2);
gimp_dialog_new (_("High Contrast"), "high_contrast", g_object_add_weak_pointer (G_OBJECT (contrast->hbox),
gimp_standard_help_func, "modules/highcontrast.html", (gpointer) &contrast->hbox);
GTK_WIN_POS_MOUSE,
FALSE, TRUE, FALSE,
GTK_STOCK_CANCEL, contrast_configure_cancel_callback, label = gtk_label_new ( _("Contrast Cycles:"));
contrast, NULL, NULL, FALSE, TRUE, gtk_box_pack_start (GTK_BOX (contrast->hbox), label, FALSE, FALSE, 0);
gtk_widget_show (label);
GTK_STOCK_OK, contrast_configure_ok_callback, spinbutton = gimp_spin_button_new (&contrast->adjustment,
contrast, NULL, NULL, TRUE, FALSE, 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); return contrast->hbox;
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);
} }
static void static void
cdisplay_contrast_configure_cancel (GimpColorDisplay *display) cdisplay_contrast_configure_reset (GimpColorDisplay *display)
{ {
CdisplayContrast *contrast; CdisplayContrast *contrast;
contrast = CDISPLAY_CONTRAST (display); contrast = CDISPLAY_CONTRAST (display);
if (contrast->shell) if (contrast->adjustment)
{ gtk_adjustment_set_value (GTK_ADJUSTMENT (contrast->adjustment),
gtk_widget_destroy (contrast->shell); DEFAULT_CONTRAST);
contrast->shell = NULL;
}
if (contrast->cancel_func)
contrast->cancel_func (contrast, contrast->cancel_data);
} }
static void static void
@ -392,24 +357,12 @@ contrast_create_lookup_table (CdisplayContrast *contrast)
} }
static void static void
contrast_configure_ok_callback (GtkWidget *widget, contrast_configure_adj_callback (GtkAdjustment *adj,
CdisplayContrast *contrast) CdisplayContrast *contrast)
{ {
contrast->contrast = contrast->contrast = adj->value;
gtk_spin_button_get_value (GTK_SPIN_BUTTON (contrast->spinner));
contrast_create_lookup_table (contrast); contrast_create_lookup_table (contrast);
gtk_widget_destroy (GTK_WIDGET (contrast->shell)); gimp_color_display_changed (GIMP_COLOR_DISPLAY (contrast));
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));
} }

View file

@ -107,7 +107,7 @@ static gboolean colorsel_triangle_event (GtkWidget *widget,
static const GimpModuleInfo colorsel_triangle_info = static const GimpModuleInfo colorsel_triangle_info =
{ {
N_("Painter-style color selector as a pluggable color selector"), N_("Painter-style triangle color selector"),
"Simon Budig <Simon.Budig@unix-ag.org>", "Simon Budig <Simon.Budig@unix-ag.org>",
"v0.03", "v0.03",
"(c) 1999, released under the GPL", "(c) 1999, released under the GPL",

View file

@ -104,7 +104,7 @@ static void pressure_adjust_update (GtkAdjustment *adj,
static const GimpModuleInfo colorsel_water_info = static const GimpModuleInfo colorsel_water_info =
{ {
N_("Watercolor style color selector as a pluggable module"), N_("Watercolor style color selector"),
"Raph Levien <raph@acm.org>, Sven Neumann <sven@gimp.org>", "Raph Levien <raph@acm.org>, Sven Neumann <sven@gimp.org>",
"v0.3", "v0.3",
"(c) 1998-1999, released under the GPL", "(c) 1998-1999, released under the GPL",
@ -289,22 +289,6 @@ colorsel_water_update (ColorselWater *water)
&water->rgb, &hsv); &water->rgb, &hsv);
} }
static gdouble static gdouble
calc (gdouble x, calc (gdouble x,
gdouble y, gdouble y,
@ -318,7 +302,6 @@ calc (gdouble x,
return 128 + (x - (IMAGE_SIZE >> 1)) * c - (y - (IMAGE_SIZE >> 1)) * s; return 128 + (x - (IMAGE_SIZE >> 1)) * c - (y - (IMAGE_SIZE >> 1)) * s;
} }
/* Initialize the preview */ /* Initialize the preview */
static void static void
select_area_draw (GtkWidget *preview) select_area_draw (GtkWidget *preview)
@ -352,7 +335,6 @@ select_area_draw (GtkWidget *preview)
} }
} }
static void static void
add_pigment (ColorselWater *colorsel, add_pigment (ColorselWater *colorsel,
gboolean erase, gboolean erase,
@ -364,7 +346,7 @@ add_pigment (ColorselWater *colorsel,
much *= (gdouble) colorsel->pressure_adjust; much *= (gdouble) colorsel->pressure_adjust;
if (erase) if (erase)
{ {
colorsel->rgb.r = 1 - (1 - colorsel->rgb.r) * (1 - much); colorsel->rgb.r = 1 - (1 - colorsel->rgb.r) * (1 - much);
colorsel->rgb.g = 1 - (1 - colorsel->rgb.g) * (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_x = event->x;
water->last_y = event->y; 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; water->button_state |= 1 << event->button;