New manpage plus bumper fun pack of bugfixes.

Sun Feb 14 01:27:29 GMT 1999  Austin Donnelly  <austin@gimp.org>

	New manpage plus bumper fun pack of bugfixes.

	* gimprc.5.in: NEW FILE: beginnings of some docs on gimprc file
	     format.
	* configure.in: generate gimprc.5 from gimprc.5.in
	* Makefile.am: install gimprc.5
	* .cvsignore: ignore gimprc.5, it's auto generated.

	* gimp.1: fix a few paths and URLs.  Mention the modules/
	     directory in user's gimpdir.

	* app/commands.c: cancel resize or scale dialogs when image
 	     they're for is destroyed, rather than segfaulting when Ok is
 	     clicked.  Thanks to Peter Teichman <peter@zeno.dorm.duke.edu>
 	     for pointing this one out.  Layer resize/scale still suffers
 	     from same problem, but Adam's working on L&C at the moment.

	* app/gdisplay.c: off-by one error on bounds check in making image
	     title.

	* app/module_db.c: some would consider it foolish returning to
 	     code you've just unloaded.  So don't do that.

	* app/plug_in.c: when superceeding a PDB function with a newer one
	     of the same name, remove pointers to the old one from the
	     plugins that originally registered them.  Fixes Nick Lamb's
	     pluginrc file corruption thing, and catches the (common?)
	     error of copying a plugin to a different name but failing to
	     change what it registers.  Also, if registering a file
	     loader/saver, make sure it has set an extension, prefix, or
	     magic number it's interested in - that way code that relies
	     on checking this doesn't get confused.
This commit is contained in:
GMT 1999 Austin Donnelly 1999-02-14 01:53:23 +00:00 committed by Austin Donnelly
parent 446a11e938
commit 54fe3402e7
37 changed files with 2307 additions and 102 deletions

View File

@ -6,6 +6,7 @@ config.h
config.cache
stamp-h
gimprc
gimprc.5
config.status
libtool
aclocal.m4

View File

@ -1,3 +1,38 @@
Sun Feb 14 01:27:29 GMT 1999 Austin Donnelly <austin@gimp.org>
New manpage plus bumper fun pack of bugfixes.
* gimprc.5.in: NEW FILE: beginnings of some docs on gimprc file
format.
* configure.in: generate gimprc.5 from gimprc.5.in
* Makefile.am: install gimprc.5
* .cvsignore: ignore gimprc.5, it's auto generated.
* gimp.1: fix a few paths and URLs. Mention the modules/
directory in user's gimpdir.
* app/commands.c: cancel resize or scale dialogs when image
they're for is destroyed, rather than segfaulting when Ok is
clicked. Thanks to Peter Teichman <peter@zeno.dorm.duke.edu>
for pointing this one out. Layer resize/scale still suffers
from same problem, but Adam's working on L&C at the moment.
* app/gdisplay.c: off-by one error on bounds check in making image
title.
* app/module_db.c: some would consider it foolish returning to
code you've just unloaded. So don't do that.
* app/plug_in.c: when superceeding a PDB function with a newer one
of the same name, remove pointers to the old one from the
plugins that originally registered them. Fixes Nick Lamb's
pluginrc file corruption thing, and catches the (common?)
error of copying a plugin to a different name but failing to
change what it registers. Also, if registering a file
loader/saver, make sure it has set an extension, prefix, or
magic number it's interested in - that way code that relies
on checking this doesn't get confused.
Sat Feb 13 19:05:16 CET 1999 Marc Lehmann <pcg@goof.com>
* app/internal_procs.c

View File

@ -25,6 +25,7 @@ EXTRA_DIST = \
gimpdata_DATA = \
gimprc \
gimprc_user \
gimprc.5 \
gtkrc \
gimp_logo.ppm \
gimp_splash.ppm \
@ -35,7 +36,7 @@ gimpdata_DATA = \
gimpdata_SCRIPTS = user_install
man_MANS=gimp.1 gimptool.1
man_MANS=gimp.1 gimptool.1 gimprc.5
m4datadir = $(datadir)/aclocal
m4data_DATA = gimp.m4

View File

