David Neary
Wed, 29 Nov 2000 08:45:30 -0800
Hi all,
I'm trying to write a plug-in for the gimp, but I'm having a few
problems. I think at this stage it's pretty bare-bones, pretty much a
hello world plug-in.
Anyway, my plug-in is detected at start-up by the Gimp, and registers
with the PDB etc - so I suspect that my query function is OK.
When it's forked again to run, I get in a bit of trouble. On 1.1.28, it
just barf about the internal failure of the plug-in, and how that could
cause transmogrification of good, unsaved data. On 1.1.24, the widget (a
dialog) displays, but it, and the gimp, disappear when I click on it...
I did a stack-trace on teh core, and it looks like I got into an
infinite loop with _dl_runtime_resolve and __restore calling each other
a few hundred times, when gimp_ui_init starts up, until the process ran
out of memory.
Anyway, I was wondering if someone would have a quick perusal and point
me in the direction of my stupidity. Or point me to a "hello, world!"
gimp plug-in, or point me in the direction of references I might find
useful, other than "Writing a GIMP Plug-in" by Kevin Turner, which is
what I have been working out of so far.
Just in case the problem is actually in the query function (in
gimp_install_procedure, maybe?) I have included that. In fact, the only
stuff I haven't included are header includes and global vars (of which
there is only one, PLUG_IN_INFO). I realise this is kind of long,
especially for a first post, but I hope you'll give me a bit of
lattitude.
Thanks a lot,
Dave Neary.
--
Dave Neary,
Software engineer, Informix Dublin.
Ireland.
Phone: +353-1-409-1357
****** Code segment starts here ***********
/* query() function. Sets up type of plug-in in the PDB.
*/
static void query(void)
{
/* We want to define the arguments this will take,
* and what it will return - eventually this will include more
* complicated stuff, for now it accepts the defaults, and returns
* SUCCESS
*/
static GimpParamDef args[]=
{
{ GIMP_PDB_INT32, "run_mode", "Interactive, non-interactive" },
{ GIMP_PDB_IMAGE, "image_id", "(unused)" },
{ GIMP_PDB_DRAWABLE, "drawable_id", "Input drawable" },
};
static gint nargs = sizeof (args) / sizeof (args[0]);
/* We need to register the module - we do this with
* gimp_install_procedure.
*/
gimp_install_procedure("plug_in_hello",
"Prints a message",
"For no good reason this plug-in only accepts greyscale
images",
"David Neary ([EMAIL PROTECTED])",
"David Neary ([EMAIL PROTECTED])",
"2000",
"<Image>/Filters/Render/Pattern/Hello",
"GRAY",
GIMP_PLUGIN,
nargs,0,
args,NULL);
}
static void run(gchar *name,
gint nparams,
GimpParam *param,
gint *nreturn_vals,
GimpParam **return_vals)
{
/* We'll add a couple of widgets and show them (a dialog titled
* Hello, world! or something equally original should do)
*/
GtkWidget *dlg;
GtkWidget *frame;
GtkWidget *greeting;
GimpPDBStatusType status = GIMP_PDB_SUCCESS;
*nreturn_vals=1;
(*return_vals)->type = GIMP_PDB_STATUS;
((*return_vals)->data).d_status = status;
gimp_ui_init ("hello", FALSE);
dlg = gimp_dialog_new ("Hello, world!", "hello",
gimp_standard_help_func,
MY_ARBITRARY_HTML_FILE,
GTK_WIN_POS_MOUSE,
FALSE, TRUE, FALSE,
"OK", check_ok_callback,
NULL, NULL, NULL, TRUE, FALSE,
"Cancel", gtk_widget_destroy,
NULL, 1, NULL, FALSE, TRUE,
NULL);
frame = gtk_frame_new ("Greeting");
gtk_frame_set_shadow_type (GTK_FRAME (frame),
GTK_SHADOW_ETCHED_IN);
gtk_container_set_border_width (GTK_CONTAINER(frame), 6);
gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dlg)->vbox), frame, TRUE,
TRUE, 0);
gtk_widget_show(frame);
greeting = gtk_entry_new ();
gtk_entry_set_text( GTK_ENTRY(greeting),"Hello, world!");
gtk_entry_set_editable( GTK_ENTRY(greeting), FALSE);
gtk_container_add(GTK_CONTAINER(frame), greeting);
gtk_widget_show(greeting);
gtk_widget_show(dlg);
gtk_main ();
gdk_flush ();
return;
}
/* Callback function for when the OK button is clicked. */
void check_ok_callback(GtkWidget *button, GtkWidget *entry)
{
gchar *entry_text;
entry_text = gtk_entry_get_text(GTK_ENTRY(entry));
printf("Entry contents: %s\n", entry_text);
return;
}