blob: 4411d8737898e7f3a45b1694c7ab10cc0e80e360 [file] [log] [blame]
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001/**********************************************************
2Copyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
3Netherlands.
4
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* FL module -- interface to Mark Overmars' FORMS Library. */
26
27#include "forms.h"
28
29#include "allobjects.h"
30#include "import.h"
31#include "modsupport.h"
32#include "structmember.h"
33
34/* #include "ceval.h" */
35extern object *call_object(object *, object *);
36
37/* Generic Forms Objects */
38
39typedef struct {
40 OB_HEAD
41 FL_OBJECT *ob_generic;
42 struct methodlist *ob_methods;
43 object *ob_callback;
44 object *ob_callback_arg;
45} genericobject;
46
47/* List of all objects (later this should be a hash table on address...) */
48
49static object *allgenerics = NULL;
50
51static void
52knowgeneric(g)
53 genericobject *g;
54{
55 if (allgenerics == NULL) {
56 allgenerics = newlistobject(0);
57 if (allgenerics == NULL) {
58 err_clear();
59 return; /* Botte pech */
60 }
61 }
62 addlistitem(allgenerics, (object *)g);
63}
64
65static genericobject *
66findgeneric(generic)
67 FL_OBJECT *generic;
68{
69 int i, n;
70 genericobject *g;
71
72 if (allgenerics == NULL)
73 return NULL; /* Botte pech */
74 n = getlistsize(allgenerics);
75 for (i = 0; i < n; i++) {
76 g = (genericobject *)getlistitem(allgenerics, i);
77 if (g->ob_generic == generic)
78 return g;
79 }
80 return NULL; /* Unknown object */
81}
82
83
84/* Methods of generic objects */
85
86static object *
87generic_set_call_back(g, args)
88 genericobject *g;
89 object *args;
90{
91 if (args == NULL) {
92 XDECREF(g->ob_callback);
93 XDECREF(g->ob_callback_arg);
94 g->ob_callback = NULL;
95 g->ob_callback_arg = NULL;
96 }
97 else {
98 if (!is_tupleobject(args) || gettuplesize(args) != 2) {
99 err_badarg();
100 return NULL;
101 }
102 XDECREF(g->ob_callback);
103 XDECREF(g->ob_callback_arg);
104 g->ob_callback = gettupleitem(args, 0);
105 INCREF(g->ob_callback);
106 g->ob_callback_arg = gettupleitem(args, 1);
107 INCREF(g->ob_callback_arg);
108 }
109 INCREF(None);
110 return None;
111}
112
113static object *
114generic_call(g, args, func)
115 genericobject *g;
116 object *args;
117 void (*func)(FL_OBJECT *);
118{
119 if (!getnoarg(args))
120 return NULL;
121 (*func)(g->ob_generic);
122 INCREF(None);
123 return None;
124}
125
126static object *
127generic_show_object(g, args)
128 genericobject *g;
129 object *args;
130{
131 return generic_call(g, args, fl_show_object);
132}
133
134static object *
135generic_hide_object(g, args)
136 genericobject *g;
137 object *args;
138{
139 return generic_call(g, args, fl_hide_object);
140}
141
142static object *
143generic_redraw_object(g, args)
144 genericobject *g;
145 object *args;
146{
147 return generic_call(g, args, fl_redraw_object);
148}
149
150static object *
151generic_freeze_object(g, args)
152 genericobject *g;
153 object *args;
154{
155 return generic_call(g, args, fl_freeze_object);
156}
157
158static object *
159generic_unfreeze_object(g, args)
160 genericobject *g;
161 object *args;
162{
163 return generic_call(g, args, fl_unfreeze_object);
164}
165
166static struct methodlist generic_methods[] = {
167 {"set_call_back", generic_set_call_back},
168 {"show_object", generic_show_object},
169 {"hide_object", generic_hide_object},
170 {"redraw_object", generic_redraw_object},
171 {"freeze_object", generic_freeze_object},
172 {"unfreeze_object", generic_unfreeze_object},
173#if 0
174 {"handle_object", generic_handle_object},
175 {"handle_object_direct",generic_handle_object_direct},
176#endif
177 {NULL, NULL} /* sentinel */
178};
179
180static void
181generic_dealloc(g)
182 genericobject *g;
183{
184 /* XXX can't destroy forms objects !!! */
185 DEL(g);
186}
187
188#define OFF(x) offsetof(FL_OBJECT, x)
189
190static struct memberlist generic_memberlist[] = {
191 {"objclass", T_INT, OFF(objclass), RO},
192 {"type", T_INT, OFF(type), RO},
193 {"boxtype", T_INT, OFF(boxtype)},
194 {"x", T_FLOAT, OFF(x)},
195 {"y", T_FLOAT, OFF(y)},
196 {"w", T_FLOAT, OFF(w)},
197 {"h", T_FLOAT, OFF(h)},
198 {"col1", T_INT, OFF(col1)},
199 {"col2", T_INT, OFF(col2)},
200 {"align", T_INT, OFF(align)},
201 {"lcol", T_INT, OFF(lcol)},
202 {"lsize", T_FLOAT, OFF(lsize)},
203 /* "label" is treated specially! */
204 {"lstyle", T_INT, OFF(lstyle)},
205 {"pushed", T_INT, OFF(pushed), RO},
206 {"focus", T_INT, OFF(focus), RO},
207 {"belowmouse", T_INT, OFF(belowmouse),RO},
208 {"frozen", T_INT, OFF(frozen), RO},
209 {"active", T_INT, OFF(active), RO},
210 {"input", T_INT, OFF(input), RO},
211 {"visible", T_INT, OFF(visible), RO},
212 {"radio", T_INT, OFF(radio), RO},
213 {"automatic", T_INT, OFF(automatic), RO},
214 {NULL} /* Sentinel */
215};
216
217static object *
218generic_getattr(g, name)
219 genericobject *g;
220 char *name;
221{
222 object *meth;
223
224 if (g-> ob_methods) {
225 meth = findmethod(g->ob_methods, (object *)g, name);
226 if (meth != NULL) return meth;
227 err_clear();
228 }
229
230 meth = findmethod(generic_methods, (object *)g, name);
231 if (meth != NULL)
232 return meth;
233 err_clear();
234
235 /* "label" is an exception, getmember only works for char pointers,
236 not for char arrays */
237 if (strcmp(name, "label") == 0)
238 return newstringobject(g->ob_generic->label);
239
240 return getmember((char *)g->ob_generic, generic_memberlist, name);
241}
242
243static int
244generic_setattr(g, name, v)
245 genericobject *g;
246 char *name;
247 object *v;
248{
249 int ret;
250
251 if (v == NULL) {
252 err_setstr(TypeError, "can't delete forms object attributes");
253 return NULL;
254 }
255
256 /* "label" is an exception: setmember doesn't set strings;
257 and FORMS wants you to call a function to set the label */
258 if (strcmp(name, "label") == 0) {
259 if (!is_stringobject(v)) {
260 err_setstr(TypeError, "label attr must be string");
261 return NULL;
262 }
263 fl_set_object_label(g->ob_generic, getstringvalue(v));
264 return 0;
265 }
266
267 ret = setmember((char *)g->ob_generic, generic_memberlist, name, v);
268
269 /* Rather than calling all the various set_object_* functions,
270 we call fl_redraw_object here. This is sometimes redundant
271 but I doubt that's a big problem */
272 if (ret == 0)
273 fl_redraw_object(g->ob_generic);
274
275 return ret;
276}
277
278typeobject GenericObjecttype = {
279 OB_HEAD_INIT(&Typetype)
280 0, /*ob_size*/
281 "generic FORMS object", /*tp_name*/
282 sizeof(genericobject), /*tp_size*/
283 0, /*tp_itemsize*/
284 /* methods */
285 generic_dealloc, /*tp_dealloc*/
286 0, /*tp_print*/
287 generic_getattr, /*tp_getattr*/
288 generic_setattr, /*tp_setattr*/
289 0, /*tp_compare*/
290 0, /*tp_repr*/
291};
292
293static object *
294newgenericobject(generic, methods)
295 FL_OBJECT *generic;
296 struct methodlist *methods;
297{
298 genericobject *g;
299 g = NEWOBJ(genericobject, &GenericObjecttype);
300 if (g == NULL)
301 return NULL;
302 g-> ob_generic = generic;
303 g->ob_methods = methods;
304 g->ob_callback = NULL;
305 g->ob_callback_arg = NULL;
306 knowgeneric(g);
307 return (object *)g;
308}
309
310/**********************************************************************/
311/* Some common calling sequences */
312
313/* void func (object, float) */
314static object *
315call_forms_INf (func, obj, args)
316 void *(*func)(FL_OBJECT *, float);
317 FL_OBJECT *obj;
318 object *args;
319{
320 float parameter;
321
322 if (!getfloatarg (args, &parameter)) return NULL;
323
324 (*func) (obj, parameter);
325
326 INCREF(None);
327 return None;
328}
329
330/* void func (object, float) */
331static object *
332call_forms_INfINf (func, obj, args)
333 void *(*func)(FL_OBJECT *, float, float);
334 FL_OBJECT *obj;
335 object *args;
336{
337 float par1, par2;
338
339 if (!getfloatfloatarg (args, &par1, &par2)) return NULL;
340
341 (*func) (obj, par1, par2);
342
343 INCREF(None);
344 return None;
345}
346
347/* void func (object, int) */
348static object *
349call_forms_INi (func, obj, args)
350 void *(*func)(FL_OBJECT *, int);
351 FL_OBJECT *obj;
352 object *args;
353{
354 int parameter;
355
356 if (!getintarg (args, &parameter)) return NULL;
357
358 (*func) (obj, parameter);
359
360 INCREF(None);
361 return None;
362}
363
364/* void func (object, string) */
365static object *
366call_forms_INstr (func, obj, args)
367 void *(*func)(FL_OBJECT *, char *);
368 FL_OBJECT *obj;
369 object *args;
370{
371 object *a;
372
373 if (!getstrarg (args, &a)) return NULL;
374
375 (*func) (obj, getstringvalue (a));
376
377 INCREF(None);
378 return None;
379}
380
381
382/* voide func (object, int, string) */
383static object *
384call_forms_INiINstr (func, obj, args)
385 void *(*func)(FL_OBJECT *, int, char *);
386 FL_OBJECT *obj;
387 object *args;
388
389{
390 object *a;
391 int b;
392
393 if (!getintstrarg (args, &b, &a)) return NULL;
394
395 (*func) (obj, b, getstringvalue (a));
396
397 INCREF(None);
398 return None;
399}
400
401/* void func (object, float) */
402static object *
403call_forms_INiINi (func, obj, args)
404 void *(*func)(FL_OBJECT *, float, float);
405 FL_OBJECT *obj;
406 object *args;
407{
408 int par1, par2;
409
410 if (!getintintarg (args, &par1, &par2)) return NULL;
411
412 (*func) (obj, par1, par2);
413
414 INCREF(None);
415 return None;
416}
417
418/* int func (object) */
419static object *
420call_forms_Ri (func, obj, args)
421 int (*func)(FL_OBJECT *);
422 FL_OBJECT *obj;
423 object *args;
424{
425 int retval;
426
427 if (!getnoarg(args)) return NULL;
428
429 retval = (*func) (obj);
430
431 return newintobject ((long) retval);
432}
433
434/* char * func (object) */
435static object *
436call_forms_Rstr (func, obj, args)
437 char * (*func)(FL_OBJECT *);
438 FL_OBJECT *obj;
439 object *args;
440{
441 char *str;
442
443 if (!getnoarg (args)) return NULL;
444
445 str = (*func) (obj);
446
447 return newstringobject (str);
448}
449
450/* int func (object) */
451static object *
452call_forms_Rf (func, obj, args)
453 float (*func)(FL_OBJECT *);
454 FL_OBJECT *obj;
455 object *args;
456{
457 float retval;
458
459 if (!getnoarg(args)) return NULL;
460
461 retval = (*func) (obj);
462
463 return newfloatobject (retval);
464}
465
466static object *
467call_forms_OUTfOUTf (func, obj, args)
468 void *(*func)(FL_OBJECT *, float *, float *);
469 FL_OBJECT *obj;
470 object *args;
471{
472 float f1, f2;
473 object *arg;
474
475 if (!getnoarg(args)) return NULL;
476
477 (*func) (obj, &f1, &f2);
478
479 arg = newtupleobject (2);
480 if (arg == NULL) return NULL;
481
482 settupleitem (arg, 0, newfloatobject (f1));
483 settupleitem (arg, 1, newfloatobject (f2));
484 return arg;
485}
486
487static object *
488call_forms_OUTf (func, obj, args)
489 void *(*func)(FL_OBJECT *, float *);
490 FL_OBJECT *obj;
491 object *args;
492{
493 float f;
494 object *arg;
495
496 if (!getnoarg(args)) return NULL;
497
498 (*func) (obj, &f);
499
500 return newfloatobject (f);
501}
502
503/**********************************************************************/
504/* Class : browser */
505
506static object *
507set_browser_topline(g, args)
508 genericobject *g;
509 object *args;
510{
511 return call_forms_INi (fl_set_browser_topline, g-> ob_generic, args);
512}
513
514static object *
515clear_browser(g, args)
516 genericobject *g;
517 object *args;
518{
519 return generic_call (g, args, fl_clear_browser);
520}
521
522static object *
523add_browser_line (g, args)
524 genericobject *g;
525 object *args;
526{
527 return call_forms_INstr (fl_add_browser_line, g-> ob_generic, args);
528}
529
530static object *
531addto_browser (g, args)
532 genericobject *g;
533 object *args;
534{
535 return call_forms_INstr (fl_addto_browser, g-> ob_generic, args);
536}
537
538static object *
539insert_browser_line (g, args)
540 genericobject *g;
541 object *args;
542{
543 return call_forms_INiINstr (fl_insert_browser_line, g-> ob_generic, args);
544}
545
546static object *
547delete_browser_line (g, args)
548 genericobject *g;
549 object *args;
550{
551 return call_forms_INi (fl_delete_browser_line, g-> ob_generic, args);
552}
553
554static object *
555replace_browser_line (g, args)
556 genericobject *g;
557 object *args;
558{
559 return call_forms_INiINstr (fl_replace_browser_line, g-> ob_generic, args);
560}
561
562static object *
563get_browser_line(g, args)
564 genericobject *g;
565 object *args;
566{
567 int i;
568 char *str;
569
570 if (!getintarg(args, &i))
571 return NULL;
572
573 str = fl_get_browser_line (g->ob_generic, i);
574
575 return newstringobject (str);
576}
577
578static object *
579load_browser (g, args)
580 genericobject *g;
581 object *args;
582{
583 return call_forms_INstr (fl_load_browser, g-> ob_generic, args);
584}
585
586static object *
587get_browser_maxline(g, args)
588 genericobject *g;
589 object *args;
590{
591 return call_forms_Ri (fl_get_browser_maxline, g-> ob_generic, args);
592}
593
594static object *
595select_browser_line (g, args)
596 genericobject *g;
597 object *args;
598{
599 return call_forms_INi (fl_select_browser_line, g-> ob_generic, args);
600}
601
602static object *
603deselect_browser_line (g, args)
604 genericobject *g;
605 object *args;
606{
607 return call_forms_INi (fl_deselect_browser_line, g-> ob_generic, args);
608}
609
610static object *
611deselect_browser (g, args)
612 genericobject *g;
613 object *args;
614{
615 return generic_call (g, args, fl_deselect_browser);
616}
617
618static object *
619isselected_browser_line (g, args)
620 genericobject *g;
621 object *args;
622{
623 int i, j;
624 object *arg;
625
626 if (!getintarg(args, &i))
627 return NULL;
628
629 j = fl_isselected_browser_line (g->ob_generic, i);
630
631 return newintobject (j);
632}
633
634static object *
635get_browser (g, args)
636 genericobject *g;
637 object *args;
638{
639 return call_forms_Ri (fl_get_browser, g-> ob_generic, args);
640}
641
642static object *
643set_browser_fontsize (g, args)
644 genericobject *g;
645 object *args;
646{
647 return call_forms_INf (fl_set_browser_fontsize, g-> ob_generic, args);
648}
649
650static object *
651set_browser_fontstyle (g, args)
652 genericobject *g;
653 object *args;
654{
655 return call_forms_INi (fl_set_browser_fontstyle, g-> ob_generic, args);
656}
657
658static struct methodlist browser_methods[] = {
659 {"set_browser_topline", set_browser_topline},
660 {"clear_browser", clear_browser},
661 {"add_browser_line", add_browser_line},
662 {"addto_browser", addto_browser},
663 {"insert_browser_line", insert_browser_line},
664 {"delete_browser_line", delete_browser_line},
665 {"replace_browser_line",replace_browser_line},
666 {"get_browser_line", get_browser_line},
667 {"load_browser", load_browser},
668 {"get_browser_maxline", get_browser_maxline},
669 {"select_browser_line", select_browser_line},
670 {"deselect_browser_line", deselect_browser_line},
671 {"deselect_browser", deselect_browser},
672 {"isselected_browser_line", isselected_browser_line},
673 {"get_browser", get_browser},
674 {"set_browser_fontsize",set_browser_fontsize},
675 {"set_browser_fontstyle", set_browser_fontstyle},
676 {NULL, NULL} /* sentinel */
677};
678
679/* Class: button */
680
681static object *
682set_button(g, args)
683 genericobject *g;
684 object *args;
685{
686 return call_forms_INi (fl_set_button, g-> ob_generic, args);
687}
688
689static object *
690get_button(g, args)
691 genericobject *g;
692 object *args;
693{
694 return call_forms_Ri (fl_get_button, g-> ob_generic, args);
695}
696
697static struct methodlist button_methods[] = {
698 {"set_button", set_button},
699 {"get_button", get_button},
700 {NULL, NULL} /* sentinel */
701};
702
703/* Class: choice */
704
705static object *
706set_choice(g, args)
707 genericobject *g;
708 object *args;
709{
710 return call_forms_INi (fl_set_choice, g-> ob_generic, args);
711}
712
713static object *
714get_choice(g, args)
715 genericobject *g;
716 object *args;
717{
718 return call_forms_Ri (fl_get_choice, g-> ob_generic, args);
719}
720
721static object *
722clear_choice (g, args)
723 genericobject *g;
724 object *args;
725{
726 generic_call (g, args, fl_clear_choice);
727}
728
729static object *
730addto_choice (g, args)
731 genericobject *g;
732 object *args;
733{
734 return call_forms_INstr (fl_addto_choice, g-> ob_generic, args);
735}
736
737static object *
738replace_choice (g, args)
739 genericobject *g;
740 object *args;
741{
742 return call_forms_INiINstr (fl_replace_choice, g-> ob_generic, args);
743}
744
745static object *
746delete_choice (g, args)
747 genericobject *g;
748 object *args;
749{
750 return call_forms_INi (fl_delete_choice, g-> ob_generic, args);
751}
752
753static object *
754get_choice_text (g, args)
755 genericobject *g;
756 object *args;
757{
758 return call_forms_Rstr (fl_get_choice_text, g-> ob_generic, args);
759}
760
761static object *
762set_choice_fontsize (g, args)
763 genericobject *g;
764 object *args;
765{
766 return call_forms_INf (fl_set_choice_fontsize, g-> ob_generic, args);
767}
768
769static object *
770set_choice_fontstyle (g, args)
771 genericobject *g;
772 object *args;
773{
774 return call_forms_INi (fl_set_choice_fontstyle, g-> ob_generic, args);
775}
776
777static struct methodlist choice_methods[] = {
778 {"set_choice", set_choice},
779 {"get_choice", get_choice},
780 {"clear_choice", clear_choice},
781 {"addto_choice", addto_choice},
782 {"replace_choice", replace_choice},
783 {"delete_choice", delete_choice},
784 {"get_choice_text", get_choice_text},
785 {"set_choice_fontsize", set_choice_fontsize},
786 {"set_choice_fontstyle",set_choice_fontstyle},
787 {NULL, NULL} /* sentinel */
788};
789
790/* Class : Clock */
791
792static object *
793get_clock(g, args)
794 genericobject *g;
795 object *args;
796{
797 int i0, i1, i2;
798 object *arg;
799
800 if (!getnoarg(args))
801 return NULL;
802
803 fl_get_clock (g->ob_generic, &i0, &i1, &i2);
804
805 arg = newtupleobject (3);
806 if (arg == NULL) return NULL;
807
808 settupleitem (arg, 0, newintobject (i0));
809 settupleitem (arg, 1, newintobject (i1));
810 settupleitem (arg, 2, newintobject (i2));
811 return arg;
812}
813
814static struct methodlist clock_methods[] = {
815 {"get_clock", get_clock},
816 {NULL, NULL} /* sentinel */
817};
818
819/* CLass : Counters */
820
821static object *
822get_counter_value(g, args)
823 genericobject *g;
824 object *args;
825{
826 return call_forms_Rf (fl_get_counter_value, g-> ob_generic, args);
827}
828
829static object *
830set_counter_value (g, args)
831 genericobject *g;
832 object *args;
833{
834 return call_forms_INf (fl_set_counter_value, g-> ob_generic, args);
835}
836
837static object *
838set_counter_precision (g, args)
839 genericobject *g;
840 object *args;
841{
842 return call_forms_INi (fl_set_counter_precision, g-> ob_generic, args);
843}
844
845static object *
846set_counter_bounds (g, args)
847 genericobject *g;
848 object *args;
849{
850 return call_forms_INfINf (fl_set_counter_bounds, g-> ob_generic, args);
851}
852
853static object *
854set_counter_step (g, args)
855 genericobject *g;
856 object *args;
857{
858 return call_forms_INfINf (fl_set_counter_step, g-> ob_generic, args);
859}
860
861static object *
862set_counter_return (g, args)
863 genericobject *g;
864 object *args;
865{
866 return call_forms_INi (fl_set_counter_return, g-> ob_generic, args);
867}
868
869static struct methodlist counter_methods[] = {
870 {"set_counter_value", set_counter_value},
871 {"get_counter_value", get_counter_value},
872 {"set_counter_bounds", set_counter_bounds},
873 {"set_counter_step", set_counter_step},
874 {"set_counter_precision", set_counter_precision},
875 {"set_counter_return", set_counter_return},
876 {NULL, NULL} /* sentinel */
877};
878
879/* Class : Defaults */
880
881static object *
882get_default(g, args)
883 genericobject *g;
884 object *args;
885{
886 char c;
887
888 if (!getnoarg(args)) return NULL;
889
890 c = fl_get_default (g->ob_generic);
891
892 return ((object *) mknewcharobject (c)); /* in cgensupport.c */
893}
894
895static struct methodlist default_methods[] = {
896 {"get_default", get_default},
897 {NULL, NULL} /* sentinel */
898};
899
900
901/* Class: Dials */
902
903static object *
904set_dial (g, args)
905 genericobject *g;
906 object *args;
907{
908 float f1, f2, f3;
909
910 if (!getfloatfloatfloatarg(args, &f1, &f2, &f3))
911 return NULL;
912 fl_set_dial (g->ob_generic, f1, f2, f3);
913 INCREF(None);
914 return None;
915}
916
917static object *
918get_dial(g, args)
919 genericobject *g;
920 object *args;
921{
922 return call_forms_Rf (fl_get_dial, g-> ob_generic, args);
923}
924
925static object *
926set_dial_value (g, args)
927 genericobject *g;
928 object *args;
929{
930 return call_forms_INf (fl_set_dial_value, g-> ob_generic, args);
931}
932
933static object *
934set_dial_bounds (g, args)
935 genericobject *g;
936 object *args;
937{
938 return call_forms_INfINf (fl_set_dial_bounds, g-> ob_generic, args);
939}
940
941static object *
942get_dial_bounds (g, args)
943 genericobject *g;
944 object *args;
945{
946 return call_forms_OUTfOUTf (fl_get_dial_bounds, g-> ob_generic, args);
947}
948
949static struct methodlist dial_methods[] = {
950 {"set_dial", set_dial},
951 {"get_dial", get_dial},
952 {"set_dial_value", set_dial_value},
953 {"get_dial_value", get_dial},
954 {"set_dial_bounds", set_dial_bounds},
955 {"get_dial_bounds", get_dial_bounds},
956 {NULL, NULL} /* sentinel */
957};
958
959/* Class : Input */
960
961static object *
962set_input (g, args)
963 genericobject *g;
964 object *args;
965{
966 return call_forms_INstr (fl_set_input, g-> ob_generic, args);
967}
968
969static object *
970get_input (g, args)
971 genericobject *g;
972 object *args;
973{
974 return call_forms_Rstr (fl_get_input, g-> ob_generic, args);
975}
976
977static object *
978set_input_color (g, args)
979 genericobject *g;
980 object *args;
981{
982 return call_forms_INfINf (fl_set_input_color, g-> ob_generic, args);
983}
984
985static struct methodlist input_methods[] = {
986 {"set_input", set_input},
987 {"get_input", get_input},
988 {"set_input_color", set_input_color},
989 {NULL, NULL} /* sentinel */
990};
991
992
993/* Class : Menu */
994
995static object *
996set_menu (g, args)
997 genericobject *g;
998 object *args;
999{
1000 return call_forms_INstr (fl_set_menu, g-> ob_generic, args);
1001}
1002
1003static object *
1004get_menu (g, args)
1005 genericobject *g;
1006 object *args;
1007{
1008 return call_forms_Ri (fl_get_menu, g-> ob_generic, args);
1009}
1010
1011static object *
1012addto_menu (g, args)
1013 genericobject *g;
1014 object *args;
1015{
1016 return call_forms_INstr (fl_addto_menu, g-> ob_generic, args);
1017}
1018
1019static struct methodlist menu_methods[] = {
1020 {"set_menu", set_menu},
1021 {"get_menu", get_menu},
1022 {"addto_menu", addto_menu},
1023 {NULL, NULL} /* sentinel */
1024};
1025
1026
1027/* Class: Sliders */
1028
1029static object *
1030set_slider (g, args)
1031 genericobject *g;
1032 object *args;
1033{
1034 float f1, f2, f3;
1035
1036 if (!getfloatfloatfloatarg(args, &f1, &f2, &f3))
1037 return NULL;
1038 fl_set_slider (g->ob_generic, f1, f2, f3);
1039 INCREF(None);
1040 return None;
1041}
1042
1043static object *
1044get_slider(g, args)
1045 genericobject *g;
1046 object *args;
1047{
1048 return call_forms_Rf (fl_get_slider, g-> ob_generic, args);
1049}
1050
1051static object *
1052set_slider_value (g, args)
1053 genericobject *g;
1054 object *args;
1055{
1056 return call_forms_INf (fl_set_slider_value, g-> ob_generic, args);
1057}
1058
1059static object *
1060set_slider_bounds (g, args)
1061 genericobject *g;
1062 object *args;
1063{
1064 return call_forms_INfINf (fl_set_slider_bounds, g-> ob_generic, args);
1065}
1066
1067static object *
1068get_slider_bounds (g, args)
1069 genericobject *g;
1070 object *args;
1071{
1072 return call_forms_OUTfOUTf(fl_get_slider_bounds, g-> ob_generic, args);
1073}
1074
1075static object *
1076set_slider_return (g, args)
1077 genericobject *g;
1078 object *args;
1079{
1080 return call_forms_INf (fl_set_slider_return, g-> ob_generic, args);
1081}
1082
1083static object *
1084set_slider_size (g, args)
1085 genericobject *g;
1086 object *args;
1087{
1088 return call_forms_INf (fl_set_slider_size, g-> ob_generic, args);
1089}
1090
1091static object *
1092set_slider_precision (g, args)
1093 genericobject *g;
1094 object *args;
1095{
1096 return call_forms_INi (fl_set_slider_precision, g-> ob_generic, args);
1097}
1098
1099static struct methodlist slider_methods[] = {
1100 {"set_slider", set_slider},
1101 {"get_slider", get_slider},
1102 {"set_slider_value", set_slider_value},
1103 {"get_slider_value", get_slider},
1104 {"set_slider_bounds", set_slider_bounds},
1105 {"get_slider_bounds", get_slider_bounds},
1106 {"set_slider_return", set_slider_return},
1107 {"set_slider_size", set_slider_size},
1108 {"set_slider_precision",set_slider_precision},
1109 {NULL, NULL} /* sentinel */
1110};
1111
1112static object *
1113set_positioner_xvalue (g, args)
1114 genericobject *g;
1115 object *args;
1116{
1117 return call_forms_INf (fl_set_positioner_xvalue, g-> ob_generic, args);
1118}
1119
1120static object *
1121set_positioner_xbounds (g, args)
1122 genericobject *g;
1123 object *args;
1124{
1125 return call_forms_INfINf (fl_set_positioner_xbounds, g-> ob_generic, args);
1126}
1127
1128static object *
1129set_positioner_yvalue (g, args)
1130 genericobject *g;
1131 object *args;
1132{
1133 return call_forms_INf (fl_set_positioner_yvalue, g-> ob_generic, args);
1134}
1135
1136static object *
1137set_positioner_ybounds (g, args)
1138 genericobject *g;
1139 object *args;
1140{
1141 return call_forms_INfINf (fl_set_positioner_ybounds, g-> ob_generic, args);
1142}
1143
1144static object *
1145get_positioner_xvalue (g, args)
1146 genericobject *g;
1147 object *args;
1148{
1149 return call_forms_Rf (fl_get_positioner_xvalue, g-> ob_generic, args);
1150}
1151
1152static object *
1153get_positioner_xbounds (g, args)
1154 genericobject *g;
1155 object *args;
1156{
1157 return call_forms_OUTfOUTf (fl_get_positioner_xbounds, g-> ob_generic, args);
1158}
1159
1160static object *
1161get_positioner_yvalue (g, args)
1162 genericobject *g;
1163 object *args;
1164{
1165 return call_forms_Rf (fl_get_positioner_yvalue, g-> ob_generic, args);
1166}
1167
1168static object *
1169get_positioner_ybounds (g, args)
1170 genericobject *g;
1171 object *args;
1172{
1173 return call_forms_OUTfOUTf (fl_get_positioner_ybounds, g-> ob_generic, args);
1174}
1175
1176static struct methodlist positioner_methods[] = {
1177 {"set_positioner_xvalue", set_positioner_xvalue},
1178 {"set_positioner_yvalue", set_positioner_yvalue},
1179 {"set_positioner_xbounds", set_positioner_xbounds},
1180 {"set_positioner_ybounds", set_positioner_ybounds},
1181 {"get_positioner_xvalue", get_positioner_xvalue},
1182 {"get_positioner_yvalue", get_positioner_yvalue},
1183 {"get_positioner_xbounds", get_positioner_xbounds},
1184 {"get_positioner_ybounds", set_positioner_ybounds},
1185 {NULL, NULL} /* sentinel */
1186};
1187
1188/* Class timer */
1189
1190static object *
1191set_timer (g, args)
1192 genericobject *g;
1193 object *args;
1194{
1195 return call_forms_INf (fl_set_timer, g-> ob_generic, args);
1196}
1197
1198static object *
1199get_timer (g, args)
1200 genericobject *g;
1201 object *args;
1202{
1203 return call_forms_Rf (fl_get_timer, g-> ob_generic, args);
1204}
1205
1206static struct methodlist timer_methods[] = {
1207 {"set_timer", set_timer},
1208 {"get_timer", get_timer},
1209 {NULL, NULL} /* sentinel */
1210};
1211
1212/* Form objects */
1213
1214typedef struct {
1215 OB_HEAD
1216 FL_FORM *ob_form;
1217} formobject;
1218
1219extern typeobject Formtype; /* Forward */
1220
1221#define is_formobject(v) ((v)->ob_type == &Formtype)
1222
1223static object *
1224form_show_form(f, args)
1225 formobject *f;
1226 object *args;
1227{
1228 int place, border;
1229 object *name;
1230 if (!getintintstrarg(args, &place, &border, &name))
1231 return NULL;
1232 fl_show_form(f->ob_form, place, border, getstringvalue(name));
1233 INCREF(None);
1234 return None;
1235}
1236
1237static object *
1238form_call(func, f, args)
1239 FL_FORM *f;
1240 object *args;
1241 void (*func)(FL_FORM *);
1242{
1243 if (!getnoarg(args)) return NULL;
1244
1245 (*func)(f);
1246
1247 INCREF(None);
1248 return None;
1249}
1250
1251static object *
1252form_call_INiINi (func, f, args)
1253 FL_FORM *f;
1254 object *args;
1255 void (*func)(FL_FORM *, int, int);
1256{
1257 int a, b;
1258
1259 if (!getintintarg(args, &a, &b)) return NULL;
1260
1261 (*func)(f, a, b);
1262
1263 INCREF(None);
1264 return None;
1265}
1266
1267static object *
1268form_hide_form(f, args)
1269 formobject *f;
1270 object *args;
1271{
1272 return form_call (fl_hide_form, f-> ob_form, args);
1273}
1274
1275static object *
1276form_redraw_form(f, args)
1277 formobject *f;
1278 object *args;
1279{
1280 return form_call (fl_redraw_form, f-> ob_form, args);
1281}
1282
1283static object *
1284form_set_form_position (f, args)
1285 formobject *f;
1286 object *args;
1287{
1288 return form_call_INiINi (fl_set_form_position, f-> ob_form, args);
1289}
1290
1291static object *
1292generic_add_object (f, args, func, internal_methods)
1293 formobject *f;
1294 object *args;
1295 FL_OBJECT *(*func)(int, float, float, float, float, char*);
1296 struct methodlist *internal_methods;
1297{
1298 int type;
1299 float x, y, w, h;
1300 object *name;
1301 FL_OBJECT *genobj;
1302
1303 if (!getintfloatfloatfloatfloatstr (args,&type,&x,&y,&w,&h,&name))
1304 return NULL;
1305
1306 fl_addto_form (f-> ob_form);
1307
1308 genobj = (*func) (type, x, y, w, h, getstringvalue (name));
1309
1310 fl_end_form ();
1311
1312 if (genobj == NULL) { err_nomem(); return NULL; }
1313
1314 return newgenericobject (genobj, internal_methods);
1315}
1316
1317static object *
1318form_add_button(f, args)
1319 formobject *f;
1320 object *args;
1321{
1322 return generic_add_object(f, args, fl_add_button, button_methods);
1323}
1324
1325static object *
1326form_add_lightbutton(f, args)
1327 formobject *f;
1328 object *args;
1329{
1330 return generic_add_object(f, args, fl_add_lightbutton, button_methods);
1331}
1332
1333static object *
1334form_add_roundbutton(f, args)
1335 formobject *f;
1336 object *args;
1337{
1338 return generic_add_object(f, args, fl_add_roundbutton, button_methods);
1339}
1340
1341static object *
1342form_add_menu (f, args)
1343 formobject *f;
1344 object *args;
1345{
1346 return generic_add_object(f, args, fl_add_menu, menu_methods);
1347}
1348
1349static object *
1350form_add_slider(f, args)
1351 formobject *f;
1352 object *args;
1353{
1354 return generic_add_object(f, args, fl_add_slider, slider_methods);
1355}
1356
1357static object *
1358form_add_valslider(f, args)
1359 formobject *f;
1360 object *args;
1361{
1362 return generic_add_object(f, args, fl_add_valslider, slider_methods);
1363}
1364
1365static object *
1366form_add_dial (f, args)
1367 formobject *f;
1368 object *args;
1369{
1370 return generic_add_object(f, args, fl_add_dial, dial_methods);
1371}
1372
1373static object *
1374form_add_counter (f, args)
1375 formobject *f;
1376 object *args;
1377{
1378 return generic_add_object(f, args, fl_add_counter, counter_methods);
1379}
1380
1381static object *
1382form_add_default (f, args)
1383 formobject *f;
1384 object *args;
1385{
1386 return generic_add_object(f, args, fl_add_default, default_methods);
1387}
1388
1389static object *
1390form_add_clock (f, args)
1391 formobject *f;
1392 object *args;
1393{
1394 return generic_add_object(f, args, fl_add_clock, clock_methods);
1395}
1396
1397static object *
1398form_add_box (f, args)
1399 formobject *f;
1400 object *args;
1401{
1402 return generic_add_object(f, args, fl_add_box, NULL);
1403}
1404
1405static object *
1406form_add_choice (f, args)
1407 formobject *f;
1408 object *args;
1409{
1410 return generic_add_object(f, args, fl_add_choice, choice_methods);
1411}
1412
1413static object *
1414form_add_browser (f, args)
1415 formobject *f;
1416 object *args;
1417{
1418 return generic_add_object(f, args, fl_add_browser, browser_methods);
1419}
1420
1421static object *
1422form_add_positioner (f, args)
1423 formobject *f;
1424 object *args;
1425{
1426 return generic_add_object(f, args, fl_add_positioner, positioner_methods);
1427}
1428
1429static object *
1430form_add_input (f, args)
1431 formobject *f;
1432 object *args;
1433{
1434 return generic_add_object(f, args, fl_add_input, input_methods);
1435}
1436
1437static object *
1438form_add_text (f, args)
1439 formobject *f;
1440 object *args;
1441{
1442 return generic_add_object(f, args, fl_add_text, NULL);
1443}
1444
1445static object *
1446form_add_timer (f, args)
1447 formobject *f;
1448 object *args;
1449{
1450 return generic_add_object(f, args, fl_add_timer, timer_methods);
1451}
1452
1453static object *
1454form_show_message (f, args)
1455 formobject *f;
1456 object *args;
1457{
1458 object *a, *b, *c;
1459
1460 if (!getstrstrstrarg(args, &a, &b, &c)) return NULL;
1461
1462 fl_show_message (
1463 getstringvalue(a), getstringvalue(b), getstringvalue(c));
1464
1465 INCREF (None);
1466 return None;
1467}
1468
1469static object *
1470form_show_question (f, args)
1471 formobject *f;
1472 object *args;
1473{
1474 int ret;
1475 object *a, *b, *c;
1476
1477 if (!getstrstrstrarg(args, &a, &b, &c)) return NULL;
1478
1479 ret = fl_show_question (
1480 getstringvalue(a), getstringvalue(b), getstringvalue(c));
1481
1482 return newintobject ((long) ret);
1483}
1484
1485static object *
1486form_show_input (f, args)
1487 formobject *f;
1488 object *args;
1489{
1490 char *str;
1491 object *a, *b;
1492
1493 if (!getstrstrarg(args, &a, &b)) return NULL;
1494
1495 str = fl_show_input (getstringvalue(a), getstringvalue(b));
1496
1497 return newstringobject (str);
1498}
1499
1500static object *
1501form_file_selector (f, args)
1502 formobject *f;
1503 object *args;
1504{
1505 char *str;
1506 object *a, *b, *c, *d;
1507
1508 if (!getstrstrstrstrarg(args, &a, &b, &c, &d)) return NULL;
1509
1510 str = fl_show_file_selector (getstringvalue(a), getstringvalue(b),
1511 getstringvalue (c), getstringvalue (d));
1512
1513 return newstringobject (str);
1514}
1515
1516
1517static object *
1518form_file_selector_func (f, args, func)
1519 formobject *f;
1520 object *args;
1521 char *(*func)();
1522{
1523 char *str;
1524
1525 str = (*func) ();
1526
1527 return newstringobject (str);
1528}
1529
1530static object *
1531form_get_directory (f, args)
1532 formobject *f;
1533 object *args;
1534{
1535 return form_file_selector_func (f, args, fl_get_directory);
1536}
1537
1538static object *
1539form_get_pattern (f, args)
1540 formobject *f;
1541 object *args;
1542{
1543 return form_file_selector_func (f, args, fl_get_pattern);
1544}
1545
1546static object *
1547form_get_filename (f, args)
1548 formobject *f;
1549 object *args;
1550{
1551 return form_file_selector_func (f, args, fl_get_filename);
1552
1553}
1554
1555static object *
1556form_freeze_form(f, args)
1557 formobject *f;
1558 object *args;
1559{
1560 return form_call (fl_freeze_form, f-> ob_form, args);
1561}
1562
1563static object *
1564form_unfreeze_form(f, args)
1565 formobject *f;
1566 object *args;
1567{
1568 return form_call (fl_unfreeze_form, f-> ob_form, args);
1569}
1570
1571static object *
1572form_display_form(f, args)
1573 formobject *f;
1574 object *args;
1575{
1576 int place, border;
1577 object *name;
1578 if (!getintintstrarg(args, &place, &border, &name))
1579 return NULL;
1580 fl_show_form(f->ob_form, place, border, getstringvalue(name));
1581 INCREF(None);
1582 return None;
1583}
1584
1585static object *
1586form_remove_form(f, args)
1587 formobject *f;
1588 object *args;
1589{
1590 return form_call (fl_remove_form, f-> ob_form, args);
1591}
1592
1593static object *
1594form_activate_form(f, args)
1595 formobject *f;
1596 object *args;
1597{
1598 return form_call (fl_activate_form, f-> ob_form, args);
1599}
1600
1601static object *
1602form_deactivate_form(f, args)
1603 formobject *f;
1604 object *args;
1605{
1606 return form_call (fl_deactivate_form, f-> ob_form, args);
1607}
1608
1609static struct methodlist form_methods[] = {
1610/* adm */
1611 {"show_form", form_show_form},
1612 {"hide_form", form_hide_form},
1613 {"redraw_form", form_redraw_form},
1614 {"set_form_position", form_set_form_position},
1615 {"freeze_form", form_freeze_form},
1616 {"unfreeze_form", form_unfreeze_form},
1617 {"display_form", form_display_form},
1618 {"remove_form", form_remove_form},
1619 {"activate_form", form_activate_form},
1620 {"deactivate_form", form_deactivate_form},
1621
1622/* basic objects */
1623 {"add_button", form_add_button},
1624/* {"add_bitmap", form_add_bitmap}, */
1625 {"add_lightbutton", form_add_lightbutton},
1626 {"add_roundbutton", form_add_roundbutton},
1627 {"add_menu", form_add_menu},
1628 {"add_slider", form_add_slider},
1629 {"add_positioner", form_add_positioner},
1630 {"add_valslider", form_add_valslider},
1631 {"add_dial", form_add_dial},
1632 {"add_counter", form_add_counter},
1633 {"add_default", form_add_default},
1634 {"add_box", form_add_box},
1635 {"add_clock", form_add_clock},
1636 {"add_choice", form_add_choice},
1637 {"add_browser", form_add_browser},
1638 {"add_input", form_add_input},
1639 {"add_timer", form_add_timer},
1640 {"add_text", form_add_text},
1641 {NULL, NULL} /* sentinel */
1642};
1643
1644static void
1645form_dealloc(f)
1646 formobject *f;
1647{
1648 /* XXX can't destroy form objects !!! */
1649 DEL(f);
1650}
1651
1652static object *
1653form_getattr(f, name)
1654 formobject *f;
1655 char *name;
1656{
1657 /* XXX check for data attr's: x, y etc. */
1658 return findmethod(form_methods, (object *)f, name);
1659}
1660
1661typeobject Formtype = {
1662 OB_HEAD_INIT(&Typetype)
1663 0, /*ob_size*/
1664 "form", /*tp_name*/
1665 sizeof(formobject), /*tp_size*/
1666 0, /*tp_itemsize*/
1667 /* methods */
1668 form_dealloc, /*tp_dealloc*/
1669 0, /*tp_print*/
1670 form_getattr, /*tp_getattr*/
1671 0, /*tp_setattr*/
1672 0, /*tp_compare*/
1673 0, /*tp_repr*/
1674};
1675
1676static object *
1677newformobject(form)
1678 FL_FORM *form;
1679{
1680 formobject *f;
1681 f = NEWOBJ(formobject, &Formtype);
1682 if (f == NULL)
1683 return NULL;
1684 f->ob_form = form;
1685 return (object *)f;
1686}
1687
1688/* The "fl" module */
1689static object *
1690forms_make_form(dummy, args)
1691 object *dummy;
1692 object *args;
1693{
1694 int type;
1695 float w, h;
1696 FL_FORM *form;
1697 if (!getintfloatfloatarg(args, &type, &w, &h))
1698 return NULL;
1699 form = fl_bgn_form(type, w, h);
1700 if (form == NULL) {
1701 /* XXX Actually, cannot happen! */
1702 err_nomem();
1703 return NULL;
1704 }
1705 fl_end_form();
1706 return newformobject(form);
1707}
1708
1709static object *my_event_callback = NULL;
1710
1711static object *
1712forms_set_event_call_back(dummy, args)
1713 object *dummy;
1714 object *args;
1715{
1716 my_event_callback = args;
1717 XINCREF(args);
1718 INCREF(None);
1719 return None;
1720}
1721
1722static object *
1723forms_do_or_check_forms(dummy, args, func)
1724 object *dummy;
1725 object *args;
1726 FL_OBJECT *(*func)();
1727{
1728 FL_OBJECT *generic;
1729 genericobject *g;
1730 object *arg, *res;
1731
1732 if (!getnoarg(args))
1733 return NULL;
1734
1735 for (;;) {
1736 generic = (*func)();
1737 if (generic == NULL) {
1738 INCREF(None);
1739 return None;
1740 }
1741 if (generic == FL_EVENT) {
1742 int dev;
1743 short val;
1744 if (my_event_callback == NULL)
1745 return newintobject(-1);
1746 dev = fl_qread(&val);
1747 arg = newtupleobject(2);
1748 if (arg == NULL)
1749 return NULL;
1750 settupleitem(arg, 0, newintobject((long)dev));
1751 settupleitem(arg, 1, newintobject((long)val));
1752 res = call_object(my_event_callback, arg);
1753 XDECREF(res);
1754 DECREF(arg);
1755 if (res == NULL)
1756 return NULL; /* Callback raised exception */
1757 continue;
1758 }
1759 g = findgeneric(generic);
1760 if (g == NULL) {
1761 err_setstr(RuntimeError,
1762 "do_forms returns unknown object");
1763 return NULL;
1764 }
1765 if (g->ob_callback == NULL) {
1766 INCREF(g);
1767 return ((object *) g);
1768 }
1769 arg = newtupleobject(2);
1770 INCREF(g);
1771 settupleitem(arg, 0, g);
1772 INCREF(g->ob_callback_arg);
1773 settupleitem(arg, 1, g->ob_callback_arg);
1774 res = call_object(g->ob_callback, arg);
1775 XDECREF(res);
1776 DECREF(arg);
1777 if (res == NULL)
1778 return NULL; /* Callback raised exception */
1779 }
1780}
1781
1782static object *
1783forms_do_forms (dummy, args)
1784 object *dummy;
1785 object *args;
1786{
1787 return forms_do_or_check_forms (dummy, args, fl_do_forms);
1788}
1789
1790static object *
1791forms_check_forms (dummy, args)
1792 object *dummy;
1793 object *args;
1794{
1795 return forms_do_or_check_forms (dummy, args, fl_check_forms);
1796}
1797
1798static object *
1799fl_call(func, args)
1800 object *args;
1801 void (*func)();
1802{
1803 if (!getnoarg(args))
1804 return NULL;
1805 (*func)();
1806 INCREF(None);
1807 return None;
1808}
1809
1810static object *
1811forms_bgn_group (dummy, args)
1812 object *dummy;
1813 object *args;
1814{
1815 return fl_call (fl_bgn_group, dummy, args);
1816}
1817
1818static object *
1819forms_end_group (dummy, args)
1820 object *dummy;
1821 object *args;
1822{
1823 return fl_call (fl_end_group, args);
1824}
1825
1826static object *
1827forms_qdevice(self, args)
1828 object *self;
1829 object *args;
1830{
1831 short arg1 ;
1832 if (!getishortarg(args, 1, 0, &arg1))
1833 return NULL;
1834 fl_qdevice( arg1 );
1835 INCREF(None);
1836 return None;
1837}
1838
1839static object *
1840forms_unqdevice(self, args)
1841 object *self;
1842 object *args;
1843{
1844 short arg1 ;
1845 if (!getishortarg(args, 1, 0, &arg1))
1846 return NULL;
1847 fl_unqdevice( arg1 );
1848 INCREF(None);
1849 return None;
1850}
1851
1852static object *
1853forms_isqueued(self, args)
1854 object *self;
1855 object *args;
1856{
1857 int retval;
1858 short arg1 ;
1859 if (!getishortarg(args, 1, 0, &arg1))
1860 return NULL;
1861 retval = fl_isqueued( arg1 );
1862
1863 return newintobject((int) retval);
1864}
1865
1866static object *
1867forms_qtest(self, args)
1868 object *self;
1869 object *args;
1870{
1871 long retval;
1872 retval = fl_qtest( );
1873 return newintobject((int) retval);
1874}
1875
1876
1877static object *
1878forms_qread(self, args)
1879 object *self;
1880 object *args;
1881{
1882 long retval;
1883 short arg1 ;
1884 retval = fl_qread( & arg1 );
1885 { object *v = newtupleobject( 2 );
1886 if (v == NULL) return NULL;
1887 settupleitem(v, 0, newintobject(retval));
1888 settupleitem(v, 1, newintobject((long)arg1));
1889 return v;
1890 }
1891}
1892
1893static object *
1894forms_qreset(self, args)
1895 object *self;
1896 object *args;
1897{
1898 if (!getnoarg(args)) return NULL;
1899
1900 forms_qreset();
1901 INCREF(None);
1902 return None;
1903}
1904
1905static object *
1906forms_qenter(self, args)
1907 object *self;
1908 object *args;
1909{
1910 short arg1 ;
1911 short arg2 ;
1912 if (!getishortarg(args, 2, 0, &arg1))
1913 return NULL;
1914 if (!getishortarg(args, 2, 1, &arg2))
1915 return NULL;
1916 fl_qenter( arg1 , arg2 );
1917 INCREF(None);
1918 return None;
1919}
1920
1921static object *
1922forms_color (self, args)
1923 object *self;
1924 object *args;
1925{
1926 int arg;
1927
1928 if (!getintarg(args, &arg)) return NULL;
1929
1930 fl_color((short) arg);
1931
1932 INCREF(None);
1933 return None;
1934}
1935
1936static object *
1937forms_mapcolor (self, args)
1938 object *self;
1939 object *args;
1940{
1941 int arg0, arg1, arg2, arg3;
1942
1943 if (!getintintintintarg(args, &arg0, &arg1, &arg2, &arg3))
1944 return NULL;
1945
1946 fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);
1947
1948 INCREF(None);
1949 return None;
1950}
1951
1952static object *
1953forms_getmcolor (self, args)
1954 object *self;
1955 object *args;
1956{
1957 int arg, r, g, b;
1958 object *v;
1959
1960 if (!getintarg(args, &arg)) return NULL;
1961
1962 fl_getmcolor (arg, (short) r, (short)g, (short)b);
1963
1964 v = newtupleobject(3);
1965
1966 if (v == NULL) return NULL;
1967
1968 settupleitem(v, 0, newintobject(r));
1969 settupleitem(v, 1, newintobject(g));
1970 settupleitem(v, 2, newintobject(b));
1971
1972 return v;
1973}
1974
1975static object *
1976forms_tie(self, args)
1977 object *self;
1978 object *args;
1979{
1980 short arg1 ;
1981 short arg2 ;
1982 short arg3 ;
1983 if (!getishortarg(args, 3, 0, &arg1))
1984 return NULL;
1985 if (!getishortarg(args, 3, 1, &arg2))
1986 return NULL;
1987 if (!getishortarg(args, 3, 2, &arg3))
1988 return NULL;
1989 fl_tie( arg1 , arg2 , arg3 );
1990 INCREF(None);
1991 return None;
1992}
1993
1994static struct methodlist forms_methods[] = {
1995/* adm */
1996 {"make_form", forms_make_form},
1997 {"bgn_group", forms_bgn_group},
1998 {"end_group", forms_end_group},
1999/* gl support wrappers */
2000 {"qdevice", forms_qdevice},
2001 {"unqdevice", forms_unqdevice},
2002 {"isqueued", forms_isqueued},
2003 {"qtest", forms_qtest},
2004 {"qread", forms_qread},
2005/* {"blkqread", forms_blkqread}, */
2006 {"qreset", forms_qreset},
2007 {"qenter", forms_qenter},
2008 {"tie", forms_tie},
2009/* {"new_events", forms_new_events}, */
2010 {"color", forms_color},
2011 {"mapcolor", forms_mapcolor},
2012 {"getmcolor", forms_getmcolor},
2013/* interaction */
2014 {"do_forms", forms_do_forms},
2015 {"check_forms", forms_check_forms},
2016 {"set_event_call_back", forms_set_event_call_back},
2017/* goodies */
2018 {"show_message", form_show_message},
2019 {"show_question", form_show_question},
2020 {"file_selector", form_file_selector},
2021 {"get_directory", form_get_directory},
2022 {"get_pattern", form_get_pattern},
2023 {"get_filename", form_get_filename},
2024/*
2025 {"show_choice", form_show_choice},
2026 XXX - draw.c
2027*/
2028 {"show_input", form_show_input},
2029 {NULL, NULL} /* sentinel */
2030};
2031
2032void
2033initfl()
2034{
2035 initmodule("fl", forms_methods);
2036 foreground ();
2037}
2038
2039
2040/* Support routines */
2041
2042int
2043getintintstrarg(args, a, b, c)
2044 object *args;
2045 int *a, *b;
2046 object **c;
2047{
2048 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2049 err_badarg();
2050 return NULL;
2051 }
2052 return getintarg(gettupleitem(args, 0), a) &&
2053 getintarg(gettupleitem(args, 1), b) &&
2054 getstrarg(gettupleitem(args, 2), c);
2055}
2056
2057int
2058getintfloatfloatarg(args, a, b, c)
2059 object *args;
2060 int *a;
2061 float *b, *c;
2062{
2063 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2064 err_badarg();
2065 return NULL;
2066 }
2067 return getintarg(gettupleitem(args, 0), a) &&
2068 getfloatarg(gettupleitem(args, 1), b) &&
2069 getfloatarg(gettupleitem(args, 2), c);
2070}
2071
2072int
2073getintintintintarg(args, a, b, c, d)
2074 object *args;
2075 int *a, *b, *c, *d;
2076{
2077 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 4) {
2078 err_badarg();
2079 return NULL;
2080 }
2081 return getintarg(gettupleitem(args, 0), a) &&
2082 getintarg(gettupleitem(args, 1), b) &&
2083 getintarg(gettupleitem(args, 2), c) &&
2084 getintarg(gettupleitem(args, 3), d);
2085}
2086
2087int
2088getfloatarg(args, a)
2089 object *args;
2090 float *a;
2091{
2092 double x;
2093 if (!getdoublearg(args, &x))
2094 return 0;
2095 *a = x;
2096 return 1;
2097}
2098
2099int
2100getintfloatfloatfloatfloatstr (args, type, x, y, w, h, name)
2101 object *args;
2102 int *type;
2103 float *x, *y, *w, *h;
2104 object **name;
2105{
2106 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 6) {
2107 err_badarg();
2108 return NULL;
2109 }
2110 return getintarg(gettupleitem(args, 0), type) &&
2111 getfloatarg(gettupleitem(args, 1), x) &&
2112 getfloatarg(gettupleitem(args, 2), y) &&
2113 getfloatarg(gettupleitem(args, 3), w) &&
2114 getfloatarg(gettupleitem(args, 4), h) &&
2115 getstrarg(gettupleitem(args, 5), name);
2116}
2117
2118int
2119getfloatfloatfloatarg(args, f1, f2, f3)
2120 object *args;
2121 float *f1, *f2, *f3;
2122{
2123 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2124 err_badarg();
2125 return NULL;
2126 }
2127 return getfloatarg(gettupleitem(args, 0), f1) &&
2128 getfloatarg(gettupleitem(args, 1), f2) &&
2129 getfloatarg(gettupleitem(args, 2), f3);
2130}
2131
2132int
2133getfloatfloatarg(args, f1, f2)
2134 object *args;
2135 float *f1, *f2;
2136{
2137 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
2138 err_badarg();
2139 return NULL;
2140 }
2141 return getfloatarg(gettupleitem(args, 0), f1) &&
2142 getfloatarg(gettupleitem(args, 1), f2);
2143}
2144
2145int
2146getstrstrstrarg(v, a, b, c)
2147 object *v;
2148 object **a;
2149 object **b;
2150 object **c;
2151{
2152 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3) {
2153 return err_badarg();
2154 }
2155 return getstrarg(gettupleitem(v, 0), a) &&
2156 getstrarg(gettupleitem(v, 1), b)&&
2157 getstrarg(gettupleitem(v, 2), c);
2158}
2159
2160
2161int
2162getstrstrstrstrarg(v, a, b, c, d)
2163 object *v;
2164 object **a;
2165 object **b;
2166 object **c;
2167 object **d;
2168{
2169 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 4) {
2170 return err_badarg();
2171 }
2172 return getstrarg(gettupleitem(v, 0), a) &&
2173 getstrarg(gettupleitem(v, 1), b)&&
2174 getstrarg(gettupleitem(v, 2), c) &&
2175 getstrarg(gettupleitem(v, 3),d);
2176
2177}