@ -789,6 +789,11 @@ image_resize_cmd_callback (GtkWidget *widget,
GTK_SIGNAL_FUNC (image_delete_callback),
image_resize);
/* handle the image disappearing under our feet */
gtk_signal_connect (GTK_OBJECT (gdisp->gimage), "destroy",
GTK_SIGNAL_FUNC (image_cancel_callback),
image_resize);
/* the main vbox */
vbox = gtk_vbox_new (FALSE, 1);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
@ -836,6 +841,11 @@ image_scale_cmd_callback (GtkWidget *widget,
GTK_SIGNAL_FUNC (image_delete_callback),
image_scale);
/* handle the image disappearing under our feet */
gtk_signal_connect (GTK_OBJECT (gdisp->gimage), "destroy",
GTK_SIGNAL_FUNC (image_cancel_callback),
image_scale);
/* the main vbox */
vbox = gtk_vbox_new (FALSE, 1);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
@ -1134,6 +1144,11 @@ image_resize_callback (GtkWidget *w,
GImage *gimage;
image_resize = (ImageResize *) client_data;
gtk_signal_disconnect_by_func (GTK_OBJECT (image_resize->gimage),
GTK_SIGNAL_FUNC (image_cancel_callback),
image_resize);
if ((gimage = image_resize->gimage) != NULL)
{
if (image_resize->resize->width > 0 &&
@ -1166,6 +1181,11 @@ image_scale_callback (GtkWidget *w,
GImage *gimage;
image_scale = (ImageResize *) client_data;
gtk_signal_disconnect_by_func (GTK_OBJECT (image_scale->gimage),
GTK_SIGNAL_FUNC (image_cancel_callback),
image_scale);
if ((gimage = image_scale->gimage) != NULL)
{
if (image_scale->resize->width > 0 &&
@ -1207,6 +1227,10 @@ image_cancel_callback (GtkWidget *w,
image_resize = (ImageResize *) client_data;
gtk_signal_disconnect_by_func (GTK_OBJECT (image_resize->gimage),
GTK_SIGNAL_FUNC (image_cancel_callback),
image_resize);
gtk_widget_destroy (image_resize->shell);
resize_widget_free (image_resize->resize);
g_free (image_resize);

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -789,6 +789,11 @@ image_resize_cmd_callback (GtkWidget *widget,
GTK_SIGNAL_FUNC (image_delete_callback),
image_resize);
/* handle the image disappearing under our feet */
gtk_signal_connect (GTK_OBJECT (gdisp->gimage), "destroy",
GTK_SIGNAL_FUNC (image_cancel_callback),
image_resize);
/* the main vbox */
vbox = gtk_vbox_new (FALSE, 1);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
@ -836,6 +841,11 @@ image_scale_cmd_callback (GtkWidget *widget,
GTK_SIGNAL_FUNC (image_delete_callback),
image_scale);
/* handle the image disappearing under our feet */
gtk_signal_connect (GTK_OBJECT (gdisp->gimage), "destroy",
GTK_SIGNAL_FUNC (image_cancel_callback),
image_scale);
/* the main vbox */
vbox = gtk_vbox_new (FALSE, 1);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
@ -1134,6 +1144,11 @@ image_resize_callback (GtkWidget *w,
GImage *gimage;
image_resize = (ImageResize *) client_data;
gtk_signal_disconnect_by_func (GTK_OBJECT (image_resize->gimage),
GTK_SIGNAL_FUNC (image_cancel_callback),
image_resize);
if ((gimage = image_resize->gimage) != NULL)
{
if (image_resize->resize->width > 0 &&
@ -1166,6 +1181,11 @@ image_scale_callback (GtkWidget *w,
GImage *gimage;
image_scale = (ImageResize *) client_data;
gtk_signal_disconnect_by_func (GTK_OBJECT (image_scale->gimage),
GTK_SIGNAL_FUNC (image_cancel_callback),
image_scale);
if ((gimage = image_scale->gimage) != NULL)
{
if (image_scale->resize->width > 0 &&
@ -1207,6 +1227,10 @@ image_cancel_callback (GtkWidget *w,
image_resize = (ImageResize *) client_data;
gtk_signal_disconnect_by_func (GTK_OBJECT (image_resize->gimage),
GTK_SIGNAL_FUNC (image_cancel_callback),
image_resize);
gtk_widget_destroy (image_resize->shell);
resize_widget_free (image_resize->resize);
g_free (image_resize);

View File

@ -271,7 +271,7 @@ gdisplay_format_title (GDisplay *gdisp,
format++;
}
title[MIN(i, title_len)] = 0;
title[MIN(i, title_len-1)] = 0;
}

View File

@ -60,6 +60,7 @@ typedef struct {
gboolean ondisk; /* TRUE if file still exists */
/* stuff from now on may be NULL depending on the state the module is in */
GimpModuleInfo *info; /* returned values from module_init */
gint refs; /* how many time we're running in the module */
GModule *module; /* handle on the module */
gchar *last_module_error;
GimpModuleInitFunc *init;
@ -111,6 +112,10 @@ static void browser_load_unload_callback (GtkWidget *widget, gpointer data);
static void browser_refresh_callback (GtkWidget *widget, gpointer data);
static void make_list_item (gpointer data, gpointer user_data);
static void gimp_module_ref (module_info *mod);
static void gimp_module_unref (module_info *mod);
/**************************************************************/
/* Exported functions */
@ -457,8 +462,11 @@ mod_unload_completed_callback (void *data)
g_return_if_fail (mod->state == ST_UNLOAD_REQUESTED);
g_module_close (mod->module);
mod->module = NULL;
if (mod->refs == 0)
{
g_module_close (mod->module);
mod->module = NULL;
}
mod->info = NULL;
mod->state = ST_UNLOADED_OK;
@ -477,8 +485,12 @@ mod_unload (module_info *mod, gboolean verbose)
mod->state = ST_UNLOAD_REQUESTED;
/* send the unload request */
/* send the unload request. Need to ref the module so we don't
* accidentally unload it while this call is in progress (eg if the
* callback is called before the unload function returns). */
gimp_module_ref (mod);
mod->unload (mod->info->shutdown_data, mod_unload_completed_callback, mod);
gimp_module_unref (mod);
}
@ -819,3 +831,29 @@ browser_refresh_callback (GtkWidget *widget, gpointer data)
datafiles_read_directories (module_path,
module_initialize, 0 /* no flags */);
}
static void
gimp_module_ref (module_info *mod)
{
g_return_if_fail (mod->refs >= 0);
g_return_if_fail (mod->module != NULL);
mod->refs++;
}
static void
gimp_module_unref (module_info *mod)
{
g_return_if_fail (mod->refs > 0);
g_return_if_fail (mod->module != NULL);
mod->refs--;
if (mod->refs == 0)
{
g_module_close (mod->module);
mod->module = NULL;
}
}
/* End of module_db.c */

View File

@ -271,7 +271,7 @@ gdisplay_format_title (GDisplay *gdisp,
format++;
}
title[MIN(i, title_len)] = 0;
title[MIN(i, title_len-1)] = 0;
}

View File

@ -271,7 +271,7 @@ gdisplay_format_title (GDisplay *gdisp,
format++;
}
title[MIN(i, title_len)] = 0;
title[MIN(i, title_len-1)] = 0;
}

View File

@ -789,6 +789,11 @@ image_resize_cmd_callback (GtkWidget *widget,
GTK_SIGNAL_FUNC (image_delete_callback),
image_resize);
/* handle the image disappearing under our feet */
gtk_signal_connect (GTK_OBJECT (gdisp->gimage), "destroy",
GTK_SIGNAL_FUNC (image_cancel_callback),
image_resize);
/* the main vbox */
vbox = gtk_vbox_new (FALSE, 1);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
@ -836,6 +841,11 @@ image_scale_cmd_callback (GtkWidget *widget,
GTK_SIGNAL_FUNC (image_delete_callback),
image_scale);
/* handle the image disappearing under our feet */
gtk_signal_connect (GTK_OBJECT (gdisp->gimage), "destroy",
GTK_SIGNAL_FUNC (image_cancel_callback),
image_scale);
/* the main vbox */
vbox = gtk_vbox_new (FALSE, 1);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
@ -1134,6 +1144,11 @@ image_resize_callback (GtkWidget *w,
GImage *gimage;
image_resize = (ImageResize *) client_data;
gtk_signal_disconnect_by_func (GTK_OBJECT (image_resize->gimage),
GTK_SIGNAL_FUNC (image_cancel_callback),
image_resize);
if ((gimage = image_resize->gimage) != NULL)
{
if (image_resize->resize->width > 0 &&
@ -1166,6 +1181,11 @@ image_scale_callback (GtkWidget *w,
GImage *gimage;
image_scale = (ImageResize *) client_data;
gtk_signal_disconnect_by_func (GTK_OBJECT (image_scale->gimage),
GTK_SIGNAL_FUNC (image_cancel_callback),
image_scale);
if ((gimage = image_scale->gimage) != NULL)
{
if (image_scale->resize->width > 0 &&
@ -1207,6 +1227,10 @@ image_cancel_callback (GtkWidget *w,
image_resize = (ImageResize *) client_data;
gtk_signal_disconnect_by_func (GTK_OBJECT (image_resize->gimage),
GTK_SIGNAL_FUNC (image_cancel_callback),
image_resize);
gtk_widget_destroy (image_resize->shell);
resize_widget_free (image_resize->resize);
g_free (image_resize);

View File

@ -789,6 +789,11 @@ image_resize_cmd_callback (GtkWidget *widget,
GTK_SIGNAL_FUNC (image_delete_callback),
image_resize);
/* handle the image disappearing under our feet */
gtk_signal_connect (GTK_OBJECT (gdisp->gimage), "destroy",
GTK_SIGNAL_FUNC (image_cancel_callback),
image_resize);
/* the main vbox */
vbox = gtk_vbox_new (FALSE, 1);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
@ -836,6 +841,11 @@ image_scale_cmd_callback (GtkWidget *widget,
GTK_SIGNAL_FUNC (image_delete_callback),
image_scale);
/* handle the image disappearing under our feet */
gtk_signal_connect (GTK_OBJECT (gdisp->gimage), "destroy",
GTK_SIGNAL_FUNC (image_cancel_callback),
image_scale);
/* the main vbox */
vbox = gtk_vbox_new (FALSE, 1);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
@ -1134,6 +1144,11 @@ image_resize_callback (GtkWidget *w,
GImage *gimage;
image_resize = (ImageResize *) client_data;
gtk_signal_disconnect_by_func (GTK_OBJECT (image_resize->gimage),
GTK_SIGNAL_FUNC (image_cancel_callback),
image_resize);
if ((gimage = image_resize->gimage) != NULL)
{
if (image_resize->resize->width > 0 &&
@ -1166,6 +1181,11 @@ image_scale_callback (GtkWidget *w,
GImage *gimage;
image_scale = (ImageResize *) client_data;
gtk_signal_disconnect_by_func (GTK_OBJECT (image_scale->gimage),
GTK_SIGNAL_FUNC (image_cancel_callback),
image_scale);
if ((gimage = image_scale->gimage) != NULL)
{
if (image_scale->resize->width > 0 &&
@ -1207,6 +1227,10 @@ image_cancel_callback (GtkWidget *w,
image_resize = (ImageResize *) client_data;
gtk_signal_disconnect_by_func (GTK_OBJECT (image_resize->gimage),
GTK_SIGNAL_FUNC (image_cancel_callback),
image_resize);
gtk_widget_destroy (image_resize->shell);
resize_widget_free (image_resize->resize);
g_free (image_resize);

View File

@ -60,6 +60,7 @@ typedef struct {
gboolean ondisk; /* TRUE if file still exists */
/* stuff from now on may be NULL depending on the state the module is in */
GimpModuleInfo *info; /* returned values from module_init */
gint refs; /* how many time we're running in the module */
GModule *module; /* handle on the module */
gchar *last_module_error;
GimpModuleInitFunc *init;
@ -111,6 +112,10 @@ static void browser_load_unload_callback (GtkWidget *widget, gpointer data);
static void browser_refresh_callback (GtkWidget *widget, gpointer data);
static void make_list_item (gpointer data, gpointer user_data);
static void gimp_module_ref (module_info *mod);
static void gimp_module_unref (module_info *mod);
/**************************************************************/
/* Exported functions */
@ -457,8 +462,11 @@ mod_unload_completed_callback (void *data)
g_return_if_fail (mod->state == ST_UNLOAD_REQUESTED);
g_module_close (mod->module);
mod->module = NULL;
if (mod->refs == 0)
{
g_module_close (mod->module);
mod->module = NULL;
}
mod->info = NULL;
mod->state = ST_UNLOADED_OK;
@ -477,8 +485,12 @@ mod_unload (module_info *mod, gboolean verbose)
mod->state = ST_UNLOAD_REQUESTED;
/* send the unload request */
/* send the unload request. Need to ref the module so we don't
* accidentally unload it while this call is in progress (eg if the
* callback is called before the unload function returns). */
gimp_module_ref (mod);
mod->unload (mod->info->shutdown_data, mod_unload_completed_callback, mod);
gimp_module_unref (mod);
}
@ -819,3 +831,29 @@ browser_refresh_callback (GtkWidget *widget, gpointer data)
datafiles_read_directories (module_path,
module_initialize, 0 /* no flags */);
}
static void
gimp_module_ref (module_info *mod)
{
g_return_if_fail (mod->refs >= 0);
g_return_if_fail (mod->module != NULL);
mod->refs++;
}
static void
gimp_module_unref (module_info *mod)
{
g_return_if_fail (mod->refs > 0);
g_return_if_fail (mod->module != NULL);
mod->refs--;
if (mod->refs == 0)
{
g_module_close (mod->module);
mod->module = NULL;
}
}
/* End of module_db.c */

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -60,6 +60,7 @@ typedef struct {
gboolean ondisk; /* TRUE if file still exists */
/* stuff from now on may be NULL depending on the state the module is in */
GimpModuleInfo *info; /* returned values from module_init */
gint refs; /* how many time we're running in the module */
GModule *module; /* handle on the module */
gchar *last_module_error;
GimpModuleInitFunc *init;
@ -111,6 +112,10 @@ static void browser_load_unload_callback (GtkWidget *widget, gpointer data);
static void browser_refresh_callback (GtkWidget *widget, gpointer data);
static void make_list_item (gpointer data, gpointer user_data);
static void gimp_module_ref (module_info *mod);
static void gimp_module_unref (module_info *mod);
/**************************************************************/
/* Exported functions */
@ -457,8 +462,11 @@ mod_unload_completed_callback (void *data)
g_return_if_fail (mod->state == ST_UNLOAD_REQUESTED);
g_module_close (mod->module);
mod->module = NULL;
if (mod->refs == 0)
{
g_module_close (mod->module);
mod->module = NULL;
}
mod->info = NULL;
mod->state = ST_UNLOADED_OK;
@ -477,8 +485,12 @@ mod_unload (module_info *mod, gboolean verbose)
mod->state = ST_UNLOAD_REQUESTED;
/* send the unload request */
/* send the unload request. Need to ref the module so we don't
* accidentally unload it while this call is in progress (eg if the
* callback is called before the unload function returns). */
gimp_module_ref (mod);
mod->unload (mod->info->shutdown_data, mod_unload_completed_callback, mod);
gimp_module_unref (mod);
}
@ -819,3 +831,29 @@ browser_refresh_callback (GtkWidget *widget, gpointer data)
datafiles_read_directories (module_path,
module_initialize, 0 /* no flags */);
}
static void
gimp_module_ref (module_info *mod)
{
g_return_if_fail (mod->refs >= 0);
g_return_if_fail (mod->module != NULL);
mod->refs++;
}
static void
gimp_module_unref (module_info *mod)
{
g_return_if_fail (mod->refs > 0);
g_return_if_fail (mod->module != NULL);
mod->refs--;
if (mod->refs == 0)
{
g_module_close (mod->module);
mod->module = NULL;
}
}
/* End of module_db.c */

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
static void plug_in_make_menu (void);
static void plug_in_callback (GtkWidget *widget,
gpointer client_data);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def);
static void plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void *));
static void plug_in_proc_def_dead (void *freed_proc_def);
static void plug_in_proc_def_remove (PlugInProcDef *proc_def);
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
int data_only);
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
};
void
plug_in_init ()
{
@ -500,7 +503,7 @@ plug_in_init ()
{
proc_def = g_new (PlugInProcDef, 1);
*proc_def = *((PlugInProcDef*) tmp->data);
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, NULL);
tmp = tmp->next;
}
@ -517,7 +520,7 @@ plug_in_init ()
tmp2 = tmp2->next;
proc_def->mtime = plug_in_def->mtime;
plug_in_proc_def_insert (proc_def);
plug_in_proc_def_insert (proc_def, plug_in_proc_def_dead);
}
}
@ -788,6 +791,7 @@ plug_in_def_add (PlugInDef *plug_in_def)
{
GSList *tmp;
PlugInDef *tplug_in_def;
PlugInProcDef *proc_def;
char *t1, *t2;
t1 = strrchr (plug_in_def->prog, '/');
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
else
t1 = plug_in_def->prog;
/* If this is a file load or save plugin, make sure we have
* something for one of the extensions, prefixes, or magic number.
* Other bits of code rely on detecting file plugins by the presence
* of one of these things, but Nick Lamb's alien/unknown format
* loader needs to be able to register no extensions, prefixes or
* magics. -- austin 13/Feb/99 */
tmp = plug_in_def->proc_defs;
while (tmp)
{
proc_def = tmp->data;
if (!proc_def->extensions && !proc_def->prefixes && !proc_def->magics &&
proc_def->menu_path &&
(!strncmp (proc_def->menu_path, "<Load>", 6) ||
!strncmp (proc_def->menu_path, "<Save>", 6)))
{
proc_def->extensions = g_strdup("");
}
tmp = tmp->next;
}
tmp = plug_in_defs;
while (tmp)
{
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
}
static void
plug_in_proc_def_insert (PlugInProcDef *proc_def)
plug_in_proc_def_insert (PlugInProcDef *proc_def,
void (*superceed_fn)(void*))
{
PlugInProcDef *tmp_proc_def;
GSList *tmp, *prev;
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
tmp_proc_def->menu_path = NULL;
tmp_proc_def->accelerator = NULL;
if (superceed_fn)
(*superceed_fn) (tmp_proc_def);
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
return;
}
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
proc_defs = g_slist_append (proc_defs, proc_def);
}
/* called when plug_in_proc_def_insert causes a proc_def to be
* overridden and thus g_free()d. */
static void
plug_in_proc_def_dead (void *freed_proc_def)
{
GSList *tmp;
PlugInDef *plug_in_def;
PlugInProcDef *proc_def = freed_proc_def;
g_warning (_("removing duplicate PDB procedure \"%s\""),
proc_def->db_info.name);
/* search the plugin list to see if any plugins had references to
* the recently freed proc_def. */
tmp = plug_in_defs;
while (tmp)
{
plug_in_def = tmp->data;
plug_in_def->proc_defs = g_slist_remove (plug_in_def->proc_defs,
freed_proc_def);
tmp = tmp->next;
}
}
static void
plug_in_proc_def_remove (PlugInProcDef *proc_def)
{

View File

@ -649,6 +649,7 @@ dnl Output the Makefiles
AC_OUTPUT([
gimprc
gimprc_user
gimprc.5
gimptool
libgimp/gimpfeatures.h
Makefile

17
gimp.1
View File

@ -99,7 +99,7 @@ placed in users home directories the first time gimp is ran.
\fB$HOME\fP/.gimp/gtkrc - users set of GTK config settings. Options
such as widget color and fonts sizes can be set here.
\fB$PREFIX\fP/share/gtkrc - sytem wide default set of GTK config settings.
\fB$PREFIX\fP/share/gimp/gtkrc - sytem wide default set of GTK config settings.
\fB$HOME\fP/.gimp/menurc - user's set of keybindings.
@ -110,6 +110,8 @@ such as widget color and fonts sizes can be set here.
\fB$HOME\fP/.gimp/pluginrc - plugin initialization values are stored
here. This file is parsed on startup and regenerated if need be.
\fB$HOME\fP/.gimp/modules - location of user installed modules.
\fB$HOME\fP/.gimp/tmp - default location that gimp uses as temporary space.
Gimp's data files are stored in \fB$PREFIX\fP/share/gimp where
@ -205,16 +207,16 @@ better.
.SH OTHER INFO
The canonical place to find GIMP info is at http://www.gimp.org.
The canonical place to find GIMP info is at http://www.gimp.org/.
Here you can find links to just about every other gimp site, tutorials, data
sets, mailing list archives, and more.
There is also a Gimp User Manual available at
http://www.dtek.chalmers.se/~d95olofs/manual/ that goes into much more detail
http://manual.gimp.org/ that goes into much more detail
about the interactive use of Gimp.
The latest version of Gimp and the gtk libs is always available at
ftp://ftp.gimp.org.
ftp://ftp.gimp.org/.
.SH AUTHORS
Spencer Kimball and Peter Mattis.
@ -239,8 +241,5 @@ Tracy Scott, Manish Singh, Nathan Summers,
Mike Sweet, Eiichi Takamori, Tristan Tarrant,
Owen Taylor, Ian Tester, James Wang, Kris Wehner.
.SH "SEE ALSO"
.BR gimprc (5)

439
gimprc-1.2.5.in Normal file
View File

@ -0,0 +1,439 @@
.\" Hey Emacs! This file is -*- nroff -*- source.
.\"
.\" This manpage is Copyright (C) 1999 Austin Donnelly <austin@gimp.org>
.\"
.\" Permission is granted to make and distribute verbatim copies of this
.\" manual provided the copyright notice and this permission notice are
.\" preserved on all copies.
.\"
.\" Permission is granted to copy and distribute modified versions of this
.\" manual under the conditions for verbatim copying, provided that the
.\" entire resulting derived work is distributed under the terms of a
.\" permission notice identical to this one
.\"
.\" Since the gimp is constantly changing, this manual page may be
.\" incorrect or out-of-date. The author(s) assume no responsibility
.\" for errors or omissions, or for damages resulting from the use of
.\" the information contained herein. The author(s) may not
.\" have taken the same level of care in the production of this manual,
.\" which is licensed free of charge, as they might when working
.\" professionally.
.\"
.\" Formatted or processed versions of this manual, if unaccompanied by
.\" the source, must acknowledge the copyright and authors of this work.
.\"
.\" Sun Feb 7 22:22:38 GMT 1999 Austin Donnelly <austin@gimp.org>
.\" * initial revision
.\"
.\" Sat Feb 13 23:47:36 GMT 1999 Austin Donnelly <austin@gimp.org>
.\" * added section on path expansion, and renamed to gimprc.5.in
.\"
.TH GIMPRC 5 "13 Jan 1999" "Version 1.1.2"
.SH NAME
gimprc \- gimp configuration file
.SH DESCRIPTION
The
.B gimprc
file is a configuation file read by the gimp when it starts up. There
are two of these: one system-wide one stored in
@prefix@/share/gimp/gimprc and a per-user \fB$HOME\fP/@gimpdir@/gimprc
which may override system settings.
Comments are introduced by a hash sign (#), and continue until the
end of the line. Blank lines are ignored.
The
.B gimprc
file associates values with properties. These properties may be set
by lisp-like assignments of the form:
.IP
\f3(\f2property-name\ \ \ value\f3)\f1
.TP
where:
.TP 10
.I propery-name
is one of the property names described below.
.TP
.I value
is the value the property is to be set to.
.PP
Either spaces or tabs may be used to separate the name from the value.
The values have an associated type, described below:
.TP
.I STRING
A sequence of characters surrounded by double-quotes ("). A backslash
(\\) may be used to escape either double-quote or itself to generate a
literal double-quote or a literal backslash.
.TP
.I PATH
Same as STRING, but path-expansion (see below) is also performed.
.TP
.I DOUBLE
An optional minus sign (-) followed by zero or more decimal digits,
and optionally a decimal-point (.) followed by zero or more decimal
digits.
.TP
.I FLOAT
Same as DOUBLE.
.TP
.I INT
Same as DOUBLE, except the value is rounded to the next lowest integer.
.TP
.I BOOLEAN
One of
.BR true ", " on ", " yes ", "
.BR false ", " off ", or " no "."
Alternatively, the empty string is interpreted to mean
.BR true "."
.TP
.I POSITION
Same as two INTs separated by whitespace.
.TP
.I MEMSIZE
An INT followed by a size specifier. A size specifier is one of
.BR m ", " M ", "
.BR k ", " K ", "
.BR b ", or " B "."
The size specified may be omitted, in which case it defaults to
.BR k "."
.TP
.I IMAGETYPE
One of
.BR rgb ", " grey ", or " gray "."
.TP
.I COLORCUBE
Four whitespace separated INTs, giving the number of shades of red,
green, blue and grey (respectively) in the color cube.
.TP
.I PREVIEWSIZE
One of
.BR none ", " small ", " medium ", or " large ", "
or an INT. small is 32x32, medium is 64x64, and large is 128x128.
.TP
.I RULERUNIT
One of
.BR pixels ", " inches ", or " centimeters "."
.PP
.SH PROPERTIES
Valid properties and their types:
.TP
.I temp-path PATH
Set the temporary storage directory. Files will appear here
during the course of running the gimp. Most files will disappear
when the gimp exits, but some files are likely to remain,
such as working palette files, so it is best if this directory
not be one that is shared by other users or is cleared on machine
reboot such as /tmp.
.TP
.I swap-path PATH
Set the swap file location. The gimp uses a tile based memory
allocation scheme. The swap file is used to quickly and easily
swap tiles out to disk and back in. Be aware that the swap file
can easily get very large if the gimp is used with large images.
Also, things can get horribly slow if the swap file is created on
a directory that is mounted over NFS. For these reasons, it may
be desirable to put your swap file in "/tmp".
.TP
.I brush-path PATH
Set the brush search path. This is a colon-separated list of
directories to be searched for brushes.
.TP
.I pattern-path PATH
Set the pattern search path. This is a colon-separated list of
directories to be searched for patterns.
.TP
.I plug-in-path PATH
Set the plug-in search path. This is a colon-separated list of
directories which will be scanned at startup to register new plugins.
.TP
.I palette-path PATH
Set the palette search path. This is a colon-separated list of
directories to be searched for palettes.
.TP
.I gradient-path PATH
Set the gradient search path. This is a colon-separated list of
directories to be searched for gradients.
.TP
.I module-path PATH
Set the module search path. This is a colon-separated list of
directories which will be scanned at startup for modules to be loaded.
.TP
.I default-brush STRING
Specify a default brush. This doesn't actually do anything any more,
since the default brush is set as part of the saved device status.
.TP
.I default-pattern STRING
Specify a default pattern. The pattern is searched for in the
specified pattern path.
.TP
.I default-palette STRING
Specify a default palette. The palette is searched for in the
specified palette path.
.TP
.I default-gradient STRING
Specify a default gradient. The gradient is searched for in the
specified gradient path.
.TP
.I gamma-correction DOUBLE
Set the gamma correction value for the display. 1.0 corresponds to no
gamma correction. For most displays, gamma correction should be set
to between 2.0 and 2.6 Run the utility "gamma_correct" to determine
appropriate values for your display. XXX is this valid info? One
important item to keep in mind: Many images that you might get from
outside sources will in all likelihood already be gamma-corrected. In
these cases, the image will look washed-out if the gimp has
gamma-correction turned on. If you are going to work with images of
this sort, turn gamma correction off by setting the value to 1.0.
.TP
.I color-cube COLORCUBE
Set the displays color cube. No longer used in gimp-1.1.x since the
introduction of GdkRgb.
.TP
.I install-colormap BOOLEAN
Install a private colormap by default - not actually used anymore since
the introduction of GdkRgb.
.TP
.I tile-cache-size MEMSIZE
The tile cache is used to make sure the gimp doesn't thrash
tiles between memory and disk. Setting this value higher will
cause the gimp to use less swap space, but will also cause
the gimp to use more memory. Conversely, a smaller cache size
causes the gimp to use more swap space and less memory.
Note: the gimp will still run even if `tile-cache-size' is
set to 0. The actual size can contain a suffix of 'm', 'M',
'k', 'K', 'b' or 'B', which makes the gimp interpret the
size as being specified in megabytes, kilobytes and bytes
respectively. If no suffix is specified the size defaults to
being specified in kilobytes.
.TP
.I marching-ants-speed INT
Speed of marching ants in the selection outline. This value is in
milliseconds (less time indicates faster marching).
.TP
.I last-opened-size INT
How many recently opened image filenames to keep on the File menu.
.TP
.I undo-levels INT
Set the number of operations kept on the undo stack.
.TP
.I transparency-type INT
Set the manner in which transparency is displayed in images.
Transparency type can be one of 0 - Light Checks, 1 - Mid-Tone Checks,
2 - Dark Checks, 3 - White Only, 4 - Gray Only, or 5 - Black Only.
.TP
.I transparency-size INT
Check size can be one of 0 - Small, 1 - Medium, or 2 - Large
.TP
.I perfect-mouse BOOLEAN
If set to true, the X server is queried for the mouse's current
position on each motion event, rather than relying on the position
hint. This means painting with large brushes should be more accurate,
but it may be slower. Perversely, on some X servers turning on this
option results in faster painting.
.TP
.I colormap-cycling BOOLEAN
Specify that marching ants for selected regions will be drawn with
colormap cycling as oposed to redrawing with different stipple masks.
This color cycling option works only with 8-bit displays.
.TP
.I default-threshold INT
Tools such as fuzzy-select and bucket fill find regions based on a
seed-fill algorithm. The seed fill starts at the intially selected
pixel and progresses in all directions until the difference of pixel
intensity from the original is greater than a specified threshold.
This value represents the default threshold.
.TP
.I stingy-memory-use BOOLEAN
There is always a tradeoff between memory usage and speed. In most
cases, the GIMP opts for speed over memory. However, if memory is a
big issue, set stingy-memory-use.
.TP
.I allow-resize-windows BOOLEAN
When zooming into and out of images, this option enables the automatic
resizing of windows.
.TP
.I dont-allow-resize-windows BOOLEAN
Negated version of allow-resize-windows.
.TP
.I cursor-updating BOOLEAN
Context-dependent cursors are cool. They are enabled by default.
However, they require overhead that you may want to do without.
.TP
.I no-cursor-updating BOOLEAN
Negated version of cursor-updating.
.TP
.I preview-size PREVIEWSIZE
Set the layer preview size.
.TP
.I show-rulers BOOLEAN
Set the ruler visibility. The default behavior is for rulers to be on.
This can also be toggled with the View->Toggle Rulers command or
shift+control+r.
.TP
.I dont-show-rulers BOOLEAN
Negated version of show-rulers.
.TP
.I show-statusbar BOOLEAN
Controlling statusbar visibility. The default behavior is to show the
statusbar. This can also be toggled with the View->Toggle Statusbar
command or shift+control+s.
.TP
.I dont-show-statusbar BOOLEAN
Negated version of show-statusbar.
.TP
.I ruler-units RULERUNIT
Set the ruler units when not in dot-for-dot mode. The units of rulers
can be one of pixels, inches or centimeters. The default is pixels.
.TP
.I auto-save BOOLEAN
Auto saving is not yet implemented! Nothing will be auto-saved, no
matter how you set this.
.TP
.I dont-auto-save BOOLEAN
Negated version of auto-save.
.TP
.I cubic-interpolation BOOLEAN
Set the level of interpolation. If set, this option enables cubic
interpolation when scaling or transforming. By default, GIMP uses
linear interpolation, which is faster, but has poorer quality.
.TP
.I confirm-on-close BOOLEAN
Ask for confirmation before closing an image without saving. This is
the default.
.TP
.I dont-confirm-on-close BOOLEAN
Negated version of confirm-on-close.
.TP
.I save-session-info BOOLEAN
Remember the positions and sizes of the main dialogs and asks your
window-manager to place them there again the next time you use the
GIMP.
.TP
.I dont-save-session-info BOOLEAN
Negated version of save-session-info.
.TP
.I save-device-status BOOLEAN
Remember the current tool, pattern, color, and brush across GIMP
sessions.
.TP
.I dont-save-device-status BOOLEAN
Negated version of save-device-status.
.TP
.I always-restore-session BOOLEAN
Let GIMP try to restore your last saved session.
.TP
.I show-tips BOOLEAN
Set to display a handy GIMP tip on startup.
.TP
.I dont-show-tips BOOLEAN
Negated version of show-tips.
.TP
.I show-tool-tips BOOLEAN
Set to display tooltips in the toolbox.
.TP
.I dont-show-tool-tips BOOLEAN
Negated version of show-tool-tips.
.TP
.I default-image-size POSITION
Set the default image size in the File/New dialog.
.TP
.I default-image-type IMAGETYPE
Set the default image type in the File/New dialog.
.TP
.I default-resolution INT
Set the default image resolution in the File/New dialog.
.TP
.I default-resolution-units RULERUNIT
Set the units the default-resolution setting is in.
.TP
.I monitor-xresolution FLOAT
Set the monitor's horizontal resolution, in dots per inch. If set to
0, forces the X server to be queried for both horizontal and vertical
resolution information.
.TP
.I monitor-yresolution FLOAT
Set the monitor's vertical resolution, in dots per inch. If set to
0, forces the X server to be queried for both horizontal and vertical
resolution information.
.TP
.I num-processors INT
On multiprocessor machines, if GIMP has been compiled with --enable-mp
this sets how many processors GIMP should use simultaneously.
.TP
.I image-title-format STRING
Set the text to appear in image window titles. Certain % character
sequences are recognised and expanded as follows:
%% literal percent sign
.br
%f bare filename, or "Untiltled"
.br
%F full path to file, or "Untiltled"
.br
%p PDB image id
.br
%i view instance number
.br
%t image type (RGB, indexed, greyscale)
.br
%z zoom factor as a percentage
.br
%s source scale factor
.br
%d destination scale factor
The default format string is "%f-%p.%i (%t)".
.PP
.SH PATH EXPANSION
Strings of type PATH are expanded in a manner similar to
.BR bash (1).
Specifically: tilde (~) is expanded to the user's home directory, and
${variable} is expanded to the current value of the variable. Note
that the bash feature of being able to refer to other user's home
directories by writing ~userid/ is not valid in this file.
The only variable initially defined is
.I gimp_dir
, which is set to either the interned value
.B @gimpdir@
or the environment variable GIMP_DIRECTORY. If the path in
GIMP_DIRECTORY is relative, it is considered relative to your home
directory. The same variable expansion syntax can be used to refer to
environment variables. New variables may be defined so long as their
name does not shadow one of the property names given in the previous
section. Variables are set using the following syntax:
.IP
\f3(\f2variable-name\ \ \ PATH\f3)\f1
.PP
Note that the right hand side of this assignment is itself path
expanded before setting the value of the variable.
Typically, the system-wide gimprc file will set a few convenience
variables:
.TP
.I prefix
The installation prefix for this build, @prefix@.
.TP
.I exec_prefix
The path to architecture-specific executables, @exec_prefix@.
.TP
.I gimp_data_dir
Path to sharable data, @gimpdatadir@.
.TP
.I gimp_plugin_dir
Base for paths to architecture-specific plugins and modules,
@gimpplugindir@.
.PP
.SH FILES
.TP
.I $PREFIX/share/gimp/gimprc
System-wide configuration file
.TP
.I $HOME/.gimp-1.1/gimprc
Per-user configuration file
.SH "SEE ALSO"
.BR gimp (1).

439
gimprc.5.in Normal file
View File

@ -0,0 +1,439 @@
.\" Hey Emacs! This file is -*- nroff -*- source.
.\"
.\" This manpage is Copyright (C) 1999 Austin Donnelly <austin@gimp.org>
.\"
.\" Permission is granted to make and distribute verbatim copies of this
.\" manual provided the copyright notice and this permission notice are
.\" preserved on all copies.
.\"
.\" Permission is granted to copy and distribute modified versions of this
.\" manual under the conditions for verbatim copying, provided that the
.\" entire resulting derived work is distributed under the terms of a
.\" permission notice identical to this one
.\"
.\" Since the gimp is constantly changing, this manual page may be
.\" incorrect or out-of-date. The author(s) assume no responsibility
.\" for errors or omissions, or for damages resulting from the use of
.\" the information contained herein. The author(s) may not
.\" have taken the same level of care in the production of this manual,
.\" which is licensed free of charge, as they might when working
.\" professionally.
.\"
.\" Formatted or processed versions of this manual, if unaccompanied by
.\" the source, must acknowledge the copyright and authors of this work.
.\"
.\" Sun Feb 7 22:22:38 GMT 1999 Austin Donnelly <austin@gimp.org>
.\" * initial revision
.\"
.\" Sat Feb 13 23:47:36 GMT 1999 Austin Donnelly <austin@gimp.org>
.\" * added section on path expansion, and renamed to gimprc.5.in
.\"
.TH GIMPRC 5 "13 Jan 1999" "Version 1.1.2"
.SH NAME
gimprc \- gimp configuration file
.SH DESCRIPTION
The
.B gimprc
file is a configuation file read by the gimp when it starts up. There
are two of these: one system-wide one stored in
@prefix@/share/gimp/gimprc and a per-user \fB$HOME\fP/@gimpdir@/gimprc
which may override system settings.
Comments are introduced by a hash sign (#), and continue until the
end of the line. Blank lines are ignored.
The
.B gimprc
file associates values with properties. These properties may be set
by lisp-like assignments of the form:
.IP
\f3(\f2property-name\ \ \ value\f3)\f1
.TP
where:
.TP 10
.I propery-name
is one of the property names described below.
.TP
.I value
is the value the property is to be set to.
.PP
Either spaces or tabs may be used to separate the name from the value.
The values have an associated type, described below:
.TP
.I STRING
A sequence of characters surrounded by double-quotes ("). A backslash
(\\) may be used to escape either double-quote or itself to generate a
literal double-quote or a literal backslash.
.TP
.I PATH
Same as STRING, but path-expansion (see below) is also performed.
.TP
.I DOUBLE
An optional minus sign (-) followed by zero or more decimal digits,
and optionally a decimal-point (.) followed by zero or more decimal
digits.
.TP
.I FLOAT
Same as DOUBLE.
.TP
.I INT
Same as DOUBLE, except the value is rounded to the next lowest integer.
.TP
.I BOOLEAN
One of
.BR true ", " on ", " yes ", "
.BR false ", " off ", or " no "."
Alternatively, the empty string is interpreted to mean
.BR true "."
.TP
.I POSITION
Same as two INTs separated by whitespace.
.TP
.I MEMSIZE
An INT followed by a size specifier. A size specifier is one of
.BR m ", " M ", "
.BR k ", " K ", "
.BR b ", or " B "."
The size specified may be omitted, in which case it defaults to
.BR k "."
.TP
.I IMAGETYPE
One of
.BR rgb ", " grey ", or " gray "."
.TP
.I COLORCUBE
Four whitespace separated INTs, giving the number of shades of red,
green, blue and grey (respectively) in the color cube.
.TP
.I PREVIEWSIZE
One of
.BR none ", " small ", " medium ", or " large ", "
or an INT. small is 32x32, medium is 64x64, and large is 128x128.
.TP
.I RULERUNIT
One of
.BR pixels ", " inches ", or " centimeters "."
.PP
.SH PROPERTIES
Valid properties and their types:
.TP
.I temp-path PATH
Set the temporary storage directory. Files will appear here
during the course of running the gimp. Most files will disappear
when the gimp exits, but some files are likely to remain,
such as working palette files, so it is best if this directory
not be one that is shared by other users or is cleared on machine
reboot such as /tmp.
.TP
.I swap-path PATH
Set the swap file location. The gimp uses a tile based memory
allocation scheme. The swap file is used to quickly and easily
swap tiles out to disk and back in. Be aware that the swap file
can easily get very large if the gimp is used with large images.
Also, things can get horribly slow if the swap file is created on
a directory that is mounted over NFS. For these reasons, it may
be desirable to put your swap file in "/tmp".
.TP
.I brush-path PATH
Set the brush search path. This is a colon-separated list of
directories to be searched for brushes.
.TP
.I pattern-path PATH
Set the pattern search path. This is a colon-separated list of
directories to be searched for patterns.
.TP
.I plug-in-path PATH
Set the plug-in search path. This is a colon-separated list of
directories which will be scanned at startup to register new plugins.
.TP
.I palette-path PATH
Set the palette search path. This is a colon-separated list of
directories to be searched for palettes.
.TP
.I gradient-path PATH
Set the gradient search path. This is a colon-separated list of
directories to be searched for gradients.
.TP
.I module-path PATH
Set the module search path. This is a colon-separated list of
directories which will be scanned at startup for modules to be loaded.
.TP
.I default-brush STRING
Specify a default brush. This doesn't actually do anything any more,
since the default brush is set as part of the saved device status.
.TP
.I default-pattern STRING
Specify a default pattern. The pattern is searched for in the
specified pattern path.
.TP
.I default-palette STRING
Specify a default palette. The palette is searched for in the
specified palette path.
.TP
.I default-gradient STRING
Specify a default gradient. The gradient is searched for in the
specified gradient path.
.TP
.I gamma-correction DOUBLE
Set the gamma correction value for the display. 1.0 corresponds to no
gamma correction. For most displays, gamma correction should be set
to between 2.0 and 2.6 Run the utility "gamma_correct" to determine
appropriate values for your display. XXX is this valid info? One
important item to keep in mind: Many images that you might get from
outside sources will in all likelihood already be gamma-corrected. In
these cases, the image will look washed-out if the gimp has
gamma-correction turned on. If you are going to work with images of
this sort, turn gamma correction off by setting the value to 1.0.
.TP
.I color-cube COLORCUBE
Set the displays color cube. No longer used in gimp-1.1.x since the
introduction of GdkRgb.
.TP
.I install-colormap BOOLEAN
Install a private colormap by default - not actually used anymore since
the introduction of GdkRgb.
.TP
.I tile-cache-size MEMSIZE
The tile cache is used to make sure the gimp doesn't thrash
tiles between memory and disk. Setting this value higher will
cause the gimp to use less swap space, but will also cause
the gimp to use more memory. Conversely, a smaller cache size
causes the gimp to use more swap space and less memory.
Note: the gimp will still run even if `tile-cache-size' is
set to 0. The actual size can contain a suffix of 'm', 'M',
'k', 'K', 'b' or 'B', which makes the gimp interpret the
size as being specified in megabytes, kilobytes and bytes
respectively. If no suffix is specified the size defaults to
being specified in kilobytes.
.TP
.I marching-ants-speed INT
Speed of marching ants in the selection outline. This value is in
milliseconds (less time indicates faster marching).
.TP
.I last-opened-size INT
How many recently opened image filenames to keep on the File menu.
.TP
.I undo-levels INT
Set the number of operations kept on the undo stack.
.TP
.I transparency-type INT
Set the manner in which transparency is displayed in images.
Transparency type can be one of 0 - Light Checks, 1 - Mid-Tone Checks,
2 - Dark Checks, 3 - White Only, 4 - Gray Only, or 5 - Black Only.
.TP
.I transparency-size INT
Check size can be one of 0 - Small, 1 - Medium, or 2 - Large
.TP
.I perfect-mouse BOOLEAN
If set to true, the X server is queried for the mouse's current
position on each motion event, rather than relying on the position
hint. This means painting with large brushes should be more accurate,
but it may be slower. Perversely, on some X servers turning on this
option results in faster painting.
.TP
.I colormap-cycling BOOLEAN
Specify that marching ants for selected regions will be drawn with
colormap cycling as oposed to redrawing with different stipple masks.
This color cycling option works only with 8-bit displays.
.TP
.I default-threshold INT
Tools such as fuzzy-select and bucket fill find regions based on a
seed-fill algorithm. The seed fill starts at the intially selected
pixel and progresses in all directions until the difference of pixel
intensity from the original is greater than a specified threshold.
This value represents the default threshold.
.TP
.I stingy-memory-use BOOLEAN
There is always a tradeoff between memory usage and speed. In most
cases, the GIMP opts for speed over memory. However, if memory is a
big issue, set stingy-memory-use.
.TP
.I allow-resize-windows BOOLEAN
When zooming into and out of images, this option enables the automatic
resizing of windows.
.TP
.I dont-allow-resize-windows BOOLEAN
Negated version of allow-resize-windows.
.TP
.I cursor-updating BOOLEAN
Context-dependent cursors are cool. They are enabled by default.
However, they require overhead that you may want to do without.
.TP
.I no-cursor-updating BOOLEAN
Negated version of cursor-updating.
.TP
.I preview-size PREVIEWSIZE
Set the layer preview size.
.TP
.I show-rulers BOOLEAN
Set the ruler visibility. The default behavior is for rulers to be on.
This can also be toggled with the View->Toggle Rulers command or
shift+control+r.
.TP
.I dont-show-rulers BOOLEAN
Negated version of show-rulers.
.TP
.I show-statusbar BOOLEAN
Controlling statusbar visibility. The default behavior is to show the
statusbar. This can also be toggled with the View->Toggle Statusbar
command or shift+control+s.
.TP
.I dont-show-statusbar BOOLEAN
Negated version of show-statusbar.
.TP
.I ruler-units RULERUNIT
Set the ruler units when not in dot-for-dot mode. The units of rulers
can be one of pixels, inches or centimeters. The default is pixels.
.TP
.I auto-save BOOLEAN
Auto saving is not yet implemented! Nothing will be auto-saved, no
matter how you set this.
.TP
.I dont-auto-save BOOLEAN
Negated version of auto-save.
.TP
.I cubic-interpolation BOOLEAN
Set the level of interpolation. If set, this option enables cubic
interpolation when scaling or transforming. By default, GIMP uses
linear interpolation, which is faster, but has poorer quality.
.TP
.I confirm-on-close BOOLEAN
Ask for confirmation before closing an image without saving. This is
the default.
.TP
.I dont-confirm-on-close BOOLEAN
Negated version of confirm-on-close.
.TP
.I save-session-info BOOLEAN
Remember the positions and sizes of the main dialogs and asks your
window-manager to place them there again the next time you use the
GIMP.
.TP
.I dont-save-session-info BOOLEAN
Negated version of save-session-info.
.TP
.I save-device-status BOOLEAN
Remember the current tool, pattern, color, and brush across GIMP
sessions.
.TP
.I dont-save-device-status BOOLEAN
Negated version of save-device-status.
.TP
.I always-restore-session BOOLEAN
Let GIMP try to restore your last saved session.
.TP
.I show-tips BOOLEAN
Set to display a handy GIMP tip on startup.
.TP
.I dont-show-tips BOOLEAN
Negated version of show-tips.
.TP
.I show-tool-tips BOOLEAN
Set to display tooltips in the toolbox.
.TP
.I dont-show-tool-tips BOOLEAN
Negated version of show-tool-tips.
.TP
.I default-image-size POSITION
Set the default image size in the File/New dialog.
.TP
.I default-image-type IMAGETYPE
Set the default image type in the File/New dialog.
.TP
.I default-resolution INT
Set the default image resolution in the File/New dialog.
.TP
.I default-resolution-units RULERUNIT
Set the units the default-resolution setting is in.
.TP
.I monitor-xresolution FLOAT
Set the monitor's horizontal resolution, in dots per inch. If set to
0, forces the X server to be queried for both horizontal and vertical
resolution information.
.TP
.I monitor-yresolution FLOAT
Set the monitor's vertical resolution, in dots per inch. If set to
0, forces the X server to be queried for both horizontal and vertical
resolution information.
.TP
.I num-processors INT
On multiprocessor machines, if GIMP has been compiled with --enable-mp
this sets how many processors GIMP should use simultaneously.
.TP
.I image-title-format STRING
Set the text to appear in image window titles. Certain % character
sequences are recognised and expanded as follows:
%% literal percent sign
.br
%f bare filename, or "Untiltled"
.br
%F full path to file, or "Untiltled"
.br
%p PDB image id
.br
%i view instance number
.br
%t image type (RGB, indexed, greyscale)
.br
%z zoom factor as a percentage
.br
%s source scale factor
.br
%d destination scale factor
The default format string is "%f-%p.%i (%t)".
.PP
.SH PATH EXPANSION
Strings of type PATH are expanded in a manner similar to
.BR bash (1).
Specifically: tilde (~) is expanded to the user's home directory, and
${variable} is expanded to the current value of the variable. Note
that the bash feature of being able to refer to other user's home
directories by writing ~userid/ is not valid in this file.
The only variable initially defined is
.I gimp_dir
, which is set to either the interned value
.B @gimpdir@
or the environment variable GIMP_DIRECTORY. If the path in
GIMP_DIRECTORY is relative, it is considered relative to your home
directory. The same variable expansion syntax can be used to refer to
environment variables. New variables may be defined so long as their
name does not shadow one of the property names given in the previous
section. Variables are set using the following syntax:
.IP
\f3(\f2variable-name\ \ \ PATH\f3)\f1
.PP
Note that the right hand side of this assignment is itself path
expanded before setting the value of the variable.
Typically, the system-wide gimprc file will set a few convenience
variables:
.TP
.I prefix
The installation prefix for this build, @prefix@.
.TP
.I exec_prefix
The path to architecture-specific executables, @exec_prefix@.
.TP
.I gimp_data_dir
Path to sharable data, @gimpdatadir@.
.TP
.I gimp_plugin_dir
Base for paths to architecture-specific plugins and modules,
@gimpplugindir@.
.PP
.SH FILES
.TP
.I $PREFIX/share/gimp/gimprc
System-wide configuration file
.TP
.I $HOME/.gimp-1.1/gimprc
Per-user configuration file
.SH "SEE ALSO"
.BR gimp (1).