/********************************************************** Copyright 1991 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 not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM 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. */ #include "forms.h" #include "allobjects.h" #include "import.h" #include "modsupport.h" #include "structmember.h" /* #include "ceval.h" */ extern object *call_object(object *, object *); /* Generic Forms Objects */ typedef struct { OB_HEAD FL_OBJECT *ob_generic; struct methodlist *ob_methods; object *ob_callback; object *ob_callback_arg; } genericobject; /* List of all objects (later this should be a hash table on address...) */ static object *allgenerics = NULL; static void knowgeneric(g) genericobject *g; { if (allgenerics == NULL) { allgenerics = newlistobject(0); if (allgenerics == NULL) { err_clear(); return; /* Botte pech */ } } addlistitem(allgenerics, (object *)g); } static genericobject * findgeneric(generic) FL_OBJECT *generic; { int i, n; genericobject *g; if (allgenerics == NULL) return NULL; /* Botte pech */ n = getlistsize(allgenerics); for (i = 0; i < n; i++) { g = (genericobject *)getlistitem(allgenerics, i); if (g->ob_generic == generic) return g; } return NULL; /* Unknown object */ } /* Methods of generic objects */ static object * generic_set_call_back(g, args) genericobject *g; object *args; { if (args == NULL) { XDECREF(g->ob_callback); XDECREF(g->ob_callback_arg); g->ob_callback = NULL; g->ob_callback_arg = NULL; } else { if (!is_tupleobject(args) || gettuplesize(args) != 2) { err_badarg(); return NULL; } XDECREF(g->ob_callback); XDECREF(g->ob_callback_arg); g->ob_callback = gettupleitem(args, 0); INCREF(g->ob_callback); g->ob_callback_arg = gettupleitem(args, 1); INCREF(g->ob_callback_arg); } INCREF(None); return None; } static object * generic_call(g, args, func) genericobject *g; object *args; void (*func)(FL_OBJECT *); { if (!getnoarg(args)) return NULL; (*func)(g->ob_generic); INCREF(None); return None; } static object * generic_show_object(g, args) genericobject *g; object *args; { return generic_call(g, args, fl_show_object); } static object * generic_hide_object(g, args) genericobject *g; object *args; { return generic_call(g, args, fl_hide_object); } static object * generic_redraw_object(g, args) genericobject *g; object *args; { return generic_call(g, args, fl_redraw_object); } static object * generic_freeze_object(g, args) genericobject *g; object *args; { return generic_call(g, args, fl_freeze_object); } static object * generic_unfreeze_object(g, args) genericobject *g; object *args; { return generic_call(g, args, fl_unfreeze_object); } static struct methodlist generic_methods[] = { {"set_call_back", generic_set_call_back}, {"show_object", generic_show_object}, {"hide_object", generic_hide_object}, {"redraw_object", generic_redraw_object}, {"freeze_object", generic_freeze_object}, {"unfreeze_object", generic_unfreeze_object}, #if 0 {"handle_object", generic_handle_object}, {"handle_object_direct",generic_handle_object_direct}, #endif {NULL, NULL} /* sentinel */ }; static void generic_dealloc(g) genericobject *g; { /* XXX can't destroy forms objects !!! */ 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), RO}, {"input", T_INT, OFF(input), RO}, {"visible", T_INT, OFF(visible), RO}, {"radio", T_INT, OFF(radio), RO}, {"automatic", T_INT, OFF(automatic), RO}, {NULL} /* Sentinel */ }; static object * generic_getattr(g, name) genericobject *g; char *name; { object *meth; if (g-> ob_methods) { meth = findmethod(g->ob_methods, (object *)g, name); if (meth != NULL) return meth; err_clear(); } meth = findmethod(generic_methods, (object *)g, name); if (meth != NULL) return meth; err_clear(); /* "label" is an exception, getmember only works for char pointers, not for char arrays */ if (strcmp(name, "label") == 0) return newstringobject(g->ob_generic->label); return getmember((char *)g->ob_generic, generic_memberlist, name); } static int generic_setattr(g, name, v) genericobject *g; char *name; object *v; { int ret; if (v == NULL) { err_setstr(TypeError, "can't delete forms object attributes"); return NULL; } /* "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 (!is_stringobject(v)) { err_setstr(TypeError, "label attr must be string"); return NULL; } fl_set_object_label(g->ob_generic, getstringvalue(v)); return 0; } ret = setmember((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; } typeobject GenericObjecttype = { OB_HEAD_INIT(&Typetype) 0, /*ob_size*/ "generic FORMS object", /*tp_name*/ sizeof(genericobject), /*tp_size*/ 0, /*tp_itemsize*/ /* methods */ generic_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ generic_getattr, /*tp_getattr*/ generic_setattr, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ }; static object * newgenericobject(generic, methods) FL_OBJECT *generic; struct methodlist *methods; { genericobject *g; g = NEWOBJ(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 (object *)g; } /**********************************************************************/ /* Some common calling sequences */ /* void func (object, float) */ static object * call_forms_INf (func, obj, args) void *(*func)(FL_OBJECT *, float); FL_OBJECT *obj; object *args; { float parameter; if (!getfloatarg (args, ¶meter)) return NULL; (*func) (obj, parameter); INCREF(None); return None; } /* void func (object, float) */ static object * call_forms_INfINf (func, obj, args) void *(*func)(FL_OBJECT *, float, float); FL_OBJECT *obj; object *args; { float par1, par2; if (!getfloatfloatarg (args, &par1, &par2)) return NULL; (*func) (obj, par1, par2); INCREF(None); return None; } /* void func (object, int) */ static object * call_forms_INi (func, obj, args) void *(*func)(FL_OBJECT *, int); FL_OBJECT *obj; object *args; { int parameter; if (!getintarg (args, ¶meter)) return NULL; (*func) (obj, parameter); INCREF(None); return None; } /* void func (object, string) */ static object * call_forms_INstr (func, obj, args) void *(*func)(FL_OBJECT *, char *); FL_OBJECT *obj; object *args; { object *a; if (!getstrarg (args, &a)) return NULL; (*func) (obj, getstringvalue (a)); INCREF(None); return None; } /* voide func (object, int, string) */ static object * call_forms_INiINstr (func, obj, args) void *(*func)(FL_OBJECT *, int, char *); FL_OBJECT *obj; object *args; { object *a; int b; if (!getintstrarg (args, &b, &a)) return NULL; (*func) (obj, b, getstringvalue (a)); INCREF(None); return None; } /* void func (object, float) */ static object * call_forms_INiINi (func, obj, args) void *(*func)(FL_OBJECT *, float, float); FL_OBJECT *obj; object *args; { int par1, par2; if (!getintintarg (args, &par1, &par2)) return NULL; (*func) (obj, par1, par2); INCREF(None); return None; } /* int func (object) */ static object * call_forms_Ri (func, obj, args) int (*func)(FL_OBJECT *); FL_OBJECT *obj; object *args; { int retval; if (!getnoarg(args)) return NULL; retval = (*func) (obj); return newintobject ((long) retval); } /* char * func (object) */ static object * call_forms_Rstr (func, obj, args) char * (*func)(FL_OBJECT *); FL_OBJECT *obj; object *args; { char *str; if (!getnoarg (args)) return NULL; str = (*func) (obj); return newstringobject (str); } /* int func (object) */ static object * call_forms_Rf (func, obj, args) float (*func)(FL_OBJECT *); FL_OBJECT *obj; object *args; { float retval; if (!getnoarg(args)) return NULL; retval = (*func) (obj); return newfloatobject (retval); } static object * call_forms_OUTfOUTf (func, obj, args) void *(*func)(FL_OBJECT *, float *, float *); FL_OBJECT *obj; object *args; { float f1, f2; object *arg; if (!getnoarg(args)) return NULL; (*func) (obj, &f1, &f2); arg = newtupleobject (2); if (arg == NULL) return NULL; settupleitem (arg, 0, newfloatobject (f1)); settupleitem (arg, 1, newfloatobject (f2)); return arg; } static object * call_forms_OUTf (func, obj, args) void *(*func)(FL_OBJECT *, float *); FL_OBJECT *obj; object *args; { float f; object *arg; if (!getnoarg(args)) return NULL; (*func) (obj, &f); return newfloatobject (f); } /**********************************************************************/ /* Class : browser */ static object * set_browser_topline(g, args) genericobject *g; object *args; { return call_forms_INi (fl_set_browser_topline, g-> ob_generic, args); } static object * clear_browser(g, args) genericobject *g; object *args; { return generic_call (g, args, fl_clear_browser); } static object * add_browser_line (g, args) genericobject *g; object *args; { return call_forms_INstr (fl_add_browser_line, g-> ob_generic, args); } static object * addto_browser (g, args) genericobject *g; object *args; { return call_forms_INstr (fl_addto_browser, g-> ob_generic, args); } static object * insert_browser_line (g, args) genericobject *g; object *args; { return call_forms_INiINstr (fl_insert_browser_line, g-> ob_generic, args); } static object * delete_browser_line (g, args) genericobject *g; object *args; { return call_forms_INi (fl_delete_browser_line, g-> ob_generic, args); } static object * replace_browser_line (g, args) genericobject *g; object *args; { return call_forms_INiINstr (fl_replace_browser_line, g-> ob_generic, args); } static object * get_browser_line(g, args) genericobject *g; object *args; { int i; char *str; if (!getintarg(args, &i)) return NULL; str = fl_get_browser_line (g->ob_generic, i); return newstringobject (str); } static object * load_browser (g, args) genericobject *g; object *args; { return call_forms_INstr (fl_load_browser, g-> ob_generic, args); } static object * get_browser_maxline(g, args) genericobject *g; object *args; { return call_forms_Ri (fl_get_browser_maxline, g-> ob_generic, args); } static object * select_browser_line (g, args) genericobject *g; object *args; { return call_forms_INi (fl_select_browser_line, g-> ob_generic, args); } static object * deselect_browser_line (g, args) genericobject *g; object *args; { return call_forms_INi (fl_deselect_browser_line, g-> ob_generic, args); } static object * deselect_browser (g, args) genericobject *g; object *args; { return generic_call (g, args, fl_deselect_browser); } static object * isselected_browser_line (g, args) genericobject *g; object *args; { int i, j; object *arg; if (!getintarg(args, &i)) return NULL; j = fl_isselected_browser_line (g->ob_generic, i); return newintobject (j); } static object * get_browser (g, args) genericobject *g; object *args; { return call_forms_Ri (fl_get_browser, g-> ob_generic, args); } static object * set_browser_fontsize (g, args) genericobject *g; object *args; { return call_forms_INf (fl_set_browser_fontsize, g-> ob_generic, args); } static object * set_browser_fontstyle (g, args) genericobject *g; object *args; { return call_forms_INi (fl_set_browser_fontstyle, g-> ob_generic, args); } static struct methodlist browser_methods[] = { {"set_browser_topline", set_browser_topline}, {"clear_browser", clear_browser}, {"add_browser_line", add_browser_line}, {"addto_browser", addto_browser}, {"insert_browser_line", insert_browser_line}, {"delete_browser_line", delete_browser_line}, {"replace_browser_line",replace_browser_line}, {"get_browser_line", get_browser_line}, {"load_browser", load_browser}, {"get_browser_maxline", get_browser_maxline}, {"select_browser_line", select_browser_line}, {"deselect_browser_line", deselect_browser_line}, {"deselect_browser", deselect_browser}, {"isselected_browser_line", isselected_browser_line}, {"get_browser", get_browser}, {"set_browser_fontsize",set_browser_fontsize}, {"set_browser_fontstyle", set_browser_fontstyle}, {NULL, NULL} /* sentinel */ }; /* Class: button */ static object * set_button(g, args) genericobject *g; object *args; { return call_forms_INi (fl_set_button, g-> ob_generic, args); } static object * get_button(g, args) genericobject *g; object *args; { return call_forms_Ri (fl_get_button, g-> ob_generic, args); } static struct methodlist button_methods[] = { {"set_button", set_button}, {"get_button", get_button}, {NULL, NULL} /* sentinel */ }; /* Class: choice */ static object * set_choice(g, args) genericobject *g; object *args; { return call_forms_INi (fl_set_choice, g-> ob_generic, args); } static object * get_choice(g, args) genericobject *g; object *args; { return call_forms_Ri (fl_get_choice, g-> ob_generic, args); } static object * clear_choice (g, args) genericobject *g; object *args; { generic_call (g, args, fl_clear_choice); } static object * addto_choice (g, args) genericobject *g; object *args; { return call_forms_INstr (fl_addto_choice, g-> ob_generic, args); } static object * replace_choice (g, args) genericobject *g; object *args; { return call_forms_INiINstr (fl_replace_choice, g-> ob_generic, args); } static object * delete_choice (g, args) genericobject *g; object *args; { return call_forms_INi (fl_delete_choice, g-> ob_generic, args); } static object * get_choice_text (g, args) genericobject *g; object *args; { return call_forms_Rstr (fl_get_choice_text, g-> ob_generic, args); } static object * set_choice_fontsize (g, args) genericobject *g; object *args; { return call_forms_INf (fl_set_choice_fontsize, g-> ob_generic, args); } static object * set_choice_fontstyle (g, args) genericobject *g; object *args; { return call_forms_INi (fl_set_choice_fontstyle, g-> ob_generic, args); } static struct methodlist choice_methods[] = { {"set_choice", set_choice}, {"get_choice", get_choice}, {"clear_choice", clear_choice}, {"addto_choice", addto_choice}, {"replace_choice", replace_choice}, {"delete_choice", delete_choice}, {"get_choice_text", get_choice_text}, {"set_choice_fontsize", set_choice_fontsize}, {"set_choice_fontstyle",set_choice_fontstyle}, {NULL, NULL} /* sentinel */ }; /* Class : Clock */ static object * get_clock(g, args) genericobject *g; object *args; { int i0, i1, i2; object *arg; if (!getnoarg(args)) return NULL; fl_get_clock (g->ob_generic, &i0, &i1, &i2); arg = newtupleobject (3); if (arg == NULL) return NULL; settupleitem (arg, 0, newintobject (i0)); settupleitem (arg, 1, newintobject (i1)); settupleitem (arg, 2, newintobject (i2)); return arg; } static struct methodlist clock_methods[] = { {"get_clock", get_clock}, {NULL, NULL} /* sentinel */ }; /* CLass : Counters */ static object * get_counter_value(g, args) genericobject *g; object *args; { return call_forms_Rf (fl_get_counter_value, g-> ob_generic, args); } static object * set_counter_value (g, args) genericobject *g; object *args; { return call_forms_INf (fl_set_counter_value, g-> ob_generic, args); } static object * set_counter_precision (g, args) genericobject *g; object *args; { return call_forms_INi (fl_set_counter_precision, g-> ob_generic, args); } static object * set_counter_bounds (g, args) genericobject *g; object *args; { return call_forms_INfINf (fl_set_counter_bounds, g-> ob_generic, args); } static object * set_counter_step (g, args) genericobject *g; object *args; { return call_forms_INfINf (fl_set_counter_step, g-> ob_generic, args); } static object * set_counter_return (g, args) genericobject *g; object *args; { return call_forms_INi (fl_set_counter_return, g-> ob_generic, args); } static struct methodlist counter_methods[] = { {"set_counter_value", set_counter_value}, {"get_counter_value", get_counter_value}, {"set_counter_bounds", set_counter_bounds}, {"set_counter_step", set_counter_step}, {"set_counter_precision", set_counter_precision}, {"set_counter_return", set_counter_return}, {NULL, NULL} /* sentinel */ }; /* Class : Defaults */ static object * get_default(g, args) genericobject *g; object *args; { char c; if (!getnoarg(args)) return NULL; c = fl_get_default (g->ob_generic); return ((object *) mknewcharobject (c)); /* in cgensupport.c */ } static struct methodlist default_methods[] = { {"get_default", get_default}, {NULL, NULL} /* sentinel */ }; /* Class: Dials */ static object * set_dial (g, args) genericobject *g; object *args; { float f1, f2, f3; if (!getfloatfloatfloatarg(args, &f1, &f2, &f3)) return NULL; fl_set_dial (g->ob_generic, f1, f2, f3); INCREF(None); return None; } static object * get_dial(g, args) genericobject *g; object *args; { return call_forms_Rf (fl_get_dial, g-> ob_generic, args); } static object * set_dial_value (g, args) genericobject *g; object *args; { return call_forms_INf (fl_set_dial_value, g-> ob_generic, args); } static object * set_dial_bounds (g, args) genericobject *g; object *args; { return call_forms_INfINf (fl_set_dial_bounds, g-> ob_generic, args); } static object * get_dial_bounds (g, args) genericobject *g; object *args; { return call_forms_OUTfOUTf (fl_get_dial_bounds, g-> ob_generic, args); } static struct methodlist dial_methods[] = { {"set_dial", set_dial}, {"get_dial", get_dial}, {"set_dial_value", set_dial_value}, {"get_dial_value", get_dial}, {"set_dial_bounds", set_dial_bounds}, {"get_dial_bounds", get_dial_bounds}, {NULL, NULL} /* sentinel */ }; /* Class : Input */ static object * set_input (g, args) genericobject *g; object *args; { return call_forms_INstr (fl_set_input, g-> ob_generic, args); } static object * get_input (g, args) genericobject *g; object *args; { return call_forms_Rstr (fl_get_input, g-> ob_generic, args); } static object * set_input_color (g, args) genericobject *g; object *args; { return call_forms_INfINf (fl_set_input_color, g-> ob_generic, args); } static struct methodlist input_methods[] = { {"set_input", set_input}, {"get_input", get_input}, {"set_input_color", set_input_color}, {NULL, NULL} /* sentinel */ }; /* Class : Menu */ static object * set_menu (g, args) genericobject *g; object *args; { return call_forms_INstr (fl_set_menu, g-> ob_generic, args); } static object * get_menu (g, args) genericobject *g; object *args; { return call_forms_Ri (fl_get_menu, g-> ob_generic, args); } static object * addto_menu (g, args) genericobject *g; object *args; { return call_forms_INstr (fl_addto_menu, g-> ob_generic, args); } static struct methodlist menu_methods[] = { {"set_menu", set_menu}, {"get_menu", get_menu}, {"addto_menu", addto_menu}, {NULL, NULL} /* sentinel */ }; /* Class: Sliders */ static object * set_slider (g, args) genericobject *g; object *args; { float f1, f2, f3; if (!getfloatfloatfloatarg(args, &f1, &f2, &f3)) return NULL; fl_set_slider (g->ob_generic, f1, f2, f3); INCREF(None); return None; } static object * get_slider(g, args) genericobject *g; object *args; { return call_forms_Rf (fl_get_slider, g-> ob_generic, args); } static object * set_slider_value (g, args) genericobject *g; object *args; { return call_forms_INf (fl_set_slider_value, g-> ob_generic, args); } static object * set_slider_bounds (g, args) genericobject *g; object *args; { return call_forms_INfINf (fl_set_slider_bounds, g-> ob_generic, args); } static object * get_slider_bounds (g, args) genericobject *g; object *args; { return call_forms_OUTfOUTf(fl_get_slider_bounds, g-> ob_generic, args); } static object * set_slider_return (g, args) genericobject *g; object *args; { return call_forms_INf (fl_set_slider_return, g-> ob_generic, args); } static object * set_slider_size (g, args) genericobject *g; object *args; { return call_forms_INf (fl_set_slider_size, g-> ob_generic, args); } static object * set_slider_precision (g, args) genericobject *g; object *args; { return call_forms_INi (fl_set_slider_precision, g-> ob_generic, args); } static struct methodlist slider_methods[] = { {"set_slider", set_slider}, {"get_slider", get_slider}, {"set_slider_value", set_slider_value}, {"get_slider_value", get_slider}, {"set_slider_bounds", set_slider_bounds}, {"get_slider_bounds", get_slider_bounds}, {"set_slider_return", set_slider_return}, {"set_slider_size", set_slider_size}, {"set_slider_precision",set_slider_precision}, {NULL, NULL} /* sentinel */ }; static object * set_positioner_xvalue (g, args) genericobject *g; object *args; { return call_forms_INf (fl_set_positioner_xvalue, g-> ob_generic, args); } static object * set_positioner_xbounds (g, args) genericobject *g; object *args; { return call_forms_INfINf (fl_set_positioner_xbounds, g-> ob_generic, args); } static object * set_positioner_yvalue (g, args) genericobject *g; object *args; { return call_forms_INf (fl_set_positioner_yvalue, g-> ob_generic, args); } static object * set_positioner_ybounds (g, args) genericobject *g; object *args; { return call_forms_INfINf (fl_set_positioner_ybounds, g-> ob_generic, args); } static object * get_positioner_xvalue (g, args) genericobject *g; object *args; { return call_forms_Rf (fl_get_positioner_xvalue, g-> ob_generic, args); } static object * get_positioner_xbounds (g, args) genericobject *g; object *args; { return call_forms_OUTfOUTf (fl_get_positioner_xbounds, g-> ob_generic, args); } static object * get_positioner_yvalue (g, args) genericobject *g; object *args; { return call_forms_Rf (fl_get_positioner_yvalue, g-> ob_generic, args); } static object * get_positioner_ybounds (g, args) genericobject *g; object *args; { return call_forms_OUTfOUTf (fl_get_positioner_ybounds, g-> ob_generic, args); } static struct methodlist positioner_methods[] = { {"set_positioner_xvalue", set_positioner_xvalue}, {"set_positioner_yvalue", set_positioner_yvalue}, {"set_positioner_xbounds", set_positioner_xbounds}, {"set_positioner_ybounds", set_positioner_ybounds}, {"get_positioner_xvalue", get_positioner_xvalue}, {"get_positioner_yvalue", get_positioner_yvalue}, {"get_positioner_xbounds", get_positioner_xbounds}, {"get_positioner_ybounds", set_positioner_ybounds}, {NULL, NULL} /* sentinel */ }; /* Class timer */ static object * set_timer (g, args) genericobject *g; object *args; { return call_forms_INf (fl_set_timer, g-> ob_generic, args); } static object * get_timer (g, args) genericobject *g; object *args; { return call_forms_Rf (fl_get_timer, g-> ob_generic, args); } static struct methodlist timer_methods[] = { {"set_timer", set_timer}, {"get_timer", get_timer}, {NULL, NULL} /* sentinel */ }; /* Form objects */ typedef struct { OB_HEAD FL_FORM *ob_form; } formobject; extern typeobject Formtype; /* Forward */ #define is_formobject(v) ((v)->ob_type == &Formtype) static object * form_show_form(f, args) formobject *f; object *args; { int place, border; object *name; if (!getintintstrarg(args, &place, &border, &name)) return NULL; fl_show_form(f->ob_form, place, border, getstringvalue(name)); INCREF(None); return None; } static object * form_call(func, f, args) FL_FORM *f; object *args; void (*func)(FL_FORM *); { if (!getnoarg(args)) return NULL; (*func)(f); INCREF(None); return None; } static object * form_call_INiINi (func, f, args) FL_FORM *f; object *args; void (*func)(FL_FORM *, int, int); { int a, b; if (!getintintarg(args, &a, &b)) return NULL; (*func)(f, a, b); INCREF(None); return None; } static object * form_hide_form(f, args) formobject *f; object *args; { return form_call (fl_hide_form, f-> ob_form, args); } static object * form_redraw_form(f, args) formobject *f; object *args; { return form_call (fl_redraw_form, f-> ob_form, args); } static object * form_set_form_position (f, args) formobject *f; object *args; { return form_call_INiINi (fl_set_form_position, f-> ob_form, args); } static object * generic_add_object (f, args, func, internal_methods) formobject *f; object *args; FL_OBJECT *(*func)(int, float, float, float, float, char*); struct methodlist *internal_methods; { int type; float x, y, w, h; object *name; FL_OBJECT *genobj; if (!getintfloatfloatfloatfloatstr (args,&type,&x,&y,&w,&h,&name)) return NULL; fl_addto_form (f-> ob_form); genobj = (*func) (type, x, y, w, h, getstringvalue (name)); fl_end_form (); if (genobj == NULL) { err_nomem(); return NULL; } return newgenericobject (genobj, internal_methods); } static object * form_add_button(f, args) formobject *f; object *args; { return generic_add_object(f, args, fl_add_button, button_methods); } static object * form_add_lightbutton(f, args) formobject *f; object *args; { return generic_add_object(f, args, fl_add_lightbutton, button_methods); } static object * form_add_roundbutton(f, args) formobject *f; object *args; { return generic_add_object(f, args, fl_add_roundbutton, button_methods); } static object * form_add_menu (f, args) formobject *f; object *args; { return generic_add_object(f, args, fl_add_menu, menu_methods); } static object * form_add_slider(f, args) formobject *f; object *args; { return generic_add_object(f, args, fl_add_slider, slider_methods); } static object * form_add_valslider(f, args) formobject *f; object *args; { return generic_add_object(f, args, fl_add_valslider, slider_methods); } static object * form_add_dial (f, args) formobject *f; object *args; { return generic_add_object(f, args, fl_add_dial, dial_methods); } static object * form_add_counter (f, args) formobject *f; object *args; { return generic_add_object(f, args, fl_add_counter, counter_methods); } static object * form_add_default (f, args) formobject *f; object *args; { return generic_add_object(f, args, fl_add_default, default_methods); } static object * form_add_clock (f, args) formobject *f; object *args; { return generic_add_object(f, args, fl_add_clock, clock_methods); } static object * form_add_box (f, args) formobject *f; object *args; { return generic_add_object(f, args, fl_add_box, NULL); } static object * form_add_choice (f, args) formobject *f; object *args; { return generic_add_object(f, args, fl_add_choice, choice_methods); } static object * form_add_browser (f, args) formobject *f; object *args; { return generic_add_object(f, args, fl_add_browser, browser_methods); } static object * form_add_positioner (f, args) formobject *f; object *args; { return generic_add_object(f, args, fl_add_positioner, positioner_methods); } static object * form_add_input (f, args) formobject *f; object *args; { return generic_add_object(f, args, fl_add_input, input_methods); } static object * form_add_text (f, args) formobject *f; object *args; { return generic_add_object(f, args, fl_add_text, NULL); } static object * form_add_timer (f, args) formobject *f; object *args; { return generic_add_object(f, args, fl_add_timer, timer_methods); } static object * form_show_message (f, args) formobject *f; object *args; { object *a, *b, *c; if (!getstrstrstrarg(args, &a, &b, &c)) return NULL; fl_show_message ( getstringvalue(a), getstringvalue(b), getstringvalue(c)); INCREF (None); return None; } static object * form_show_question (f, args) formobject *f; object *args; { int ret; object *a, *b, *c; if (!getstrstrstrarg(args, &a, &b, &c)) return NULL; ret = fl_show_question ( getstringvalue(a), getstringvalue(b), getstringvalue(c)); return newintobject ((long) ret); } static object * form_show_input (f, args) formobject *f; object *args; { char *str; object *a, *b; if (!getstrstrarg(args, &a, &b)) return NULL; str = fl_show_input (getstringvalue(a), getstringvalue(b)); return newstringobject (str); } static object * form_file_selector (f, args) formobject *f; object *args; { char *str; object *a, *b, *c, *d; if (!getstrstrstrstrarg(args, &a, &b, &c, &d)) return NULL; str = fl_show_file_selector (getstringvalue(a), getstringvalue(b), getstringvalue (c), getstringvalue (d)); return newstringobject (str); } static object * form_file_selector_func (f, args, func) formobject *f; object *args; char *(*func)(); { char *str; str = (*func) (); return newstringobject (str); } static object * form_get_directory (f, args) formobject *f; object *args; { return form_file_selector_func (f, args, fl_get_directory); } static object * form_get_pattern (f, args) formobject *f; object *args; { return form_file_selector_func (f, args, fl_get_pattern); } static object * form_get_filename (f, args) formobject *f; object *args; { return form_file_selector_func (f, args, fl_get_filename); } static object * form_freeze_form(f, args) formobject *f; object *args; { return form_call (fl_freeze_form, f-> ob_form, args); } static object * form_unfreeze_form(f, args) formobject *f; object *args; { return form_call (fl_unfreeze_form, f-> ob_form, args); } static object * form_display_form(f, args) formobject *f; object *args; { int place, border; object *name; if (!getintintstrarg(args, &place, &border, &name)) return NULL; fl_show_form(f->ob_form, place, border, getstringvalue(name)); INCREF(None); return None; } static object * form_remove_form(f, args) formobject *f; object *args; { return form_call (fl_remove_form, f-> ob_form, args); } static object * form_activate_form(f, args) formobject *f; object *args; { return form_call (fl_activate_form, f-> ob_form, args); } static object * form_deactivate_form(f, args) formobject *f; object *args; { return form_call (fl_deactivate_form, f-> ob_form, args); } static struct methodlist form_methods[] = { /* adm */ {"show_form", form_show_form}, {"hide_form", form_hide_form}, {"redraw_form", form_redraw_form}, {"set_form_position", form_set_form_position}, {"freeze_form", form_freeze_form}, {"unfreeze_form", form_unfreeze_form}, {"display_form", form_display_form}, {"remove_form", form_remove_form}, {"activate_form", form_activate_form}, {"deactivate_form", form_deactivate_form}, /* basic objects */ {"add_button", form_add_button}, /* {"add_bitmap", form_add_bitmap}, */ {"add_lightbutton", form_add_lightbutton}, {"add_roundbutton", form_add_roundbutton}, {"add_menu", form_add_menu}, {"add_slider", form_add_slider}, {"add_positioner", form_add_positioner}, {"add_valslider", form_add_valslider}, {"add_dial", form_add_dial}, {"add_counter", form_add_counter}, {"add_default", form_add_default}, {"add_box", form_add_box}, {"add_clock", form_add_clock}, {"add_choice", form_add_choice}, {"add_browser", form_add_browser}, {"add_input", form_add_input}, {"add_timer", form_add_timer}, {"add_text", form_add_text}, {NULL, NULL} /* sentinel */ }; static void form_dealloc(f) formobject *f; { /* XXX can't destroy form objects !!! */ DEL(f); } static object * form_getattr(f, name) formobject *f; char *name; { /* XXX check for data attr's: x, y etc. */ return findmethod(form_methods, (object *)f, name); } typeobject Formtype = { OB_HEAD_INIT(&Typetype) 0, /*ob_size*/ "form", /*tp_name*/ sizeof(formobject), /*tp_size*/ 0, /*tp_itemsize*/ /* methods */ form_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ form_getattr, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ }; static object * newformobject(form) FL_FORM *form; { formobject *f; f = NEWOBJ(formobject, &Formtype); if (f == NULL) return NULL; f->ob_form = form; return (object *)f; } /* The "fl" module */ static object * forms_make_form(dummy, args) object *dummy; object *args; { int type; float w, h; FL_FORM *form; if (!getintfloatfloatarg(args, &type, &w, &h)) return NULL; form = fl_bgn_form(type, w, h); if (form == NULL) { /* XXX Actually, cannot happen! */ err_nomem(); return NULL; } fl_end_form(); return newformobject(form); } static object *my_event_callback = NULL; static object * forms_set_event_call_back(dummy, args) object *dummy; object *args; { my_event_callback = args; XINCREF(args); INCREF(None); return None; } static object * forms_do_or_check_forms(dummy, args, func) object *dummy; object *args; FL_OBJECT *(*func)(); { FL_OBJECT *generic; genericobject *g; object *arg, *res; if (!getnoarg(args)) return NULL; for (;;) { generic = (*func)(); if (generic == NULL) { INCREF(None); return None; } if (generic == FL_EVENT) { int dev; short val; if (my_event_callback == NULL) return newintobject(-1); dev = fl_qread(&val); arg = newtupleobject(2); if (arg == NULL) return NULL; settupleitem(arg, 0, newintobject((long)dev)); settupleitem(arg, 1, newintobject((long)val)); res = call_object(my_event_callback, arg); XDECREF(res); DECREF(arg); if (res == NULL) return NULL; /* Callback raised exception */ continue; } g = findgeneric(generic); if (g == NULL) { err_setstr(RuntimeError, "do_forms returns unknown object"); return NULL; } if (g->ob_callback == NULL) { INCREF(g); return ((object *) g); } arg = newtupleobject(2); INCREF(g); settupleitem(arg, 0, g); INCREF(g->ob_callback_arg); settupleitem(arg, 1, g->ob_callback_arg); res = call_object(g->ob_callback, arg); XDECREF(res); DECREF(arg); if (res == NULL) return NULL; /* Callback raised exception */ } } static object * forms_do_forms (dummy, args) object *dummy; object *args; { return forms_do_or_check_forms (dummy, args, fl_do_forms); } static object * forms_check_forms (dummy, args) object *dummy; object *args; { return forms_do_or_check_forms (dummy, args, fl_check_forms); } static object * fl_call(func, args) object *args; void (*func)(); { if (!getnoarg(args)) return NULL; (*func)(); INCREF(None); return None; } static object * forms_bgn_group (dummy, args) object *dummy; object *args; { return fl_call (fl_bgn_group, dummy, args); } static object * forms_end_group (dummy, args) object *dummy; object *args; { return fl_call (fl_end_group, args); } static object * forms_qdevice(self, args) object *self; object *args; { short arg1 ; if (!getishortarg(args, 1, 0, &arg1)) return NULL; fl_qdevice( arg1 ); INCREF(None); return None; } static object * forms_unqdevice(self, args) object *self; object *args; { short arg1 ; if (!getishortarg(args, 1, 0, &arg1)) return NULL; fl_unqdevice( arg1 ); INCREF(None); return None; } static object * forms_isqueued(self, args) object *self; object *args; { int retval; short arg1 ; if (!getishortarg(args, 1, 0, &arg1)) return NULL; retval = fl_isqueued( arg1 ); return newintobject((int) retval); } static object * forms_qtest(self, args) object *self; object *args; { long retval; retval = fl_qtest( ); return newintobject((int) retval); } static object * forms_qread(self, args) object *self; object *args; { long retval; short arg1 ; retval = fl_qread( & arg1 ); { object *v = newtupleobject( 2 ); if (v == NULL) return NULL; settupleitem(v, 0, newintobject(retval)); settupleitem(v, 1, newintobject((long)arg1)); return v; } } static object * forms_qreset(self, args) object *self; object *args; { if (!getnoarg(args)) return NULL; forms_qreset(); INCREF(None); return None; } static object * forms_qenter(self, args) object *self; object *args; { short arg1 ; short arg2 ; if (!getishortarg(args, 2, 0, &arg1)) return NULL; if (!getishortarg(args, 2, 1, &arg2)) return NULL; fl_qenter( arg1 , arg2 ); INCREF(None); return None; } static object * forms_color (self, args) object *self; object *args; { int arg; if (!getintarg(args, &arg)) return NULL; fl_color((short) arg); INCREF(None); return None; } static object * forms_mapcolor (self, args) object *self; object *args; { int arg0, arg1, arg2, arg3; if (!getintintintintarg(args, &arg0, &arg1, &arg2, &arg3)) return NULL; fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3); INCREF(None); return None; } static object * forms_getmcolor (self, args) object *self; object *args; { int arg, r, g, b; object *v; if (!getintarg(args, &arg)) return NULL; fl_getmcolor (arg, (short) r, (short)g, (short)b); v = newtupleobject(3); if (v == NULL) return NULL; settupleitem(v, 0, newintobject(r)); settupleitem(v, 1, newintobject(g)); settupleitem(v, 2, newintobject(b)); return v; } static object * forms_tie(self, args) object *self; object *args; { short arg1 ; short arg2 ; short arg3 ; if (!getishortarg(args, 3, 0, &arg1)) return NULL; if (!getishortarg(args, 3, 1, &arg2)) return NULL; if (!getishortarg(args, 3, 2, &arg3)) return NULL; fl_tie( arg1 , arg2 , arg3 ); INCREF(None); return None; } static struct methodlist forms_methods[] = { /* adm */ {"make_form", forms_make_form}, {"bgn_group", forms_bgn_group}, {"end_group", forms_end_group}, /* 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}, {"tie", forms_tie}, /* {"new_events", forms_new_events}, */ {"color", forms_color}, {"mapcolor", forms_mapcolor}, {"getmcolor", forms_getmcolor}, /* interaction */ {"do_forms", forms_do_forms}, {"check_forms", forms_check_forms}, {"set_event_call_back", forms_set_event_call_back}, /* goodies */ {"show_message", form_show_message}, {"show_question", form_show_question}, {"file_selector", form_file_selector}, {"get_directory", form_get_directory}, {"get_pattern", form_get_pattern}, {"get_filename", form_get_filename}, /* {"show_choice", form_show_choice}, XXX - draw.c */ {"show_input", form_show_input}, {NULL, NULL} /* sentinel */ }; void initfl() { initmodule("fl", forms_methods); foreground (); } /* Support routines */ int getintintstrarg(args, a, b, c) object *args; int *a, *b; object **c; { if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) { err_badarg(); return NULL; } return getintarg(gettupleitem(args, 0), a) && getintarg(gettupleitem(args, 1), b) && getstrarg(gettupleitem(args, 2), c); } int getintfloatfloatarg(args, a, b, c) object *args; int *a; float *b, *c; { if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) { err_badarg(); return NULL; } return getintarg(gettupleitem(args, 0), a) && getfloatarg(gettupleitem(args, 1), b) && getfloatarg(gettupleitem(args, 2), c); } int getintintintintarg(args, a, b, c, d) object *args; int *a, *b, *c, *d; { if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 4) { err_badarg(); return NULL; } return getintarg(gettupleitem(args, 0), a) && getintarg(gettupleitem(args, 1), b) && getintarg(gettupleitem(args, 2), c) && getintarg(gettupleitem(args, 3), d); } int getfloatarg(args, a) object *args; float *a; { double x; if (!getdoublearg(args, &x)) return 0; *a = x; return 1; } int getintfloatfloatfloatfloatstr (args, type, x, y, w, h, name) object *args; int *type; float *x, *y, *w, *h; object **name; { if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 6) { err_badarg(); return NULL; } return getintarg(gettupleitem(args, 0), type) && getfloatarg(gettupleitem(args, 1), x) && getfloatarg(gettupleitem(args, 2), y) && getfloatarg(gettupleitem(args, 3), w) && getfloatarg(gettupleitem(args, 4), h) && getstrarg(gettupleitem(args, 5), name); } int getfloatfloatfloatarg(args, f1, f2, f3) object *args; float *f1, *f2, *f3; { if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) { err_badarg(); return NULL; } return getfloatarg(gettupleitem(args, 0), f1) && getfloatarg(gettupleitem(args, 1), f2) && getfloatarg(gettupleitem(args, 2), f3); } int getfloatfloatarg(args, f1, f2) object *args; float *f1, *f2; { if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) { err_badarg(); return NULL; } return getfloatarg(gettupleitem(args, 0), f1) && getfloatarg(gettupleitem(args, 1), f2); } int getstrstrstrarg(v, a, b, c) object *v; object **a; object **b; object **c; { if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3) { return err_badarg(); } return getstrarg(gettupleitem(v, 0), a) && getstrarg(gettupleitem(v, 1), b)&& getstrarg(gettupleitem(v, 2), c); } int getstrstrstrstrarg(v, a, b, c, d) object *v; object **a; object **b; object **c; object **d; { if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 4) { return err_badarg(); } return getstrarg(gettupleitem(v, 0), a) && getstrarg(gettupleitem(v, 1), b)&& getstrarg(gettupleitem(v, 2), c) && getstrarg(gettupleitem(v, 3),d); }