mirror of https://github.com/GNOME/gimp.git
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:
parent
446a11e938
commit
54fe3402e7
|
@ -6,6 +6,7 @@ config.h
|
||||||
config.cache
|
config.cache
|
||||||
stamp-h
|
stamp-h
|
||||||
gimprc
|
gimprc
|
||||||
|
gimprc.5
|
||||||
config.status
|
config.status
|
||||||
libtool
|
libtool
|
||||||
aclocal.m4
|
aclocal.m4
|
||||||
|
|
35
ChangeLog
35
ChangeLog
|
@ -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>
|
Sat Feb 13 19:05:16 CET 1999 Marc Lehmann <pcg@goof.com>
|
||||||
|
|
||||||
* app/internal_procs.c
|
* app/internal_procs.c
|
||||||
|
|
|
@ -25,6 +25,7 @@ EXTRA_DIST = \
|
||||||
gimpdata_DATA = \
|
gimpdata_DATA = \
|
||||||
gimprc \
|
gimprc \
|
||||||
gimprc_user \
|
gimprc_user \
|
||||||
|
gimprc.5 \
|
||||||
gtkrc \
|
gtkrc \
|
||||||
gimp_logo.ppm \
|
gimp_logo.ppm \
|
||||||
gimp_splash.ppm \
|
gimp_splash.ppm \
|
||||||
|
@ -35,7 +36,7 @@ gimpdata_DATA = \
|
||||||
|
|
||||||
gimpdata_SCRIPTS = user_install
|
gimpdata_SCRIPTS = user_install
|
||||||
|
|
||||||
man_MANS=gimp.1 gimptool.1
|
man_MANS=gimp.1 gimptool.1 gimprc.5
|
||||||
|
|
||||||
m4datadir = $(datadir)/aclocal
|
m4datadir = $(datadir)/aclocal
|
||||||
m4data_DATA = gimp.m4
|
m4data_DATA = gimp.m4
|
||||||
|
|
|
@ -789,6 +789,11 @@ image_resize_cmd_callback (GtkWidget *widget,
|
||||||
GTK_SIGNAL_FUNC (image_delete_callback),
|
GTK_SIGNAL_FUNC (image_delete_callback),
|
||||||
image_resize);
|
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 */
|
/* the main vbox */
|
||||||
vbox = gtk_vbox_new (FALSE, 1);
|
vbox = gtk_vbox_new (FALSE, 1);
|
||||||
gtk_container_set_border_width (GTK_CONTAINER (vbox), 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),
|
GTK_SIGNAL_FUNC (image_delete_callback),
|
||||||
image_scale);
|
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 */
|
/* the main vbox */
|
||||||
vbox = gtk_vbox_new (FALSE, 1);
|
vbox = gtk_vbox_new (FALSE, 1);
|
||||||
gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
|
gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
|
||||||
|
@ -1134,6 +1144,11 @@ image_resize_callback (GtkWidget *w,
|
||||||
GImage *gimage;
|
GImage *gimage;
|
||||||
|
|
||||||
image_resize = (ImageResize *) client_data;
|
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 ((gimage = image_resize->gimage) != NULL)
|
||||||
{
|
{
|
||||||
if (image_resize->resize->width > 0 &&
|
if (image_resize->resize->width > 0 &&
|
||||||
|
@ -1166,6 +1181,11 @@ image_scale_callback (GtkWidget *w,
|
||||||
GImage *gimage;
|
GImage *gimage;
|
||||||
|
|
||||||
image_scale = (ImageResize *) client_data;
|
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 ((gimage = image_scale->gimage) != NULL)
|
||||||
{
|
{
|
||||||
if (image_scale->resize->width > 0 &&
|
if (image_scale->resize->width > 0 &&
|
||||||
|
@ -1207,6 +1227,10 @@ image_cancel_callback (GtkWidget *w,
|
||||||
|
|
||||||
image_resize = (ImageResize *) client_data;
|
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);
|
gtk_widget_destroy (image_resize->shell);
|
||||||
resize_widget_free (image_resize->resize);
|
resize_widget_free (image_resize->resize);
|
||||||
g_free (image_resize);
|
g_free (image_resize);
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -789,6 +789,11 @@ image_resize_cmd_callback (GtkWidget *widget,
|
||||||
GTK_SIGNAL_FUNC (image_delete_callback),
|
GTK_SIGNAL_FUNC (image_delete_callback),
|
||||||
image_resize);
|
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 */
|
/* the main vbox */
|
||||||
vbox = gtk_vbox_new (FALSE, 1);
|
vbox = gtk_vbox_new (FALSE, 1);
|
||||||
gtk_container_set_border_width (GTK_CONTAINER (vbox), 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),
|
GTK_SIGNAL_FUNC (image_delete_callback),
|
||||||
image_scale);
|
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 */
|
/* the main vbox */
|
||||||
vbox = gtk_vbox_new (FALSE, 1);
|
vbox = gtk_vbox_new (FALSE, 1);
|
||||||
gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
|
gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
|
||||||
|
@ -1134,6 +1144,11 @@ image_resize_callback (GtkWidget *w,
|
||||||
GImage *gimage;
|
GImage *gimage;
|
||||||
|
|
||||||
image_resize = (ImageResize *) client_data;
|
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 ((gimage = image_resize->gimage) != NULL)
|
||||||
{
|
{
|
||||||
if (image_resize->resize->width > 0 &&
|
if (image_resize->resize->width > 0 &&
|
||||||
|
@ -1166,6 +1181,11 @@ image_scale_callback (GtkWidget *w,
|
||||||
GImage *gimage;
|
GImage *gimage;
|
||||||
|
|
||||||
image_scale = (ImageResize *) client_data;
|
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 ((gimage = image_scale->gimage) != NULL)
|
||||||
{
|
{
|
||||||
if (image_scale->resize->width > 0 &&
|
if (image_scale->resize->width > 0 &&
|
||||||
|
@ -1207,6 +1227,10 @@ image_cancel_callback (GtkWidget *w,
|
||||||
|
|
||||||
image_resize = (ImageResize *) client_data;
|
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);
|
gtk_widget_destroy (image_resize->shell);
|
||||||
resize_widget_free (image_resize->resize);
|
resize_widget_free (image_resize->resize);
|
||||||
g_free (image_resize);
|
g_free (image_resize);
|
||||||
|
|
|
@ -271,7 +271,7 @@ gdisplay_format_title (GDisplay *gdisp,
|
||||||
format++;
|
format++;
|
||||||
}
|
}
|
||||||
|
|
||||||
title[MIN(i, title_len)] = 0;
|
title[MIN(i, title_len-1)] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,7 @@ typedef struct {
|
||||||
gboolean ondisk; /* TRUE if file still exists */
|
gboolean ondisk; /* TRUE if file still exists */
|
||||||
/* stuff from now on may be NULL depending on the state the module is in */
|
/* stuff from now on may be NULL depending on the state the module is in */
|
||||||
GimpModuleInfo *info; /* returned values from module_init */
|
GimpModuleInfo *info; /* returned values from module_init */
|
||||||
|
gint refs; /* how many time we're running in the module */
|
||||||
GModule *module; /* handle on the module */
|
GModule *module; /* handle on the module */
|
||||||
gchar *last_module_error;
|
gchar *last_module_error;
|
||||||
GimpModuleInitFunc *init;
|
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 browser_refresh_callback (GtkWidget *widget, gpointer data);
|
||||||
static void make_list_item (gpointer data, gpointer user_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 */
|
/* Exported functions */
|
||||||
|
@ -457,8 +462,11 @@ mod_unload_completed_callback (void *data)
|
||||||
|
|
||||||
g_return_if_fail (mod->state == ST_UNLOAD_REQUESTED);
|
g_return_if_fail (mod->state == ST_UNLOAD_REQUESTED);
|
||||||
|
|
||||||
g_module_close (mod->module);
|
if (mod->refs == 0)
|
||||||
mod->module = NULL;
|
{
|
||||||
|
g_module_close (mod->module);
|
||||||
|
mod->module = NULL;
|
||||||
|
}
|
||||||
mod->info = NULL;
|
mod->info = NULL;
|
||||||
|
|
||||||
mod->state = ST_UNLOADED_OK;
|
mod->state = ST_UNLOADED_OK;
|
||||||
|
@ -477,8 +485,12 @@ mod_unload (module_info *mod, gboolean verbose)
|
||||||
|
|
||||||
mod->state = ST_UNLOAD_REQUESTED;
|
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);
|
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,
|
datafiles_read_directories (module_path,
|
||||||
module_initialize, 0 /* no flags */);
|
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 */
|
||||||
|
|
|
@ -271,7 +271,7 @@ gdisplay_format_title (GDisplay *gdisp,
|
||||||
format++;
|
format++;
|
||||||
}
|
}
|
||||||
|
|
||||||
title[MIN(i, title_len)] = 0;
|
title[MIN(i, title_len-1)] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -271,7 +271,7 @@ gdisplay_format_title (GDisplay *gdisp,
|
||||||
format++;
|
format++;
|
||||||
}
|
}
|
||||||
|
|
||||||
title[MIN(i, title_len)] = 0;
|
title[MIN(i, title_len-1)] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -789,6 +789,11 @@ image_resize_cmd_callback (GtkWidget *widget,
|
||||||
GTK_SIGNAL_FUNC (image_delete_callback),
|
GTK_SIGNAL_FUNC (image_delete_callback),
|
||||||
image_resize);
|
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 */
|
/* the main vbox */
|
||||||
vbox = gtk_vbox_new (FALSE, 1);
|
vbox = gtk_vbox_new (FALSE, 1);
|
||||||
gtk_container_set_border_width (GTK_CONTAINER (vbox), 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),
|
GTK_SIGNAL_FUNC (image_delete_callback),
|
||||||
image_scale);
|
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 */
|
/* the main vbox */
|
||||||
vbox = gtk_vbox_new (FALSE, 1);
|
vbox = gtk_vbox_new (FALSE, 1);
|
||||||
gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
|
gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
|
||||||
|
@ -1134,6 +1144,11 @@ image_resize_callback (GtkWidget *w,
|
||||||
GImage *gimage;
|
GImage *gimage;
|
||||||
|
|
||||||
image_resize = (ImageResize *) client_data;
|
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 ((gimage = image_resize->gimage) != NULL)
|
||||||
{
|
{
|
||||||
if (image_resize->resize->width > 0 &&
|
if (image_resize->resize->width > 0 &&
|
||||||
|
@ -1166,6 +1181,11 @@ image_scale_callback (GtkWidget *w,
|
||||||
GImage *gimage;
|
GImage *gimage;
|
||||||
|
|
||||||
image_scale = (ImageResize *) client_data;
|
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 ((gimage = image_scale->gimage) != NULL)
|
||||||
{
|
{
|
||||||
if (image_scale->resize->width > 0 &&
|
if (image_scale->resize->width > 0 &&
|
||||||
|
@ -1207,6 +1227,10 @@ image_cancel_callback (GtkWidget *w,
|
||||||
|
|
||||||
image_resize = (ImageResize *) client_data;
|
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);
|
gtk_widget_destroy (image_resize->shell);
|
||||||
resize_widget_free (image_resize->resize);
|
resize_widget_free (image_resize->resize);
|
||||||
g_free (image_resize);
|
g_free (image_resize);
|
||||||
|
|
|
@ -789,6 +789,11 @@ image_resize_cmd_callback (GtkWidget *widget,
|
||||||
GTK_SIGNAL_FUNC (image_delete_callback),
|
GTK_SIGNAL_FUNC (image_delete_callback),
|
||||||
image_resize);
|
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 */
|
/* the main vbox */
|
||||||
vbox = gtk_vbox_new (FALSE, 1);
|
vbox = gtk_vbox_new (FALSE, 1);
|
||||||
gtk_container_set_border_width (GTK_CONTAINER (vbox), 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),
|
GTK_SIGNAL_FUNC (image_delete_callback),
|
||||||
image_scale);
|
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 */
|
/* the main vbox */
|
||||||
vbox = gtk_vbox_new (FALSE, 1);
|
vbox = gtk_vbox_new (FALSE, 1);
|
||||||
gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
|
gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
|
||||||
|
@ -1134,6 +1144,11 @@ image_resize_callback (GtkWidget *w,
|
||||||
GImage *gimage;
|
GImage *gimage;
|
||||||
|
|
||||||
image_resize = (ImageResize *) client_data;
|
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 ((gimage = image_resize->gimage) != NULL)
|
||||||
{
|
{
|
||||||
if (image_resize->resize->width > 0 &&
|
if (image_resize->resize->width > 0 &&
|
||||||
|
@ -1166,6 +1181,11 @@ image_scale_callback (GtkWidget *w,
|
||||||
GImage *gimage;
|
GImage *gimage;
|
||||||
|
|
||||||
image_scale = (ImageResize *) client_data;
|
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 ((gimage = image_scale->gimage) != NULL)
|
||||||
{
|
{
|
||||||
if (image_scale->resize->width > 0 &&
|
if (image_scale->resize->width > 0 &&
|
||||||
|
@ -1207,6 +1227,10 @@ image_cancel_callback (GtkWidget *w,
|
||||||
|
|
||||||
image_resize = (ImageResize *) client_data;
|
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);
|
gtk_widget_destroy (image_resize->shell);
|
||||||
resize_widget_free (image_resize->resize);
|
resize_widget_free (image_resize->resize);
|
||||||
g_free (image_resize);
|
g_free (image_resize);
|
||||||
|
|
|
@ -60,6 +60,7 @@ typedef struct {
|
||||||
gboolean ondisk; /* TRUE if file still exists */
|
gboolean ondisk; /* TRUE if file still exists */
|
||||||
/* stuff from now on may be NULL depending on the state the module is in */
|
/* stuff from now on may be NULL depending on the state the module is in */
|
||||||
GimpModuleInfo *info; /* returned values from module_init */
|
GimpModuleInfo *info; /* returned values from module_init */
|
||||||
|
gint refs; /* how many time we're running in the module */
|
||||||
GModule *module; /* handle on the module */
|
GModule *module; /* handle on the module */
|
||||||
gchar *last_module_error;
|
gchar *last_module_error;
|
||||||
GimpModuleInitFunc *init;
|
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 browser_refresh_callback (GtkWidget *widget, gpointer data);
|
||||||
static void make_list_item (gpointer data, gpointer user_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 */
|
/* Exported functions */
|
||||||
|
@ -457,8 +462,11 @@ mod_unload_completed_callback (void *data)
|
||||||
|
|
||||||
g_return_if_fail (mod->state == ST_UNLOAD_REQUESTED);
|
g_return_if_fail (mod->state == ST_UNLOAD_REQUESTED);
|
||||||
|
|
||||||
g_module_close (mod->module);
|
if (mod->refs == 0)
|
||||||
mod->module = NULL;
|
{
|
||||||
|
g_module_close (mod->module);
|
||||||
|
mod->module = NULL;
|
||||||
|
}
|
||||||
mod->info = NULL;
|
mod->info = NULL;
|
||||||
|
|
||||||
mod->state = ST_UNLOADED_OK;
|
mod->state = ST_UNLOADED_OK;
|
||||||
|
@ -477,8 +485,12 @@ mod_unload (module_info *mod, gboolean verbose)
|
||||||
|
|
||||||
mod->state = ST_UNLOAD_REQUESTED;
|
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);
|
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,
|
datafiles_read_directories (module_path,
|
||||||
module_initialize, 0 /* no flags */);
|
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 */
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -60,6 +60,7 @@ typedef struct {
|
||||||
gboolean ondisk; /* TRUE if file still exists */
|
gboolean ondisk; /* TRUE if file still exists */
|
||||||
/* stuff from now on may be NULL depending on the state the module is in */
|
/* stuff from now on may be NULL depending on the state the module is in */
|
||||||
GimpModuleInfo *info; /* returned values from module_init */
|
GimpModuleInfo *info; /* returned values from module_init */
|
||||||
|
gint refs; /* how many time we're running in the module */
|
||||||
GModule *module; /* handle on the module */
|
GModule *module; /* handle on the module */
|
||||||
gchar *last_module_error;
|
gchar *last_module_error;
|
||||||
GimpModuleInitFunc *init;
|
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 browser_refresh_callback (GtkWidget *widget, gpointer data);
|
||||||
static void make_list_item (gpointer data, gpointer user_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 */
|
/* Exported functions */
|
||||||
|
@ -457,8 +462,11 @@ mod_unload_completed_callback (void *data)
|
||||||
|
|
||||||
g_return_if_fail (mod->state == ST_UNLOAD_REQUESTED);
|
g_return_if_fail (mod->state == ST_UNLOAD_REQUESTED);
|
||||||
|
|
||||||
g_module_close (mod->module);
|
if (mod->refs == 0)
|
||||||
mod->module = NULL;
|
{
|
||||||
|
g_module_close (mod->module);
|
||||||
|
mod->module = NULL;
|
||||||
|
}
|
||||||
mod->info = NULL;
|
mod->info = NULL;
|
||||||
|
|
||||||
mod->state = ST_UNLOADED_OK;
|
mod->state = ST_UNLOADED_OK;
|
||||||
|
@ -477,8 +485,12 @@ mod_unload (module_info *mod, gboolean verbose)
|
||||||
|
|
||||||
mod->state = ST_UNLOAD_REQUESTED;
|
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);
|
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,
|
datafiles_read_directories (module_path,
|
||||||
module_initialize, 0 /* no flags */);
|
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 */
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,7 +106,9 @@ static void plug_in_add_to_db (void);
|
||||||
static void plug_in_make_menu (void);
|
static void plug_in_make_menu (void);
|
||||||
static void plug_in_callback (GtkWidget *widget,
|
static void plug_in_callback (GtkWidget *widget,
|
||||||
gpointer client_data);
|
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_remove (PlugInProcDef *proc_def);
|
||||||
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
static void plug_in_proc_def_destroy (PlugInProcDef *proc_def,
|
||||||
int data_only);
|
int data_only);
|
||||||
|
@ -394,6 +396,7 @@ ProcRecord plugin_query_proc =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
plug_in_init ()
|
plug_in_init ()
|
||||||
{
|
{
|
||||||
|
@ -500,7 +503,7 @@ plug_in_init ()
|
||||||
{
|
{
|
||||||
proc_def = g_new (PlugInProcDef, 1);
|
proc_def = g_new (PlugInProcDef, 1);
|
||||||
*proc_def = *((PlugInProcDef*) tmp->data);
|
*proc_def = *((PlugInProcDef*) tmp->data);
|
||||||
plug_in_proc_def_insert (proc_def);
|
plug_in_proc_def_insert (proc_def, NULL);
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ plug_in_init ()
|
||||||
tmp2 = tmp2->next;
|
tmp2 = tmp2->next;
|
||||||
|
|
||||||
proc_def->mtime = plug_in_def->mtime;
|
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;
|
GSList *tmp;
|
||||||
PlugInDef *tplug_in_def;
|
PlugInDef *tplug_in_def;
|
||||||
|
PlugInProcDef *proc_def;
|
||||||
char *t1, *t2;
|
char *t1, *t2;
|
||||||
|
|
||||||
t1 = strrchr (plug_in_def->prog, '/');
|
t1 = strrchr (plug_in_def->prog, '/');
|
||||||
|
@ -796,6 +800,27 @@ plug_in_def_add (PlugInDef *plug_in_def)
|
||||||
else
|
else
|
||||||
t1 = plug_in_def->prog;
|
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;
|
tmp = plug_in_defs;
|
||||||
while (tmp)
|
while (tmp)
|
||||||
{
|
{
|
||||||
|
@ -2388,7 +2413,8 @@ plug_in_callback (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
PlugInProcDef *tmp_proc_def;
|
||||||
GSList *tmp, *prev;
|
GSList *tmp, *prev;
|
||||||
|
@ -2416,6 +2442,9 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
tmp_proc_def->menu_path = NULL;
|
tmp_proc_def->menu_path = NULL;
|
||||||
tmp_proc_def->accelerator = NULL;
|
tmp_proc_def->accelerator = NULL;
|
||||||
|
|
||||||
|
if (superceed_fn)
|
||||||
|
(*superceed_fn) (tmp_proc_def);
|
||||||
|
|
||||||
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
plug_in_proc_def_destroy (tmp_proc_def, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2470,31 @@ plug_in_proc_def_insert (PlugInProcDef *proc_def)
|
||||||
proc_defs = g_slist_append (proc_defs, 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
|
static void
|
||||||
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
plug_in_proc_def_remove (PlugInProcDef *proc_def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -649,6 +649,7 @@ dnl Output the Makefiles
|
||||||
AC_OUTPUT([
|
AC_OUTPUT([
|
||||||
gimprc
|
gimprc
|
||||||
gimprc_user
|
gimprc_user
|
||||||
|
gimprc.5
|
||||||
gimptool
|
gimptool
|
||||||
libgimp/gimpfeatures.h
|
libgimp/gimpfeatures.h
|
||||||
Makefile
|
Makefile
|
||||||
|
|
17
gimp.1
17
gimp.1
|
@ -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
|
\fB$HOME\fP/.gimp/gtkrc - users set of GTK config settings. Options
|
||||||
such as widget color and fonts sizes can be set here.
|
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.
|
\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
|
\fB$HOME\fP/.gimp/pluginrc - plugin initialization values are stored
|
||||||
here. This file is parsed on startup and regenerated if need be.
|
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.
|
\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
|
Gimp's data files are stored in \fB$PREFIX\fP/share/gimp where
|
||||||
|
@ -205,16 +207,16 @@ better.
|
||||||
|
|
||||||
.SH OTHER INFO
|
.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
|
Here you can find links to just about every other gimp site, tutorials, data
|
||||||
sets, mailing list archives, and more.
|
sets, mailing list archives, and more.
|
||||||
|
|
||||||
There is also a Gimp User Manual available at
|
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.
|
about the interactive use of Gimp.
|
||||||
|
|
||||||
The latest version of Gimp and the gtk libs is always available at
|
The latest version of Gimp and the gtk libs is always available at
|
||||||
ftp://ftp.gimp.org.
|
ftp://ftp.gimp.org/.
|
||||||
|
|
||||||
.SH AUTHORS
|
.SH AUTHORS
|
||||||
Spencer Kimball and Peter Mattis.
|
Spencer Kimball and Peter Mattis.
|
||||||
|
@ -239,8 +241,5 @@ Tracy Scott, Manish Singh, Nathan Summers,
|
||||||
Mike Sweet, Eiichi Takamori, Tristan Tarrant,
|
Mike Sweet, Eiichi Takamori, Tristan Tarrant,
|
||||||
Owen Taylor, Ian Tester, James Wang, Kris Wehner.
|
Owen Taylor, Ian Tester, James Wang, Kris Wehner.
|
||||||
|
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.BR gimprc (5)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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).
|
|
@ -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).
|
Loading…
Reference in New Issue