gimp/tools/pdbgen
Michael Natterer fa30ba04c7 configure.in po-plug-ins/POTFILES.in plug-ins/common/Makefile.am
2000-01-25  Michael Natterer  <mitch@gimp.org>

	* configure.in
	* po-plug-ins/POTFILES.in
	* plug-ins/common/Makefile.am
	* plug-ins/common/plugin-defs.pl
	* plug-ins/megawidget/*: removed. (There were only 3 functions
	left which were used by ~5 plugins, so I moved the resp. functions
	to the plugins). More preview stuff to come...

	* app/airbrush_blob.c
	* modules/colorsel_triangle.c
	* modules/colorsel_water.c: use G_PI instead of M_PI.

	* app/procedural_db.h
	* libgimp/gimpenums.h
	* plug-ins/script-fu/script-fu-constants.c
	* tools/pdbgen/enums.pl: new PDB return value STATUS_CANCEL which
	indicates that "Cancel" was pressed in a plugin dialog. (Useful
	only for file load/save plugins).

	* app/fileops.[ch]
	* app/menus.c: changes to handle STATUS_CANCEL correctly. Did some
	code cleanup in fileops.[ch]. Pop up a warning if File->Save
	failed.

	* app/plug_in.c: return_val[0] is of type PDB_STATUS, not
	PDB_INT32.

	* libgimp/gimpmath.h: new constant G_MAXRAND which equals to
	RAND_MAX if it exists or to G_MAXINT otherwise.

	* libgimp/gimpwidgets.[ch]: new function gimp_random_seed_new()
	which creates a spinbutton and a "Time" toggle.
	Call the function which does the "set_sensitive" magic from the
	radio button callback.

	* plug-ins/[75 plugins]:

	- Return STATUS_CANCEL in all file load/save dialogs if "Cancel"
	  was pressed.
	- Standardized the file plugins' "run" functions.
	- Use G_PI and G_MAXRAND everywhere.
	- Added tons of scales and spinbuttons instead of text entries.
	- Applied uniform packing/spacings all over the place.
	- Reorganized some UIs (stuff like moving the preview to the top
	  left corner of the dialog).
	- Removed many ui helper functions and callbacks and use the stuff
	  from libgimp instead.
	- I tried not to restrict the range of possible values when I
	  replaced entries with spinbuttons/scales but may have failed,
	  though in some cases. Please test ;-)
	- #include <libgimp/gimpmath.h> where appropriate and use it's
	  constants.
	- Indentation, s/int/gint/ et.al., code cleanup.

	RFC: The plugins are definitely not useable with GIMP 1.0 any
	     more, so shouldn't we remove all the remaining compatibility
	     stuff ??? (like "#ifdef GIMP_HAVE_PARASITES")
2000-01-25 17:46:56 +00:00
..
app remove unused var 1999-06-03 00:00:48 +00:00
libgimp PDB autogen stuff. Unfinished and undocumented 1998-10-24 05:19:30 +00:00
pdb acconfig.h configure.in libgimp/Makefile.am libgimp/gimpregex.h 2000-01-24 22:16:36 +00:00
.cvsignore version number bump 1999-09-26 05:16:19 +00:00
Makefile.am made gimp_help accessible through the PDB 1999-09-25 01:59:42 +00:00
README add the new args to gimp-paintbrush PDB calls. 1999-04-20 23:03:31 +00:00
app.pl cosmetic fix 2000-01-02 00:16:47 +00:00
enumcode.pl added spec file to EXTRA_DIST 1999-12-26 07:54:39 +00:00
enumgen.pl app/channel.h app/gimpimage.h app/gimpimageP.h app/layer.h app/undo.[ch] 1999-09-23 23:42:38 +00:00
enums.pl configure.in po-plug-ins/POTFILES.in plug-ins/common/Makefile.am 2000-01-25 17:46:56 +00:00
groups.pl made gimp_help accessible through the PDB 1999-05-03 19:22:55 +00:00
lib.pl use $(LN_S) instead of ln -sf, should fix bug #5289. 2000-01-17 20:25:55 +00:00
pdb.pl treat INT8s are guint8 internally, as a bandaid to address bug #2208 and 1999-11-09 00:23:14 +00:00
pdbgen.pl hopefully fixed gimp_file_load_thumbnail PDB function 2000-01-18 21:39:03 +00:00
stddefs.pdb *** empty log message *** 1999-09-14 19:05:00 +00:00
util.pl configure.in tools/Makefile.am integrated pdbgen into the build system 1999-04-28 07:03:35 +00:00

README

Some mostly unfinished docs are here.

-Yosh

PDBGEN
------------------

What is this?
It's a tool to automate much of the drudge work of making PDB interfaces
to GIMP internals. Right now, it generates PDB description records,
argument marshallers (with sanity checking) for the app side, as well
as libgimp wrappers for C plugins. It's written so that extending it
to provide support for CORBA and other languages suited to static
autogeneration.

How to invoke pdbgen from the command line:
Change into the ./tools/pdbgen directory
  $ ./pdbgen.pl DIRNAME
where DIRNAME is either "lib" or "app", depending on which set of
files you want to generate.  The files are written to ./app or ./lib
in the ./tools/pdbgen directory.  Up to you to diff the file you
changed and when you're happy copy it into the actual ./app/ or ./lib/
directory where it gets built.

Anatomy of a PDB descriptor:
PDB descriptors are Perl code. You define a subroutine, which corresponds
to the PDB function you want to create. You then fill certain special
variables to fully describe all the information pdbgen needs to generate
code. Since it's perl, you can do practically whatever perl lets you
do to help you do this. However, at the simplest level, you don't need
to know perl at all to make PDB descriptors.

Annotated description:
For example, we will look at gimp_display_new, specified in gdisplay.pdb.

sub display_new { 

We start with the name of our PDB function (not including the "gimp_" prefix).

    $blurb = 'Create a new display for the specified image.';

This directly corresponds to the "blurb" field in the ProcRecord.

    $help = <<'HELP';
Creates a new display for the specified image. If the image already has a
display, another is added. Multiple displays are handled transparently by the
GIMP. The newly created display is returned and can be subsequently destroyed
with a call to 'gimp-display-delete'. This procedure only makes sense for use
with the GIMP UI.
HELP

This is the help field. Notice because it is a long string, we used HERE
document syntax to split it over multiple lines. Any extra whitespace
in $blurb or $help, including newlines, is automatically stripped, so you
don't have to worry about that.

    &std_pdb_misc;

This is the "author", "copyright", and "date" fields. Since S&P are quite
common, they get a special shortcut which fills these in for you. Stuff
like this is defined in stddefs.pdb.

    @inargs = ( &std_image_arg );

You specify arguments in a list. Again, your basic image is very common,
so it gets a shortcut.

    @outargs = (
        { name => 'display', type => 'display',
          desc => 'The new display', alias => 'gdisp', init => 1 }
    );

This is a real argument. It has a name, type, description at a minumum.
"alias" lets you use the alias name in your invoker code, but the real
name is still shown in the ProcRecord. This is useful not only as a
shorthand, but for grabbing variables defined somewhere else (or constants),
in conjunction with the "no_declare" flag. "init" simply says initialize
this variable to a dummy value (in this case to placate gcc warnings)

    %invoke = (
        headers => [ qw("gdisplay.h") ],

These are the headers needed for the functions you call.

        vars => [ 'guint scale = 0x101' ],

Extra variables can be put here for your invoker.

        code => <<'CODE'
{
  if (gimage->layers == NULL)
    success = FALSE;
  else
    success = ((gdisp = gdisplay_new (gimage, scale)) != NULL);
}
CODE

The actual invoker code. Since it's a multiline block, we put curly braces
in the beginning.