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 not be used in advertising or publicity pertaining to
13 distribution of the software without specific, written prior permission.
15 STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16 THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17 FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18 FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21 OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 ******************************************************************/
25 /* FL module -- interface to Mark Overmars' FORMS Library. */
27 /* This code works with FORMS version 2.2a.
28 FORMS can be ftp'ed from ftp.cs.ruu.nl (131.211.80.17), directory
31 /* A half-hearted attempt has been made to allow programs using this
32 * module to exploit parallelism (through the threads module). No provisions
33 * have been made for multiple threads to use this module at the same time,
34 * though. So, a program with a forms thread and a non-forms thread will work
35 * fine but a program with two threads using forms will probably crash (unless
36 * the program takes precaution to ensure that only one thread can be in
37 * this module at any time). This will have to be fixed some time.
38 * (A fix will probably also have to synchronise with the gl module).
43 #include "allobjects.h"
45 #include "modsupport.h"
46 #include "structmember.h"
49 /* Generic Forms Objects */
53 FL_OBJECT
*ob_generic
;
54 struct methodlist
*ob_methods
;
56 object
*ob_callback_arg
;
59 staticforward typeobject GenericObjecttype
;
61 #define is_genericobject(g) ((g)->ob_type == &GenericObjecttype)
63 /* List of all objects (XXX this should be a hash table on address...) */
65 static object
*allgenerics
= NULL
;
66 static int nfreeslots
= 0;
68 /* Add an object to the list of known objects */
75 /* Create the list if it doesn't already exist */
76 if (allgenerics
== NULL
) {
77 allgenerics
= newlistobject(0);
78 if (allgenerics
== NULL
) {
80 return; /* Too bad, live without allgenerics... */
84 /* Search the list for reusable slots (NULL items) */
85 /* XXX This can be made faster! */
86 n
= getlistsize(allgenerics
);
87 for (i
= 0; i
< n
; i
++) {
88 if (getlistitem(allgenerics
, i
) == NULL
) {
90 setlistitem(allgenerics
, i
, (object
*)g
);
95 /* Strange... no free slots found... */
98 /* No free entries, append new item to the end */
99 addlistitem(allgenerics
, (object
*)g
);
102 /* Find an object in the list of known objects */
104 static genericobject
*
111 if (allgenerics
== NULL
)
112 return NULL
; /* No objects known yet */
113 n
= getlistsize(allgenerics
);
114 for (i
= 0; i
< n
; i
++) {
115 g
= (genericobject
*)getlistitem(allgenerics
, i
);
116 if (g
!= NULL
&& g
->ob_generic
== generic
)
119 return NULL
; /* Unknown object */
122 /* Remove an object from the list of known objects */
130 XDECREF(g
->ob_callback
);
131 g
->ob_callback
= NULL
;
132 XDECREF(g
->ob_callback_arg
);
133 g
->ob_callback_arg
= NULL
;
134 if (allgenerics
== NULL
)
135 return; /* No objects known yet */
136 n
= getlistsize(allgenerics
);
137 for (i
= 0; i
< n
; i
++) {
138 if (g
== (genericobject
*)getlistitem(allgenerics
, i
)) {
139 setlistitem(allgenerics
, i
, (object
*)NULL
);
146 /* Called when a form is about to be freed --
147 remove all the objects that we know about from it. */
156 if (allgenerics
== NULL
)
157 return; /* No objects known yet */
158 n
= getlistsize(allgenerics
);
159 for (i
= 0; i
< n
; i
++) {
160 g
= (genericobject
*)getlistitem(allgenerics
, i
);
161 if (g
!= NULL
&& g
->ob_generic
->form
== form
) {
162 fl_delete_object(g
->ob_generic
);
163 /* The object is now unreachable for
164 do_forms and check_forms, so
165 delete it from the list of known objects */
166 XDECREF(g
->ob_callback
);
167 g
->ob_callback
= NULL
;
168 XDECREF(g
->ob_callback_arg
);
169 g
->ob_callback_arg
= NULL
;
170 setlistitem(allgenerics
, i
, (object
*)NULL
);
177 /* Methods of generic objects */
180 generic_set_call_back(g
, args
)
185 XDECREF(g
->ob_callback
);
186 XDECREF(g
->ob_callback_arg
);
187 g
->ob_callback
= NULL
;
188 g
->ob_callback_arg
= NULL
;
191 if (!is_tupleobject(args
) || gettuplesize(args
) != 2) {
195 XDECREF(g
->ob_callback
);
196 XDECREF(g
->ob_callback_arg
);
197 g
->ob_callback
= gettupleitem(args
, 0);
198 INCREF(g
->ob_callback
);
199 g
->ob_callback_arg
= gettupleitem(args
, 1);
200 INCREF(g
->ob_callback_arg
);
207 generic_call(g
, args
, func
)
210 void (*func
)(FL_OBJECT
*);
214 (*func
)(g
->ob_generic
);
220 generic_delete_object(g
, args
)
225 res
= generic_call(g
, args
, fl_delete_object
);
232 generic_show_object(g
, args
)
236 return generic_call(g
, args
, fl_show_object
);
240 generic_hide_object(g
, args
)
244 return generic_call(g
, args
, fl_hide_object
);
248 generic_redraw_object(g
, args
)
252 return generic_call(g
, args
, fl_redraw_object
);
256 generic_freeze_object(g
, args
)
260 return generic_call(g
, args
, fl_freeze_object
);
264 generic_unfreeze_object(g
, args
)
268 return generic_call(g
, args
, fl_unfreeze_object
);
272 generic_activate_object(g
, args
)
276 return generic_call(g
, args
, fl_activate_object
);
280 generic_deactivate_object(g
, args
)
284 return generic_call(g
, args
, fl_deactivate_object
);
288 generic_set_object_shortcut(g
, args
)
293 if (!getargs(args
, "s", &str
))
295 fl_set_object_shortcut(g
->ob_generic
, str
);
300 static struct methodlist generic_methods
[] = {
301 {"set_call_back", (method
)generic_set_call_back
},
302 {"delete_object", (method
)generic_delete_object
},
303 {"show_object", (method
)generic_show_object
},
304 {"hide_object", (method
)generic_hide_object
},
305 {"redraw_object", (method
)generic_redraw_object
},
306 {"freeze_object", (method
)generic_freeze_object
},
307 {"unfreeze_object", (method
)generic_unfreeze_object
},
308 {"activate_object", (method
)generic_activate_object
},
309 {"deactivate_object", (method
)generic_deactivate_object
},
310 {"set_object_shortcut", (method
)generic_set_object_shortcut
},
311 {NULL
, NULL
} /* sentinel */
318 fl_free_object(g
->ob_generic
);
319 XDECREF(g
->ob_callback
);
320 XDECREF(g
->ob_callback_arg
);
324 #define OFF(x) offsetof(FL_OBJECT, x)
326 static struct memberlist generic_memberlist
[] = {
327 {"objclass", T_INT
, OFF(objclass
), RO
},
328 {"type", T_INT
, OFF(type
), RO
},
329 {"boxtype", T_INT
, OFF(boxtype
)},
330 {"x", T_FLOAT
, OFF(x
)},
331 {"y", T_FLOAT
, OFF(y
)},
332 {"w", T_FLOAT
, OFF(w
)},
333 {"h", T_FLOAT
, OFF(h
)},
334 {"col1", T_INT
, OFF(col1
)},
335 {"col2", T_INT
, OFF(col2
)},
336 {"align", T_INT
, OFF(align
)},
337 {"lcol", T_INT
, OFF(lcol
)},
338 {"lsize", T_FLOAT
, OFF(lsize
)},
339 /* "label" is treated specially! */
340 {"lstyle", T_INT
, OFF(lstyle
)},
341 {"pushed", T_INT
, OFF(pushed
), RO
},
342 {"focus", T_INT
, OFF(focus
), RO
},
343 {"belowmouse", T_INT
, OFF(belowmouse
),RO
},
344 /* {"frozen", T_INT, OFF(frozen), RO}, */
345 {"active", T_INT
, OFF(active
)},
346 {"input", T_INT
, OFF(input
)},
347 {"visible", T_INT
, OFF(visible
), RO
},
348 {"radio", T_INT
, OFF(radio
)},
349 {"automatic", T_INT
, OFF(automatic
)},
350 {NULL
} /* Sentinel */
356 generic_getattr(g
, name
)
362 /* XXX Ought to special-case name "__methods__" */
363 if (g
-> ob_methods
) {
364 meth
= findmethod(g
->ob_methods
, (object
*)g
, name
);
365 if (meth
!= NULL
) return meth
;
369 meth
= findmethod(generic_methods
, (object
*)g
, name
);
374 /* "label" is an exception, getmember only works for char pointers,
375 not for char arrays */
376 if (strcmp(name
, "label") == 0)
377 return newstringobject(g
->ob_generic
->label
);
379 return getmember((char *)g
->ob_generic
, generic_memberlist
, name
);
383 generic_setattr(g
, name
, v
)
391 err_setstr(TypeError
, "can't delete forms object attributes");
395 /* "label" is an exception: setmember doesn't set strings;
396 and FORMS wants you to call a function to set the label */
397 if (strcmp(name
, "label") == 0) {
398 if (!is_stringobject(v
)) {
399 err_setstr(TypeError
, "label attr must be string");
402 fl_set_object_label(g
->ob_generic
, getstringvalue(v
));
406 ret
= setmember((char *)g
->ob_generic
, generic_memberlist
, name
, v
);
408 /* Rather than calling all the various set_object_* functions,
409 we call fl_redraw_object here. This is sometimes redundant
410 but I doubt that's a big problem */
412 fl_redraw_object(g
->ob_generic
);
422 sprintf(buf
, "<FORMS_object at %lx, objclass=%d>",
423 (long)g
, g
->ob_generic
->objclass
);
424 return newstringobject(buf
);
427 static typeobject GenericObjecttype
= {
428 OB_HEAD_INIT(&Typetype
)
430 "FORMS_object", /*tp_name*/
431 sizeof(genericobject
), /*tp_size*/
434 (destructor
)generic_dealloc
, /*tp_dealloc*/
436 (getattrfunc
)generic_getattr
, /*tp_getattr*/
437 (setattrfunc
)generic_setattr
, /*tp_setattr*/
439 (reprfunc
)generic_repr
, /*tp_repr*/
443 newgenericobject(generic
, methods
)
445 struct methodlist
*methods
;
448 g
= NEWOBJ(genericobject
, &GenericObjecttype
);
451 g
-> ob_generic
= generic
;
452 g
->ob_methods
= methods
;
453 g
->ob_callback
= NULL
;
454 g
->ob_callback_arg
= NULL
;
459 /**********************************************************************/
460 /* Some common calling sequences */
462 /* void func (object, float) */
464 call_forms_INf (func
, obj
, args
)
465 void (*func
)(FL_OBJECT
*, float);
471 if (!getargs(args
, "f", ¶meter
)) return NULL
;
473 (*func
) (obj
, parameter
);
479 /* void func (object, float) */
481 call_forms_INfINf (func
, obj
, args
)
482 void (*func
)(FL_OBJECT
*, float, float);
488 if (!getargs(args
, "(ff)", &par1
, &par2
)) return NULL
;
490 (*func
) (obj
, par1
, par2
);
496 /* void func (object, int) */
498 call_forms_INi (func
, obj
, args
)
499 void (*func
)(FL_OBJECT
*, int);
505 if (!getintarg(args
, ¶meter
)) return NULL
;
507 (*func
) (obj
, parameter
);
513 /* void func (object, char) */
515 call_forms_INc (func
, obj
, args
)
516 void (*func
)(FL_OBJECT
*, int);
522 if (!getstrarg(args
, &a
)) return NULL
;
530 /* void func (object, string) */
532 call_forms_INstr (func
, obj
, args
)
533 void (*func
)(FL_OBJECT
*, char *);
539 if (!getstrarg(args
, &a
)) return NULL
;
548 /* void func (object, int, string) */
550 call_forms_INiINstr (func
, obj
, args
)
551 void (*func
)(FL_OBJECT
*, int, char *);
558 if (!getargs(args
, "(is)", &a
, &b
)) return NULL
;
567 /* void func (object, int, int) */
569 call_forms_INiINi (func
, obj
, args
)
570 void (*func
)(FL_OBJECT
*, int, int);
576 if (!getargs(args
, "(ii)", &par1
, &par2
)) return NULL
;
578 (*func
) (obj
, par1
, par2
);
585 /* int func (object) */
587 call_forms_Ri (func
, obj
, args
)
588 int (*func
)(FL_OBJECT
*);
594 if (!getnoarg(args
)) return NULL
;
596 retval
= (*func
) (obj
);
598 return newintobject ((long) retval
);
601 /* char * func (object) */
603 call_forms_Rstr (func
, obj
, args
)
604 char * (*func
)(FL_OBJECT
*);
610 if (!getnoarg(args
)) return NULL
;
618 return newstringobject (str
);
621 /* int func (object) */
623 call_forms_Rf (func
, obj
, args
)
624 float (*func
)(FL_OBJECT
*);
630 if (!getnoarg(args
)) return NULL
;
632 retval
= (*func
) (obj
);
634 return newfloatobject (retval
);
638 call_forms_OUTfOUTf (func
, obj
, args
)
639 void (*func
)(FL_OBJECT
*, float *, float *);
645 if (!getnoarg(args
)) return NULL
;
647 (*func
) (obj
, &f1
, &f2
);
649 return mkvalue("(ff)", f1
, f2
);
654 call_forms_OUTf (func
, obj
, args
)
655 void (*func
)(FL_OBJECT
*, float *);
661 if (!getnoarg(args
)) return NULL
;
665 return newfloatobject (f
);
669 /**********************************************************************/
670 /* Class : browser */
673 set_browser_topline(g
, args
)
677 return call_forms_INi (fl_set_browser_topline
, g
-> ob_generic
, args
);
681 clear_browser(g
, args
)
685 return generic_call (g
, args
, fl_clear_browser
);
689 add_browser_line (g
, args
)
693 return call_forms_INstr (fl_add_browser_line
, g
-> ob_generic
, args
);
697 addto_browser (g
, args
)
701 return call_forms_INstr (fl_addto_browser
, g
-> ob_generic
, args
);
705 insert_browser_line (g
, args
)
709 return call_forms_INiINstr (fl_insert_browser_line
,
710 g
-> ob_generic
, args
);
714 delete_browser_line (g
, args
)
718 return call_forms_INi (fl_delete_browser_line
, g
-> ob_generic
, args
);
722 replace_browser_line (g
, args
)
726 return call_forms_INiINstr (fl_replace_browser_line
,
727 g
-> ob_generic
, args
);
731 get_browser_line(g
, args
)
738 if (!getintarg(args
, &i
))
741 str
= fl_get_browser_line (g
->ob_generic
, i
);
747 return newstringobject (str
);
751 load_browser (g
, args
)
755 /* XXX strictly speaking this is wrong since fl_load_browser
756 XXX returns int, not void */
757 return call_forms_INstr (fl_load_browser
, g
-> ob_generic
, args
);
761 get_browser_maxline(g
, args
)
765 return call_forms_Ri (fl_get_browser_maxline
, g
-> ob_generic
, args
);
769 select_browser_line (g
, args
)
773 return call_forms_INi (fl_select_browser_line
, g
-> ob_generic
, args
);
777 deselect_browser_line (g
, args
)
781 return call_forms_INi (fl_deselect_browser_line
, g
-> ob_generic
, args
);
785 deselect_browser (g
, args
)
789 return generic_call (g
, args
, fl_deselect_browser
);
793 isselected_browser_line (g
, args
)
799 if (!getintarg(args
, &i
))
802 j
= fl_isselected_browser_line (g
->ob_generic
, i
);
804 return newintobject (j
);
808 get_browser (g
, args
)
812 return call_forms_Ri (fl_get_browser
, g
-> ob_generic
, args
);
816 set_browser_fontsize (g
, args
)
820 return call_forms_INf (fl_set_browser_fontsize
, g
-> ob_generic
, args
);
824 set_browser_fontstyle (g
, args
)
828 return call_forms_INi (fl_set_browser_fontstyle
, g
-> ob_generic
, args
);
832 set_browser_specialkey (g
, args
)
836 return call_forms_INc(fl_set_browser_specialkey
, g
-> ob_generic
, args
);
839 static struct methodlist browser_methods
[] = {
840 {"set_browser_topline", (method
)set_browser_topline
},
841 {"clear_browser", (method
)clear_browser
},
842 {"add_browser_line", (method
)add_browser_line
},
843 {"addto_browser", (method
)addto_browser
},
844 {"insert_browser_line", (method
)insert_browser_line
},
845 {"delete_browser_line", (method
)delete_browser_line
},
846 {"replace_browser_line", (method
)replace_browser_line
},
847 {"get_browser_line", (method
)get_browser_line
},
848 {"load_browser", (method
)load_browser
},
849 {"get_browser_maxline", (method
)get_browser_maxline
},
850 {"select_browser_line", (method
)select_browser_line
},
851 {"deselect_browser_line", (method
)deselect_browser_line
},
852 {"deselect_browser", (method
)deselect_browser
},
853 {"isselected_browser_line", (method
)isselected_browser_line
},
854 {"get_browser", (method
)get_browser
},
855 {"set_browser_fontsize", (method
)set_browser_fontsize
},
856 {"set_browser_fontstyle", (method
)set_browser_fontstyle
},
857 {"set_browser_specialkey", (method
)set_browser_specialkey
},
858 {NULL
, NULL
} /* sentinel */
868 return call_forms_INi (fl_set_button
, g
-> ob_generic
, args
);
876 return call_forms_Ri (fl_get_button
, g
-> ob_generic
, args
);
880 get_button_numb(g
, args
)
884 return call_forms_Ri (fl_get_button_numb
, g
-> ob_generic
, args
);
888 set_button_shortcut(g
, args
)
892 return call_forms_INstr (fl_set_button_shortcut
, g
-> ob_generic
, args
);
895 static struct methodlist button_methods
[] = {
896 {"set_button", (method
)set_button
},
897 {"get_button", (method
)get_button
},
898 {"get_button_numb", (method
)get_button_numb
},
899 {"set_button_shortcut", (method
)set_button_shortcut
},
900 {NULL
, NULL
} /* sentinel */
910 return call_forms_INi (fl_set_choice
, g
-> ob_generic
, args
);
918 return call_forms_Ri (fl_get_choice
, g
-> ob_generic
, args
);
922 clear_choice (g
, args
)
926 return generic_call (g
, args
, fl_clear_choice
);
930 addto_choice (g
, args
)
934 return call_forms_INstr (fl_addto_choice
, g
-> ob_generic
, args
);
938 replace_choice (g
, args
)
942 return call_forms_INiINstr (fl_replace_choice
, g
-> ob_generic
, args
);
946 delete_choice (g
, args
)
950 return call_forms_INi (fl_delete_choice
, g
-> ob_generic
, args
);
954 get_choice_text (g
, args
)
958 return call_forms_Rstr (fl_get_choice_text
, g
-> ob_generic
, args
);
962 set_choice_fontsize (g
, args
)
966 return call_forms_INf (fl_set_choice_fontsize
, g
-> ob_generic
, args
);
970 set_choice_fontstyle (g
, args
)
974 return call_forms_INi (fl_set_choice_fontstyle
, g
-> ob_generic
, args
);
977 static struct methodlist choice_methods
[] = {
978 {"set_choice", (method
)set_choice
},
979 {"get_choice", (method
)get_choice
},
980 {"clear_choice", (method
)clear_choice
},
981 {"addto_choice", (method
)addto_choice
},
982 {"replace_choice", (method
)replace_choice
},
983 {"delete_choice", (method
)delete_choice
},
984 {"get_choice_text", (method
)get_choice_text
},
985 {"set_choice_fontsize", (method
)set_choice_fontsize
},
986 {"set_choice_fontstyle",(method
)set_choice_fontstyle
},
987 {NULL
, NULL
} /* sentinel */
1002 fl_get_clock (g
->ob_generic
, &i0
, &i1
, &i2
);
1004 return mkvalue("(iii)", i0
, i1
, i2
);
1007 static struct methodlist clock_methods
[] = {
1008 {"get_clock", (method
)get_clock
},
1009 {NULL
, NULL
} /* sentinel */
1012 /* CLass : Counters */
1015 get_counter_value(g
, args
)
1019 return call_forms_Rf (fl_get_counter_value
, g
-> ob_generic
, args
);
1023 set_counter_value (g
, args
)
1027 return call_forms_INf (fl_set_counter_value
, g
-> ob_generic
, args
);
1031 set_counter_precision (g
, args
)
1035 return call_forms_INi (fl_set_counter_precision
, g
-> ob_generic
, args
);
1039 set_counter_bounds (g
, args
)
1043 return call_forms_INfINf (fl_set_counter_bounds
, g
-> ob_generic
, args
);
1047 set_counter_step (g
, args
)
1051 return call_forms_INfINf (fl_set_counter_step
, g
-> ob_generic
, args
);
1055 set_counter_return (g
, args
)
1059 return call_forms_INi (fl_set_counter_return
, g
-> ob_generic
, args
);
1062 static struct methodlist counter_methods
[] = {
1063 {"set_counter_value", (method
)set_counter_value
},
1064 {"get_counter_value", (method
)get_counter_value
},
1065 {"set_counter_bounds", (method
)set_counter_bounds
},
1066 {"set_counter_step", (method
)set_counter_step
},
1067 {"set_counter_precision", (method
)set_counter_precision
},
1068 {"set_counter_return", (method
)set_counter_return
},
1069 {NULL
, NULL
} /* sentinel */
1076 get_dial_value(g
, args
)
1080 return call_forms_Rf (fl_get_dial_value
, g
-> ob_generic
, args
);
1084 set_dial_value (g
, args
)
1088 return call_forms_INf (fl_set_dial_value
, g
-> ob_generic
, args
);
1092 set_dial_bounds (g
, args
)
1096 return call_forms_INfINf (fl_set_dial_bounds
, g
-> ob_generic
, args
);
1100 get_dial_bounds (g
, args
)
1104 return call_forms_OUTfOUTf (fl_get_dial_bounds
, g
-> ob_generic
, args
);
1108 set_dial_step (g
, args
)
1112 return call_forms_INf (fl_set_dial_step
, g
-> ob_generic
, args
);
1115 static struct methodlist dial_methods
[] = {
1116 {"set_dial_value", (method
)set_dial_value
},
1117 {"get_dial_value", (method
)get_dial_value
},
1118 {"set_dial_bounds", (method
)set_dial_bounds
},
1119 {"get_dial_bounds", (method
)get_dial_bounds
},
1120 {"set_dial_step", (method
)set_dial_step
},
1121 {NULL
, NULL
} /* sentinel */
1131 return call_forms_INstr (fl_set_input
, g
-> ob_generic
, args
);
1139 return call_forms_Rstr (fl_get_input
, g
-> ob_generic
, args
);
1143 set_input_color (g
, args
)
1147 return call_forms_INfINf (fl_set_input_color
, g
-> ob_generic
, args
);
1151 set_input_return (g
, args
)
1155 return call_forms_INi (fl_set_input_return
, g
-> ob_generic
, args
);
1158 static struct methodlist input_methods
[] = {
1159 {"set_input", (method
)set_input
},
1160 {"get_input", (method
)get_input
},
1161 {"set_input_color", (method
)set_input_color
},
1162 {"set_input_return", (method
)set_input_return
},
1163 {NULL
, NULL
} /* sentinel */
1174 return call_forms_INstr (fl_set_menu
, g
-> ob_generic
, args
);
1182 /* XXX strictly speaking this is wrong since fl_get_menu
1183 XXX returns long, not int */
1184 return call_forms_Ri (fl_get_menu
, g
-> ob_generic
, args
);
1188 get_menu_text (g
, args
)
1192 return call_forms_Rstr (fl_get_menu_text
, g
-> ob_generic
, args
);
1196 addto_menu (g
, args
)
1200 return call_forms_INstr (fl_addto_menu
, g
-> ob_generic
, args
);
1203 static struct methodlist menu_methods
[] = {
1204 {"set_menu", (method
)set_menu
},
1205 {"get_menu", (method
)get_menu
},
1206 {"get_menu_text", (method
)get_menu_text
},
1207 {"addto_menu", (method
)addto_menu
},
1208 {NULL
, NULL
} /* sentinel */
1212 /* Class: Sliders */
1215 get_slider_value(g
, args
)
1219 return call_forms_Rf (fl_get_slider_value
, g
-> ob_generic
, args
);
1223 set_slider_value (g
, args
)
1227 return call_forms_INf (fl_set_slider_value
, g
-> ob_generic
, args
);
1231 set_slider_bounds (g
, args
)
1235 return call_forms_INfINf (fl_set_slider_bounds
, g
-> ob_generic
, args
);
1239 get_slider_bounds (g
, args
)
1243 return call_forms_OUTfOUTf(fl_get_slider_bounds
, g
-> ob_generic
, args
);
1247 set_slider_return (g
, args
)
1251 return call_forms_INf (fl_set_slider_return
, g
-> ob_generic
, args
);
1255 set_slider_size (g
, args
)
1259 return call_forms_INf (fl_set_slider_size
, g
-> ob_generic
, args
);
1263 set_slider_precision (g
, args
)
1267 return call_forms_INi (fl_set_slider_precision
, g
-> ob_generic
, args
);
1271 set_slider_step (g
, args
)
1275 return call_forms_INf (fl_set_slider_step
, g
-> ob_generic
, args
);
1279 static struct methodlist slider_methods
[] = {
1280 {"set_slider_value", (method
)set_slider_value
},
1281 {"get_slider_value", (method
)get_slider_value
},
1282 {"set_slider_bounds", (method
)set_slider_bounds
},
1283 {"get_slider_bounds", (method
)get_slider_bounds
},
1284 {"set_slider_return", (method
)set_slider_return
},
1285 {"set_slider_size", (method
)set_slider_size
},
1286 {"set_slider_precision",(method
)set_slider_precision
},
1287 {"set_slider_step", (method
)set_slider_step
},
1288 {NULL
, NULL
} /* sentinel */
1292 set_positioner_xvalue (g
, args
)
1296 return call_forms_INf (fl_set_positioner_xvalue
, g
-> ob_generic
, args
);
1300 set_positioner_xbounds (g
, args
)
1304 return call_forms_INfINf (fl_set_positioner_xbounds
,
1305 g
-> ob_generic
, args
);
1309 set_positioner_yvalue (g
, args
)
1313 return call_forms_INf (fl_set_positioner_yvalue
, g
-> ob_generic
, args
);
1317 set_positioner_ybounds (g
, args
)
1321 return call_forms_INfINf (fl_set_positioner_ybounds
,
1322 g
-> ob_generic
, args
);
1326 get_positioner_xvalue (g
, args
)
1330 return call_forms_Rf (fl_get_positioner_xvalue
, g
-> ob_generic
, args
);
1334 get_positioner_xbounds (g
, args
)
1338 return call_forms_OUTfOUTf (fl_get_positioner_xbounds
,
1339 g
-> ob_generic
, args
);
1343 get_positioner_yvalue (g
, args
)
1347 return call_forms_Rf (fl_get_positioner_yvalue
, g
-> ob_generic
, args
);
1351 get_positioner_ybounds (g
, args
)
1355 return call_forms_OUTfOUTf (fl_get_positioner_ybounds
,
1356 g
-> ob_generic
, args
);
1359 static struct methodlist positioner_methods
[] = {
1360 {"set_positioner_xvalue", (method
)set_positioner_xvalue
},
1361 {"set_positioner_yvalue", (method
)set_positioner_yvalue
},
1362 {"set_positioner_xbounds", (method
)set_positioner_xbounds
},
1363 {"set_positioner_ybounds", (method
)set_positioner_ybounds
},
1364 {"get_positioner_xvalue", (method
)get_positioner_xvalue
},
1365 {"get_positioner_yvalue", (method
)get_positioner_yvalue
},
1366 {"get_positioner_xbounds", (method
)get_positioner_xbounds
},
1367 {"get_positioner_ybounds", (method
)get_positioner_ybounds
},
1368 {NULL
, NULL
} /* sentinel */
1378 return call_forms_INf (fl_set_timer
, g
-> ob_generic
, args
);
1386 return call_forms_Rf (fl_get_timer
, g
-> ob_generic
, args
);
1389 static struct methodlist timer_methods
[] = {
1390 {"set_timer", (method
)set_timer
},
1391 {"get_timer", (method
)get_timer
},
1392 {NULL
, NULL
} /* sentinel */
1402 staticforward typeobject Formtype
;
1404 #define is_formobject(v) ((v)->ob_type == &Formtype)
1407 form_show_form(f
, args
)
1413 if (!getargs(args
, "(iis)", &place
, &border
, &name
))
1415 fl_show_form(f
->ob_form
, place
, border
, name
);
1421 form_call(func
, f
, args
)
1424 void (*func
)(FL_FORM
*);
1426 if (!getnoarg(args
)) return NULL
;
1435 form_call_INiINi(func
, f
, args
)
1438 void (*func
)(FL_FORM
*, int, int);
1442 if (!getargs(args
, "(ii)", &a
, &b
)) return NULL
;
1451 form_call_INfINf(func
, f
, args
)
1454 void (*func
)(FL_FORM
*, float, float);
1458 if (!getargs(args
, "(ff)", &a
, &b
)) return NULL
;
1467 form_hide_form(f
, args
)
1471 return form_call(fl_hide_form
, f
-> ob_form
, args
);
1475 form_redraw_form(f
, args
)
1479 return form_call(fl_redraw_form
, f
-> ob_form
, args
);
1483 form_add_object(f
, args
)
1488 if (args
== NULL
|| !is_genericobject(args
)) {
1492 g
= (genericobject
*)args
;
1493 if (findgeneric(g
->ob_generic
) != NULL
) {
1494 err_setstr(RuntimeError
,
1495 "add_object of object already in a form");
1498 fl_add_object(f
->ob_form
, g
->ob_generic
);
1506 form_set_form_position(f
, args
)
1510 return form_call_INiINi(fl_set_form_position
, f
-> ob_form
, args
);
1514 form_set_form_size(f
, args
)
1518 return form_call_INiINi(fl_set_form_size
, f
-> ob_form
, args
);
1522 form_scale_form(f
, args
)
1526 return form_call_INfINf(fl_scale_form
, f
-> ob_form
, args
);
1530 generic_add_object(f
, args
, func
, internal_methods
)
1533 FL_OBJECT
*(*func
)(int, float, float, float, float, char*);
1534 struct methodlist
*internal_methods
;
1541 if (!getargs(args
,"(iffffs)", &type
,&x
,&y
,&w
,&h
,&name
))
1544 fl_addto_form (f
-> ob_form
);
1546 obj
= (*func
) (type
, x
, y
, w
, h
, name
);
1555 return newgenericobject (obj
, internal_methods
);
1559 form_add_button(f
, args
)
1563 return generic_add_object(f
, args
, fl_add_button
, button_methods
);
1567 form_add_lightbutton(f
, args
)
1571 return generic_add_object(f
, args
, fl_add_lightbutton
, button_methods
);
1575 form_add_roundbutton(f
, args
)
1579 return generic_add_object(f
, args
, fl_add_roundbutton
, button_methods
);
1583 form_add_menu (f
, args
)
1587 return generic_add_object(f
, args
, fl_add_menu
, menu_methods
);
1591 form_add_slider(f
, args
)
1595 return generic_add_object(f
, args
, fl_add_slider
, slider_methods
);
1599 form_add_valslider(f
, args
)
1603 return generic_add_object(f
, args
, fl_add_valslider
, slider_methods
);
1607 form_add_dial(f
, args
)
1611 return generic_add_object(f
, args
, fl_add_dial
, dial_methods
);
1615 form_add_counter(f
, args
)
1619 return generic_add_object(f
, args
, fl_add_counter
, counter_methods
);
1623 form_add_clock(f
, args
)
1627 return generic_add_object(f
, args
, fl_add_clock
, clock_methods
);
1631 form_add_box(f
, args
)
1635 return generic_add_object(f
, args
, fl_add_box
,
1636 (struct methodlist
*)NULL
);
1640 form_add_choice(f
, args
)
1644 return generic_add_object(f
, args
, fl_add_choice
, choice_methods
);
1648 form_add_browser(f
, args
)
1652 return generic_add_object(f
, args
, fl_add_browser
, browser_methods
);
1656 form_add_positioner(f
, args
)
1660 return generic_add_object(f
, args
, fl_add_positioner
, positioner_methods
);
1664 form_add_input(f
, args
)
1668 return generic_add_object(f
, args
, fl_add_input
, input_methods
);
1672 form_add_text(f
, args
)
1676 return generic_add_object(f
, args
, fl_add_text
,
1677 (struct methodlist
*)NULL
);
1681 form_add_timer(f
, args
)
1685 return generic_add_object(f
, args
, fl_add_timer
, timer_methods
);
1689 form_freeze_form(f
, args
)
1693 return form_call(fl_freeze_form
, f
-> ob_form
, args
);
1697 form_unfreeze_form(f
, args
)
1701 return form_call(fl_unfreeze_form
, f
-> ob_form
, args
);
1705 form_activate_form(f
, args
)
1709 return form_call(fl_activate_form
, f
-> ob_form
, args
);
1713 form_deactivate_form(f
, args
)
1717 return form_call(fl_deactivate_form
, f
-> ob_form
, args
);
1721 form_bgn_group(f
, args
)
1727 fl_addto_form(f
-> ob_form
);
1728 obj
= fl_bgn_group();
1736 return newgenericobject (obj
, (struct methodlist
*) NULL
);
1740 form_end_group(f
, args
)
1744 fl_addto_form(f
-> ob_form
);
1752 forms_find_first_or_last(func
, f
, args
)
1753 FL_OBJECT
*(*func
)(FL_FORM
*, int, float, float);
1762 if (!getargs(args
, "(iff)", &type
, &mx
, &my
)) return NULL
;
1764 generic
= (*func
) (f
-> ob_form
, type
, mx
, my
);
1766 if (generic
== NULL
)
1772 g
= findgeneric(generic
);
1774 err_setstr(RuntimeError
,
1775 "forms_find_{first|last} returns unknown object");
1779 return (object
*) g
;
1783 form_find_first(f
, args
)
1787 return forms_find_first_or_last(fl_find_first
, f
, args
);
1791 form_find_last(f
, args
)
1795 return forms_find_first_or_last(fl_find_last
, f
, args
);
1799 form_set_object_focus(f
, args
)
1804 if (args
== NULL
|| !is_genericobject(args
)) {
1808 g
= (genericobject
*)args
;
1809 fl_set_object_focus(f
->ob_form
, g
->ob_generic
);
1814 static struct methodlist form_methods
[] = {
1816 {"show_form", (method
)form_show_form
},
1817 {"hide_form", (method
)form_hide_form
},
1818 {"redraw_form", (method
)form_redraw_form
},
1819 {"set_form_position", (method
)form_set_form_position
},
1820 {"set_form_size", (method
)form_set_form_size
},
1821 {"scale_form", (method
)form_scale_form
},
1822 {"freeze_form", (method
)form_freeze_form
},
1823 {"unfreeze_form", (method
)form_unfreeze_form
},
1824 {"activate_form", (method
)form_activate_form
},
1825 {"deactivate_form", (method
)form_deactivate_form
},
1826 {"bgn_group", (method
)form_bgn_group
},
1827 {"end_group", (method
)form_end_group
},
1828 {"find_first", (method
)form_find_first
},
1829 {"find_last", (method
)form_find_last
},
1830 {"set_object_focus", (method
)form_set_object_focus
},
1833 {"add_button", (method
)form_add_button
},
1834 /* {"add_bitmap", (method)form_add_bitmap}, */
1835 {"add_lightbutton", (method
)form_add_lightbutton
},
1836 {"add_roundbutton", (method
)form_add_roundbutton
},
1837 {"add_menu", (method
)form_add_menu
},
1838 {"add_slider", (method
)form_add_slider
},
1839 {"add_positioner", (method
)form_add_positioner
},
1840 {"add_valslider", (method
)form_add_valslider
},
1841 {"add_dial", (method
)form_add_dial
},
1842 {"add_counter", (method
)form_add_counter
},
1843 {"add_box", (method
)form_add_box
},
1844 {"add_clock", (method
)form_add_clock
},
1845 {"add_choice", (method
)form_add_choice
},
1846 {"add_browser", (method
)form_add_browser
},
1847 {"add_input", (method
)form_add_input
},
1848 {"add_timer", (method
)form_add_timer
},
1849 {"add_text", (method
)form_add_text
},
1850 {NULL
, NULL
} /* sentinel */
1857 releaseobjects(f
->ob_form
);
1858 if (f
->ob_form
->visible
)
1859 fl_hide_form(f
->ob_form
);
1860 fl_free_form(f
->ob_form
);
1864 #define OFF(x) offsetof(FL_FORM, x)
1866 static struct memberlist form_memberlist
[] = {
1867 {"window", T_LONG
, OFF(window
), RO
},
1868 {"w", T_FLOAT
, OFF(w
)},
1869 {"h", T_FLOAT
, OFF(h
)},
1870 {"x", T_FLOAT
, OFF(x
), RO
},
1871 {"y", T_FLOAT
, OFF(y
), RO
},
1872 {"deactivated", T_INT
, OFF(deactivated
)},
1873 {"visible", T_INT
, OFF(visible
), RO
},
1874 {"frozen", T_INT
, OFF(frozen
), RO
},
1875 {"doublebuf", T_INT
, OFF(doublebuf
)},
1876 {NULL
} /* Sentinel */
1882 form_getattr(f
, name
)
1888 meth
= findmethod(form_methods
, (object
*)f
, name
);
1892 return getmember((char *)f
->ob_form
, form_memberlist
, name
);
1896 form_setattr(f
, name
, v
)
1904 err_setstr(TypeError
, "can't delete form attributes");
1908 return setmember((char *)f
->ob_form
, form_memberlist
, name
, v
);
1916 sprintf(buf
, "<FORMS_form at %lx, window=%ld>",
1917 (long)f
, f
->ob_form
->window
);
1918 return newstringobject(buf
);
1921 static typeobject Formtype
= {
1922 OB_HEAD_INIT(&Typetype
)
1924 "FORMS_form", /*tp_name*/
1925 sizeof(formobject
), /*tp_size*/
1928 (destructor
)form_dealloc
, /*tp_dealloc*/
1930 (getattrfunc
)form_getattr
, /*tp_getattr*/
1931 (setattrfunc
)form_setattr
, /*tp_setattr*/
1933 (reprfunc
)form_repr
, /*tp_repr*/
1941 f
= NEWOBJ(formobject
, &Formtype
);
1949 /* The "fl" module */
1952 forms_make_form(dummy
, args
)
1959 if (!getargs(args
, "(iff)", &type
, &w
, &h
))
1961 form
= fl_bgn_form(type
, w
, h
);
1963 /* XXX Actually, cannot happen! */
1968 return newformobject(form
);
1972 forms_activate_all_forms(f
, args
)
1976 fl_activate_all_forms();
1982 forms_deactivate_all_forms(f
, args
)
1986 fl_deactivate_all_forms();
1991 static object
*my_event_callback
= NULL
;
1994 forms_set_event_call_back(dummy
, args
)
2000 my_event_callback
= args
;
2007 forms_do_or_check_forms(dummy
, args
, func
)
2010 FL_OBJECT
*(*func
)();
2016 if (!getnoarg(args
))
2021 generic
= (*func
)();
2023 if (generic
== NULL
) {
2027 if (generic
== FL_EVENT
) {
2030 if (my_event_callback
== NULL
)
2031 return newintobject(-1L);
2032 dev
= fl_qread(&val
);
2033 arg
= mkvalue("(ih)", dev
, val
);
2036 res
= call_object(my_event_callback
, arg
);
2040 return NULL
; /* Callback raised exception */
2043 g
= findgeneric(generic
);
2045 /* Object not known to us (some dialogs cause this) */
2046 continue; /* Ignore it */
2048 if (g
->ob_callback
== NULL
) {
2050 return ((object
*) g
);
2052 arg
= mkvalue("(OO)", (object
*)g
, g
->ob_callback_arg
);
2055 res
= call_object(g
->ob_callback
, arg
);
2059 return NULL
; /* Callback raised exception */
2064 forms_do_forms(dummy
, args
)
2068 return forms_do_or_check_forms(dummy
, args
, fl_do_forms
);
2072 forms_check_forms(dummy
, args
)
2076 return forms_do_or_check_forms(dummy
, args
, fl_check_forms
);
2080 forms_do_only_forms(dummy
, args
)
2084 return forms_do_or_check_forms(dummy
, args
, fl_do_only_forms
);
2088 forms_check_only_forms(dummy
, args
)
2092 return forms_do_or_check_forms(dummy
, args
, fl_check_only_forms
);
2101 if (!getnoarg(args
))
2110 forms_set_graphics_mode(dummy
, args
)
2114 int rgbmode
, doublebuf
;
2116 if (!getargs(args
, "(ii)", &rgbmode
, &doublebuf
))
2118 fl_set_graphics_mode(rgbmode
,doublebuf
);
2124 forms_get_rgbmode(dummy
, args
)
2128 extern int fl_rgbmode
;
2134 return newintobject((long)fl_rgbmode
);
2138 forms_show_errors(dummy
, args
)
2143 if (!getargs(args
, "i", &show
))
2145 fl_show_errors(show
);
2151 forms_set_font_name(dummy
, args
)
2157 if (!getargs(args
, "(is)", &numb
, &name
))
2159 fl_set_font_name(numb
, name
);
2166 forms_qdevice(self
, args
)
2171 if (!getargs(args
, "h", &arg1
))
2179 forms_unqdevice(self
, args
)
2184 if (!getargs(args
, "h", &arg1
))
2192 forms_isqueued(self
, args
)
2198 if (!getargs(args
, "h", &arg1
))
2200 retval
= fl_isqueued(arg1
);
2202 return newintobject(retval
);
2206 forms_qtest(self
, args
)
2211 retval
= fl_qtest();
2212 return newintobject(retval
);
2217 forms_qread(self
, args
)
2224 dev
= fl_qread(&val
);
2226 return mkvalue("(ih)", dev
, val
);
2230 forms_qreset(self
, args
)
2234 if (!getnoarg(args
)) return NULL
;
2242 forms_qenter(self
, args
)
2247 if (!getargs(args
, "(hh)", &arg1
, &arg2
))
2249 fl_qenter(arg1
, arg2
);
2255 forms_color(self
, args
)
2261 if (!getintarg(args
, &arg
)) return NULL
;
2263 fl_color((short) arg
);
2270 forms_mapcolor(self
, args
)
2274 int arg0
, arg1
, arg2
, arg3
;
2276 if (!getargs(args
, "(iiii)", &arg0
, &arg1
, &arg2
, &arg3
))
2279 fl_mapcolor(arg0
, (short) arg1
, (short) arg2
, (short) arg3
);
2286 forms_getmcolor(self
, args
)
2293 if (!getintarg(args
, &arg
)) return NULL
;
2295 fl_getmcolor(arg
, &r
, &g
, &b
);
2297 return mkvalue("(hhh)", r
, g
, b
);
2301 forms_get_mouse(self
, args
)
2307 if (!getnoarg(args
)) return NULL
;
2309 fl_get_mouse(&x
, &y
);
2311 return mkvalue("(ff)", x
, y
);
2315 forms_tie(self
, args
)
2319 short arg1
, arg2
, arg3
;
2320 if (!getargs(args
, "(hhh)", &arg1
, &arg2
, &arg3
))
2322 fl_tie(arg1
, arg2
, arg3
);
2328 forms_show_message(f
, args
)
2334 if (!getargs(args
, "(sss)", &a
, &b
, &c
)) return NULL
;
2337 fl_show_message(a
, b
, c
);
2345 forms_show_choice(f
, args
)
2349 char *m1
, *m2
, *m3
, *b1
, *b2
, *b3
;
2354 if (args
== NULL
|| !is_tupleobject(args
)) {
2358 nb
= gettuplesize(args
) - 3;
2360 err_setstr(TypeError
, "need at least one button label");
2363 if (is_intobject(gettupleitem(args
, 3))) {
2364 err_setstr(TypeError
,
2365 "'number-of-buttons' argument not needed");
2369 case 1: format
= "(ssss)"; break;
2370 case 2: format
= "(sssss)"; break;
2371 case 3: format
= "(ssssss)"; break;
2373 err_setstr(TypeError
, "too many button labels");
2377 if (!getargs(args
, format
, &m1
, &m2
, &m3
, &b1
, &b2
, &b3
))
2381 rv
= fl_show_choice(m1
, m2
, m3
, nb
, b1
, b2
, b3
);
2383 return newintobject(rv
);
2387 forms_show_question(f
, args
)
2394 if (!getargs(args
, "(sss)", &a
, &b
, &c
)) return NULL
;
2397 ret
= fl_show_question(a
, b
, c
);
2400 return newintobject((long) ret
);
2404 forms_show_input(f
, args
)
2411 if (!getargs(args
, "(ss)", &a
, &b
)) return NULL
;
2414 str
= fl_show_input(a
, b
);
2421 return newstringobject(str
);
2425 forms_file_selector(f
, args
)
2430 char *a
, *b
, *c
, *d
;
2432 if (!getargs(args
, "(ssss)", &a
, &b
, &c
, &d
)) return NULL
;
2435 str
= fl_show_file_selector(a
, b
, c
, d
);
2442 return newstringobject(str
);
2447 forms_file_selector_func(args
, func
)
2459 return newstringobject(str
);
2463 forms_get_directory(f
, args
)
2467 return forms_file_selector_func(args
, fl_get_directory
);
2471 forms_get_pattern(f
, args
)
2475 return forms_file_selector_func(args
, fl_get_pattern
);
2479 forms_get_filename(f
, args
)
2483 return forms_file_selector_func(args
, fl_get_filename
);
2486 static struct methodlist forms_methods
[] = {
2488 {"make_form", forms_make_form
},
2489 {"activate_all_forms", forms_activate_all_forms
},
2490 {"deactivate_all_forms",forms_deactivate_all_forms
},
2491 /* gl support wrappers */
2492 {"qdevice", forms_qdevice
},
2493 {"unqdevice", forms_unqdevice
},
2494 {"isqueued", forms_isqueued
},
2495 {"qtest", forms_qtest
},
2496 {"qread", forms_qread
},
2497 /* {"blkqread", forms_blkqread}, */
2498 {"qreset", forms_qreset
},
2499 {"qenter", forms_qenter
},
2500 {"get_mouse", forms_get_mouse
},
2502 /* {"new_events", forms_new_events}, */
2503 {"color", forms_color
},
2504 {"mapcolor", forms_mapcolor
},
2505 {"getmcolor", forms_getmcolor
},
2507 {"do_forms", forms_do_forms
},
2508 {"do_only_forms", forms_do_only_forms
},
2509 {"check_forms", forms_check_forms
},
2510 {"check_only_forms", forms_check_only_forms
},
2511 {"set_event_call_back", forms_set_event_call_back
},
2513 {"show_message", forms_show_message
},
2514 {"show_question", forms_show_question
},
2515 {"show_choice", forms_show_choice
},
2516 {"show_input", forms_show_input
},
2517 {"show_file_selector", forms_file_selector
},
2518 {"file_selector", forms_file_selector
}, /* BW compat */
2519 {"get_directory", forms_get_directory
},
2520 {"get_pattern", forms_get_pattern
},
2521 {"get_filename", forms_get_filename
},
2522 {"set_graphics_mode", forms_set_graphics_mode
},
2523 {"get_rgbmode", forms_get_rgbmode
},
2524 {"show_errors", forms_show_errors
},
2525 {"set_font_name", forms_set_font_name
},
2526 {NULL
, NULL
} /* sentinel */
2532 initmodule("fl", forms_methods
);