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

Thanks a lot,
Dave Neary.

                Dave Neary,
        Software engineer, Informix Dublin.
        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 

     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.
                            "Prints a message",
                            "For no good reason this plug-in only accepts greyscale 
                            "David Neary ([EMAIL PROTECTED])", 
                            "David Neary ([EMAIL PROTECTED])", 


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;

     (*return_vals)->type = GIMP_PDB_STATUS;
     ((*return_vals)->data).d_status = status;

     gimp_ui_init ("hello", FALSE);

     dlg = gimp_dialog_new ("Hello, world!", "hello",
                            FALSE, TRUE, FALSE,

                            "OK", check_ok_callback,
                            NULL, NULL, NULL, TRUE, FALSE,
                            "Cancel", gtk_widget_destroy,
                            NULL, 1, NULL, FALSE, TRUE,


     frame = gtk_frame_new ("Greeting");
     gtk_frame_set_shadow_type (GTK_FRAME (frame),
     gtk_container_set_border_width (GTK_CONTAINER(frame), 6);
     gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dlg)->vbox), frame, TRUE,
TRUE, 0);

     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_main ();
     gdk_flush ();


/* 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);

Reply via email to