/**********************************************************
Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
The Netherlands.

                        All Rights Reserved

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the names of Stichting Mathematisch
Centrum or CWI or Corporation for National Research Initiatives or
CNRI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

While CWI is the initial source for this software, a modified version
is made available by the Corporation for National Research Initiatives
(CNRI) at the Internet address ftp://ftp.python.org.

STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.

******************************************************************/

/* FL module -- interface to Mark Overmars' FORMS Library. */

/* This code works with FORMS version 2.2 (if you defined
   OBSOLETE_FORMS_CALLS), and 2.3.
   FORMS can be ftp'ed from ftp.cs.ruu.nl (131.211.80.17), directory
   /pub/SGI/FORMS. */

/* A half-hearted attempt has been made to allow programs using this
 * module to exploit parallelism (through the threads module). No provisions
 * have been made for multiple threads to use this module at the same time,
 * though. So, a program with a forms thread and a non-forms thread will work
 * fine but a program with two threads using forms will probably crash (unless
 * the program takes precaution to ensure that only one thread can be in
 * this module at any time). This will have to be fixed some time.
 * (A fix will probably also have to synchronise with the gl module).
 */

#include "Python.h"
#include "forms.h"
#include "structmember.h"

/* Generic Forms Objects */

typedef struct {
	PyObject_HEAD
	FL_OBJECT *ob_generic;
	PyMethodDef *ob_methods;
	PyObject *ob_callback;
	PyObject *ob_callback_arg;
} genericobject;

staticforward PyTypeObject GenericObjecttype;

#define is_genericobject(g) ((g)->ob_type == &GenericObjecttype)

/* List of all objects (XXX this should be a hash table on address...) */

static PyObject *allgenerics = NULL;
static int nfreeslots = 0;

/* Add an object to the list of known objects */

static void
knowgeneric(g)
	genericobject *g;
{
	int i, n;
	/* Create the list if it doesn't already exist */
	if (allgenerics == NULL) {
		allgenerics = PyList_New(0);
		if (allgenerics == NULL) {
			PyErr_Clear();
			return; /* Too bad, live without allgenerics... */
		}
	}
	if (nfreeslots > 0) {
		/* Search the list for reusable slots (NULL items) */
		/* XXX This can be made faster! */
		n = PyList_Size(allgenerics);
		for (i = 0; i < n; i++) {
			if (PyList_GetItem(allgenerics, i) == NULL) {
				Py_INCREF(g);
				PyList_SetItem(allgenerics, i, (PyObject *)g);
				nfreeslots--;
				return;
			}
		}
		/* Strange... no free slots found... */
		nfreeslots = 0;
	}
	/* No free entries, append new item to the end */
	PyList_Append(allgenerics, (PyObject *)g);
}

/* Find an object in the list of known objects */

static genericobject *
findgeneric(generic)
	FL_OBJECT *generic;
{
	int i, n;
	genericobject *g;
	
	if (allgenerics == NULL)
		return NULL; /* No objects known yet */
	n = PyList_Size(allgenerics);
	for (i = 0; i < n; i++) {
		g = (genericobject *)PyList_GetItem(allgenerics, i);
		if (g != NULL && g->ob_generic == generic)
			return g;
	}
	return NULL; /* Unknown object */
}

/* Remove an object from the list of known objects */

static void
forgetgeneric(g)
	genericobject *g;
{
	int i, n;
	
	Py_XDECREF(g->ob_callback);
	g->ob_callback = NULL;
	Py_XDECREF(g->ob_callback_arg);
	g->ob_callback_arg = NULL;
	if (allgenerics == NULL)
		return; /* No objects known yet */
	n = PyList_Size(allgenerics);
	for (i = 0; i < n; i++) {
		if (g == (genericobject *)PyList_GetItem(allgenerics, i)) {
			PyList_SetItem(allgenerics, i, (PyObject *)NULL);
			nfreeslots++;
			break;
		}
	}
}

/* Called when a form is about to be freed --
   remove all the objects that we know about from it. */

static void
releaseobjects(form)
	FL_FORM *form;
{
	int i, n;
	genericobject *g;
	
	if (allgenerics == NULL)
		return; /* No objects known yet */
	n = PyList_Size(allgenerics);
	for (i = 0; i < n; i++) {
		g = (genericobject *)PyList_GetItem(allgenerics, i);
		if (g != NULL && g->ob_generic->form == form) {
			fl_delete_object(g->ob_generic);
			/* The object is now unreachable for
			   do_forms and check_forms, so
			   delete it from the list of known objects */
			Py_XDECREF(g->ob_callback);
			g->ob_callback = NULL;
			Py_XDECREF(g->ob_callback_arg);
			g->ob_callback_arg = NULL;
			PyList_SetItem(allgenerics, i, (PyObject *)NULL);
			nfreeslots++;
		}
	}
}


/* Methods of generic objects */

