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

static 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(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(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(genericobject *g)
{
    int i, n;

    Py_CLEAR(g->ob_callback);
    Py_CLEAR(g->ob_callback_arg);
    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(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_CLEAR(g->ob_callback);
            Py_CLEAR(g->ob_callback_arg);
            PyList_SetItem(allgenerics, i, (PyObject *)NULL);
            nfreeslots++;
        }
    }
}


/* Methods of generic objects */

static PyObject *
generic_set_call_back(genericobject *g, PyObject *args)
{
    if (PyTuple_GET_SIZE(args) == 0) {
        Py_XDECREF(g->ob_callback);
        Py_XDECREF(g->ob_callback_arg);
        g->ob_callback = NULL;
        g->ob_callback_arg = NULL;
    }
    else {
        PyObject *a, *b;
        if (!PyArg_UnpackTuple(args, "set_call_back", 2, 2, &a, &b))
            return NULL;
        Py_XDECREF(g->ob_callback);
        Py_XDECREF(g->ob_callback_arg);
        g->ob_callback = a;
        Py_INCREF(g->ob_callback);
        g->ob_callback_arg = b;
        Py_INCREF(g->ob_callback_arg);
    }
    Py_INCREF(Py_None);
    return Py_None;
}

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

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

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

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

static PyObject *
generic_redraw_object(genericobject *g)
{
    return generic_call(g, 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(genericobject *g)
{
    return generic_call(g, fl_freeze_object);
}

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

#endif /* OBSOLETE_FORMS_CALLS */

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

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

static PyObject *
generic_set_object_shortcut(genericobject *g, PyObject *args)
{
    char *str;
    if (!PyArg_ParseTuple(args, "s:set_object_shortcut", &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, METH_VARARGS},
    {"delete_object",           (PyCFunction)generic_delete_object, METH_NOARGS},
    {"show_object",             (PyCFunction)generic_show_object, METH_NOARGS},
    {"hide_object",             (PyCFunction)generic_hide_object, METH_NOARGS},
    {"redraw_object",           (PyCFunction)generic_redraw_object, METH_NOARGS},
#ifdef OBSOLETE_FORMS_CALLS
    {"freeze_object",           (PyCFunction)generic_freeze_object, METH_NOARGS},
    {"unfreeze_object",         (PyCFunction)generic_unfreeze_object, METH_NOARGS},
#endif
    {"activate_object",         (PyCFunction)generic_activate_object, METH_NOARGS},
    {"deactivate_object",       (PyCFunction)generic_deactivate_object, METH_NOARGS},
    {"set_object_shortcut",     (PyCFunction)generic_set_object_shortcut, METH_VARARGS},
    {NULL,                      NULL}           /* sentinel */
};

static void
generic_dealloc(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(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(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(genericobject *g)
{
    char buf[100];
    PyOS_snprintf(buf, sizeof(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*/
    "fl.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(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 (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 (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 (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 (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 (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 (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 (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 (int (*func)(FL_OBJECT *), FL_OBJECT *obj)
{
    int retval;

    retval = (*func) (obj);

    return PyInt_FromLong ((long) retval);
}

/* char * func (object) */
static PyObject *
call_forms_Rstr (char * (*func)(FL_OBJECT *), FL_OBJECT *obj)
{
    char *str;

    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 (float (*func)(FL_OBJECT *), FL_OBJECT *obj)
{
    float retval;

    retval = (*func) (obj);

    return PyFloat_FromDouble (retval);
}

static PyObject *
call_forms_OUTfOUTf (void (*func)(FL_OBJECT *, float *, float *), FL_OBJECT *obj)
{
    float f1, f2;

    (*func) (obj, &f1, &f2);

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

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

    (*func) (obj, &f);

    return PyFloat_FromDouble (f);
}
#endif

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

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

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

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

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

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

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

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

static PyObject *
get_browser_line(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 (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(genericobject *g)
{
    return call_forms_Ri (fl_get_browser_maxline, g-> ob_generic);
}

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

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

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

static PyObject *
isselected_browser_line (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 (genericobject *g)
{
    return call_forms_Ri (fl_get_browser, g-> ob_generic);
}

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

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

static PyObject *
set_browser_specialkey (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,
     METH_OLDARGS},
    {"clear_browser",                   (PyCFunction)clear_browser,
     METH_NOARGS},
    {"add_browser_line",                (PyCFunction)add_browser_line,
     METH_OLDARGS},
    {"addto_browser",                   (PyCFunction)addto_browser,
     METH_OLDARGS},
    {"insert_browser_line",             (PyCFunction)insert_browser_line,
     METH_OLDARGS},
    {"delete_browser_line",             (PyCFunction)delete_browser_line,
     METH_OLDARGS},
    {"replace_browser_line",            (PyCFunction)replace_browser_line,
     METH_OLDARGS},
    {"get_browser_line",                (PyCFunction)get_browser_line,
     METH_OLDARGS},
    {"load_browser",                    (PyCFunction)load_browser,
     METH_OLDARGS},
    {"get_browser_maxline",             (PyCFunction)get_browser_maxline,
     METH_NOARGS,}
    {"select_browser_line",             (PyCFunction)select_browser_line,
     METH_OLDARGS},
    {"deselect_browser_line",           (PyCFunction)deselect_browser_line,
     METH_OLDARGS},
    {"deselect_browser",                (PyCFunction)deselect_browser,
     METH_NOARGS,}
    {"isselected_browser_line",         (PyCFunction)isselected_browser_line,
     METH_OLDARGS},
    {"get_browser",                     (PyCFunction)get_browser,
     METH_NOARGS,}
    {"set_browser_fontsize",            (PyCFunction)set_browser_fontsize,
     METH_OLDARGS},
    {"set_browser_fontstyle",           (PyCFunction)set_browser_fontstyle,
     METH_OLDARGS},
    {"set_browser_specialkey",          (PyCFunction)set_browser_specialkey,
     METH_OLDARGS},
    {NULL,                              NULL}           /* sentinel */
};

/* Class: button */

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

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

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

static PyObject *
set_button_shortcut(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, METH_OLDARGS},
    {"get_button",              (PyCFunction)get_button, METH_NOARGS},
    {"get_button_numb",         (PyCFunction)get_button_numb, METH_NOARGS},
    {"set_button_shortcut",     (PyCFunction)set_button_shortcut, METH_OLDARGS},
    {NULL,                      NULL}           /* sentinel */
};

/* Class: choice */

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

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

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

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

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

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

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

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

static PyObject *
set_choice_fontstyle (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,      METH_OLDARGS},
    {"get_choice",              (PyCFunction)get_choice,      METH_NOARGS},
    {"clear_choice",            (PyCFunction)clear_choice,    METH_NOARGS},
    {"addto_choice",            (PyCFunction)addto_choice,    METH_OLDARGS},
    {"replace_choice",          (PyCFunction)replace_choice,  METH_OLDARGS},
    {"delete_choice",           (PyCFunction)delete_choice,   METH_OLDARGS},
    {"get_choice_text",         (PyCFunction)get_choice_text, METH_NOARGS},
    {"set_choice_fontsize", (PyCFunction)set_choice_fontsize, METH_OLDARGS},
    {"set_choice_fontstyle",(PyCFunction)set_choice_fontstyle, METH_OLDARGS},
    {NULL,                      NULL}           /* sentinel */
};

/* Class : Clock */

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

    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, METH_NOARGS},
    {NULL,                      NULL}           /* sentinel */
};

/* CLass : Counters */

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

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

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

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

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

static PyObject *
set_counter_return (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,
     METH_OLDARGS},
    {"get_counter_value",               (PyCFunction)get_counter_value,
     METH_NOARGS},
    {"set_counter_bounds",              (PyCFunction)set_counter_bounds,
     METH_OLDARGS},
    {"set_counter_step",                (PyCFunction)set_counter_step,
     METH_OLDARGS},
    {"set_counter_precision",           (PyCFunction)set_counter_precision,
     METH_OLDARGS},
    {"set_counter_return",              (PyCFunction)set_counter_return,
     METH_OLDARGS},
    {NULL,                              NULL}           /* sentinel */
};


/* Class: Dials */

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

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

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

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

static PyObject *
set_dial_step (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,  METH_OLDARGS},
    {"get_dial_value",          (PyCFunction)get_dial_value,  METH_NOARGS},
    {"set_dial_bounds",         (PyCFunction)set_dial_bounds, METH_OLDARGS},
    {"get_dial_bounds",         (PyCFunction)get_dial_bounds, METH_NOARGS},
    {"set_dial_step",           (PyCFunction)set_dial_step,   METH_OLDARGS},
    {NULL,                      NULL}           /* sentinel */
};

/* Class : Input */

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

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

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

static PyObject *
set_input_return (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,        METH_OLDARGS},
    {"get_input",               (PyCFunction)get_input,        METH_NOARGS},
    {"set_input_color",         (PyCFunction)set_input_color,  METH_OLDARGS},
    {"set_input_return",        (PyCFunction)set_input_return, METH_OLDARGS},
    {NULL,                      NULL}           /* sentinel */
};


/* Class : Menu */

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

static PyObject *
get_menu (genericobject *g)
{
    /* 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);
}

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

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

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


/* Class: Sliders */

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

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

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

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

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

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

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

static PyObject *
set_slider_step (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,  METH_OLDARGS},
    {"get_slider_value",        (PyCFunction)get_slider_value,  METH_NOARGS},
    {"set_slider_bounds",       (PyCFunction)set_slider_bounds, METH_OLDARGS},
    {"get_slider_bounds",       (PyCFunction)get_slider_bounds, METH_NOARGS},
    {"set_slider_return",       (PyCFunction)set_slider_return, METH_OLDARGS},
    {"set_slider_size",         (PyCFunction)set_slider_size,   METH_OLDARGS},
    {"set_slider_precision",(PyCFunction)set_slider_precision, METH_OLDARGS},
    {"set_slider_step",         (PyCFunction)set_slider_step,   METH_OLDARGS},
    {NULL,                      NULL}           /* sentinel */
};

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

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

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

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

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

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

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

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

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

/* Class timer */

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

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

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

/* Form objects */

typedef struct {
    PyObject_HEAD
    FL_FORM *ob_form;
} formobject;

static PyTypeObject Formtype;

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

static PyObject *
form_show_form(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(void (*func)(FL_FORM *), FL_FORM *f)
{
    (*func)(f);

    Py_INCREF(Py_None);
    return Py_None;
}

static PyObject *
form_call_INiINi(void (*func)(FL_FORM *, int, int), FL_FORM *f, PyObject *args)
{
    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(void (*func)(FL_FORM *, float, float), FL_FORM *f, PyObject *args)
{
    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(formobject *f)
{
    return form_call(fl_hide_form, f-> ob_form);
}

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

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

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

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

static PyObject *
generic_add_object(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(formobject *f, PyObject *args)
{
    return generic_add_object(f, args, fl_add_button, button_methods);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

static PyObject *
form_bgn_group(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(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(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(formobject *f, PyObject *args)
{
    return forms_find_first_or_last(fl_find_first, f, args);
}

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

static PyObject *
form_set_object_focus(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,     METH_OLDARGS},
    {"hide_form",               (PyCFunction)form_hide_form,     METH_NOARGS},
    {"redraw_form",             (PyCFunction)form_redraw_form,   METH_NOARGS},
    {"set_form_position",       (PyCFunction)form_set_form_position, METH_OLDARGS},
    {"set_form_size",           (PyCFunction)form_set_form_size, METH_OLDARGS},
    {"scale_form",              (PyCFunction)form_scale_form,    METH_OLDARGS},
    {"freeze_form",             (PyCFunction)form_freeze_form,   METH_NOARGS},
    {"unfreeze_form",           (PyCFunction)form_unfreeze_form, METH_NOARGS},
    {"activate_form",           (PyCFunction)form_activate_form, METH_NOARGS},
    {"deactivate_form",         (PyCFunction)form_deactivate_form, METH_NOARGS},
    {"bgn_group",               (PyCFunction)form_bgn_group,  METH_OLDARGS},
    {"end_group",               (PyCFunction)form_end_group,  METH_OLDARGS},
    {"find_first",              (PyCFunction)form_find_first, METH_OLDARGS},
    {"find_last",               (PyCFunction)form_find_last,  METH_OLDARGS},
    {"set_object_focus",        (PyCFunction)form_set_object_focus, METH_OLDARGS},

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

static void
form_dealloc(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(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(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(formobject *f)
{
    char buf[100];
    PyOS_snprintf(buf, sizeof(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*/
    "fl.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(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(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(PyObject *f, PyObject *args)
{
    fl_activate_all_forms();
    Py_INCREF(Py_None);
    return Py_None;
}

static PyObject *
forms_deactivate_all_forms(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(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(PyObject *dummy, FL_OBJECT *(*func)(void))
{
    FL_OBJECT *generic;
    genericobject *g;
    PyObject *arg, *res;

    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 = PyTuple_Pack(2, (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(PyObject *dummy)
{
    return forms_do_or_check_forms(dummy, fl_do_forms);
}

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

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

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

#ifdef UNUSED
static PyObject *
fl_call(void (*func)(void))
{
    (*func)();
    Py_INCREF(Py_None);
    return Py_None;
}
#endif

static PyObject *
forms_set_graphics_mode(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(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(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(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(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(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(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(PyObject *self, PyObject *args)
{
    long retval;
    retval = fl_qtest();
    return PyInt_FromLong(retval);
}


static PyObject *
forms_qread(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(PyObject *self)
{
    fl_qreset();
    Py_INCREF(Py_None);
    return Py_None;
}

static PyObject *
forms_qenter(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(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(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(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(PyObject *self)
{
    float x, y;

    fl_get_mouse(&x, &y);

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

static PyObject *
forms_tie(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(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(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(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(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(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(PyObject *args, char *(*func)(void))
{
    char *str;

    str = (*func) ();

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

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

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

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

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

PyMODINIT_FUNC
initfl(void)
{
    if (PyErr_WarnPy3k("the fl module has been removed in "
                       "Python 3.0", 2) < 0)
        return;

    Py_InitModule("fl", forms_methods);
    if (m == NULL)
        return;
    foreground();
    fl_init();
}



