1 /**********************************************************
2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
7 Permission to use, copy, modify, and distribute this software and its
8 documentation for any purpose and without fee is hereby granted,
9 provided that the above copyright notice appear in all copies and that
10 both that copyright notice and this permission notice appear in
11 supporting documentation, and that the names of Stichting Mathematisch
12 Centrum or CWI or Corporation for National Research Initiatives or
13 CNRI not be used in advertising or publicity pertaining to
14 distribution of the software without specific, written prior
17 While CWI is the initial source for this software, a modified version
18 is made available by the Corporation for National Research Initiatives
19 (CNRI) at the Internet address ftp://ftp.python.org.
21 STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22 REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23 MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24 CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26 PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28 PERFORMANCE OF THIS SOFTWARE.
30 ******************************************************************/
32 /* FL module -- interface to Mark Overmars' FORMS Library. */
34 /* This code works with FORMS version 2.2 (if you defined
35 OBSOLETE_FORMS_CALLS), and 2.3.
36 FORMS can be ftp'ed from ftp.cs.ruu.nl (131.211.80.17), directory
39 /* A half-hearted attempt has been made to allow programs using this
40 * module to exploit parallelism (through the threads module). No provisions
41 * have been made for multiple threads to use this module at the same time,
42 * though. So, a program with a forms thread and a non-forms thread will work
43 * fine but a program with two threads using forms will probably crash (unless
44 * the program takes precaution to ensure that only one thread can be in
45 * this module at any time). This will have to be fixed some time.
46 * (A fix will probably also have to synchronise with the gl module).
51 #include "structmember.h"
53 /* Generic Forms Objects */
57 FL_OBJECT
*ob_generic
;
58 PyMethodDef
*ob_methods
;
59 PyObject
*ob_callback
;
60 PyObject
*ob_callback_arg
;
63 staticforward PyTypeObject GenericObjecttype
;
65 #define is_genericobject(g) ((g)->ob_type == &GenericObjecttype)
67 /* List of all objects (XXX this should be a hash table on address...) */
69 static PyObject
*allgenerics
= NULL
;
70 static int nfreeslots
= 0;
72 /* Add an object to the list of known objects */
79 /* Create the list if it doesn't already exist */
80 if (allgenerics
== NULL
) {
81 allgenerics
= PyList_New(0);
82 if (allgenerics
== NULL
) {
84 return; /* Too bad, live without allgenerics... */
88 /* Search the list for reusable slots (NULL items) */
89 /* XXX This can be made faster! */
90 n
= PyList_Size(allgenerics
);
91 for (i
= 0; i
< n
; i
++) {
92 if (PyList_GetItem(allgenerics
, i
) == NULL
) {
94 PyList_SetItem(allgenerics
, i
, (PyObject
*)g
);
99 /* Strange... no free slots found... */
102 /* No free entries, append new item to the end */
103 PyList_Append(allgenerics
, (PyObject
*)g
);
106 /* Find an object in the list of known objects */
108 static genericobject
*
115 if (allgenerics
== NULL
)
116 return NULL
; /* No objects known yet */
117 n
= PyList_Size(allgenerics
);
118 for (i
= 0; i
< n
; i
++) {
119 g
= (genericobject
*)PyList_GetItem(allgenerics
, i
);
120 if (g
!= NULL
&& g
->ob_generic
== generic
)
123 return NULL
; /* Unknown object */
126 /* Remove an object from the list of known objects */
134 Py_XDECREF(g
->ob_callback
);
135 g
->ob_callback
= NULL
;
136 Py_XDECREF(g
->ob_callback_arg
);
137 g
->ob_callback_arg
= NULL
;
138 if (allgenerics
== NULL
)
139 return; /* No objects known yet */
140 n
= PyList_Size(allgenerics
);
141 for (i
= 0; i
< n
; i
++) {
142 if (g
== (genericobject
*)PyList_GetItem(allgenerics
, i
)) {
143 PyList_SetItem(allgenerics
, i
, (PyObject
*)NULL
);
150 /* Called when a form is about to be freed --
151 remove all the objects that we know about from it. */
160 if (allgenerics
== NULL
)
161 return; /* No objects known yet */
162 n
= PyList_Size(allgenerics
);
163 for (i
= 0; i
< n
; i
++) {
164 g
= (genericobject
*)PyList_GetItem(allgenerics
, i
);
165 if (g
!= NULL
&& g
->ob_generic
->form
== form
) {
166 fl_delete_object(g
->ob_generic
);
167 /* The object is now unreachable for
168 do_forms and check_forms, so
169 delete it from the list of known objects */
170 Py_XDECREF(g
->ob_callback
);
171 g
->ob_callback
= NULL
;
172 Py_XDECREF(g
->ob_callback_arg
);
173 g
->ob_callback_arg
= NULL
;
174 PyList_SetItem(allgenerics
, i
, (PyObject
*)NULL
);
181 /* Methods of generic objects */
184 generic_set_call_back(g
, args
)
189 Py_XDECREF(g
->ob_callback
);
190 Py_XDECREF(g
->ob_callback_arg
);
191 g
->ob_callback
= NULL
;
192 g
->ob_callback_arg
= NULL
;
195 if (!PyTuple_Check(args
) || PyTuple_Size(args
) != 2) {
199 Py_XDECREF(g
->ob_callback
);
200 Py_XDECREF(g
->ob_callback_arg
);
201 g
->ob_callback
= PyTuple_GetItem(args
, 0);
202 Py_INCREF(g
->ob_callback
);
203 g
->ob_callback_arg
= PyTuple_GetItem(args
, 1);
204 Py_INCREF(g
->ob_callback_arg
);
211 generic_call(g
, args
, func
)
214 void (*func
)(FL_OBJECT
*);
216 if (!PyArg_NoArgs(args
))
218 (*func
)(g
->ob_generic
);
224 generic_delete_object(g
, args
)
229 res
= generic_call(g
, args
, fl_delete_object
);
236 generic_show_object(g
, args
)
240 return generic_call(g
, args
, fl_show_object
);
244 generic_hide_object(g
, args
)
248 return generic_call(g
, args
, fl_hide_object
);
252 generic_redraw_object(g
, args
)
256 return generic_call(g
, args
, fl_redraw_object
);
259 #ifdef OBSOLETE_FORMS_CALLS
261 /* (un)freeze_object() are obsolete in FORMS 2.2 and unsupported
262 in 2.3. Since there's no foolproof way to tell which version we're
263 using, we omit them unconditionally. */
266 generic_freeze_object(g
, args
)
270 return generic_call(g
, args
, fl_freeze_object
);
274 generic_unfreeze_object(g
, args
)
278 return generic_call(g
, args
, fl_unfreeze_object
);
281 #endif /* OBSOLETE_FORMS_CALLS */
284 generic_activate_object(g
, args
)
288 return generic_call(g
, args
, fl_activate_object
);
292 generic_deactivate_object(g
, args
)
296 return generic_call(g
, args
, fl_deactivate_object
);
300 generic_set_object_shortcut(g
, args
)
305 if (!PyArg_Parse(args
, "s", &str
))
307 fl_set_object_shortcut(g
->ob_generic
, str
);
312 static PyMethodDef generic_methods
[] = {
313 {"set_call_back", (PyCFunction
)generic_set_call_back
},
314 {"delete_object", (PyCFunction
)generic_delete_object
},
315 {"show_object", (PyCFunction
)generic_show_object
},
316 {"hide_object", (PyCFunction
)generic_hide_object
},
317 {"redraw_object", (PyCFunction
)generic_redraw_object
},
318 #ifdef OBSOLETE_FORMS_CALLS
319 {"freeze_object", (PyCFunction
)generic_freeze_object
},
320 {"unfreeze_object", (PyCFunction
)generic_unfreeze_object
},
322 {"activate_object", (PyCFunction
)generic_activate_object
},
323 {"deactivate_object", (PyCFunction
)generic_deactivate_object
},
324 {"set_object_shortcut", (PyCFunction
)generic_set_object_shortcut
},
325 {NULL
, NULL
} /* sentinel */
332 fl_free_object(g
->ob_generic
);
333 Py_XDECREF(g
->ob_callback
);
334 Py_XDECREF(g
->ob_callback_arg
);
338 #define OFF(x) offsetof(FL_OBJECT, x)
340 static struct memberlist generic_memberlist
[] = {
341 {"objclass", T_INT
, OFF(objclass
), RO
},
342 {"type", T_INT
, OFF(type
), RO
},
343 {"boxtype", T_INT
, OFF(boxtype
)},
344 {"x", T_FLOAT
, OFF(x
)},
345 {"y", T_FLOAT
, OFF(y
)},
346 {"w", T_FLOAT
, OFF(w
)},
347 {"h", T_FLOAT
, OFF(h
)},
348 {"col1", T_INT
, OFF(col1
)},
349 {"col2", T_INT
, OFF(col2
)},
350 {"align", T_INT
, OFF(align
)},
351 {"lcol", T_INT
, OFF(lcol
)},
352 {"lsize", T_FLOAT
, OFF(lsize
)},
353 /* "label" is treated specially! */
354 {"lstyle", T_INT
, OFF(lstyle
)},
355 {"pushed", T_INT
, OFF(pushed
), RO
},
356 {"focus", T_INT
, OFF(focus
), RO
},
357 {"belowmouse", T_INT
, OFF(belowmouse
),RO
},
358 /* {"frozen", T_INT, OFF(frozen), RO}, */
359 {"active", T_INT
, OFF(active
)},
360 {"input", T_INT
, OFF(input
)},
361 {"visible", T_INT
, OFF(visible
), RO
},
362 {"radio", T_INT
, OFF(radio
)},
363 {"automatic", T_INT
, OFF(automatic
)},
364 {NULL
} /* Sentinel */
370 generic_getattr(g
, name
)
376 /* XXX Ought to special-case name "__methods__" */
377 if (g
-> ob_methods
) {
378 meth
= Py_FindMethod(g
->ob_methods
, (PyObject
*)g
, name
);
379 if (meth
!= NULL
) return meth
;
383 meth
= Py_FindMethod(generic_methods
, (PyObject
*)g
, name
);
388 /* "label" is an exception, getmember only works for char pointers,
389 not for char arrays */
390 if (strcmp(name
, "label") == 0)
391 return PyString_FromString(g
->ob_generic
->label
);
393 return PyMember_Get((char *)g
->ob_generic
, generic_memberlist
, name
);
397 generic_setattr(g
, name
, v
)
405 PyErr_SetString(PyExc_TypeError
,
406 "can't delete forms object attributes");
410 /* "label" is an exception: setmember doesn't set strings;
411 and FORMS wants you to call a function to set the label */
412 if (strcmp(name
, "label") == 0) {
413 if (!PyString_Check(v
)) {
414 PyErr_SetString(PyExc_TypeError
,
415 "label attr must be string");
418 fl_set_object_label(g
->ob_generic
, PyString_AsString(v
));
422 ret
= PyMember_Set((char *)g
->ob_generic
, generic_memberlist
, name
, v
);
424 /* Rather than calling all the various set_object_* functions,
425 we call fl_redraw_object here. This is sometimes redundant
426 but I doubt that's a big problem */
428 fl_redraw_object(g
->ob_generic
);
438 sprintf(buf
, "<FORMS_object at %lx, objclass=%d>",
439 (long)g
, g
->ob_generic
->objclass
);
440 return PyString_FromString(buf
);
443 static PyTypeObject GenericObjecttype
= {
444 PyObject_HEAD_INIT(&PyType_Type
)
446 "FORMS_object", /*tp_name*/
447 sizeof(genericobject
), /*tp_size*/
450 (destructor
)generic_dealloc
, /*tp_dealloc*/
452 (getattrfunc
)generic_getattr
, /*tp_getattr*/
453 (setattrfunc
)generic_setattr
, /*tp_setattr*/
455 (reprfunc
)generic_repr
, /*tp_repr*/
459 newgenericobject(generic
, methods
)
461 PyMethodDef
*methods
;
464 g
= PyObject_NEW(genericobject
, &GenericObjecttype
);
467 g
-> ob_generic
= generic
;
468 g
->ob_methods
= methods
;
469 g
->ob_callback
= NULL
;
470 g
->ob_callback_arg
= NULL
;
472 return (PyObject
*)g
;
475 /**********************************************************************/
476 /* Some common calling sequences */
478 /* void func (object, float) */
480 call_forms_INf (func
, obj
, args
)
481 void (*func
)(FL_OBJECT
*, float);
487 if (!PyArg_Parse(args
, "f", ¶meter
)) return NULL
;
489 (*func
) (obj
, parameter
);
495 /* void func (object, float) */
497 call_forms_INfINf (func
, obj
, args
)
498 void (*func
)(FL_OBJECT
*, float, float);
504 if (!PyArg_Parse(args
, "(ff)", &par1
, &par2
)) return NULL
;
506 (*func
) (obj
, par1
, par2
);
512 /* void func (object, int) */
514 call_forms_INi (func
, obj
, args
)
515 void (*func
)(FL_OBJECT
*, int);
521 if (!PyArg_Parse(args
, "i", ¶meter
)) return NULL
;
523 (*func
) (obj
, parameter
);
529 /* void func (object, char) */
531 call_forms_INc (func
, obj
, args
)
532 void (*func
)(FL_OBJECT
*, int);
538 if (!PyArg_Parse(args
, "s", &a
)) return NULL
;
546 /* void func (object, string) */
548 call_forms_INstr (func
, obj
, args
)
549 void (*func
)(FL_OBJECT
*, char *);
555 if (!PyArg_Parse(args
, "s", &a
)) return NULL
;
564 /* void func (object, int, string) */
566 call_forms_INiINstr (func
, obj
, args
)
567 void (*func
)(FL_OBJECT
*, int, char *);
574 if (!PyArg_Parse(args
, "(is)", &a
, &b
)) return NULL
;
583 /* void func (object, int, int) */
585 call_forms_INiINi (func
, obj
, args
)
586 void (*func
)(FL_OBJECT
*, int, int);
592 if (!PyArg_Parse(args
, "(ii)", &par1
, &par2
)) return NULL
;
594 (*func
) (obj
, par1
, par2
);
601 /* int func (object) */
603 call_forms_Ri (func
, obj
, args
)
604 int (*func
)(FL_OBJECT
*);
610 if (!PyArg_NoArgs(args
)) return NULL
;
612 retval
= (*func
) (obj
);
614 return PyInt_FromLong ((long) retval
);
617 /* char * func (object) */
619 call_forms_Rstr (func
, obj
, args
)
620 char * (*func
)(FL_OBJECT
*);
626 if (!PyArg_NoArgs(args
)) return NULL
;
634 return PyString_FromString (str
);
637 /* int func (object) */
639 call_forms_Rf (func
, obj
, args
)
640 float (*func
)(FL_OBJECT
*);
646 if (!PyArg_NoArgs(args
)) return NULL
;
648 retval
= (*func
) (obj
);
650 return PyFloat_FromDouble (retval
);
654 call_forms_OUTfOUTf (func
, obj
, args
)
655 void (*func
)(FL_OBJECT
*, float *, float *);
661 if (!PyArg_NoArgs(args
)) return NULL
;
663 (*func
) (obj
, &f1
, &f2
);
665 return Py_BuildValue("(ff)", f1
, f2
);
670 call_forms_OUTf (func
, obj
, args
)
671 void (*func
)(FL_OBJECT
*, float *);
677 if (!PyArg_NoArgs(args
)) return NULL
;
681 return PyFloat_FromDouble (f
);
685 /**********************************************************************/
686 /* Class : browser */
689 set_browser_topline(g
, args
)
693 return call_forms_INi (fl_set_browser_topline
, g
-> ob_generic
, args
);
697 clear_browser(g
, args
)
701 return generic_call (g
, args
, fl_clear_browser
);
705 add_browser_line (g
, args
)
709 return call_forms_INstr (fl_add_browser_line
, g
-> ob_generic
, args
);
713 addto_browser (g
, args
)
717 return call_forms_INstr (fl_addto_browser
, g
-> ob_generic
, args
);
721 insert_browser_line (g
, args
)
725 return call_forms_INiINstr (fl_insert_browser_line
,
726 g
-> ob_generic
, args
);
730 delete_browser_line (g
, args
)
734 return call_forms_INi (fl_delete_browser_line
, g
-> ob_generic
, args
);
738 replace_browser_line (g
, args
)
742 return call_forms_INiINstr (fl_replace_browser_line
,
743 g
-> ob_generic
, args
);
747 get_browser_line(g
, args
)
754 if (!PyArg_Parse(args
, "i", &i
))
757 str
= fl_get_browser_line (g
->ob_generic
, i
);
763 return PyString_FromString (str
);
767 load_browser (g
, args
)
771 /* XXX strictly speaking this is wrong since fl_load_browser
772 XXX returns int, not void */
773 return call_forms_INstr (fl_load_browser
, g
-> ob_generic
, args
);
777 get_browser_maxline(g
, args
)
781 return call_forms_Ri (fl_get_browser_maxline
, g
-> ob_generic
, args
);
785 select_browser_line (g
, args
)
789 return call_forms_INi (fl_select_browser_line
, g
-> ob_generic
, args
);
793 deselect_browser_line (g
, args
)
797 return call_forms_INi (fl_deselect_browser_line
, g
-> ob_generic
, args
);
801 deselect_browser (g
, args
)
805 return generic_call (g
, args
, fl_deselect_browser
);
809 isselected_browser_line (g
, args
)
815 if (!PyArg_Parse(args
, "i", &i
))
818 j
= fl_isselected_browser_line (g
->ob_generic
, i
);
820 return PyInt_FromLong (j
);
824 get_browser (g
, args
)
828 return call_forms_Ri (fl_get_browser
, g
-> ob_generic
, args
);
832 set_browser_fontsize (g
, args
)
836 return call_forms_INf (fl_set_browser_fontsize
, g
-> ob_generic
, args
);
840 set_browser_fontstyle (g
, args
)
844 return call_forms_INi (fl_set_browser_fontstyle
, g
-> ob_generic
, args
);
848 set_browser_specialkey (g
, args
)
852 return call_forms_INc(fl_set_browser_specialkey
, g
-> ob_generic
, args
);
855 static PyMethodDef browser_methods
[] = {
856 {"set_browser_topline", (PyCFunction
)set_browser_topline
},
857 {"clear_browser", (PyCFunction
)clear_browser
},
858 {"add_browser_line", (PyCFunction
)add_browser_line
},
859 {"addto_browser", (PyCFunction
)addto_browser
},
860 {"insert_browser_line", (PyCFunction
)insert_browser_line
},
861 {"delete_browser_line", (PyCFunction
)delete_browser_line
},
862 {"replace_browser_line", (PyCFunction
)replace_browser_line
},
863 {"get_browser_line", (PyCFunction
)get_browser_line
},
864 {"load_browser", (PyCFunction
)load_browser
},
865 {"get_browser_maxline", (PyCFunction
)get_browser_maxline
},
866 {"select_browser_line", (PyCFunction
)select_browser_line
},
867 {"deselect_browser_line", (PyCFunction
)deselect_browser_line
},
868 {"deselect_browser", (PyCFunction
)deselect_browser
},
869 {"isselected_browser_line", (PyCFunction
)isselected_browser_line
},
870 {"get_browser", (PyCFunction
)get_browser
},
871 {"set_browser_fontsize", (PyCFunction
)set_browser_fontsize
},
872 {"set_browser_fontstyle", (PyCFunction
)set_browser_fontstyle
},
873 {"set_browser_specialkey", (PyCFunction
)set_browser_specialkey
},
874 {NULL
, NULL
} /* sentinel */
884 return call_forms_INi (fl_set_button
, g
-> ob_generic
, args
);
892 return call_forms_Ri (fl_get_button
, g
-> ob_generic
, args
);
896 get_button_numb(g
, args
)
900 return call_forms_Ri (fl_get_button_numb
, g
-> ob_generic
, args
);
904 set_button_shortcut(g
, args
)
908 return call_forms_INstr (fl_set_button_shortcut
, g
-> ob_generic
, args
);
911 static PyMethodDef button_methods
[] = {
912 {"set_button", (PyCFunction
)set_button
},
913 {"get_button", (PyCFunction
)get_button
},
914 {"get_button_numb", (PyCFunction
)get_button_numb
},
915 {"set_button_shortcut", (PyCFunction
)set_button_shortcut
},
916 {NULL
, NULL
} /* sentinel */
926 return call_forms_INi (fl_set_choice
, g
-> ob_generic
, args
);
934 return call_forms_Ri (fl_get_choice
, g
-> ob_generic
, args
);
938 clear_choice (g
, args
)
942 return generic_call (g
, args
, fl_clear_choice
);
946 addto_choice (g
, args
)
950 return call_forms_INstr (fl_addto_choice
, g
-> ob_generic
, args
);
954 replace_choice (g
, args
)
958 return call_forms_INiINstr (fl_replace_choice
, g
-> ob_generic
, args
);
962 delete_choice (g
, args
)
966 return call_forms_INi (fl_delete_choice
, g
-> ob_generic
, args
);
970 get_choice_text (g
, args
)
974 return call_forms_Rstr (fl_get_choice_text
, g
-> ob_generic
, args
);
978 set_choice_fontsize (g
, args
)
982 return call_forms_INf (fl_set_choice_fontsize
, g
-> ob_generic
, args
);
986 set_choice_fontstyle (g
, args
)
990 return call_forms_INi (fl_set_choice_fontstyle
, g
-> ob_generic
, args
);
993 static PyMethodDef choice_methods
[] = {
994 {"set_choice", (PyCFunction
)set_choice
},
995 {"get_choice", (PyCFunction
)get_choice
},
996 {"clear_choice", (PyCFunction
)clear_choice
},
997 {"addto_choice", (PyCFunction
)addto_choice
},
998 {"replace_choice", (PyCFunction
)replace_choice
},
999 {"delete_choice", (PyCFunction
)delete_choice
},
1000 {"get_choice_text", (PyCFunction
)get_choice_text
},
1001 {"set_choice_fontsize", (PyCFunction
)set_choice_fontsize
},
1002 {"set_choice_fontstyle",(PyCFunction
)set_choice_fontstyle
},
1003 {NULL
, NULL
} /* sentinel */
1015 if (!PyArg_NoArgs(args
))
1018 fl_get_clock (g
->ob_generic
, &i0
, &i1
, &i2
);
1020 return Py_BuildValue("(iii)", i0
, i1
, i2
);
1023 static PyMethodDef clock_methods
[] = {
1024 {"get_clock", (PyCFunction
)get_clock
},
1025 {NULL
, NULL
} /* sentinel */
1028 /* CLass : Counters */
1031 get_counter_value(g
, args
)
1035 return call_forms_Rf (fl_get_counter_value
, g
-> ob_generic
, args
);
1039 set_counter_value (g
, args
)
1043 return call_forms_INf (fl_set_counter_value
, g
-> ob_generic
, args
);
1047 set_counter_precision (g
, args
)
1051 return call_forms_INi (fl_set_counter_precision
, g
-> ob_generic
, args
);
1055 set_counter_bounds (g
, args
)
1059 return call_forms_INfINf (fl_set_counter_bounds
, g
-> ob_generic
, args
);
1063 set_counter_step (g
, args
)
1067 return call_forms_INfINf (fl_set_counter_step
, g
-> ob_generic
, args
);
1071 set_counter_return (g
, args
)
1075 return call_forms_INi (fl_set_counter_return
, g
-> ob_generic
, args
);
1078 static PyMethodDef counter_methods
[] = {
1079 {"set_counter_value", (PyCFunction
)set_counter_value
},
1080 {"get_counter_value", (PyCFunction
)get_counter_value
},
1081 {"set_counter_bounds", (PyCFunction
)set_counter_bounds
},
1082 {"set_counter_step", (PyCFunction
)set_counter_step
},
1083 {"set_counter_precision", (PyCFunction
)set_counter_precision
},
1084 {"set_counter_return", (PyCFunction
)set_counter_return
},
1085 {NULL
, NULL
} /* sentinel */
1092 get_dial_value(g
, args
)
1096 return call_forms_Rf (fl_get_dial_value
, g
-> ob_generic
, args
);
1100 set_dial_value (g
, args
)
1104 return call_forms_INf (fl_set_dial_value
, g
-> ob_generic
, args
);
1108 set_dial_bounds (g
, args
)
1112 return call_forms_INfINf (fl_set_dial_bounds
, g
-> ob_generic
, args
);
1116 get_dial_bounds (g
, args
)
1120 return call_forms_OUTfOUTf (fl_get_dial_bounds
, g
-> ob_generic
, args
);
1124 set_dial_step (g
, args
)
1128 return call_forms_INf (fl_set_dial_step
, g
-> ob_generic
, args
);
1131 static PyMethodDef dial_methods
[] = {
1132 {"set_dial_value", (PyCFunction
)set_dial_value
},
1133 {"get_dial_value", (PyCFunction
)get_dial_value
},
1134 {"set_dial_bounds", (PyCFunction
)set_dial_bounds
},
1135 {"get_dial_bounds", (PyCFunction
)get_dial_bounds
},
1136 {"set_dial_step", (PyCFunction
)set_dial_step
},
1137 {NULL
, NULL
} /* sentinel */
1147 return call_forms_INstr (fl_set_input
, g
-> ob_generic
, args
);
1155 return call_forms_Rstr (fl_get_input
, g
-> ob_generic
, args
);
1159 set_input_color (g
, args
)
1163 return call_forms_INfINf (fl_set_input_color
, g
-> ob_generic
, args
);
1167 set_input_return (g
, args
)
1171 return call_forms_INi (fl_set_input_return
, g
-> ob_generic
, args
);
1174 static PyMethodDef input_methods
[] = {
1175 {"set_input", (PyCFunction
)set_input
},
1176 {"get_input", (PyCFunction
)get_input
},
1177 {"set_input_color", (PyCFunction
)set_input_color
},
1178 {"set_input_return", (PyCFunction
)set_input_return
},
1179 {NULL
, NULL
} /* sentinel */
1190 return call_forms_INstr (fl_set_menu
, g
-> ob_generic
, args
);
1198 /* XXX strictly speaking this is wrong since fl_get_menu
1199 XXX returns long, not int */
1200 return call_forms_Ri (fl_get_menu
, g
-> ob_generic
, args
);
1204 get_menu_text (g
, args
)
1208 return call_forms_Rstr (fl_get_menu_text
, g
-> ob_generic
, args
);
1212 addto_menu (g
, args
)
1216 return call_forms_INstr (fl_addto_menu
, g
-> ob_generic
, args
);
1219 static PyMethodDef menu_methods
[] = {
1220 {"set_menu", (PyCFunction
)set_menu
},
1221 {"get_menu", (PyCFunction
)get_menu
},
1222 {"get_menu_text", (PyCFunction
)get_menu_text
},
1223 {"addto_menu", (PyCFunction
)addto_menu
},
1224 {NULL
, NULL
} /* sentinel */
1228 /* Class: Sliders */
1231 get_slider_value(g
, args
)
1235 return call_forms_Rf (fl_get_slider_value
, g
-> ob_generic
, args
);
1239 set_slider_value (g
, args
)
1243 return call_forms_INf (fl_set_slider_value
, g
-> ob_generic
, args
);
1247 set_slider_bounds (g
, args
)
1251 return call_forms_INfINf (fl_set_slider_bounds
, g
-> ob_generic
, args
);
1255 get_slider_bounds (g
, args
)
1259 return call_forms_OUTfOUTf(fl_get_slider_bounds
, g
-> ob_generic
, args
);
1263 set_slider_return (g
, args
)
1267 return call_forms_INf (fl_set_slider_return
, g
-> ob_generic
, args
);
1271 set_slider_size (g
, args
)
1275 return call_forms_INf (fl_set_slider_size
, g
-> ob_generic
, args
);
1279 set_slider_precision (g
, args
)
1283 return call_forms_INi (fl_set_slider_precision
, g
-> ob_generic
, args
);
1287 set_slider_step (g
, args
)
1291 return call_forms_INf (fl_set_slider_step
, g
-> ob_generic
, args
);
1295 static PyMethodDef slider_methods
[] = {
1296 {"set_slider_value", (PyCFunction
)set_slider_value
},
1297 {"get_slider_value", (PyCFunction
)get_slider_value
},
1298 {"set_slider_bounds", (PyCFunction
)set_slider_bounds
},
1299 {"get_slider_bounds", (PyCFunction
)get_slider_bounds
},
1300 {"set_slider_return", (PyCFunction
)set_slider_return
},
1301 {"set_slider_size", (PyCFunction
)set_slider_size
},
1302 {"set_slider_precision",(PyCFunction
)set_slider_precision
},
1303 {"set_slider_step", (PyCFunction
)set_slider_step
},
1304 {NULL
, NULL
} /* sentinel */
1308 set_positioner_xvalue (g
, args
)
1312 return call_forms_INf (fl_set_positioner_xvalue
, g
-> ob_generic
, args
);
1316 set_positioner_xbounds (g
, args
)
1320 return call_forms_INfINf (fl_set_positioner_xbounds
,
1321 g
-> ob_generic
, args
);
1325 set_positioner_yvalue (g
, args
)
1329 return call_forms_INf (fl_set_positioner_yvalue
, g
-> ob_generic
, args
);
1333 set_positioner_ybounds (g
, args
)
1337 return call_forms_INfINf (fl_set_positioner_ybounds
,
1338 g
-> ob_generic
, args
);
1342 get_positioner_xvalue (g
, args
)
1346 return call_forms_Rf (fl_get_positioner_xvalue
, g
-> ob_generic
, args
);
1350 get_positioner_xbounds (g
, args
)
1354 return call_forms_OUTfOUTf (fl_get_positioner_xbounds
,
1355 g
-> ob_generic
, args
);
1359 get_positioner_yvalue (g
, args
)
1363 return call_forms_Rf (fl_get_positioner_yvalue
, g
-> ob_generic
, args
);
1367 get_positioner_ybounds (g
, args
)
1371 return call_forms_OUTfOUTf (fl_get_positioner_ybounds
,
1372 g
-> ob_generic
, args
);
1375 static PyMethodDef positioner_methods
[] = {
1376 {"set_positioner_xvalue", (PyCFunction
)set_positioner_xvalue
},
1377 {"set_positioner_yvalue", (PyCFunction
)set_positioner_yvalue
},
1378 {"set_positioner_xbounds", (PyCFunction
)set_positioner_xbounds
},
1379 {"set_positioner_ybounds", (PyCFunction
)set_positioner_ybounds
},
1380 {"get_positioner_xvalue", (PyCFunction
)get_positioner_xvalue
},
1381 {"get_positioner_yvalue", (PyCFunction
)get_positioner_yvalue
},
1382 {"get_positioner_xbounds", (PyCFunction
)get_positioner_xbounds
},
1383 {"get_positioner_ybounds", (PyCFunction
)get_positioner_ybounds
},
1384 {NULL
, NULL
} /* sentinel */
1394 return call_forms_INf (fl_set_timer
, g
-> ob_generic
, args
);
1402 return call_forms_Rf (fl_get_timer
, g
-> ob_generic
, args
);
1405 static PyMethodDef timer_methods
[] = {
1406 {"set_timer", (PyCFunction
)set_timer
},
1407 {"get_timer", (PyCFunction
)get_timer
},
1408 {NULL
, NULL
} /* sentinel */
1418 staticforward PyTypeObject Formtype
;
1420 #define is_formobject(v) ((v)->ob_type == &Formtype)
1423 form_show_form(f
, args
)
1429 if (!PyArg_Parse(args
, "(iis)", &place
, &border
, &name
))
1431 fl_show_form(f
->ob_form
, place
, border
, name
);
1437 form_call(func
, f
, args
)
1440 void (*func
)(FL_FORM
*);
1442 if (!PyArg_NoArgs(args
)) return NULL
;
1451 form_call_INiINi(func
, f
, args
)
1454 void (*func
)(FL_FORM
*, int, int);
1458 if (!PyArg_Parse(args
, "(ii)", &a
, &b
)) return NULL
;
1467 form_call_INfINf(func
, f
, args
)
1470 void (*func
)(FL_FORM
*, float, float);
1474 if (!PyArg_Parse(args
, "(ff)", &a
, &b
)) return NULL
;
1483 form_hide_form(f
, args
)
1487 return form_call(fl_hide_form
, f
-> ob_form
, args
);
1491 form_redraw_form(f
, args
)
1495 return form_call(fl_redraw_form
, f
-> ob_form
, args
);
1499 form_set_form_position(f
, args
)
1503 return form_call_INiINi(fl_set_form_position
, f
-> ob_form
, args
);
1507 form_set_form_size(f
, args
)
1511 return form_call_INiINi(fl_set_form_size
, f
-> ob_form
, args
);
1515 form_scale_form(f
, args
)
1519 return form_call_INfINf(fl_scale_form
, f
-> ob_form
, args
);
1523 generic_add_object(f
, args
, func
, internal_methods
)
1526 FL_OBJECT
*(*func
)(int, float, float, float, float, char*);
1527 PyMethodDef
*internal_methods
;
1534 if (!PyArg_Parse(args
,"(iffffs)", &type
,&x
,&y
,&w
,&h
,&name
))
1537 fl_addto_form (f
-> ob_form
);
1539 obj
= (*func
) (type
, x
, y
, w
, h
, name
);
1548 return newgenericobject (obj
, internal_methods
);
1552 form_add_button(f
, args
)
1556 return generic_add_object(f
, args
, fl_add_button
, button_methods
);
1560 form_add_lightbutton(f
, args
)
1564 return generic_add_object(f
, args
, fl_add_lightbutton
, button_methods
);
1568 form_add_roundbutton(f
, args
)
1572 return generic_add_object(f
, args
, fl_add_roundbutton
, button_methods
);
1576 form_add_menu (f
, args
)
1580 return generic_add_object(f
, args
, fl_add_menu
, menu_methods
);
1584 form_add_slider(f
, args
)
1588 return generic_add_object(f
, args
, fl_add_slider
, slider_methods
);
1592 form_add_valslider(f
, args
)
1596 return generic_add_object(f
, args
, fl_add_valslider
, slider_methods
);
1600 form_add_dial(f
, args
)
1604 return generic_add_object(f
, args
, fl_add_dial
, dial_methods
);
1608 form_add_counter(f
, args
)
1612 return generic_add_object(f
, args
, fl_add_counter
, counter_methods
);
1616 form_add_clock(f
, args
)
1620 return generic_add_object(f
, args
, fl_add_clock
, clock_methods
);
1624 form_add_box(f
, args
)
1628 return generic_add_object(f
, args
, fl_add_box
,
1629 (PyMethodDef
*)NULL
);
1633 form_add_choice(f
, args
)
1637 return generic_add_object(f
, args
, fl_add_choice
, choice_methods
);
1641 form_add_browser(f
, args
)
1645 return generic_add_object(f
, args
, fl_add_browser
, browser_methods
);
1649 form_add_positioner(f
, args
)
1653 return generic_add_object(f
, args
, fl_add_positioner
,
1654 positioner_methods
);
1658 form_add_input(f
, args
)
1662 return generic_add_object(f
, args
, fl_add_input
, input_methods
);
1666 form_add_text(f
, args
)
1670 return generic_add_object(f
, args
, fl_add_text
,
1671 (PyMethodDef
*)NULL
);
1675 form_add_timer(f
, args
)
1679 return generic_add_object(f
, args
, fl_add_timer
, timer_methods
);
1683 form_freeze_form(f
, args
)
1687 return form_call(fl_freeze_form
, f
-> ob_form
, args
);
1691 form_unfreeze_form(f
, args
)
1695 return form_call(fl_unfreeze_form
, f
-> ob_form
, args
);
1699 form_activate_form(f
, args
)
1703 return form_call(fl_activate_form
, f
-> ob_form
, args
);
1707 form_deactivate_form(f
, args
)
1711 return form_call(fl_deactivate_form
, f
-> ob_form
, args
);
1715 form_bgn_group(f
, args
)
1721 fl_addto_form(f
-> ob_form
);
1722 obj
= fl_bgn_group();
1730 return newgenericobject (obj
, (PyMethodDef
*) NULL
);
1734 form_end_group(f
, args
)
1738 fl_addto_form(f
-> ob_form
);
1746 forms_find_first_or_last(func
, f
, args
)
1747 FL_OBJECT
*(*func
)(FL_FORM
*, int, float, float);
1756 if (!PyArg_Parse(args
, "(iff)", &type
, &mx
, &my
)) return NULL
;
1758 generic
= (*func
) (f
-> ob_form
, type
, mx
, my
);
1760 if (generic
== NULL
)
1766 g
= findgeneric(generic
);
1768 PyErr_SetString(PyExc_RuntimeError
,
1769 "forms_find_{first|last} returns unknown object");
1773 return (PyObject
*) g
;
1777 form_find_first(f
, args
)
1781 return forms_find_first_or_last(fl_find_first
, f
, args
);
1785 form_find_last(f
, args
)
1789 return forms_find_first_or_last(fl_find_last
, f
, args
);
1793 form_set_object_focus(f
, args
)
1798 if (args
== NULL
|| !is_genericobject(args
)) {
1799 PyErr_BadArgument();
1802 g
= (genericobject
*)args
;
1803 fl_set_object_focus(f
->ob_form
, g
->ob_generic
);
1808 static PyMethodDef form_methods
[] = {
1810 {"show_form", (PyCFunction
)form_show_form
},
1811 {"hide_form", (PyCFunction
)form_hide_form
},
1812 {"redraw_form", (PyCFunction
)form_redraw_form
},
1813 {"set_form_position", (PyCFunction
)form_set_form_position
},
1814 {"set_form_size", (PyCFunction
)form_set_form_size
},
1815 {"scale_form", (PyCFunction
)form_scale_form
},
1816 {"freeze_form", (PyCFunction
)form_freeze_form
},
1817 {"unfreeze_form", (PyCFunction
)form_unfreeze_form
},
1818 {"activate_form", (PyCFunction
)form_activate_form
},
1819 {"deactivate_form", (PyCFunction
)form_deactivate_form
},
1820 {"bgn_group", (PyCFunction
)form_bgn_group
},
1821 {"end_group", (PyCFunction
)form_end_group
},
1822 {"find_first", (PyCFunction
)form_find_first
},
1823 {"find_last", (PyCFunction
)form_find_last
},
1824 {"set_object_focus", (PyCFunction
)form_set_object_focus
},
1827 {"add_button", (PyCFunction
)form_add_button
},
1828 /* {"add_bitmap", (method)form_add_bitmap}, */
1829 {"add_lightbutton", (PyCFunction
)form_add_lightbutton
},
1830 {"add_roundbutton", (PyCFunction
)form_add_roundbutton
},
1831 {"add_menu", (PyCFunction
)form_add_menu
},
1832 {"add_slider", (PyCFunction
)form_add_slider
},
1833 {"add_positioner", (PyCFunction
)form_add_positioner
},
1834 {"add_valslider", (PyCFunction
)form_add_valslider
},
1835 {"add_dial", (PyCFunction
)form_add_dial
},
1836 {"add_counter", (PyCFunction
)form_add_counter
},
1837 {"add_box", (PyCFunction
)form_add_box
},
1838 {"add_clock", (PyCFunction
)form_add_clock
},
1839 {"add_choice", (PyCFunction
)form_add_choice
},
1840 {"add_browser", (PyCFunction
)form_add_browser
},
1841 {"add_input", (PyCFunction
)form_add_input
},
1842 {"add_timer", (PyCFunction
)form_add_timer
},
1843 {"add_text", (PyCFunction
)form_add_text
},
1844 {NULL
, NULL
} /* sentinel */
1851 releaseobjects(f
->ob_form
);
1852 if (f
->ob_form
->visible
)
1853 fl_hide_form(f
->ob_form
);
1854 fl_free_form(f
->ob_form
);
1858 #define OFF(x) offsetof(FL_FORM, x)
1860 static struct memberlist form_memberlist
[] = {
1861 {"window", T_LONG
, OFF(window
), RO
},
1862 {"w", T_FLOAT
, OFF(w
)},
1863 {"h", T_FLOAT
, OFF(h
)},
1864 {"x", T_FLOAT
, OFF(x
), RO
},
1865 {"y", T_FLOAT
, OFF(y
), RO
},
1866 {"deactivated", T_INT
, OFF(deactivated
)},
1867 {"visible", T_INT
, OFF(visible
), RO
},
1868 {"frozen", T_INT
, OFF(frozen
), RO
},
1869 {"doublebuf", T_INT
, OFF(doublebuf
)},
1870 {NULL
} /* Sentinel */
1876 form_getattr(f
, name
)
1882 meth
= Py_FindMethod(form_methods
, (PyObject
*)f
, name
);
1886 return PyMember_Get((char *)f
->ob_form
, form_memberlist
, name
);
1890 form_setattr(f
, name
, v
)
1896 PyErr_SetString(PyExc_TypeError
,
1897 "can't delete form attributes");
1901 return PyMember_Set((char *)f
->ob_form
, form_memberlist
, name
, v
);
1909 sprintf(buf
, "<FORMS_form at %lx, window=%ld>",
1910 (long)f
, f
->ob_form
->window
);
1911 return PyString_FromString(buf
);
1914 static PyTypeObject Formtype
= {
1915 PyObject_HEAD_INIT(&PyType_Type
)
1917 "FORMS_form", /*tp_name*/
1918 sizeof(formobject
), /*tp_size*/
1921 (destructor
)form_dealloc
, /*tp_dealloc*/
1923 (getattrfunc
)form_getattr
, /*tp_getattr*/
1924 (setattrfunc
)form_setattr
, /*tp_setattr*/
1926 (reprfunc
)form_repr
, /*tp_repr*/
1934 f
= PyObject_NEW(formobject
, &Formtype
);
1938 return (PyObject
*)f
;
1942 /* The "fl" module */
1945 forms_make_form(dummy
, args
)
1952 if (!PyArg_Parse(args
, "(iff)", &type
, &w
, &h
))
1954 form
= fl_bgn_form(type
, w
, h
);
1956 /* XXX Actually, cannot happen! */
1961 return newformobject(form
);
1965 forms_activate_all_forms(f
, args
)
1969 fl_activate_all_forms();
1975 forms_deactivate_all_forms(f
, args
)
1979 fl_deactivate_all_forms();
1984 static PyObject
*my_event_callback
= NULL
;
1987 forms_set_event_call_back(dummy
, args
)
1991 if (args
== Py_None
)
1993 my_event_callback
= args
;
2000 forms_do_or_check_forms(dummy
, args
, func
)
2003 FL_OBJECT
*(*func
)();
2007 PyObject
*arg
, *res
;
2009 if (!PyArg_NoArgs(args
))
2013 Py_BEGIN_ALLOW_THREADS
2014 generic
= (*func
)();
2015 Py_END_ALLOW_THREADS
2016 if (generic
== NULL
) {
2020 if (generic
== FL_EVENT
) {
2023 if (my_event_callback
== NULL
)
2024 return PyInt_FromLong(-1L);
2025 dev
= fl_qread(&val
);
2026 arg
= Py_BuildValue("(ih)", dev
, val
);
2029 res
= PyEval_CallObject(my_event_callback
, arg
);
2033 return NULL
; /* Callback raised exception */
2036 g
= findgeneric(generic
);
2038 /* Object not known to us (some dialogs cause this) */
2039 continue; /* Ignore it */
2041 if (g
->ob_callback
== NULL
) {
2043 return ((PyObject
*) g
);
2045 arg
= Py_BuildValue("(OO)", (PyObject
*)g
, g
->ob_callback_arg
);
2048 res
= PyEval_CallObject(g
->ob_callback
, arg
);
2052 return NULL
; /* Callback raised exception */
2057 forms_do_forms(dummy
, args
)
2061 return forms_do_or_check_forms(dummy
, args
, fl_do_forms
);
2065 forms_check_forms(dummy
, args
)
2069 return forms_do_or_check_forms(dummy
, args
, fl_check_forms
);
2073 forms_do_only_forms(dummy
, args
)
2077 return forms_do_or_check_forms(dummy
, args
, fl_do_only_forms
);
2081 forms_check_only_forms(dummy
, args
)
2085 return forms_do_or_check_forms(dummy
, args
, fl_check_only_forms
);
2094 if (!PyArg_NoArgs(args
))
2103 forms_set_graphics_mode(dummy
, args
)
2107 int rgbmode
, doublebuf
;
2109 if (!PyArg_Parse(args
, "(ii)", &rgbmode
, &doublebuf
))
2111 fl_set_graphics_mode(rgbmode
,doublebuf
);
2117 forms_get_rgbmode(dummy
, args
)
2121 extern int fl_rgbmode
;
2124 PyErr_BadArgument();
2127 return PyInt_FromLong((long)fl_rgbmode
);
2131 forms_show_errors(dummy
, args
)
2136 if (!PyArg_Parse(args
, "i", &show
))
2138 fl_show_errors(show
);
2144 forms_set_font_name(dummy
, args
)
2150 if (!PyArg_Parse(args
, "(is)", &numb
, &name
))
2152 fl_set_font_name(numb
, name
);
2159 forms_qdevice(self
, args
)
2164 if (!PyArg_Parse(args
, "h", &arg1
))
2172 forms_unqdevice(self
, args
)
2177 if (!PyArg_Parse(args
, "h", &arg1
))
2185 forms_isqueued(self
, args
)
2191 if (!PyArg_Parse(args
, "h", &arg1
))
2193 retval
= fl_isqueued(arg1
);
2195 return PyInt_FromLong(retval
);
2199 forms_qtest(self
, args
)
2204 retval
= fl_qtest();
2205 return PyInt_FromLong(retval
);
2210 forms_qread(self
, args
)
2216 Py_BEGIN_ALLOW_THREADS
2217 dev
= fl_qread(&val
);
2218 Py_END_ALLOW_THREADS
2219 return Py_BuildValue("(ih)", dev
, val
);
2223 forms_qreset(self
, args
)
2227 if (!PyArg_NoArgs(args
)) return NULL
;
2235 forms_qenter(self
, args
)
2240 if (!PyArg_Parse(args
, "(hh)", &arg1
, &arg2
))
2242 fl_qenter(arg1
, arg2
);
2248 forms_color(self
, args
)
2254 if (!PyArg_Parse(args
, "i", &arg
)) return NULL
;
2256 fl_color((short) arg
);
2263 forms_mapcolor(self
, args
)
2267 int arg0
, arg1
, arg2
, arg3
;
2269 if (!PyArg_Parse(args
, "(iiii)", &arg0
, &arg1
, &arg2
, &arg3
))
2272 fl_mapcolor(arg0
, (short) arg1
, (short) arg2
, (short) arg3
);
2279 forms_getmcolor(self
, args
)
2286 if (!PyArg_Parse(args
, "i", &arg
)) return NULL
;
2288 fl_getmcolor(arg
, &r
, &g
, &b
);
2290 return Py_BuildValue("(hhh)", r
, g
, b
);
2294 forms_get_mouse(self
, args
)
2300 if (!PyArg_NoArgs(args
)) return NULL
;
2302 fl_get_mouse(&x
, &y
);
2304 return Py_BuildValue("(ff)", x
, y
);
2308 forms_tie(self
, args
)
2312 short arg1
, arg2
, arg3
;
2313 if (!PyArg_Parse(args
, "(hhh)", &arg1
, &arg2
, &arg3
))
2315 fl_tie(arg1
, arg2
, arg3
);
2321 forms_show_message(f
, args
)
2327 if (!PyArg_Parse(args
, "(sss)", &a
, &b
, &c
)) return NULL
;
2329 Py_BEGIN_ALLOW_THREADS
2330 fl_show_message(a
, b
, c
);
2331 Py_END_ALLOW_THREADS
2338 forms_show_choice(f
, args
)
2342 char *m1
, *m2
, *m3
, *b1
, *b2
, *b3
;
2347 if (args
== NULL
|| !PyTuple_Check(args
)) {
2348 PyErr_BadArgument();
2351 nb
= PyTuple_Size(args
) - 3;
2353 PyErr_SetString(PyExc_TypeError
,
2354 "need at least one button label");
2357 if (PyInt_Check(PyTuple_GetItem(args
, 3))) {
2358 PyErr_SetString(PyExc_TypeError
,
2359 "'number-of-buttons' argument not needed");
2363 case 1: format
= "(ssss)"; break;
2364 case 2: format
= "(sssss)"; break;
2365 case 3: format
= "(ssssss)"; break;
2367 PyErr_SetString(PyExc_TypeError
, "too many button labels");
2371 if (!PyArg_Parse(args
, format
, &m1
, &m2
, &m3
, &b1
, &b2
, &b3
))
2374 Py_BEGIN_ALLOW_THREADS
2375 rv
= fl_show_choice(m1
, m2
, m3
, nb
, b1
, b2
, b3
);
2376 Py_END_ALLOW_THREADS
2377 return PyInt_FromLong(rv
);
2381 forms_show_question(f
, args
)
2388 if (!PyArg_Parse(args
, "(sss)", &a
, &b
, &c
)) return NULL
;
2390 Py_BEGIN_ALLOW_THREADS
2391 ret
= fl_show_question(a
, b
, c
);
2392 Py_END_ALLOW_THREADS
2394 return PyInt_FromLong((long) ret
);
2398 forms_show_input(f
, args
)
2405 if (!PyArg_Parse(args
, "(ss)", &a
, &b
)) return NULL
;
2407 Py_BEGIN_ALLOW_THREADS
2408 str
= fl_show_input(a
, b
);
2409 Py_END_ALLOW_THREADS
2415 return PyString_FromString(str
);
2419 forms_file_selector(f
, args
)
2424 char *a
, *b
, *c
, *d
;
2426 if (!PyArg_Parse(args
, "(ssss)", &a
, &b
, &c
, &d
)) return NULL
;
2428 Py_BEGIN_ALLOW_THREADS
2429 str
= fl_show_file_selector(a
, b
, c
, d
);
2430 Py_END_ALLOW_THREADS
2436 return PyString_FromString(str
);
2441 forms_file_selector_func(args
, func
)
2453 return PyString_FromString(str
);
2457 forms_get_directory(f
, args
)
2461 return forms_file_selector_func(args
, fl_get_directory
);
2465 forms_get_pattern(f
, args
)
2469 return forms_file_selector_func(args
, fl_get_pattern
);
2473 forms_get_filename(f
, args
)
2477 return forms_file_selector_func(args
, fl_get_filename
);
2480 static PyMethodDef forms_methods
[] = {
2482 {"make_form", forms_make_form
},
2483 {"activate_all_forms", forms_activate_all_forms
},
2484 {"deactivate_all_forms",forms_deactivate_all_forms
},
2485 /* gl support wrappers */
2486 {"qdevice", forms_qdevice
},
2487 {"unqdevice", forms_unqdevice
},
2488 {"isqueued", forms_isqueued
},
2489 {"qtest", forms_qtest
},
2490 {"qread", forms_qread
},
2491 /* {"blkqread", forms_blkqread}, */
2492 {"qreset", forms_qreset
},
2493 {"qenter", forms_qenter
},
2494 {"get_mouse", forms_get_mouse
},
2496 /* {"new_events", forms_new_events}, */
2497 {"color", forms_color
},
2498 {"mapcolor", forms_mapcolor
},
2499 {"getmcolor", forms_getmcolor
},
2501 {"do_forms", forms_do_forms
},
2502 {"do_only_forms", forms_do_only_forms
},
2503 {"check_forms", forms_check_forms
},
2504 {"check_only_forms", forms_check_only_forms
},
2505 {"set_event_call_back", forms_set_event_call_back
},
2507 {"show_message", forms_show_message
},
2508 {"show_question", forms_show_question
},
2509 {"show_choice", forms_show_choice
},
2510 {"show_input", forms_show_input
},
2511 {"show_file_selector", forms_file_selector
},
2512 {"file_selector", forms_file_selector
}, /* BW compat */
2513 {"get_directory", forms_get_directory
},
2514 {"get_pattern", forms_get_pattern
},
2515 {"get_filename", forms_get_filename
},
2516 {"set_graphics_mode", forms_set_graphics_mode
},
2517 {"get_rgbmode", forms_get_rgbmode
},
2518 {"show_errors", forms_show_errors
},
2519 {"set_font_name", forms_set_font_name
},
2520 {NULL
, NULL
} /* sentinel */
2526 Py_InitModule("fl", forms_methods
);