static PyObject *
generic_set_call_back(g, args)
	genericobject *g;
	PyObject *args;
{
	if (args == NULL) {
		Py_XDECREF(g->ob_callback);
		Py_XDECREF(g->ob_callback_arg);
		g->ob_callback = NULL;
		g->ob_callback_arg = NULL;
	}
	else {
		if (!PyTuple_Check(args) || PyTuple_Size(args) != 2) {
			PyErr_BadArgument();
			return NULL;
		}
		Py_XDECREF(g->ob_callback);
		Py_XDECREF(g->ob_callback_arg);
		g->ob_callback = PyTuple_GetItem(args, 0);
		Py_INCREF(g->ob_callback);
		g->ob_callback_arg = PyTuple_GetItem(args, 1);
		Py_INCREF(g->ob_callback_arg);
	}
	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
generic_call(g, args, func)
	genericobject *g;
	PyObject *args;
	void (*func)(FL_OBJECT *);
{
	if (!PyArg_NoArgs(args))
		return NULL;
	(*func)(g->ob_generic);
	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
generic_delete_object(g, args)
	genericobject *g;
	PyObject *args;
{
	PyObject *res;
	res = generic_call(g, args, fl_delete_object);
	if (res != NULL)
		forgetgeneric(g);
	return res;
}

static PyObject *
generic_show_object(g, args)
	genericobject *g;
	PyObject *args;
{
	return generic_call(g, args, fl_show_object);
}

static PyObject *
generic_hide_object(g, args)
	genericobject *g;
	PyObject *args;
{
	return generic_call(g, args, fl_hide_object);
}

static PyObject *
generic_redraw_object(g, args)
	genericobject *g;
	PyObject *args;
{
	return generic_call(g, args, fl_redraw_object);
}

#ifdef OBSOLETE_FORMS_CALLS
 
 /* (un)freeze_object() are obsolete in FORMS 2.2 and unsupported
    in 2.3.  Since there's no foolproof way to tell which version we're
    using, we omit them unconditionally. */
 
static PyObject *
generic_freeze_object(g, args)
	genericobject *g;
	PyObject *args;
{
	return generic_call(g, args, fl_freeze_object);
}

static PyObject *
generic_unfreeze_object(g, args)
	genericobject *g;
	PyObject *args;
{
	return generic_call(g, args, fl_unfreeze_object);
}

#endif /* OBSOLETE_FORMS_CALLS */

static PyObject *
generic_activate_object(g, args)
	genericobject *g;
	PyObject *args;
{
	return generic_call(g, args, fl_activate_object);
}

static PyObject *
generic_deactivate_object(g, args)
	genericobject *g;
	PyObject *args;
{
	return generic_call(g, args, fl_deactivate_object);
}

static PyObject *
generic_set_object_shortcut(g, args)
	genericobject *g;
	PyObject *args;
{
	char *str;
	if (!PyArg_Parse(args, "s", &str))
		return NULL;
	fl_set_object_shortcut(g->ob_generic, str);
	Py_INCREF(Py_None);
	return Py_None;
}

static PyMethodDef generic_methods[] = {
	{"set_call_back",	(PyCFunction)generic_set_call_back},
	{"delete_object",	(PyCFunction)generic_delete_object},
	{"show_object",		(PyCFunction)generic_show_object},
	{"hide_object",		(PyCFunction)generic_hide_object},
	{"redraw_object",	(PyCFunction)generic_redraw_object},
#ifdef OBSOLETE_FORMS_CALLS
	{"freeze_object",	(PyCFunction)generic_freeze_object},
	{"unfreeze_object",	(PyCFunction)generic_unfreeze_object},
#endif
	{"activate_object",	(PyCFunction)generic_activate_object},
	{"deactivate_object",	(PyCFunction)generic_deactivate_object},
	{"set_object_shortcut",	(PyCFunction)generic_set_object_shortcut},
	{NULL,			NULL}		/* sentinel */
};

static void
generic_dealloc(g)
	genericobject *g;
{
	fl_free_object(g->ob_generic);
	Py_XDECREF(g->ob_callback);
	Py_XDECREF(g->ob_callback_arg);
	PyObject_Del(g);
}

#define OFF(x) offsetof(FL_OBJECT, x)

static struct memberlist generic_memberlist[] = {
	{"objclass",	T_INT,		OFF(objclass),	RO},
	{"type",	T_INT,		OFF(type),	RO},
	{"boxtype",	T_INT,		OFF(boxtype)},
	{"x",		T_FLOAT,	OFF(x)},
	{"y",		T_FLOAT,	OFF(y)},
	{"w",		T_FLOAT,	OFF(w)},
	{"h",		T_FLOAT,	OFF(h)},
	{"col1",	T_INT,		OFF(col1)},
	{"col2",	T_INT,		OFF(col2)},
	{"align",	T_INT,		OFF(align)},
	{"lcol",	T_INT,		OFF(lcol)},
	{"lsize",	T_FLOAT,	OFF(lsize)},
	/* "label" is treated specially! */
	{"lstyle",	T_INT,		OFF(lstyle)},
	{"pushed",	T_INT,		OFF(pushed),	RO},
	{"focus",	T_INT,		OFF(focus),	RO},
	{"belowmouse",	T_INT,		OFF(belowmouse),RO},
/*	{"frozen",	T_INT,		OFF(frozen),	RO},	*/
	{"active",	T_INT,		OFF(active)},
	{"input",	T_INT,		OFF(input)},
	{"visible",	T_INT,		OFF(visible),	RO},
	{"radio",	T_INT,		OFF(radio)},
	{"automatic",	T_INT,		OFF(automatic)},
	{NULL}	/* Sentinel */
};

#undef OFF

static PyObject *
generic_getattr(g, name)
	genericobject *g;
	char *name;
{
	PyObject *meth;

	/* XXX Ought to special-case name "__methods__" */
	if (g-> ob_methods) {
		meth = Py_FindMethod(g->ob_methods, (PyObject *)g, name);
		if (meth != NULL) return meth;
		PyErr_Clear();
	}

	meth = Py_FindMethod(generic_methods, (PyObject *)g, name);
	if (meth != NULL)
		return meth;
	PyErr_Clear();

	/* "label" is an exception, getmember only works for char pointers,
	   not for char arrays */
	if (strcmp(name, "label") == 0)
		return PyString_FromString(g->ob_generic->label);

	return PyMember_Get((char *)g->ob_generic, generic_memberlist, name);
}

static int
generic_setattr(g, name, v)
	genericobject *g;
	char *name;
	PyObject *v;
{
	int ret;

	if (v == NULL) {
		PyErr_SetString(PyExc_TypeError,
				"can't delete forms object attributes");
		return -1;
	}

	/* "label" is an exception: setmember doesn't set strings;
	   and FORMS wants you to call a function to set the label */
	if (strcmp(name, "label") == 0) {
		if (!PyString_Check(v)) {
			PyErr_SetString(PyExc_TypeError,
					"label attr must be string");
			return -1;
		}
		fl_set_object_label(g->ob_generic, PyString_AsString(v));
		return 0;
	}

	ret = PyMember_Set((char *)g->ob_generic, generic_memberlist, name, v);

	/* Rather than calling all the various set_object_* functions,
	   we call fl_redraw_object here.  This is sometimes redundant
	   but I doubt that's a big problem */
	if (ret == 0)
		fl_redraw_object(g->ob_generic);

	return ret;
}

static PyObject *
generic_repr(g)
	genericobject *g;
{
	char buf[100];
	sprintf(buf, "<FORMS_object at %p, objclass=%d>",
		g, g->ob_generic->objclass);
	return PyString_FromString(buf);
}

static PyTypeObject GenericObjecttype = {
	PyObject_HEAD_INIT(&PyType_Type)
	0,				/*ob_size*/
	"FORMS_object",			/*tp_name*/
	sizeof(genericobject),		/*tp_size*/
	0,				/*tp_itemsize*/
	/* methods */
	(destructor)generic_dealloc,	/*tp_dealloc*/
	0,				/*tp_print*/
	(getattrfunc)generic_getattr,	/*tp_getattr*/
	(setattrfunc)generic_setattr,	/*tp_setattr*/
	0,				/*tp_compare*/
	(reprfunc)generic_repr,		/*tp_repr*/
};

static PyObject *
newgenericobject(generic, methods)
	FL_OBJECT *generic;
	PyMethodDef *methods;
{
	genericobject *g;
	g = PyObject_New(genericobject, &GenericObjecttype);
	if (g == NULL)
		return NULL;
	g-> ob_generic = generic;
	g->ob_methods = methods;
	g->ob_callback = NULL;
	g->ob_callback_arg = NULL;
	knowgeneric(g);
	return (PyObject *)g;
}

/**********************************************************************/
/* Some common calling sequences */

/* void func (object, float) */
static PyObject *
call_forms_INf (func, obj, args)
	void (*func)(FL_OBJECT *, float);
	FL_OBJECT *obj;
	PyObject *args;
{
	float parameter;

	if (!PyArg_Parse(args, "f", &parameter)) return NULL;

	(*func) (obj, parameter);

	Py_INCREF(Py_None);
	return Py_None;
}

/* void func (object, float) */
static PyObject *
call_forms_INfINf (func, obj, args)
	void (*func)(FL_OBJECT *, float, float);
	FL_OBJECT *obj;
	PyObject *args;
{
	float par1, par2;

	if (!PyArg_Parse(args, "(ff)", &par1, &par2)) return NULL;

	(*func) (obj, par1, par2);

	Py_INCREF(Py_None);
	return Py_None;
}

/* void func (object, int) */
static PyObject *
call_forms_INi (func, obj, args)
	void (*func)(FL_OBJECT *, int);
	FL_OBJECT *obj;
	PyObject *args;
{
	int parameter;

	if (!PyArg_Parse(args, "i", &parameter)) return NULL;

	(*func) (obj, parameter);

	Py_INCREF(Py_None);
	return Py_None;
}

/* void func (object, char) */
static PyObject *
call_forms_INc (func, obj, args)
	void (*func)(FL_OBJECT *, int);
	FL_OBJECT *obj;
	PyObject *args;
{
	char *a;

	if (!PyArg_Parse(args, "s", &a)) return NULL;

	(*func) (obj, a[0]);

	Py_INCREF(Py_None);
	return Py_None;
}

/* void func (object, string) */
static PyObject *
call_forms_INstr (func, obj, args)
	void (*func)(FL_OBJECT *, char *);
	FL_OBJECT *obj;
	PyObject *args;
{
	char *a;

	if (!PyArg_Parse(args, "s", &a)) return NULL;

	(*func) (obj, a);

	Py_INCREF(Py_None);
	return Py_None;
}


/* void func (object, int, string) */
static PyObject *
call_forms_INiINstr (func, obj, args)
	void (*func)(FL_OBJECT *, int, char *);
	FL_OBJECT *obj;
	PyObject *args;
{
	char *b;
	int a;
	
	if (!PyArg_Parse(args, "(is)", &a, &b)) return NULL;
	
	(*func) (obj, a, b);
	
	Py_INCREF(Py_None);
	return Py_None;
}

#ifdef UNUSED
/* void func (object, int, int) */
static PyObject *
call_forms_INiINi (func, obj, args)
	void (*func)(FL_OBJECT *, int, int);
	FL_OBJECT *obj;
	PyObject *args;
{
	int par1, par2;
	
	if (!PyArg_Parse(args, "(ii)", &par1, &par2)) return NULL;
	
	(*func) (obj, par1, par2);
	
	Py_INCREF(Py_None);
	return Py_None;
}
#endif

/* int func (object) */
static PyObject *
call_forms_Ri (func, obj, args)
	int (*func)(FL_OBJECT *);
	FL_OBJECT *obj;
	PyObject *args;
{
	int retval;
	
	if (!PyArg_NoArgs(args)) return NULL;
	
	retval = (*func) (obj);
	
	return PyInt_FromLong ((long) retval);
}

/* char * func (object) */
static PyObject *
call_forms_Rstr (func, obj, args)
	char * (*func)(FL_OBJECT *);
	FL_OBJECT *obj;
	PyObject *args;
{
	char *str;
	
	if (!PyArg_NoArgs(args)) return NULL;
	
	str = (*func) (obj);
	
	if (str == NULL) {
		Py_INCREF(Py_None);
		return Py_None;
	}
	return PyString_FromString (str);
}

/* int func (object) */
static PyObject *
call_forms_Rf (func, obj, args)
	float (*func)(FL_OBJECT *);
	FL_OBJECT *obj;
	PyObject *args;
{
	float retval;
	
	if (!PyArg_NoArgs(args)) return NULL;
	
	retval = (*func) (obj);
	
	return PyFloat_FromDouble (retval);
}

static PyObject *
call_forms_OUTfOUTf (func, obj, args)
	void (*func)(FL_OBJECT *, float *, float *);
	FL_OBJECT *obj;
	PyObject *args;
{
	float f1, f2;
	
	if (!PyArg_NoArgs(args)) return NULL;
	
	(*func) (obj, &f1, &f2);

	return Py_BuildValue("(ff)", f1, f2);
}

#ifdef UNUSED
static PyObject *
call_forms_OUTf (func, obj, args)
	void (*func)(FL_OBJECT *, float *);
	FL_OBJECT *obj;
	PyObject *args;
{
	float f;

	if (!PyArg_NoArgs(args)) return NULL;

	(*func) (obj, &f);

	return PyFloat_FromDouble (f);
}
#endif

/**********************************************************************/
/* Class : browser */

static PyObject *
set_browser_topline(g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INi (fl_set_browser_topline, g-> ob_generic, args);
}

static PyObject *
clear_browser(g, args)
	genericobject *g;
	PyObject *args;
{
	return generic_call (g, args, fl_clear_browser);
}

static PyObject *
add_browser_line (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INstr (fl_add_browser_line, g-> ob_generic, args);
}

static PyObject *
addto_browser (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INstr (fl_addto_browser, g-> ob_generic, args);
}

static PyObject *
insert_browser_line (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INiINstr (fl_insert_browser_line,
				    g-> ob_generic, args);
}

static PyObject *
delete_browser_line (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INi (fl_delete_browser_line, g-> ob_generic, args);
}

static PyObject *
replace_browser_line (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INiINstr (fl_replace_browser_line,
				    g-> ob_generic, args);
}

static PyObject *
get_browser_line(g, args)
	genericobject *g;
	PyObject *args;
{
	int i;
	char *str;

	if (!PyArg_Parse(args, "i", &i))
		return NULL;

	str = fl_get_browser_line (g->ob_generic, i);

	if (str == NULL) {
		Py_INCREF(Py_None);
		return Py_None;
	}
	return PyString_FromString (str);
}

static PyObject *
load_browser (g, args)
	genericobject *g;
	PyObject *args;
{
	/* XXX strictly speaking this is wrong since fl_load_browser
	   XXX returns int, not void */
	return call_forms_INstr (fl_load_browser, g-> ob_generic, args);
}

static PyObject *
get_browser_maxline(g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_Ri (fl_get_browser_maxline, g-> ob_generic, args);
}

static PyObject *
select_browser_line (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INi (fl_select_browser_line, g-> ob_generic, args);
}

static PyObject *
deselect_browser_line (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INi (fl_deselect_browser_line, g-> ob_generic, args);
}

static PyObject *
deselect_browser (g, args)
	genericobject *g;
	PyObject *args;
{
	return generic_call (g, args, fl_deselect_browser);
}

static PyObject *
isselected_browser_line (g, args)
	genericobject *g;
	PyObject *args;
{
	int i, j;
	
	if (!PyArg_Parse(args, "i", &i))
		return NULL;
	
	j = fl_isselected_browser_line (g->ob_generic, i);
	
	return PyInt_FromLong (j);
}

static PyObject *
get_browser (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_Ri (fl_get_browser, g-> ob_generic, args);
}

static PyObject *
set_browser_fontsize (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INf (fl_set_browser_fontsize, g-> ob_generic, args);
}

static PyObject *
set_browser_fontstyle (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INi (fl_set_browser_fontstyle, g-> ob_generic, args);
}

static PyObject *
set_browser_specialkey (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INc(fl_set_browser_specialkey, g-> ob_generic, args);
}

static PyMethodDef browser_methods[] = {
	{"set_browser_topline",		(PyCFunction)set_browser_topline},
	{"clear_browser",		(PyCFunction)clear_browser},
	{"add_browser_line",		(PyCFunction)add_browser_line},
	{"addto_browser",		(PyCFunction)addto_browser},
	{"insert_browser_line",		(PyCFunction)insert_browser_line},
	{"delete_browser_line",		(PyCFunction)delete_browser_line},
	{"replace_browser_line",	(PyCFunction)replace_browser_line},
	{"get_browser_line",		(PyCFunction)get_browser_line},
	{"load_browser",		(PyCFunction)load_browser},
	{"get_browser_maxline",		(PyCFunction)get_browser_maxline},
	{"select_browser_line",		(PyCFunction)select_browser_line},
	{"deselect_browser_line",	(PyCFunction)deselect_browser_line},
	{"deselect_browser",		(PyCFunction)deselect_browser},
	{"isselected_browser_line",	(PyCFunction)isselected_browser_line},
	{"get_browser",			(PyCFunction)get_browser},
	{"set_browser_fontsize",	(PyCFunction)set_browser_fontsize},
	{"set_browser_fontstyle",	(PyCFunction)set_browser_fontstyle},
	{"set_browser_specialkey",	(PyCFunction)set_browser_specialkey},
	{NULL,				NULL}		/* sentinel */
};

/* Class: button */

static PyObject *
set_button(g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INi (fl_set_button, g-> ob_generic, args);
}

static PyObject *
get_button(g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_Ri (fl_get_button, g-> ob_generic, args);
}

static PyObject *
get_button_numb(g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_Ri (fl_get_button_numb, g-> ob_generic, args);
}

static PyObject *
set_button_shortcut(g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INstr (fl_set_button_shortcut, g-> ob_generic, args);
}

static PyMethodDef button_methods[] = {
	{"set_button",		(PyCFunction)set_button},
	{"get_button",		(PyCFunction)get_button},
	{"get_button_numb",	(PyCFunction)get_button_numb},
	{"set_button_shortcut",	(PyCFunction)set_button_shortcut},
	{NULL,			NULL}		/* sentinel */
};

/* Class: choice */

static PyObject *
set_choice(g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INi (fl_set_choice, g-> ob_generic, args);
}

static PyObject *
get_choice(g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_Ri (fl_get_choice, g-> ob_generic, args);
}

static PyObject *
clear_choice (g, args)
	genericobject *g;
	PyObject *args;
{
	return generic_call (g, args, fl_clear_choice);
}

static PyObject *
addto_choice (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INstr (fl_addto_choice, g-> ob_generic, args);
}

static PyObject *
replace_choice (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INiINstr (fl_replace_choice, g-> ob_generic, args);
}

static PyObject *
delete_choice (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INi (fl_delete_choice, g-> ob_generic, args);
}

static PyObject *
get_choice_text (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_Rstr (fl_get_choice_text, g-> ob_generic, args);
}

static PyObject *
set_choice_fontsize (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INf (fl_set_choice_fontsize, g-> ob_generic, args);
}

static PyObject *
set_choice_fontstyle (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INi (fl_set_choice_fontstyle, g-> ob_generic, args);
}

static PyMethodDef choice_methods[] = {
	{"set_choice",		(PyCFunction)set_choice},
	{"get_choice",		(PyCFunction)get_choice},
	{"clear_choice",	(PyCFunction)clear_choice},
	{"addto_choice",	(PyCFunction)addto_choice},
	{"replace_choice",	(PyCFunction)replace_choice},
	{"delete_choice",	(PyCFunction)delete_choice},
	{"get_choice_text",	(PyCFunction)get_choice_text},
	{"set_choice_fontsize", (PyCFunction)set_choice_fontsize},
	{"set_choice_fontstyle",(PyCFunction)set_choice_fontstyle},
	{NULL,			NULL}		/* sentinel */
};

/* Class : Clock */

static PyObject *
get_clock(g, args)
	genericobject *g;
	PyObject *args;
{
	int i0, i1, i2;

	if (!PyArg_NoArgs(args))
		return NULL;

	fl_get_clock (g->ob_generic, &i0, &i1, &i2);

	return Py_BuildValue("(iii)", i0, i1, i2);
}

static PyMethodDef clock_methods[] = {
	{"get_clock",		(PyCFunction)get_clock},
	{NULL,			NULL}		/* sentinel */
};

/* CLass : Counters */

static PyObject *
get_counter_value(g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_Rf (fl_get_counter_value, g-> ob_generic, args);
}

static PyObject *
set_counter_value (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INf (fl_set_counter_value, g-> ob_generic, args);
}

static PyObject *
set_counter_precision (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INi (fl_set_counter_precision, g-> ob_generic, args);
}

static PyObject *
set_counter_bounds (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INfINf (fl_set_counter_bounds, g-> ob_generic, args);
}

static PyObject *
set_counter_step (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INfINf (fl_set_counter_step, g-> ob_generic, args);
}

static PyObject *
set_counter_return (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INi (fl_set_counter_return, g-> ob_generic, args);
}

static PyMethodDef counter_methods[] = {
	{"set_counter_value",		(PyCFunction)set_counter_value},
	{"get_counter_value",		(PyCFunction)get_counter_value},
	{"set_counter_bounds",		(PyCFunction)set_counter_bounds},
	{"set_counter_step",		(PyCFunction)set_counter_step},
	{"set_counter_precision",	(PyCFunction)set_counter_precision},
	{"set_counter_return",		(PyCFunction)set_counter_return},
	{NULL,				NULL}		/* sentinel */
};


/* Class: Dials */

static PyObject *
get_dial_value(g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_Rf (fl_get_dial_value, g-> ob_generic, args);
}

static PyObject *
set_dial_value (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INf (fl_set_dial_value, g-> ob_generic, args);
}

static PyObject *
set_dial_bounds (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INfINf (fl_set_dial_bounds, g-> ob_generic, args);
}

static PyObject *
get_dial_bounds (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_OUTfOUTf (fl_get_dial_bounds, g-> ob_generic, args);
}

static PyObject *
set_dial_step (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INf (fl_set_dial_step, g-> ob_generic, args);
}

static PyMethodDef dial_methods[] = {
	{"set_dial_value",	(PyCFunction)set_dial_value},
	{"get_dial_value",	(PyCFunction)get_dial_value},
	{"set_dial_bounds",	(PyCFunction)set_dial_bounds},
	{"get_dial_bounds",	(PyCFunction)get_dial_bounds},
	{"set_dial_step",	(PyCFunction)set_dial_step},
	{NULL,			NULL}		/* sentinel */
};

/* Class : Input */

static PyObject *
set_input (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INstr (fl_set_input, g-> ob_generic, args);
}

static PyObject *
get_input (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_Rstr (fl_get_input, g-> ob_generic, args);
}

static PyObject *
set_input_color (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INfINf (fl_set_input_color, g-> ob_generic, args);
}

static PyObject *
set_input_return (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INi (fl_set_input_return, g-> ob_generic, args);
}

static PyMethodDef input_methods[] = {
	{"set_input",		(PyCFunction)set_input},
	{"get_input",		(PyCFunction)get_input},
	{"set_input_color",	(PyCFunction)set_input_color},
	{"set_input_return",	(PyCFunction)set_input_return},
	{NULL,			NULL}		/* sentinel */
};


/* Class : Menu */

static PyObject *
set_menu (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INstr (fl_set_menu, g-> ob_generic, args);
}

static PyObject *
get_menu (g, args)
	genericobject *g;
	PyObject *args;
{
	/* XXX strictly speaking this is wrong since fl_get_menu
	   XXX returns long, not int */
	return call_forms_Ri (fl_get_menu, g-> ob_generic, args);
}

static PyObject *
get_menu_text (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_Rstr (fl_get_menu_text, g-> ob_generic, args);
}

static PyObject *
addto_menu (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INstr (fl_addto_menu, g-> ob_generic, args);
}

static PyMethodDef menu_methods[] = {
	{"set_menu",		(PyCFunction)set_menu},
	{"get_menu",		(PyCFunction)get_menu},
	{"get_menu_text",	(PyCFunction)get_menu_text},
	{"addto_menu",		(PyCFunction)addto_menu},
	{NULL,			NULL}		/* sentinel */
};


/* Class: Sliders */

static PyObject *
get_slider_value(g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_Rf (fl_get_slider_value, g-> ob_generic, args);
}

static PyObject *
set_slider_value (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INf (fl_set_slider_value, g-> ob_generic, args);
}

static PyObject *
set_slider_bounds (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INfINf (fl_set_slider_bounds, g-> ob_generic, args);
}

static PyObject *
get_slider_bounds (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_OUTfOUTf(fl_get_slider_bounds, g-> ob_generic, args);
}

static PyObject *
set_slider_return (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INf (fl_set_slider_return, g-> ob_generic, args);
}

static PyObject *
set_slider_size (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INf (fl_set_slider_size, g-> ob_generic, args);
}

static PyObject *
set_slider_precision (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INi (fl_set_slider_precision, g-> ob_generic, args);
}

static PyObject *
set_slider_step (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INf (fl_set_slider_step, g-> ob_generic, args);
}


static PyMethodDef slider_methods[] = {
	{"set_slider_value",	(PyCFunction)set_slider_value},
	{"get_slider_value",	(PyCFunction)get_slider_value},
	{"set_slider_bounds",	(PyCFunction)set_slider_bounds},
	{"get_slider_bounds",	(PyCFunction)get_slider_bounds},
	{"set_slider_return",	(PyCFunction)set_slider_return},
	{"set_slider_size",	(PyCFunction)set_slider_size},
	{"set_slider_precision",(PyCFunction)set_slider_precision},
	{"set_slider_step",	(PyCFunction)set_slider_step},
	{NULL,			NULL}		/* sentinel */
};

static PyObject *
set_positioner_xvalue (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INf (fl_set_positioner_xvalue, g-> ob_generic, args);
}

static PyObject *
set_positioner_xbounds (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INfINf (fl_set_positioner_xbounds,
				  g-> ob_generic, args);
}

static PyObject *
set_positioner_yvalue (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INf (fl_set_positioner_yvalue, g-> ob_generic, args);
}

static PyObject *
set_positioner_ybounds (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INfINf (fl_set_positioner_ybounds,
				  g-> ob_generic, args);
}

static PyObject *
get_positioner_xvalue (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_Rf (fl_get_positioner_xvalue, g-> ob_generic, args);
}

static PyObject *
get_positioner_xbounds (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_OUTfOUTf (fl_get_positioner_xbounds,
				    g-> ob_generic, args);
}

static PyObject *
get_positioner_yvalue (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_Rf (fl_get_positioner_yvalue, g-> ob_generic, args);
}

static PyObject *
get_positioner_ybounds (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_OUTfOUTf (fl_get_positioner_ybounds,
				    g-> ob_generic, args);
}

static PyMethodDef positioner_methods[] = {
	{"set_positioner_xvalue",	(PyCFunction)set_positioner_xvalue},
	{"set_positioner_yvalue",	(PyCFunction)set_positioner_yvalue},
	{"set_positioner_xbounds",	(PyCFunction)set_positioner_xbounds},
	{"set_positioner_ybounds",	(PyCFunction)set_positioner_ybounds},
	{"get_positioner_xvalue",	(PyCFunction)get_positioner_xvalue},
	{"get_positioner_yvalue",	(PyCFunction)get_positioner_yvalue},
	{"get_positioner_xbounds",	(PyCFunction)get_positioner_xbounds},
	{"get_positioner_ybounds",	(PyCFunction)get_positioner_ybounds},
	{NULL,			NULL}		/* sentinel */
};

/* Class timer */

static PyObject *
set_timer (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_INf (fl_set_timer, g-> ob_generic, args);
}

static PyObject *
get_timer (g, args)
	genericobject *g;
	PyObject *args;
{
	return call_forms_Rf (fl_get_timer, g-> ob_generic, args);
}

static PyMethodDef timer_methods[] = {
	{"set_timer",		(PyCFunction)set_timer},
	{"get_timer",		(PyCFunction)get_timer},
	{NULL,			NULL}		/* sentinel */
};

/* Form objects */

typedef struct {
	PyObject_HEAD
	FL_FORM *ob_form;
} formobject;

staticforward PyTypeObject Formtype;

#define is_formobject(v) ((v)->ob_type == &Formtype)

static PyObject *
form_show_form(f, args)
	formobject *f;
	PyObject *args;
{
	int place, border;
	char *name;
	if (!PyArg_Parse(args, "(iis)", &place, &border, &name))
		return NULL;
	fl_show_form(f->ob_form, place, border, name);
	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
form_call(func, f, args)
	FL_FORM *f;
	PyObject *args;
	void (*func)(FL_FORM *);
{
	if (!PyArg_NoArgs(args)) return NULL;

	(*func)(f);

	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
form_call_INiINi(func, f, args)
	FL_FORM *f;
	PyObject *args;
	void (*func)(FL_FORM *, int, int);
{
	int a, b;

	if (!PyArg_Parse(args, "(ii)", &a, &b)) return NULL;

	(*func)(f, a, b);

	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
form_call_INfINf(func, f, args)
	FL_FORM *f;
	PyObject *args;
	void (*func)(FL_FORM *, float, float);
{
	float a, b;

	if (!PyArg_Parse(args, "(ff)", &a, &b)) return NULL;

	(*func)(f, a, b);

	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
form_hide_form(f, args)
	formobject *f;
	PyObject *args;
{
	return form_call(fl_hide_form, f-> ob_form, args);
}

static PyObject *
form_redraw_form(f, args)
	formobject *f;
	PyObject *args;
{
	return form_call(fl_redraw_form, f-> ob_form, args);
}

static PyObject *
form_set_form_position(f, args)
	formobject *f;
	PyObject *args;
{
	return form_call_INiINi(fl_set_form_position, f-> ob_form, args);
}

static PyObject *
form_set_form_size(f, args)
	formobject *f;
	PyObject *args;
{
	return form_call_INiINi(fl_set_form_size, f-> ob_form, args);
}

static PyObject *
form_scale_form(f, args)
	formobject *f;
	PyObject *args;
{
	return form_call_INfINf(fl_scale_form, f-> ob_form, args);
}

static PyObject *
generic_add_object(f, args, func, internal_methods)
	formobject *f;
	PyObject *args;
	FL_OBJECT *(*func)(int, float, float, float, float, char*);
	PyMethodDef *internal_methods;
{
	int type;
	float x, y, w, h;
	char *name;
	FL_OBJECT *obj;

	if (!PyArg_Parse(args,"(iffffs)", &type,&x,&y,&w,&h,&name))
		return NULL;

	fl_addto_form (f-> ob_form);

	obj = (*func) (type, x, y, w, h, name);

	fl_end_form();

	if (obj == NULL) {
		PyErr_NoMemory();
		return NULL;
	}

	return newgenericobject (obj, internal_methods);
}

static PyObject *
form_add_button(f, args)
	formobject *f;
	PyObject *args;
{
	return generic_add_object(f, args, fl_add_button, button_methods);
}

static PyObject *
form_add_lightbutton(f, args)
	formobject *f;
	PyObject *args;
{
	return generic_add_object(f, args, fl_add_lightbutton, button_methods);
}

static PyObject *
form_add_roundbutton(f, args)
	formobject *f;
	PyObject *args;
{
	return generic_add_object(f, args, fl_add_roundbutton, button_methods);
}

static PyObject *
form_add_menu (f, args)
	formobject *f;
	PyObject *args;
{
	return generic_add_object(f, args, fl_add_menu, menu_methods);
}

static PyObject *
form_add_slider(f, args)
	formobject *f;
	PyObject *args;
{
	return generic_add_object(f, args, fl_add_slider, slider_methods);
}

static PyObject *
form_add_valslider(f, args)
	formobject *f;
	PyObject *args;
{
	return generic_add_object(f, args, fl_add_valslider, slider_methods);
}

static PyObject *
form_add_dial(f, args)
	formobject *f;
	PyObject *args;
{
	return generic_add_object(f, args, fl_add_dial, dial_methods);
}

static PyObject *
form_add_counter(f, args)
	formobject *f;
	PyObject *args;
{
	return generic_add_object(f, args, fl_add_counter, counter_methods);
}

static PyObject *
form_add_clock(f, args)
	formobject *f;
	PyObject *args;
{
	return generic_add_object(f, args, fl_add_clock, clock_methods);
}

static PyObject *
form_add_box(f, args)
	formobject *f;
	PyObject *args;
{
	return generic_add_object(f, args, fl_add_box,
				  (PyMethodDef *)NULL);
}

static PyObject *
form_add_choice(f, args)
	formobject *f;
	PyObject *args;
{
	return generic_add_object(f, args, fl_add_choice, choice_methods);
}

static PyObject *
form_add_browser(f, args)
	formobject *f;
	PyObject *args;
{
	return generic_add_object(f, args, fl_add_browser, browser_methods);
}

static PyObject *
form_add_positioner(f, args)
	formobject *f;
	PyObject *args;
{
	return generic_add_object(f, args, fl_add_positioner,
				  positioner_methods);
}

static PyObject *
form_add_input(f, args)
	formobject *f;
	PyObject *args;
{
	return generic_add_object(f, args, fl_add_input, input_methods);
}

static PyObject *
form_add_text(f, args)
	formobject *f;
	PyObject *args;
{
	return generic_add_object(f, args, fl_add_text,
				  (PyMethodDef *)NULL);
}

static PyObject *
form_add_timer(f, args)
	formobject *f;
	PyObject *args;
{
	return generic_add_object(f, args, fl_add_timer, timer_methods);
}

static PyObject *
form_freeze_form(f, args)
	formobject *f;
	PyObject *args;
{
	return form_call(fl_freeze_form, f-> ob_form, args);
}

static PyObject *
form_unfreeze_form(f, args)
	formobject *f;
	PyObject *args;
{
	return form_call(fl_unfreeze_form, f-> ob_form, args);
}

static PyObject *
form_activate_form(f, args)
	formobject *f;
	PyObject *args;
{
	return form_call(fl_activate_form, f-> ob_form, args);
}

static PyObject *
form_deactivate_form(f, args)
	formobject *f;
	PyObject *args;
{
	return form_call(fl_deactivate_form, f-> ob_form, args);
}

static PyObject *
form_bgn_group(f, args)
	formobject *f;
	PyObject *args;
{
	FL_OBJECT *obj;

	fl_addto_form(f-> ob_form);
	obj = fl_bgn_group();
	fl_end_form();

	if (obj == NULL) {
		PyErr_NoMemory();
		return NULL;
	}

	return newgenericobject (obj, (PyMethodDef *) NULL);
}

static PyObject *
form_end_group(f, args)
	formobject *f;
	PyObject *args;
{
	fl_addto_form(f-> ob_form);
	fl_end_group();
	fl_end_form();
	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
forms_find_first_or_last(func, f, args)
	FL_OBJECT *(*func)(FL_FORM *, int, float, float);
	formobject *f;
	PyObject *args;
{
	int type;
	float mx, my;
	FL_OBJECT *generic;
	genericobject *g;
	
	if (!PyArg_Parse(args, "(iff)", &type, &mx, &my)) return NULL;

	generic = (*func) (f-> ob_form, type, mx, my);

	if (generic == NULL)
	{
		Py_INCREF(Py_None);
		return Py_None;
	}

	g = findgeneric(generic);
	if (g == NULL) {
		PyErr_SetString(PyExc_RuntimeError,
			   "forms_find_{first|last} returns unknown object");
		return NULL;
	}
	Py_INCREF(g);
	return (PyObject *) g;
}

static PyObject *
form_find_first(f, args)
	formobject *f;
	PyObject *args;
{
	return forms_find_first_or_last(fl_find_first, f, args);
}

static PyObject *
form_find_last(f, args)
	formobject *f;
	PyObject *args;
{
	return forms_find_first_or_last(fl_find_last, f, args);
}

static PyObject *
form_set_object_focus(f, args)
	formobject *f;
	PyObject *args;
{
	genericobject *g;
	if (args == NULL || !is_genericobject(args)) {
		PyErr_BadArgument();
		return NULL;
	}
	g = (genericobject *)args;
	fl_set_object_focus(f->ob_form, g->ob_generic);
	Py_INCREF(Py_None);
	return Py_None;
}

static PyMethodDef form_methods[] = {
/* adm */
	{"show_form",		(PyCFunction)form_show_form},
	{"hide_form",		(PyCFunction)form_hide_form},
	{"redraw_form",		(PyCFunction)form_redraw_form},
	{"set_form_position",	(PyCFunction)form_set_form_position},
	{"set_form_size",	(PyCFunction)form_set_form_size},
	{"scale_form",		(PyCFunction)form_scale_form},
	{"freeze_form",		(PyCFunction)form_freeze_form},
	{"unfreeze_form",	(PyCFunction)form_unfreeze_form},
	{"activate_form",	(PyCFunction)form_activate_form},
	{"deactivate_form",	(PyCFunction)form_deactivate_form},
	{"bgn_group",		(PyCFunction)form_bgn_group},
	{"end_group",		(PyCFunction)form_end_group},
	{"find_first",		(PyCFunction)form_find_first},
	{"find_last",		(PyCFunction)form_find_last},
	{"set_object_focus",	(PyCFunction)form_set_object_focus},

/* basic objects */
	{"add_button",		(PyCFunction)form_add_button},
/*	{"add_bitmap",		(method)form_add_bitmap}, */
	{"add_lightbutton",	(PyCFunction)form_add_lightbutton},
	{"add_roundbutton",	(PyCFunction)form_add_roundbutton},
	{"add_menu",		(PyCFunction)form_add_menu},
	{"add_slider",		(PyCFunction)form_add_slider},
	{"add_positioner",	(PyCFunction)form_add_positioner},
	{"add_valslider",	(PyCFunction)form_add_valslider},
	{"add_dial",		(PyCFunction)form_add_dial},
	{"add_counter",		(PyCFunction)form_add_counter},
	{"add_box",		(PyCFunction)form_add_box},
	{"add_clock",		(PyCFunction)form_add_clock},
	{"add_choice",		(PyCFunction)form_add_choice},
	{"add_browser",		(PyCFunction)form_add_browser},
	{"add_input",		(PyCFunction)form_add_input},
	{"add_timer",		(PyCFunction)form_add_timer},
	{"add_text",		(PyCFunction)form_add_text},
	{NULL,			NULL}		/* sentinel */
};

static void
form_dealloc(f)
	formobject *f;
{
	releaseobjects(f->ob_form);
	if (f->ob_form->visible)
		fl_hide_form(f->ob_form);
	fl_free_form(f->ob_form);
	PyObject_Del(f);
}

#define OFF(x) offsetof(FL_FORM, x)

static struct memberlist form_memberlist[] = {
	{"window",	T_LONG,		OFF(window),	RO},
	{"w",		T_FLOAT,	OFF(w)},
	{"h",		T_FLOAT,	OFF(h)},
	{"x",		T_FLOAT,	OFF(x),		RO},
	{"y",		T_FLOAT,	OFF(y),		RO},
	{"deactivated",	T_INT,		OFF(deactivated)},
	{"visible",	T_INT,		OFF(visible),	RO},
	{"frozen",	T_INT,		OFF(frozen),	RO},
	{"doublebuf",	T_INT,		OFF(doublebuf)},
	{NULL}	/* Sentinel */
};

#undef OFF

static PyObject *
form_getattr(f, name)
	formobject *f;
	char *name;
{
	PyObject *meth;

	meth = Py_FindMethod(form_methods, (PyObject *)f, name);
	if (meth != NULL)
		return meth;
	PyErr_Clear();
	return PyMember_Get((char *)f->ob_form, form_memberlist, name);
}

static int
form_setattr(f, name, v)
	formobject *f;
	char *name;
	PyObject *v;
{
	if (v == NULL) {
		PyErr_SetString(PyExc_TypeError,
				"can't delete form attributes");
		return -1;
	}

	return PyMember_Set((char *)f->ob_form, form_memberlist, name, v);
}

static PyObject *
form_repr(f)
	formobject *f;
{
	char buf[100];
	sprintf(buf, "<FORMS_form at %p, window=%ld>",
		f, f->ob_form->window);
	return PyString_FromString(buf);
}

static PyTypeObject Formtype = {
	PyObject_HEAD_INIT(&PyType_Type)
	0,				/*ob_size*/
	"FORMS_form",			/*tp_name*/
	sizeof(formobject),		/*tp_size*/
	0,				/*tp_itemsize*/
	/* methods */
	(destructor)form_dealloc,	/*tp_dealloc*/
	0,				/*tp_print*/
	(getattrfunc)form_getattr,	/*tp_getattr*/
	(setattrfunc)form_setattr,	/*tp_setattr*/
	0,				/*tp_compare*/
	(reprfunc)form_repr,		/*tp_repr*/
};

static PyObject *
newformobject(form)
	FL_FORM *form;
{
	formobject *f;
	f = PyObject_New(formobject, &Formtype);
	if (f == NULL)
		return NULL;
	f->ob_form = form;
	return (PyObject *)f;
}


/* The "fl" module */

static PyObject *
forms_make_form(dummy, args)
	PyObject *dummy;
	PyObject *args;
{
	int type;
	float w, h;
	FL_FORM *form;
	if (!PyArg_Parse(args, "(iff)", &type, &w, &h))
		return NULL;
	form = fl_bgn_form(type, w, h);
	if (form == NULL) {
		/* XXX Actually, cannot happen! */
		PyErr_NoMemory();
		return NULL;
	}
	fl_end_form();
	return newformobject(form);
}

static PyObject *
forms_activate_all_forms(f, args)
	PyObject *f;
	PyObject *args;
{
	fl_activate_all_forms();
	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
forms_deactivate_all_forms(f, args)
	PyObject *f;
	PyObject *args;
{
	fl_deactivate_all_forms();
	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *my_event_callback = NULL;

static PyObject *
forms_set_event_call_back(dummy, args)
	PyObject *dummy;
	PyObject *args;
{
	if (args == Py_None)
		args = NULL;
	my_event_callback = args;
	Py_XINCREF(args);
	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
forms_do_or_check_forms(dummy, args, func)
	PyObject *dummy;
	PyObject *args;
	FL_OBJECT *(*func)();
{
	FL_OBJECT *generic;
	genericobject *g;
	PyObject *arg, *res;
	
	if (!PyArg_NoArgs(args))
		return NULL;

	for (;;) {
		Py_BEGIN_ALLOW_THREADS
		generic = (*func)();
		Py_END_ALLOW_THREADS
		if (generic == NULL) {
			Py_INCREF(Py_None);
			return Py_None;
		}
		if (generic == FL_EVENT) {
			int dev;
			short val;
			if (my_event_callback == NULL)
				return PyInt_FromLong(-1L);
			dev = fl_qread(&val);
			arg = Py_BuildValue("(ih)", dev, val);
			if (arg == NULL)
				return NULL;
			res = PyEval_CallObject(my_event_callback, arg);
			Py_XDECREF(res);
			Py_DECREF(arg);
			if (res == NULL)
				return NULL; /* Callback raised exception */
			continue;
		}
		g = findgeneric(generic);
		if (g == NULL) {
			/* Object not known to us (some dialogs cause this) */
			continue; /* Ignore it */
		}
		if (g->ob_callback == NULL) {
			Py_INCREF(g);
			return ((PyObject *) g);
		}
		arg = Py_BuildValue("(OO)", (PyObject *)g, g->ob_callback_arg);
		if (arg == NULL)
			return NULL;
		res = PyEval_CallObject(g->ob_callback, arg);
		Py_XDECREF(res);
		Py_DECREF(arg);
		if (res == NULL)
			return NULL; /* Callback raised exception */
	}
}

static PyObject *
forms_do_forms(dummy, args)
	PyObject *dummy;
	PyObject *args;
{
	return forms_do_or_check_forms(dummy, args, fl_do_forms);
}

static PyObject *
forms_check_forms(dummy, args)
	PyObject *dummy;
	PyObject *args;
{
	return forms_do_or_check_forms(dummy, args, fl_check_forms);
}

static PyObject *
forms_do_only_forms(dummy, args)
	PyObject *dummy;
	PyObject *args;
{
	return forms_do_or_check_forms(dummy, args, fl_do_only_forms);
}

static PyObject *
forms_check_only_forms(dummy, args)
	PyObject *dummy;
	PyObject *args;
{
	return forms_do_or_check_forms(dummy, args, fl_check_only_forms);
}

#ifdef UNUSED
static PyObject *
fl_call(func, args)
	PyObject *args;
	void (*func)();
{
	if (!PyArg_NoArgs(args))
		return NULL;
	(*func)();
	Py_INCREF(Py_None);
	return Py_None;
}
#endif

static PyObject *
forms_set_graphics_mode(dummy, args)
	PyObject *dummy;
	PyObject *args;
{
	int rgbmode, doublebuf;

	if (!PyArg_Parse(args, "(ii)", &rgbmode, &doublebuf))
		return NULL;
	fl_set_graphics_mode(rgbmode,doublebuf);
	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
forms_get_rgbmode(dummy, args)
	PyObject *dummy;
	PyObject *args;
{
	extern int fl_rgbmode;

	if (args != NULL) {
		PyErr_BadArgument();
		return NULL;
	}
	return PyInt_FromLong((long)fl_rgbmode);
}

static PyObject *
forms_show_errors(dummy, args)
	PyObject *dummy;
	PyObject *args;
{
	int show;
	if (!PyArg_Parse(args, "i", &show))
		return NULL;
	fl_show_errors(show);
	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
forms_set_font_name(dummy, args)
	PyObject *dummy;
	PyObject *args;
{
	int numb;
	char *name;
	if (!PyArg_Parse(args, "(is)", &numb, &name))
		return NULL;
	fl_set_font_name(numb, name);
	Py_INCREF(Py_None);
	return Py_None;
}


static PyObject *
forms_qdevice(self, args)
	PyObject *self;
	PyObject *args;
{
	short arg1;
	if (!PyArg_Parse(args, "h", &arg1))
		return NULL;
	fl_qdevice(arg1);
	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
forms_unqdevice(self, args)
	PyObject *self;
	PyObject *args;
{
	short arg1;
	if (!PyArg_Parse(args, "h", &arg1))
		return NULL;
	fl_unqdevice(arg1);
	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
forms_isqueued(self, args)
	PyObject *self;
	PyObject *args;
{
	long retval;
	short arg1;
	if (!PyArg_Parse(args, "h", &arg1))
		return NULL;
	retval = fl_isqueued(arg1);

	return PyInt_FromLong(retval);
}

static PyObject *
forms_qtest(self, args)
	PyObject *self;
	PyObject *args;
{
	long retval;
	retval = fl_qtest();
	return PyInt_FromLong(retval);
}


static PyObject *
forms_qread(self, args)
	PyObject *self;
	PyObject *args;
{
	int dev;
	short val;
	Py_BEGIN_ALLOW_THREADS
	dev = fl_qread(&val);
	Py_END_ALLOW_THREADS
	return Py_BuildValue("(ih)", dev, val);
}

static PyObject *
forms_qreset(self, args)
	PyObject *self;
	PyObject *args;
{
	if (!PyArg_NoArgs(args)) return NULL;

	fl_qreset();
	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
forms_qenter(self, args)
	PyObject *self;
	PyObject *args;
{
	short arg1, arg2;
	if (!PyArg_Parse(args, "(hh)", &arg1, &arg2))
		return NULL;
	fl_qenter(arg1, arg2);
	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
forms_color(self, args)
	PyObject *self;
	PyObject *args;
{
	int arg;

	if (!PyArg_Parse(args, "i", &arg)) return NULL;

	fl_color((short) arg);

	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
forms_mapcolor(self, args)
	PyObject *self;
	PyObject *args;
{
	int arg0, arg1, arg2, arg3;

	if (!PyArg_Parse(args, "(iiii)", &arg0, &arg1, &arg2, &arg3))
		return NULL;

	fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);

	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
forms_getmcolor(self, args)
	PyObject *self;
	PyObject *args;
{
	int arg;
	short r, g, b;

	if (!PyArg_Parse(args, "i", &arg)) return NULL;

	fl_getmcolor(arg, &r, &g, &b);

	return Py_BuildValue("(hhh)", r, g, b);
}

static PyObject *
forms_get_mouse(self, args)
	PyObject *self;
	PyObject *args;
{
	float x, y;

	if (!PyArg_NoArgs(args)) return NULL;
	
	fl_get_mouse(&x, &y);

	return Py_BuildValue("(ff)", x, y);
}

static PyObject *
forms_tie(self, args)
	PyObject *self;
	PyObject *args;
{
	short arg1, arg2, arg3;
	if (!PyArg_Parse(args, "(hhh)", &arg1, &arg2, &arg3))
		return NULL;
	fl_tie(arg1, arg2, arg3);
	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
forms_show_message(f, args)
	PyObject *f;
	PyObject *args;
{
	char *a, *b, *c;

	if (!PyArg_Parse(args, "(sss)", &a, &b, &c)) return NULL;

	Py_BEGIN_ALLOW_THREADS
	fl_show_message(a, b, c);
	Py_END_ALLOW_THREADS

	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
forms_show_choice(f, args)
	PyObject *f;
	PyObject *args;
{
	char *m1, *m2, *m3, *b1, *b2, *b3;
	int nb;
	char *format;
	long rv;

	if (args == NULL || !PyTuple_Check(args)) {
		PyErr_BadArgument();
		return NULL;
	}
	nb = PyTuple_Size(args) - 3;
	if (nb <= 0) {
		PyErr_SetString(PyExc_TypeError,
				"need at least one button label");
		return NULL;
	}
	if (PyInt_Check(PyTuple_GetItem(args, 3))) {
		PyErr_SetString(PyExc_TypeError,
			   "'number-of-buttons' argument not needed");
		return NULL;
	}
	switch (nb) {
	case 1: format = "(ssss)"; break;
	case 2: format = "(sssss)"; break;
	case 3: format = "(ssssss)"; break;
	default:
		PyErr_SetString(PyExc_TypeError, "too many button labels");
		return NULL;
	}

	if (!PyArg_Parse(args, format, &m1, &m2, &m3, &b1, &b2, &b3))
		return NULL;

	Py_BEGIN_ALLOW_THREADS
	rv = fl_show_choice(m1, m2, m3, nb, b1, b2, b3);
	Py_END_ALLOW_THREADS
	return PyInt_FromLong(rv);
}

static PyObject *
forms_show_question(f, args)
	PyObject *f;
	PyObject *args;
{
	int ret;
	char *a, *b, *c;

	if (!PyArg_Parse(args, "(sss)", &a, &b, &c)) return NULL;

	Py_BEGIN_ALLOW_THREADS
	ret = fl_show_question(a, b, c);
	Py_END_ALLOW_THREADS

	return PyInt_FromLong((long) ret);
}

static PyObject *
forms_show_input(f, args)
	PyObject *f;
	PyObject *args;
{
	char *str;
	char *a, *b;

	if (!PyArg_Parse(args, "(ss)", &a, &b)) return NULL;

	Py_BEGIN_ALLOW_THREADS
	str = fl_show_input(a, b);
	Py_END_ALLOW_THREADS

	if (str == NULL) {
		Py_INCREF(Py_None);
		return Py_None;
	}
	return PyString_FromString(str);
}

static PyObject *
forms_file_selector(f, args)
	PyObject *f;
	PyObject *args;
{
	char *str;
	char *a, *b, *c, *d;

	if (!PyArg_Parse(args, "(ssss)", &a, &b, &c, &d)) return NULL;

	Py_BEGIN_ALLOW_THREADS
	str = fl_show_file_selector(a, b, c, d);
	Py_END_ALLOW_THREADS

	if (str == NULL) {
		Py_INCREF(Py_None);
		return Py_None;
	}
	return PyString_FromString(str);
}


static PyObject *
forms_file_selector_func(args, func)
	PyObject *args;
	char *(*func)();
{
	char *str;

	str = (*func) ();

	if (str == NULL) {
		Py_INCREF(Py_None);
		return Py_None;
	}
	return PyString_FromString(str);
}

static PyObject *
forms_get_directory(f, args)
	PyObject *f;
	PyObject *args;
{
	return forms_file_selector_func(args, fl_get_directory);
}

static PyObject *
forms_get_pattern(f, args)
	PyObject *f;
	PyObject *args;
{
	return forms_file_selector_func(args, fl_get_pattern);
}

static PyObject *
forms_get_filename(f, args)
	PyObject *f;
	PyObject *args;
{
	return forms_file_selector_func(args, fl_get_filename);
}

static PyMethodDef forms_methods[] = {
/* adm */
	{"make_form",		forms_make_form},
	{"activate_all_forms",	forms_activate_all_forms},
	{"deactivate_all_forms",forms_deactivate_all_forms},
/* gl support wrappers */
	{"qdevice",		forms_qdevice},
	{"unqdevice",		forms_unqdevice},
	{"isqueued",		forms_isqueued},
	{"qtest",		forms_qtest},
	{"qread",		forms_qread},
/*	{"blkqread",		forms_blkqread}, */
	{"qreset",		forms_qreset},
	{"qenter",		forms_qenter},
	{"get_mouse",		forms_get_mouse},
	{"tie",			forms_tie},
/*	{"new_events",		forms_new_events}, */
	{"color",		forms_color},
	{"mapcolor",		forms_mapcolor},
	{"getmcolor",		forms_getmcolor},
/* interaction */
	{"do_forms",		forms_do_forms},
	{"do_only_forms",	forms_do_only_forms},
	{"check_forms",		forms_check_forms},
	{"check_only_forms",	forms_check_only_forms},
	{"set_event_call_back",	forms_set_event_call_back},
/* goodies */
	{"show_message",	forms_show_message},
	{"show_question",	forms_show_question},
	{"show_choice",		forms_show_choice},
	{"show_input",		forms_show_input},
	{"show_file_selector",	forms_file_selector},
	{"file_selector",	forms_file_selector}, /* BW compat */
	{"get_directory",	forms_get_directory},
	{"get_pattern",		forms_get_pattern},
	{"get_filename",	forms_get_filename},
	{"set_graphics_mode",	forms_set_graphics_mode},
	{"get_rgbmode",		forms_get_rgbmode},
	{"show_errors",		forms_show_errors},
	{"set_font_name",	forms_set_font_name},
	{NULL,			NULL}		/* sentinel */
};

DL_EXPORT(void)
initfl()
{
	Py_InitModule("fl", forms_methods);
	foreground();
	fl_init();
}



