blob: 48bbd3f16f2300f61d50f4d58c1543e7fa5c8fe5 [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
Guido van Rossum75cc8981991-08-08 12:07:45 +00001609static object *
1610forms_find_first_or_last (func, dummy, args)
1611 FL_OBJECT *(*func)(FL_FORM *, int, float, float);
1612 formobject *dummy;
1613 object *args;
1614{
1615 int type;
1616 float mx, my;
1617 FL_OBJECT *generic;
1618 genericobject *g;
1619
1620 if (!getintfloatfloatarg (args, &type, &mx, &my)) return NULL;
1621
1622 generic = (*func) (dummy-> ob_form, type, mx, my);
1623
1624 if (generic == NULL)
1625 {
1626 INCREF(None);
1627 return None;
1628 }
1629
1630 g = findgeneric(generic);
1631 if (g == NULL) {
1632 err_setstr(RuntimeError,
1633 "do_forms returns unknown object");
1634 return NULL;
1635 }
1636 INCREF(g);
1637 return ((object *) g);
1638}
1639
1640static object *
1641form_find_first (dummy, args)
1642 object *dummy;
1643 object *args;
1644{
1645 return (forms_find_first_or_last(fl_find_first, dummy, args));
1646}
1647
1648static object *
1649form_find_last (dummy, args)
1650 object *dummy;
1651 object *args;
1652{
1653 return (forms_find_first_or_last(fl_find_last, dummy, args));
1654}
1655
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001656static struct methodlist form_methods[] = {
1657/* adm */
1658 {"show_form", form_show_form},
1659 {"hide_form", form_hide_form},
1660 {"redraw_form", form_redraw_form},
1661 {"set_form_position", form_set_form_position},
1662 {"freeze_form", form_freeze_form},
1663 {"unfreeze_form", form_unfreeze_form},
1664 {"display_form", form_display_form},
1665 {"remove_form", form_remove_form},
1666 {"activate_form", form_activate_form},
1667 {"deactivate_form", form_deactivate_form},
Guido van Rossum75cc8981991-08-08 12:07:45 +00001668 {"find_first", form_find_first},
1669 {"find_last", form_find_last},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001670
1671/* basic objects */
1672 {"add_button", form_add_button},
1673/* {"add_bitmap", form_add_bitmap}, */
1674 {"add_lightbutton", form_add_lightbutton},
1675 {"add_roundbutton", form_add_roundbutton},
1676 {"add_menu", form_add_menu},
1677 {"add_slider", form_add_slider},
1678 {"add_positioner", form_add_positioner},
1679 {"add_valslider", form_add_valslider},
1680 {"add_dial", form_add_dial},
1681 {"add_counter", form_add_counter},
1682 {"add_default", form_add_default},
1683 {"add_box", form_add_box},
1684 {"add_clock", form_add_clock},
1685 {"add_choice", form_add_choice},
1686 {"add_browser", form_add_browser},
1687 {"add_input", form_add_input},
1688 {"add_timer", form_add_timer},
1689 {"add_text", form_add_text},
1690 {NULL, NULL} /* sentinel */
1691};
1692
1693static void
1694form_dealloc(f)
1695 formobject *f;
1696{
1697 /* XXX can't destroy form objects !!! */
1698 DEL(f);
1699}
1700
1701static object *
1702form_getattr(f, name)
1703 formobject *f;
1704 char *name;
1705{
1706 /* XXX check for data attr's: x, y etc. */
1707 return findmethod(form_methods, (object *)f, name);
1708}
1709
1710typeobject Formtype = {
1711 OB_HEAD_INIT(&Typetype)
1712 0, /*ob_size*/
1713 "form", /*tp_name*/
1714 sizeof(formobject), /*tp_size*/
1715 0, /*tp_itemsize*/
1716 /* methods */
1717 form_dealloc, /*tp_dealloc*/
1718 0, /*tp_print*/
1719 form_getattr, /*tp_getattr*/
1720 0, /*tp_setattr*/
1721 0, /*tp_compare*/
1722 0, /*tp_repr*/
1723};
1724
1725static object *
1726newformobject(form)
1727 FL_FORM *form;
1728{
1729 formobject *f;
1730 f = NEWOBJ(formobject, &Formtype);
1731 if (f == NULL)
1732 return NULL;
1733 f->ob_form = form;
1734 return (object *)f;
1735}
1736
1737/* The "fl" module */
1738static object *
1739forms_make_form(dummy, args)
1740 object *dummy;
1741 object *args;
1742{
1743 int type;
1744 float w, h;
1745 FL_FORM *form;
1746 if (!getintfloatfloatarg(args, &type, &w, &h))
1747 return NULL;
1748 form = fl_bgn_form(type, w, h);
1749 if (form == NULL) {
1750 /* XXX Actually, cannot happen! */
1751 err_nomem();
1752 return NULL;
1753 }
1754 fl_end_form();
1755 return newformobject(form);
1756}
1757
1758static object *my_event_callback = NULL;
1759
1760static object *
1761forms_set_event_call_back(dummy, args)
1762 object *dummy;
1763 object *args;
1764{
1765 my_event_callback = args;
1766 XINCREF(args);
1767 INCREF(None);
1768 return None;
1769}
1770
1771static object *
1772forms_do_or_check_forms(dummy, args, func)
1773 object *dummy;
1774 object *args;
1775 FL_OBJECT *(*func)();
1776{
1777 FL_OBJECT *generic;
1778 genericobject *g;
1779 object *arg, *res;
1780
1781 if (!getnoarg(args))
1782 return NULL;
1783
1784 for (;;) {
1785 generic = (*func)();
1786 if (generic == NULL) {
1787 INCREF(None);
1788 return None;
1789 }
1790 if (generic == FL_EVENT) {
1791 int dev;
1792 short val;
1793 if (my_event_callback == NULL)
1794 return newintobject(-1);
1795 dev = fl_qread(&val);
1796 arg = newtupleobject(2);
1797 if (arg == NULL)
1798 return NULL;
1799 settupleitem(arg, 0, newintobject((long)dev));
1800 settupleitem(arg, 1, newintobject((long)val));
1801 res = call_object(my_event_callback, arg);
1802 XDECREF(res);
1803 DECREF(arg);
1804 if (res == NULL)
1805 return NULL; /* Callback raised exception */
1806 continue;
1807 }
1808 g = findgeneric(generic);
1809 if (g == NULL) {
1810 err_setstr(RuntimeError,
1811 "do_forms returns unknown object");
1812 return NULL;
1813 }
1814 if (g->ob_callback == NULL) {
1815 INCREF(g);
1816 return ((object *) g);
1817 }
1818 arg = newtupleobject(2);
1819 INCREF(g);
1820 settupleitem(arg, 0, g);
1821 INCREF(g->ob_callback_arg);
1822 settupleitem(arg, 1, g->ob_callback_arg);
1823 res = call_object(g->ob_callback, arg);
1824 XDECREF(res);
1825 DECREF(arg);
1826 if (res == NULL)
1827 return NULL; /* Callback raised exception */
1828 }
1829}
1830
1831static object *
1832forms_do_forms (dummy, args)
1833 object *dummy;
1834 object *args;
1835{
1836 return forms_do_or_check_forms (dummy, args, fl_do_forms);
1837}
1838
1839static object *
1840forms_check_forms (dummy, args)
1841 object *dummy;
1842 object *args;
1843{
1844 return forms_do_or_check_forms (dummy, args, fl_check_forms);
1845}
1846
1847static object *
1848fl_call(func, args)
1849 object *args;
1850 void (*func)();
1851{
1852 if (!getnoarg(args))
1853 return NULL;
1854 (*func)();
1855 INCREF(None);
1856 return None;
1857}
1858
1859static object *
1860forms_bgn_group (dummy, args)
1861 object *dummy;
1862 object *args;
1863{
1864 return fl_call (fl_bgn_group, dummy, args);
1865}
1866
1867static object *
1868forms_end_group (dummy, args)
1869 object *dummy;
1870 object *args;
1871{
1872 return fl_call (fl_end_group, args);
1873}
1874
1875static object *
1876forms_qdevice(self, args)
1877 object *self;
1878 object *args;
1879{
1880 short arg1 ;
1881 if (!getishortarg(args, 1, 0, &arg1))
1882 return NULL;
1883 fl_qdevice( arg1 );
1884 INCREF(None);
1885 return None;
1886}
1887
1888static object *
1889forms_unqdevice(self, args)
1890 object *self;
1891 object *args;
1892{
1893 short arg1 ;
1894 if (!getishortarg(args, 1, 0, &arg1))
1895 return NULL;
1896 fl_unqdevice( arg1 );
1897 INCREF(None);
1898 return None;
1899}
1900
1901static object *
1902forms_isqueued(self, args)
1903 object *self;
1904 object *args;
1905{
1906 int retval;
1907 short arg1 ;
1908 if (!getishortarg(args, 1, 0, &arg1))
1909 return NULL;
1910 retval = fl_isqueued( arg1 );
1911
1912 return newintobject((int) retval);
1913}
1914
1915static object *
1916forms_qtest(self, args)
1917 object *self;
1918 object *args;
1919{
1920 long retval;
1921 retval = fl_qtest( );
1922 return newintobject((int) retval);
1923}
1924
1925
1926static object *
1927forms_qread(self, args)
1928 object *self;
1929 object *args;
1930{
1931 long retval;
1932 short arg1 ;
1933 retval = fl_qread( & arg1 );
1934 { object *v = newtupleobject( 2 );
1935 if (v == NULL) return NULL;
1936 settupleitem(v, 0, newintobject(retval));
1937 settupleitem(v, 1, newintobject((long)arg1));
1938 return v;
1939 }
1940}
1941
1942static object *
1943forms_qreset(self, args)
1944 object *self;
1945 object *args;
1946{
1947 if (!getnoarg(args)) return NULL;
1948
1949 forms_qreset();
1950 INCREF(None);
1951 return None;
1952}
1953
1954static object *
1955forms_qenter(self, args)
1956 object *self;
1957 object *args;
1958{
1959 short arg1 ;
1960 short arg2 ;
1961 if (!getishortarg(args, 2, 0, &arg1))
1962 return NULL;
1963 if (!getishortarg(args, 2, 1, &arg2))
1964 return NULL;
1965 fl_qenter( arg1 , arg2 );
1966 INCREF(None);
1967 return None;
1968}
1969
1970static object *
1971forms_color (self, args)
1972 object *self;
1973 object *args;
1974{
1975 int arg;
1976
1977 if (!getintarg(args, &arg)) return NULL;
1978
1979 fl_color((short) arg);
1980
1981 INCREF(None);
1982 return None;
1983}
1984
1985static object *
1986forms_mapcolor (self, args)
1987 object *self;
1988 object *args;
1989{
1990 int arg0, arg1, arg2, arg3;
1991
1992 if (!getintintintintarg(args, &arg0, &arg1, &arg2, &arg3))
1993 return NULL;
1994
1995 fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);
1996
1997 INCREF(None);
1998 return None;
1999}
2000
2001static object *
2002forms_getmcolor (self, args)
2003 object *self;
2004 object *args;
2005{
2006 int arg, r, g, b;
2007 object *v;
2008
2009 if (!getintarg(args, &arg)) return NULL;
2010
2011 fl_getmcolor (arg, (short) r, (short)g, (short)b);
2012
2013 v = newtupleobject(3);
2014
2015 if (v == NULL) return NULL;
2016
2017 settupleitem(v, 0, newintobject(r));
2018 settupleitem(v, 1, newintobject(g));
2019 settupleitem(v, 2, newintobject(b));
2020
2021 return v;
2022}
2023
2024static object *
Guido van Rossum75cc8981991-08-08 12:07:45 +00002025forms_get_mouse (self, args)
2026 object *self;
2027 object *args;
2028{
2029 float x, y ;
2030 object *v;
2031
2032 if (!getnoarg(args)) return NULL;
2033
2034 fl_get_mouse (&x, &y);
2035
2036 v = newtupleobject(2);
2037
2038 if (v == NULL) return NULL;
2039
2040 settupleitem(v, 0, newfloatobject(x));
2041 settupleitem(v, 1, newfloatobject(y));
2042
2043 return v;
2044}
2045
2046static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002047forms_tie(self, args)
2048 object *self;
2049 object *args;
2050{
2051 short arg1 ;
2052 short arg2 ;
2053 short arg3 ;
2054 if (!getishortarg(args, 3, 0, &arg1))
2055 return NULL;
2056 if (!getishortarg(args, 3, 1, &arg2))
2057 return NULL;
2058 if (!getishortarg(args, 3, 2, &arg3))
2059 return NULL;
2060 fl_tie( arg1 , arg2 , arg3 );
2061 INCREF(None);
2062 return None;
2063}
2064
2065static struct methodlist forms_methods[] = {
2066/* adm */
2067 {"make_form", forms_make_form},
2068 {"bgn_group", forms_bgn_group},
2069 {"end_group", forms_end_group},
2070/* gl support wrappers */
2071 {"qdevice", forms_qdevice},
2072 {"unqdevice", forms_unqdevice},
2073 {"isqueued", forms_isqueued},
2074 {"qtest", forms_qtest},
2075 {"qread", forms_qread},
2076/* {"blkqread", forms_blkqread}, */
2077 {"qreset", forms_qreset},
2078 {"qenter", forms_qenter},
2079 {"tie", forms_tie},
Guido van Rossum75cc8981991-08-08 12:07:45 +00002080 {"get_mouse", forms_get_mouse},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002081/* {"new_events", forms_new_events}, */
2082 {"color", forms_color},
2083 {"mapcolor", forms_mapcolor},
2084 {"getmcolor", forms_getmcolor},
2085/* interaction */
2086 {"do_forms", forms_do_forms},
2087 {"check_forms", forms_check_forms},
2088 {"set_event_call_back", forms_set_event_call_back},
2089/* goodies */
2090 {"show_message", form_show_message},
2091 {"show_question", form_show_question},
2092 {"file_selector", form_file_selector},
2093 {"get_directory", form_get_directory},
2094 {"get_pattern", form_get_pattern},
2095 {"get_filename", form_get_filename},
2096/*
2097 {"show_choice", form_show_choice},
2098 XXX - draw.c
2099*/
2100 {"show_input", form_show_input},
2101 {NULL, NULL} /* sentinel */
2102};
2103
2104void
2105initfl()
2106{
2107 initmodule("fl", forms_methods);
2108 foreground ();
2109}
2110
2111
2112/* Support routines */
2113
2114int
2115getintintstrarg(args, a, b, c)
2116 object *args;
2117 int *a, *b;
2118 object **c;
2119{
2120 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2121 err_badarg();
2122 return NULL;
2123 }
2124 return getintarg(gettupleitem(args, 0), a) &&
2125 getintarg(gettupleitem(args, 1), b) &&
2126 getstrarg(gettupleitem(args, 2), c);
2127}
2128
2129int
2130getintfloatfloatarg(args, a, b, c)
2131 object *args;
2132 int *a;
2133 float *b, *c;
2134{
2135 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2136 err_badarg();
2137 return NULL;
2138 }
2139 return getintarg(gettupleitem(args, 0), a) &&
2140 getfloatarg(gettupleitem(args, 1), b) &&
2141 getfloatarg(gettupleitem(args, 2), c);
2142}
2143
2144int
2145getintintintintarg(args, a, b, c, d)
2146 object *args;
2147 int *a, *b, *c, *d;
2148{
2149 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 4) {
2150 err_badarg();
2151 return NULL;
2152 }
2153 return getintarg(gettupleitem(args, 0), a) &&
2154 getintarg(gettupleitem(args, 1), b) &&
2155 getintarg(gettupleitem(args, 2), c) &&
2156 getintarg(gettupleitem(args, 3), d);
2157}
2158
2159int
2160getfloatarg(args, a)
2161 object *args;
2162 float *a;
2163{
2164 double x;
2165 if (!getdoublearg(args, &x))
2166 return 0;
2167 *a = x;
2168 return 1;
2169}
2170
2171int
2172getintfloatfloatfloatfloatstr (args, type, x, y, w, h, name)
2173 object *args;
2174 int *type;
2175 float *x, *y, *w, *h;
2176 object **name;
2177{
2178 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 6) {
2179 err_badarg();
2180 return NULL;
2181 }
2182 return getintarg(gettupleitem(args, 0), type) &&
2183 getfloatarg(gettupleitem(args, 1), x) &&
2184 getfloatarg(gettupleitem(args, 2), y) &&
2185 getfloatarg(gettupleitem(args, 3), w) &&
2186 getfloatarg(gettupleitem(args, 4), h) &&
2187 getstrarg(gettupleitem(args, 5), name);
2188}
2189
2190int
2191getfloatfloatfloatarg(args, f1, f2, f3)
2192 object *args;
2193 float *f1, *f2, *f3;
2194{
2195 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2196 err_badarg();
2197 return NULL;
2198 }
2199 return getfloatarg(gettupleitem(args, 0), f1) &&
2200 getfloatarg(gettupleitem(args, 1), f2) &&
2201 getfloatarg(gettupleitem(args, 2), f3);
2202}
2203
2204int
2205getfloatfloatarg(args, f1, f2)
2206 object *args;
2207 float *f1, *f2;
2208{
2209 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
2210 err_badarg();
2211 return NULL;
2212 }
2213 return getfloatarg(gettupleitem(args, 0), f1) &&
2214 getfloatarg(gettupleitem(args, 1), f2);
2215}
2216
2217int
2218getstrstrstrarg(v, a, b, c)
2219 object *v;
2220 object **a;
2221 object **b;
2222 object **c;
2223{
2224 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3) {
2225 return err_badarg();
2226 }
2227 return getstrarg(gettupleitem(v, 0), a) &&
2228 getstrarg(gettupleitem(v, 1), b)&&
2229 getstrarg(gettupleitem(v, 2), c);
2230}
2231
2232
2233int
2234getstrstrstrstrarg(v, a, b, c, d)
2235 object *v;
2236 object **a;
2237 object **b;
2238 object **c;
2239 object **d;
2240{
2241 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 4) {
2242 return err_badarg();
2243 }
2244 return getstrarg(gettupleitem(v, 0), a) &&
2245 getstrarg(gettupleitem(v, 1), b)&&
2246 getstrarg(gettupleitem(v, 2), c) &&
2247 getstrarg(gettupleitem(v, 3),d);
2248
2249}