blob: 2251bbfc43810b49da2abd4aca00c667ed4727ff [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
Guido van Rossum03747111991-08-08 12:10:01 +0000177 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000178};
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) {
Guido van Rossum03747111991-08-08 12:10:01 +0000225 meth = findmethod(g->ob_methods, (object *)g, name);
226 if (meth != NULL) return meth;
227 err_clear();
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000228 }
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)
Guido van Rossumabe58351991-08-08 12:34:44 +0000316 void (*func)(FL_OBJECT *, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000317 FL_OBJECT *obj;
318 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000319{
Guido van Rossum03747111991-08-08 12:10:01 +0000320 float parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000321
Guido van Rossum03747111991-08-08 12:10:01 +0000322 if (!getfloatarg (args, &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000323
Guido van Rossum03747111991-08-08 12:10:01 +0000324 (*func) (obj, parameter);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000325
Guido van Rossum03747111991-08-08 12:10:01 +0000326 INCREF(None);
327 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000328}
329
330/* void func (object, float) */
331static object *
332call_forms_INfINf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000333 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000334 FL_OBJECT *obj;
335 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000336{
Guido van Rossum03747111991-08-08 12:10:01 +0000337 float par1, par2;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000338
Guido van Rossum03747111991-08-08 12:10:01 +0000339 if (!getfloatfloatarg (args, &par1, &par2)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000340
Guido van Rossum03747111991-08-08 12:10:01 +0000341 (*func) (obj, par1, par2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000342
Guido van Rossum03747111991-08-08 12:10:01 +0000343 INCREF(None);
344 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000345}
346
347/* void func (object, int) */
348static object *
349call_forms_INi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000350 void (*func)(FL_OBJECT *, int);
Guido van Rossum03747111991-08-08 12:10:01 +0000351 FL_OBJECT *obj;
352 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000353{
Guido van Rossum03747111991-08-08 12:10:01 +0000354 int parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000355
Guido van Rossum03747111991-08-08 12:10:01 +0000356 if (!getintarg (args, &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000357
Guido van Rossum03747111991-08-08 12:10:01 +0000358 (*func) (obj, parameter);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000359
Guido van Rossum03747111991-08-08 12:10:01 +0000360 INCREF(None);
361 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000362}
363
364/* void func (object, string) */
365static object *
366call_forms_INstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000367 void (*func)(FL_OBJECT *, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000368 FL_OBJECT *obj;
369 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000370{
Guido van Rossum03747111991-08-08 12:10:01 +0000371 object *a;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000372
Guido van Rossum03747111991-08-08 12:10:01 +0000373 if (!getstrarg (args, &a)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000374
Guido van Rossum03747111991-08-08 12:10:01 +0000375 (*func) (obj, getstringvalue (a));
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000376
Guido van Rossum03747111991-08-08 12:10:01 +0000377 INCREF(None);
378 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000379}
380
381
382/* voide func (object, int, string) */
383static object *
384call_forms_INiINstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000385 void (*func)(FL_OBJECT *, int, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000386 FL_OBJECT *obj;
387 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000388{
Guido van Rossum03747111991-08-08 12:10:01 +0000389 object *a;
390 int b;
391
392 if (!getintstrarg (args, &b, &a)) return NULL;
393
394 (*func) (obj, b, getstringvalue (a));
395
396 INCREF(None);
397 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000398}
399
Guido van Rossum03747111991-08-08 12:10:01 +0000400#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000401/* void func (object, float) */
402static object *
403call_forms_INiINi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000404 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000405 FL_OBJECT *obj;
406 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000407{
Guido van Rossum03747111991-08-08 12:10:01 +0000408 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;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000416}
Guido van Rossum03747111991-08-08 12:10:01 +0000417#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000418
419/* int func (object) */
420static object *
421call_forms_Ri (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000422 int (*func)(FL_OBJECT *);
423 FL_OBJECT *obj;
424 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000425{
Guido van Rossum03747111991-08-08 12:10:01 +0000426 int retval;
427
428 if (!getnoarg(args)) return NULL;
429
430 retval = (*func) (obj);
431
432 return newintobject ((long) retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000433}
434
435/* char * func (object) */
436static object *
437call_forms_Rstr (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000438 char * (*func)(FL_OBJECT *);
439 FL_OBJECT *obj;
440 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000441{
Guido van Rossum03747111991-08-08 12:10:01 +0000442 char *str;
443
444 if (!getnoarg (args)) return NULL;
445
446 str = (*func) (obj);
447
448 return newstringobject (str);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000449}
450
451/* int func (object) */
452static object *
453call_forms_Rf (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000454 float (*func)(FL_OBJECT *);
455 FL_OBJECT *obj;
456 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000457{
Guido van Rossum03747111991-08-08 12:10:01 +0000458 float retval;
459
460 if (!getnoarg(args)) return NULL;
461
462 retval = (*func) (obj);
463
464 return newfloatobject (retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000465}
466
467static object *
468call_forms_OUTfOUTf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000469 void (*func)(FL_OBJECT *, float *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000470 FL_OBJECT *obj;
471 object *args;
472{
473 float f1, f2;
474 object *arg;
Guido van Rossum03747111991-08-08 12:10:01 +0000475
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000476 if (!getnoarg(args)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000477
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000478 (*func) (obj, &f1, &f2);
479
480 arg = newtupleobject (2);
481 if (arg == NULL) return NULL;
482
483 settupleitem (arg, 0, newfloatobject (f1));
484 settupleitem (arg, 1, newfloatobject (f2));
485 return arg;
486}
487
Guido van Rossum03747111991-08-08 12:10:01 +0000488#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000489static object *
490call_forms_OUTf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000491 void (*func)(FL_OBJECT *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000492 FL_OBJECT *obj;
493 object *args;
494{
495 float f;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000496
497 if (!getnoarg(args)) return NULL;
498
499 (*func) (obj, &f);
500
501 return newfloatobject (f);
502}
Guido van Rossum03747111991-08-08 12:10:01 +0000503#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000504
505/**********************************************************************/
506/* Class : browser */
507
508static object *
509set_browser_topline(g, args)
510 genericobject *g;
511 object *args;
512{
Guido van Rossum03747111991-08-08 12:10:01 +0000513 return call_forms_INi (fl_set_browser_topline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000514}
515
516static object *
517clear_browser(g, args)
518 genericobject *g;
519 object *args;
520{
Guido van Rossum03747111991-08-08 12:10:01 +0000521 return generic_call (g, args, fl_clear_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000522}
523
524static object *
525add_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000526 genericobject *g;
527 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000528{
Guido van Rossum03747111991-08-08 12:10:01 +0000529 return call_forms_INstr (fl_add_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000530}
531
532static object *
533addto_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000534 genericobject *g;
535 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000536{
Guido van Rossum03747111991-08-08 12:10:01 +0000537 return call_forms_INstr (fl_addto_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000538}
539
540static object *
541insert_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000542 genericobject *g;
543 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000544{
Guido van Rossum03747111991-08-08 12:10:01 +0000545 return call_forms_INiINstr (fl_insert_browser_line,
546 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000547}
548
549static object *
550delete_browser_line (g, args)
551 genericobject *g;
552 object *args;
553{
Guido van Rossum03747111991-08-08 12:10:01 +0000554 return call_forms_INi (fl_delete_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000555}
556
557static object *
558replace_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000559 genericobject *g;
560 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000561{
Guido van Rossum03747111991-08-08 12:10:01 +0000562 return call_forms_INiINstr (fl_replace_browser_line,
563 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000564}
565
566static object *
567get_browser_line(g, args)
568 genericobject *g;
569 object *args;
570{
571 int i;
572 char *str;
573
574 if (!getintarg(args, &i))
575 return NULL;
576
577 str = fl_get_browser_line (g->ob_generic, i);
578
579 return newstringobject (str);
580}
581
582static object *
583load_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000584 genericobject *g;
585 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000586{
Guido van Rossumabe58351991-08-08 12:34:44 +0000587 /* XXX strictly speaking this is wrong since fl_load_browser
588 XXX returns int, not void */
Guido van Rossum03747111991-08-08 12:10:01 +0000589 return call_forms_INstr (fl_load_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000590}
591
592static object *
593get_browser_maxline(g, args)
594 genericobject *g;
595 object *args;
596{
Guido van Rossum03747111991-08-08 12:10:01 +0000597 return call_forms_Ri (fl_get_browser_maxline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000598}
599
600static object *
601select_browser_line (g, args)
602 genericobject *g;
603 object *args;
604{
Guido van Rossum03747111991-08-08 12:10:01 +0000605 return call_forms_INi (fl_select_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000606}
607
608static object *
609deselect_browser_line (g, args)
610 genericobject *g;
611 object *args;
612{
Guido van Rossum03747111991-08-08 12:10:01 +0000613 return call_forms_INi (fl_deselect_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000614}
615
616static object *
617deselect_browser (g, args)
618 genericobject *g;
619 object *args;
620{
Guido van Rossum03747111991-08-08 12:10:01 +0000621 return generic_call (g, args, fl_deselect_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000622}
623
624static object *
625isselected_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000626 genericobject *g;
627 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000628{
629 int i, j;
Guido van Rossum03747111991-08-08 12:10:01 +0000630
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000631 if (!getintarg(args, &i))
632 return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000633
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000634 j = fl_isselected_browser_line (g->ob_generic, i);
Guido van Rossum03747111991-08-08 12:10:01 +0000635
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000636 return newintobject (j);
637}
638
639static object *
640get_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000641 genericobject *g;
642 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000643{
Guido van Rossum03747111991-08-08 12:10:01 +0000644 return call_forms_Ri (fl_get_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000645}
646
647static object *
648set_browser_fontsize (g, args)
649 genericobject *g;
650 object *args;
651{
Guido van Rossum03747111991-08-08 12:10:01 +0000652 return call_forms_INf (fl_set_browser_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000653}
654
655static object *
656set_browser_fontstyle (g, args)
657 genericobject *g;
658 object *args;
659{
Guido van Rossum03747111991-08-08 12:10:01 +0000660 return call_forms_INi (fl_set_browser_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000661}
662
663static struct methodlist browser_methods[] = {
664 {"set_browser_topline", set_browser_topline},
665 {"clear_browser", clear_browser},
666 {"add_browser_line", add_browser_line},
667 {"addto_browser", addto_browser},
668 {"insert_browser_line", insert_browser_line},
669 {"delete_browser_line", delete_browser_line},
670 {"replace_browser_line",replace_browser_line},
671 {"get_browser_line", get_browser_line},
672 {"load_browser", load_browser},
673 {"get_browser_maxline", get_browser_maxline},
674 {"select_browser_line", select_browser_line},
675 {"deselect_browser_line", deselect_browser_line},
676 {"deselect_browser", deselect_browser},
677 {"isselected_browser_line", isselected_browser_line},
678 {"get_browser", get_browser},
679 {"set_browser_fontsize",set_browser_fontsize},
680 {"set_browser_fontstyle", set_browser_fontstyle},
681 {NULL, NULL} /* sentinel */
682};
683
684/* Class: button */
685
686static object *
687set_button(g, args)
688 genericobject *g;
689 object *args;
690{
Guido van Rossum03747111991-08-08 12:10:01 +0000691 return call_forms_INi (fl_set_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000692}
693
694static object *
695get_button(g, args)
696 genericobject *g;
697 object *args;
698{
Guido van Rossum03747111991-08-08 12:10:01 +0000699 return call_forms_Ri (fl_get_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000700}
701
702static struct methodlist button_methods[] = {
703 {"set_button", set_button},
704 {"get_button", get_button},
705 {NULL, NULL} /* sentinel */
706};
707
708/* Class: choice */
709
710static object *
711set_choice(g, args)
712 genericobject *g;
713 object *args;
714{
Guido van Rossum03747111991-08-08 12:10:01 +0000715 return call_forms_INi (fl_set_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000716}
717
718static object *
719get_choice(g, args)
720 genericobject *g;
721 object *args;
722{
Guido van Rossum03747111991-08-08 12:10:01 +0000723 return call_forms_Ri (fl_get_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000724}
725
726static object *
727clear_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000728 genericobject *g;
729 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000730{
Guido van Rossum03747111991-08-08 12:10:01 +0000731 return generic_call (g, args, fl_clear_choice);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000732}
733
734static object *
735addto_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000736 genericobject *g;
737 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000738{
Guido van Rossum03747111991-08-08 12:10:01 +0000739 return call_forms_INstr (fl_addto_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000740}
741
742static object *
743replace_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000744 genericobject *g;
745 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000746{
Guido van Rossum03747111991-08-08 12:10:01 +0000747 return call_forms_INiINstr (fl_replace_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000748}
749
750static object *
751delete_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000752 genericobject *g;
753 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000754{
Guido van Rossum03747111991-08-08 12:10:01 +0000755 return call_forms_INi (fl_delete_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000756}
757
758static object *
759get_choice_text (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000760 genericobject *g;
761 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000762{
Guido van Rossum03747111991-08-08 12:10:01 +0000763 return call_forms_Rstr (fl_get_choice_text, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000764}
765
766static object *
767set_choice_fontsize (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000768 genericobject *g;
769 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000770{
Guido van Rossum03747111991-08-08 12:10:01 +0000771 return call_forms_INf (fl_set_choice_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000772}
773
774static object *
775set_choice_fontstyle (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000776 genericobject *g;
777 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000778{
Guido van Rossum03747111991-08-08 12:10:01 +0000779 return call_forms_INi (fl_set_choice_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000780}
781
782static struct methodlist choice_methods[] = {
783 {"set_choice", set_choice},
784 {"get_choice", get_choice},
785 {"clear_choice", clear_choice},
786 {"addto_choice", addto_choice},
787 {"replace_choice", replace_choice},
788 {"delete_choice", delete_choice},
789 {"get_choice_text", get_choice_text},
790 {"set_choice_fontsize", set_choice_fontsize},
791 {"set_choice_fontstyle",set_choice_fontstyle},
792 {NULL, NULL} /* sentinel */
793};
794
795/* Class : Clock */
796
797static object *
798get_clock(g, args)
799 genericobject *g;
800 object *args;
801{
802 int i0, i1, i2;
803 object *arg;
804
805 if (!getnoarg(args))
806 return NULL;
807
808 fl_get_clock (g->ob_generic, &i0, &i1, &i2);
809
810 arg = newtupleobject (3);
811 if (arg == NULL) return NULL;
812
813 settupleitem (arg, 0, newintobject (i0));
814 settupleitem (arg, 1, newintobject (i1));
815 settupleitem (arg, 2, newintobject (i2));
816 return arg;
817}
818
819static struct methodlist clock_methods[] = {
820 {"get_clock", get_clock},
821 {NULL, NULL} /* sentinel */
822};
823
824/* CLass : Counters */
825
826static object *
827get_counter_value(g, args)
828 genericobject *g;
829 object *args;
830{
831 return call_forms_Rf (fl_get_counter_value, g-> ob_generic, args);
832}
833
834static object *
835set_counter_value (g, args)
836 genericobject *g;
837 object *args;
838{
839 return call_forms_INf (fl_set_counter_value, g-> ob_generic, args);
840}
841
842static object *
843set_counter_precision (g, args)
844 genericobject *g;
845 object *args;
846{
847 return call_forms_INi (fl_set_counter_precision, g-> ob_generic, args);
848}
849
850static object *
851set_counter_bounds (g, args)
852 genericobject *g;
853 object *args;
854{
855 return call_forms_INfINf (fl_set_counter_bounds, g-> ob_generic, args);
856}
857
858static object *
859set_counter_step (g, args)
860 genericobject *g;
861 object *args;
862{
863 return call_forms_INfINf (fl_set_counter_step, g-> ob_generic, args);
864}
865
866static object *
867set_counter_return (g, args)
868 genericobject *g;
869 object *args;
870{
Guido van Rossum03747111991-08-08 12:10:01 +0000871 return call_forms_INi (fl_set_counter_return, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000872}
873
874static struct methodlist counter_methods[] = {
875 {"set_counter_value", set_counter_value},
876 {"get_counter_value", get_counter_value},
877 {"set_counter_bounds", set_counter_bounds},
878 {"set_counter_step", set_counter_step},
879 {"set_counter_precision", set_counter_precision},
880 {"set_counter_return", set_counter_return},
881 {NULL, NULL} /* sentinel */
882};
883
884/* Class : Defaults */
885
886static object *
887get_default(g, args)
888 genericobject *g;
889 object *args;
890{
Guido van Rossum03747111991-08-08 12:10:01 +0000891 char c;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000892
Guido van Rossum03747111991-08-08 12:10:01 +0000893 if (!getnoarg(args)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000894
Guido van Rossum03747111991-08-08 12:10:01 +0000895 c = fl_get_default (g->ob_generic);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000896
Guido van Rossum03747111991-08-08 12:10:01 +0000897 return ((object *) mknewcharobject (c)); /* in cgensupport.c */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000898}
899
900static struct methodlist default_methods[] = {
901 {"get_default", get_default},
902 {NULL, NULL} /* sentinel */
903};
904
905
906/* Class: Dials */
907
908static object *
909set_dial (g, args)
910 genericobject *g;
911 object *args;
912{
913 float f1, f2, f3;
914
915 if (!getfloatfloatfloatarg(args, &f1, &f2, &f3))
916 return NULL;
917 fl_set_dial (g->ob_generic, f1, f2, f3);
918 INCREF(None);
919 return None;
920}
921
922static object *
923get_dial(g, args)
924 genericobject *g;
925 object *args;
926{
927 return call_forms_Rf (fl_get_dial, g-> ob_generic, args);
928}
929
930static object *
931set_dial_value (g, args)
932 genericobject *g;
933 object *args;
934{
935 return call_forms_INf (fl_set_dial_value, g-> ob_generic, args);
936}
937
938static object *
939set_dial_bounds (g, args)
940 genericobject *g;
941 object *args;
942{
943 return call_forms_INfINf (fl_set_dial_bounds, g-> ob_generic, args);
944}
945
946static object *
947get_dial_bounds (g, args)
948 genericobject *g;
949 object *args;
950{
951 return call_forms_OUTfOUTf (fl_get_dial_bounds, g-> ob_generic, args);
952}
953
954static struct methodlist dial_methods[] = {
955 {"set_dial", set_dial},
956 {"get_dial", get_dial},
957 {"set_dial_value", set_dial_value},
958 {"get_dial_value", get_dial},
959 {"set_dial_bounds", set_dial_bounds},
960 {"get_dial_bounds", get_dial_bounds},
961 {NULL, NULL} /* sentinel */
962};
963
964/* Class : Input */
965
966static object *
967set_input (g, args)
968 genericobject *g;
969 object *args;
970{
971 return call_forms_INstr (fl_set_input, g-> ob_generic, args);
972}
973
974static object *
975get_input (g, args)
976 genericobject *g;
977 object *args;
978{
979 return call_forms_Rstr (fl_get_input, g-> ob_generic, args);
980}
981
982static object *
983set_input_color (g, args)
984 genericobject *g;
985 object *args;
986{
987 return call_forms_INfINf (fl_set_input_color, g-> ob_generic, args);
988}
989
990static struct methodlist input_methods[] = {
991 {"set_input", set_input},
992 {"get_input", get_input},
993 {"set_input_color", set_input_color},
994 {NULL, NULL} /* sentinel */
995};
996
997
998/* Class : Menu */
999
1000static object *
1001set_menu (g, args)
1002 genericobject *g;
1003 object *args;
1004{
Guido van Rossumabe58351991-08-08 12:34:44 +00001005 return call_forms_INstr (fl_set_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001006}
1007
1008static object *
1009get_menu (g, args)
1010 genericobject *g;
1011 object *args;
1012{
Guido van Rossumabe58351991-08-08 12:34:44 +00001013 /* XXX strictly speaking this is wrong since fl_get_menu
1014 XXX returns long, not int */
1015 return call_forms_Ri (fl_get_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001016}
1017
1018static object *
1019addto_menu (g, args)
1020 genericobject *g;
1021 object *args;
1022{
Guido van Rossumabe58351991-08-08 12:34:44 +00001023 return call_forms_INstr (fl_addto_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001024}
1025
1026static struct methodlist menu_methods[] = {
1027 {"set_menu", set_menu},
1028 {"get_menu", get_menu},
1029 {"addto_menu", addto_menu},
1030 {NULL, NULL} /* sentinel */
1031};
1032
1033
1034/* Class: Sliders */
1035
1036static object *
1037set_slider (g, args)
1038 genericobject *g;
1039 object *args;
1040{
1041 float f1, f2, f3;
1042
1043 if (!getfloatfloatfloatarg(args, &f1, &f2, &f3))
1044 return NULL;
1045 fl_set_slider (g->ob_generic, f1, f2, f3);
1046 INCREF(None);
1047 return None;
1048}
1049
1050static object *
1051get_slider(g, args)
1052 genericobject *g;
1053 object *args;
1054{
1055 return call_forms_Rf (fl_get_slider, g-> ob_generic, args);
1056}
1057
1058static object *
1059set_slider_value (g, args)
1060 genericobject *g;
1061 object *args;
1062{
1063 return call_forms_INf (fl_set_slider_value, g-> ob_generic, args);
1064}
1065
1066static object *
1067set_slider_bounds (g, args)
1068 genericobject *g;
1069 object *args;
1070{
1071 return call_forms_INfINf (fl_set_slider_bounds, g-> ob_generic, args);
1072}
1073
1074static object *
1075get_slider_bounds (g, args)
1076 genericobject *g;
1077 object *args;
1078{
1079 return call_forms_OUTfOUTf(fl_get_slider_bounds, g-> ob_generic, args);
1080}
1081
1082static object *
1083set_slider_return (g, args)
1084 genericobject *g;
1085 object *args;
1086{
1087 return call_forms_INf (fl_set_slider_return, g-> ob_generic, args);
1088}
1089
1090static object *
1091set_slider_size (g, args)
1092 genericobject *g;
1093 object *args;
1094{
1095 return call_forms_INf (fl_set_slider_size, g-> ob_generic, args);
1096}
1097
1098static object *
1099set_slider_precision (g, args)
1100 genericobject *g;
1101 object *args;
1102{
1103 return call_forms_INi (fl_set_slider_precision, g-> ob_generic, args);
1104}
1105
1106static struct methodlist slider_methods[] = {
1107 {"set_slider", set_slider},
1108 {"get_slider", get_slider},
1109 {"set_slider_value", set_slider_value},
1110 {"get_slider_value", get_slider},
1111 {"set_slider_bounds", set_slider_bounds},
1112 {"get_slider_bounds", get_slider_bounds},
1113 {"set_slider_return", set_slider_return},
1114 {"set_slider_size", set_slider_size},
1115 {"set_slider_precision",set_slider_precision},
1116 {NULL, NULL} /* sentinel */
1117};
1118
1119static object *
1120set_positioner_xvalue (g, args)
1121 genericobject *g;
1122 object *args;
1123{
1124 return call_forms_INf (fl_set_positioner_xvalue, g-> ob_generic, args);
1125}
1126
1127static object *
1128set_positioner_xbounds (g, args)
1129 genericobject *g;
1130 object *args;
1131{
1132 return call_forms_INfINf (fl_set_positioner_xbounds, g-> ob_generic, args);
1133}
1134
1135static object *
1136set_positioner_yvalue (g, args)
1137 genericobject *g;
1138 object *args;
1139{
1140 return call_forms_INf (fl_set_positioner_yvalue, g-> ob_generic, args);
1141}
1142
1143static object *
1144set_positioner_ybounds (g, args)
1145 genericobject *g;
1146 object *args;
1147{
1148 return call_forms_INfINf (fl_set_positioner_ybounds, g-> ob_generic, args);
1149}
1150
1151static object *
1152get_positioner_xvalue (g, args)
1153 genericobject *g;
1154 object *args;
1155{
1156 return call_forms_Rf (fl_get_positioner_xvalue, g-> ob_generic, args);
1157}
1158
1159static object *
1160get_positioner_xbounds (g, args)
1161 genericobject *g;
1162 object *args;
1163{
1164 return call_forms_OUTfOUTf (fl_get_positioner_xbounds, g-> ob_generic, args);
1165}
1166
1167static object *
1168get_positioner_yvalue (g, args)
1169 genericobject *g;
1170 object *args;
1171{
1172 return call_forms_Rf (fl_get_positioner_yvalue, g-> ob_generic, args);
1173}
1174
1175static object *
1176get_positioner_ybounds (g, args)
1177 genericobject *g;
1178 object *args;
1179{
1180 return call_forms_OUTfOUTf (fl_get_positioner_ybounds, g-> ob_generic, args);
1181}
1182
1183static struct methodlist positioner_methods[] = {
1184 {"set_positioner_xvalue", set_positioner_xvalue},
1185 {"set_positioner_yvalue", set_positioner_yvalue},
1186 {"set_positioner_xbounds", set_positioner_xbounds},
1187 {"set_positioner_ybounds", set_positioner_ybounds},
1188 {"get_positioner_xvalue", get_positioner_xvalue},
1189 {"get_positioner_yvalue", get_positioner_yvalue},
1190 {"get_positioner_xbounds", get_positioner_xbounds},
Guido van Rossum03747111991-08-08 12:10:01 +00001191 {"get_positioner_ybounds", get_positioner_ybounds},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001192 {NULL, NULL} /* sentinel */
1193};
1194
1195/* Class timer */
1196
1197static object *
1198set_timer (g, args)
1199 genericobject *g;
1200 object *args;
1201{
1202 return call_forms_INf (fl_set_timer, g-> ob_generic, args);
1203}
1204
1205static object *
1206get_timer (g, args)
1207 genericobject *g;
1208 object *args;
1209{
1210 return call_forms_Rf (fl_get_timer, g-> ob_generic, args);
1211}
1212
1213static struct methodlist timer_methods[] = {
1214 {"set_timer", set_timer},
1215 {"get_timer", get_timer},
1216 {NULL, NULL} /* sentinel */
1217};
1218
1219/* Form objects */
1220
1221typedef struct {
1222 OB_HEAD
1223 FL_FORM *ob_form;
1224} formobject;
1225
1226extern typeobject Formtype; /* Forward */
1227
1228#define is_formobject(v) ((v)->ob_type == &Formtype)
1229
1230static object *
1231form_show_form(f, args)
1232 formobject *f;
1233 object *args;
1234{
1235 int place, border;
1236 object *name;
1237 if (!getintintstrarg(args, &place, &border, &name))
1238 return NULL;
1239 fl_show_form(f->ob_form, place, border, getstringvalue(name));
1240 INCREF(None);
1241 return None;
1242}
1243
1244static object *
1245form_call(func, f, args)
1246 FL_FORM *f;
1247 object *args;
1248 void (*func)(FL_FORM *);
1249{
1250 if (!getnoarg(args)) return NULL;
1251
1252 (*func)(f);
1253
1254 INCREF(None);
1255 return None;
1256}
1257
1258static object *
1259form_call_INiINi (func, f, args)
1260 FL_FORM *f;
1261 object *args;
1262 void (*func)(FL_FORM *, int, int);
1263{
1264 int a, b;
1265
1266 if (!getintintarg(args, &a, &b)) return NULL;
1267
1268 (*func)(f, a, b);
1269
1270 INCREF(None);
1271 return None;
1272}
1273
1274static object *
1275form_hide_form(f, args)
1276 formobject *f;
1277 object *args;
1278{
1279 return form_call (fl_hide_form, f-> ob_form, args);
1280}
1281
1282static object *
1283form_redraw_form(f, args)
1284 formobject *f;
1285 object *args;
1286{
1287 return form_call (fl_redraw_form, f-> ob_form, args);
1288}
1289
1290static object *
1291form_set_form_position (f, args)
1292 formobject *f;
1293 object *args;
1294{
1295 return form_call_INiINi (fl_set_form_position, f-> ob_form, args);
1296}
1297
1298static object *
1299generic_add_object (f, args, func, internal_methods)
1300 formobject *f;
1301 object *args;
1302 FL_OBJECT *(*func)(int, float, float, float, float, char*);
1303 struct methodlist *internal_methods;
1304{
1305 int type;
1306 float x, y, w, h;
1307 object *name;
Guido van Rossumabe58351991-08-08 12:34:44 +00001308 FL_OBJECT *obj;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001309
Guido van Rossum03747111991-08-08 12:10:01 +00001310 if (!getintfloatfloatfloatfloatstrarg (args,&type,&x,&y,&w,&h,&name))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001311 return NULL;
1312
1313 fl_addto_form (f-> ob_form);
1314
Guido van Rossumabe58351991-08-08 12:34:44 +00001315 obj = (*func) (type, x, y, w, h, getstringvalue (name));
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001316
1317 fl_end_form ();
1318
Guido van Rossumabe58351991-08-08 12:34:44 +00001319 if (obj == NULL) { err_nomem(); return NULL; }
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001320
Guido van Rossumabe58351991-08-08 12:34:44 +00001321 return newgenericobject (obj, internal_methods);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001322}
1323
1324static object *
1325form_add_button(f, args)
1326 formobject *f;
1327 object *args;
1328{
1329 return generic_add_object(f, args, fl_add_button, button_methods);
1330}
1331
1332static object *
1333form_add_lightbutton(f, args)
1334 formobject *f;
1335 object *args;
1336{
1337 return generic_add_object(f, args, fl_add_lightbutton, button_methods);
1338}
1339
1340static object *
1341form_add_roundbutton(f, args)
1342 formobject *f;
1343 object *args;
1344{
1345 return generic_add_object(f, args, fl_add_roundbutton, button_methods);
1346}
1347
1348static object *
1349form_add_menu (f, args)
1350 formobject *f;
1351 object *args;
1352{
1353 return generic_add_object(f, args, fl_add_menu, menu_methods);
1354}
1355
1356static object *
1357form_add_slider(f, args)
1358 formobject *f;
1359 object *args;
1360{
1361 return generic_add_object(f, args, fl_add_slider, slider_methods);
1362}
1363
1364static object *
1365form_add_valslider(f, args)
1366 formobject *f;
1367 object *args;
1368{
1369 return generic_add_object(f, args, fl_add_valslider, slider_methods);
1370}
1371
1372static object *
1373form_add_dial (f, args)
1374 formobject *f;
1375 object *args;
1376{
1377 return generic_add_object(f, args, fl_add_dial, dial_methods);
1378}
1379
1380static object *
1381form_add_counter (f, args)
1382 formobject *f;
1383 object *args;
1384{
1385 return generic_add_object(f, args, fl_add_counter, counter_methods);
1386}
1387
1388static object *
1389form_add_default (f, args)
1390 formobject *f;
1391 object *args;
1392{
1393 return generic_add_object(f, args, fl_add_default, default_methods);
1394}
1395
1396static object *
1397form_add_clock (f, args)
1398 formobject *f;
1399 object *args;
1400{
1401 return generic_add_object(f, args, fl_add_clock, clock_methods);
1402}
1403
1404static object *
1405form_add_box (f, args)
1406 formobject *f;
1407 object *args;
1408{
Guido van Rossum03747111991-08-08 12:10:01 +00001409 return generic_add_object(f, args, fl_add_box,
1410 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001411}
1412
1413static object *
1414form_add_choice (f, args)
1415 formobject *f;
1416 object *args;
1417{
1418 return generic_add_object(f, args, fl_add_choice, choice_methods);
1419}
1420
1421static object *
1422form_add_browser (f, args)
1423 formobject *f;
1424 object *args;
1425{
1426 return generic_add_object(f, args, fl_add_browser, browser_methods);
1427}
1428
1429static object *
1430form_add_positioner (f, args)
1431 formobject *f;
1432 object *args;
1433{
1434 return generic_add_object(f, args, fl_add_positioner, positioner_methods);
1435}
1436
1437static object *
1438form_add_input (f, args)
1439 formobject *f;
1440 object *args;
1441{
1442 return generic_add_object(f, args, fl_add_input, input_methods);
1443}
1444
1445static object *
1446form_add_text (f, args)
1447 formobject *f;
1448 object *args;
1449{
Guido van Rossum03747111991-08-08 12:10:01 +00001450 return generic_add_object(f, args, fl_add_text,
1451 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001452}
1453
1454static object *
1455form_add_timer (f, args)
1456 formobject *f;
1457 object *args;
1458{
1459 return generic_add_object(f, args, fl_add_timer, timer_methods);
1460}
1461
1462static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001463form_freeze_form(f, args)
1464 formobject *f;
1465 object *args;
1466{
1467 return form_call (fl_freeze_form, f-> ob_form, args);
1468}
1469
1470static object *
1471form_unfreeze_form(f, args)
1472 formobject *f;
1473 object *args;
1474{
1475 return form_call (fl_unfreeze_form, f-> ob_form, args);
1476}
1477
1478static object *
1479form_display_form(f, args)
1480 formobject *f;
1481 object *args;
1482{
1483 int place, border;
1484 object *name;
1485 if (!getintintstrarg(args, &place, &border, &name))
1486 return NULL;
1487 fl_show_form(f->ob_form, place, border, getstringvalue(name));
1488 INCREF(None);
1489 return None;
1490}
1491
1492static object *
1493form_remove_form(f, args)
1494 formobject *f;
1495 object *args;
1496{
1497 return form_call (fl_remove_form, f-> ob_form, args);
1498}
1499
1500static object *
1501form_activate_form(f, args)
1502 formobject *f;
1503 object *args;
1504{
1505 return form_call (fl_activate_form, f-> ob_form, args);
1506}
1507
1508static object *
1509form_deactivate_form(f, args)
1510 formobject *f;
1511 object *args;
1512{
1513 return form_call (fl_deactivate_form, f-> ob_form, args);
1514}
1515
Guido van Rossum75cc8981991-08-08 12:07:45 +00001516static object *
Guido van Rossum03747111991-08-08 12:10:01 +00001517form_bgn_group (f, args)
1518 formobject *f;
1519 object *args;
1520{
1521 fl_addto_form (f-> ob_form);
1522 fl_bgn_group();
1523 fl_end_form ();
1524 INCREF(None);
1525 return None;
1526}
1527
1528static object *
1529form_end_group (f, args)
1530 formobject *f;
1531 object *args;
1532{
1533 fl_addto_form (f-> ob_form);
1534 fl_end_group();
1535 fl_end_form ();
1536 INCREF(None);
1537 return None;
1538}
1539
1540static object *
1541forms_find_first_or_last (func, f, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00001542 FL_OBJECT *(*func)(FL_FORM *, int, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +00001543 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001544 object *args;
1545{
1546 int type;
1547 float mx, my;
1548 FL_OBJECT *generic;
1549 genericobject *g;
1550
1551 if (!getintfloatfloatarg (args, &type, &mx, &my)) return NULL;
1552
Guido van Rossum03747111991-08-08 12:10:01 +00001553 generic = (*func) (f-> ob_form, type, mx, my);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001554
1555 if (generic == NULL)
1556 {
1557 INCREF(None);
1558 return None;
1559 }
1560
1561 g = findgeneric(generic);
1562 if (g == NULL) {
1563 err_setstr(RuntimeError,
1564 "do_forms returns unknown object");
1565 return NULL;
1566 }
1567 INCREF(g);
1568 return ((object *) g);
1569}
1570
1571static object *
Guido van Rossum03747111991-08-08 12:10:01 +00001572form_find_first (f, args)
1573 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001574 object *args;
1575{
Guido van Rossum03747111991-08-08 12:10:01 +00001576 return (forms_find_first_or_last(fl_find_first, f, args));
Guido van Rossum75cc8981991-08-08 12:07:45 +00001577}
1578
1579static object *
Guido van Rossum03747111991-08-08 12:10:01 +00001580form_find_last (f, args)
1581 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001582 object *args;
1583{
Guido van Rossum03747111991-08-08 12:10:01 +00001584 return (forms_find_first_or_last(fl_find_last, f, args));
Guido van Rossum75cc8981991-08-08 12:07:45 +00001585}
1586
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001587static struct methodlist form_methods[] = {
1588/* adm */
1589 {"show_form", form_show_form},
1590 {"hide_form", form_hide_form},
1591 {"redraw_form", form_redraw_form},
1592 {"set_form_position", form_set_form_position},
1593 {"freeze_form", form_freeze_form},
1594 {"unfreeze_form", form_unfreeze_form},
1595 {"display_form", form_display_form},
1596 {"remove_form", form_remove_form},
1597 {"activate_form", form_activate_form},
1598 {"deactivate_form", form_deactivate_form},
Guido van Rossum03747111991-08-08 12:10:01 +00001599 {"bgn_group", form_bgn_group},
1600 {"end_group", form_end_group},
Guido van Rossum75cc8981991-08-08 12:07:45 +00001601 {"find_first", form_find_first},
1602 {"find_last", form_find_last},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001603
1604/* basic objects */
1605 {"add_button", form_add_button},
1606/* {"add_bitmap", form_add_bitmap}, */
1607 {"add_lightbutton", form_add_lightbutton},
1608 {"add_roundbutton", form_add_roundbutton},
1609 {"add_menu", form_add_menu},
1610 {"add_slider", form_add_slider},
1611 {"add_positioner", form_add_positioner},
1612 {"add_valslider", form_add_valslider},
1613 {"add_dial", form_add_dial},
1614 {"add_counter", form_add_counter},
1615 {"add_default", form_add_default},
1616 {"add_box", form_add_box},
1617 {"add_clock", form_add_clock},
1618 {"add_choice", form_add_choice},
1619 {"add_browser", form_add_browser},
1620 {"add_input", form_add_input},
1621 {"add_timer", form_add_timer},
1622 {"add_text", form_add_text},
1623 {NULL, NULL} /* sentinel */
1624};
1625
1626static void
1627form_dealloc(f)
1628 formobject *f;
1629{
1630 /* XXX can't destroy form objects !!! */
1631 DEL(f);
1632}
1633
1634static object *
1635form_getattr(f, name)
1636 formobject *f;
1637 char *name;
1638{
1639 /* XXX check for data attr's: x, y etc. */
1640 return findmethod(form_methods, (object *)f, name);
1641}
1642
1643typeobject Formtype = {
1644 OB_HEAD_INIT(&Typetype)
1645 0, /*ob_size*/
1646 "form", /*tp_name*/
1647 sizeof(formobject), /*tp_size*/
1648 0, /*tp_itemsize*/
1649 /* methods */
1650 form_dealloc, /*tp_dealloc*/
1651 0, /*tp_print*/
1652 form_getattr, /*tp_getattr*/
1653 0, /*tp_setattr*/
1654 0, /*tp_compare*/
1655 0, /*tp_repr*/
1656};
1657
1658static object *
1659newformobject(form)
1660 FL_FORM *form;
1661{
1662 formobject *f;
1663 f = NEWOBJ(formobject, &Formtype);
1664 if (f == NULL)
1665 return NULL;
1666 f->ob_form = form;
1667 return (object *)f;
1668}
1669
1670/* The "fl" module */
1671static object *
1672forms_make_form(dummy, args)
1673 object *dummy;
1674 object *args;
1675{
1676 int type;
1677 float w, h;
1678 FL_FORM *form;
1679 if (!getintfloatfloatarg(args, &type, &w, &h))
1680 return NULL;
1681 form = fl_bgn_form(type, w, h);
1682 if (form == NULL) {
1683 /* XXX Actually, cannot happen! */
1684 err_nomem();
1685 return NULL;
1686 }
1687 fl_end_form();
1688 return newformobject(form);
1689}
1690
1691static object *my_event_callback = NULL;
1692
1693static object *
1694forms_set_event_call_back(dummy, args)
1695 object *dummy;
1696 object *args;
1697{
1698 my_event_callback = args;
1699 XINCREF(args);
1700 INCREF(None);
1701 return None;
1702}
1703
1704static object *
1705forms_do_or_check_forms(dummy, args, func)
1706 object *dummy;
1707 object *args;
1708 FL_OBJECT *(*func)();
1709{
1710 FL_OBJECT *generic;
1711 genericobject *g;
1712 object *arg, *res;
1713
1714 if (!getnoarg(args))
1715 return NULL;
1716
1717 for (;;) {
1718 generic = (*func)();
1719 if (generic == NULL) {
1720 INCREF(None);
1721 return None;
1722 }
1723 if (generic == FL_EVENT) {
1724 int dev;
1725 short val;
1726 if (my_event_callback == NULL)
1727 return newintobject(-1);
1728 dev = fl_qread(&val);
1729 arg = newtupleobject(2);
1730 if (arg == NULL)
1731 return NULL;
1732 settupleitem(arg, 0, newintobject((long)dev));
1733 settupleitem(arg, 1, newintobject((long)val));
1734 res = call_object(my_event_callback, arg);
1735 XDECREF(res);
1736 DECREF(arg);
1737 if (res == NULL)
1738 return NULL; /* Callback raised exception */
1739 continue;
1740 }
1741 g = findgeneric(generic);
1742 if (g == NULL) {
1743 err_setstr(RuntimeError,
1744 "do_forms returns unknown object");
1745 return NULL;
1746 }
1747 if (g->ob_callback == NULL) {
1748 INCREF(g);
1749 return ((object *) g);
1750 }
1751 arg = newtupleobject(2);
1752 INCREF(g);
Guido van Rossumabe58351991-08-08 12:34:44 +00001753 settupleitem(arg, 0, (object *)g);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001754 INCREF(g->ob_callback_arg);
1755 settupleitem(arg, 1, g->ob_callback_arg);
1756 res = call_object(g->ob_callback, arg);
1757 XDECREF(res);
1758 DECREF(arg);
1759 if (res == NULL)
1760 return NULL; /* Callback raised exception */
1761 }
1762}
1763
1764static object *
1765forms_do_forms (dummy, args)
1766 object *dummy;
1767 object *args;
1768{
1769 return forms_do_or_check_forms (dummy, args, fl_do_forms);
1770}
1771
1772static object *
1773forms_check_forms (dummy, args)
1774 object *dummy;
1775 object *args;
1776{
1777 return forms_do_or_check_forms (dummy, args, fl_check_forms);
1778}
1779
Guido van Rossum03747111991-08-08 12:10:01 +00001780#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001781static object *
1782fl_call(func, args)
1783 object *args;
1784 void (*func)();
1785{
1786 if (!getnoarg(args))
1787 return NULL;
1788 (*func)();
1789 INCREF(None);
1790 return None;
1791}
Guido van Rossum03747111991-08-08 12:10:01 +00001792#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001793
1794static object *
1795forms_qdevice(self, args)
1796 object *self;
1797 object *args;
1798{
1799 short arg1 ;
1800 if (!getishortarg(args, 1, 0, &arg1))
1801 return NULL;
1802 fl_qdevice( arg1 );
1803 INCREF(None);
1804 return None;
1805}
1806
1807static object *
1808forms_unqdevice(self, args)
1809 object *self;
1810 object *args;
1811{
1812 short arg1 ;
1813 if (!getishortarg(args, 1, 0, &arg1))
1814 return NULL;
1815 fl_unqdevice( arg1 );
1816 INCREF(None);
1817 return None;
1818}
1819
1820static object *
1821forms_isqueued(self, args)
1822 object *self;
1823 object *args;
1824{
Guido van Rossum03747111991-08-08 12:10:01 +00001825 long retval;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001826 short arg1 ;
1827 if (!getishortarg(args, 1, 0, &arg1))
1828 return NULL;
1829 retval = fl_isqueued( arg1 );
1830
Guido van Rossum03747111991-08-08 12:10:01 +00001831 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001832}
1833
1834static object *
1835forms_qtest(self, args)
1836 object *self;
1837 object *args;
1838{
1839 long retval;
1840 retval = fl_qtest( );
Guido van Rossum03747111991-08-08 12:10:01 +00001841 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001842}
1843
1844
1845static object *
1846forms_qread(self, args)
1847 object *self;
1848 object *args;
1849{
1850 long retval;
1851 short arg1 ;
1852 retval = fl_qread( & arg1 );
1853 { object *v = newtupleobject( 2 );
1854 if (v == NULL) return NULL;
1855 settupleitem(v, 0, newintobject(retval));
1856 settupleitem(v, 1, newintobject((long)arg1));
1857 return v;
1858 }
1859}
1860
1861static object *
1862forms_qreset(self, args)
1863 object *self;
1864 object *args;
1865{
1866 if (!getnoarg(args)) return NULL;
1867
Guido van Rossum03747111991-08-08 12:10:01 +00001868 fl_qreset();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001869 INCREF(None);
1870 return None;
1871}
1872
1873static object *
1874forms_qenter(self, args)
1875 object *self;
1876 object *args;
1877{
1878 short arg1 ;
1879 short arg2 ;
1880 if (!getishortarg(args, 2, 0, &arg1))
1881 return NULL;
1882 if (!getishortarg(args, 2, 1, &arg2))
1883 return NULL;
1884 fl_qenter( arg1 , arg2 );
1885 INCREF(None);
1886 return None;
1887}
1888
1889static object *
1890forms_color (self, args)
1891 object *self;
1892 object *args;
1893{
1894 int arg;
1895
1896 if (!getintarg(args, &arg)) return NULL;
1897
1898 fl_color((short) arg);
1899
1900 INCREF(None);
1901 return None;
1902}
1903
1904static object *
1905forms_mapcolor (self, args)
1906 object *self;
1907 object *args;
1908{
1909 int arg0, arg1, arg2, arg3;
1910
1911 if (!getintintintintarg(args, &arg0, &arg1, &arg2, &arg3))
1912 return NULL;
1913
1914 fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);
1915
1916 INCREF(None);
1917 return None;
1918}
1919
1920static object *
1921forms_getmcolor (self, args)
1922 object *self;
1923 object *args;
1924{
Guido van Rossum03747111991-08-08 12:10:01 +00001925 int arg;
1926 short r, g, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001927 object *v;
1928
1929 if (!getintarg(args, &arg)) return NULL;
1930
Guido van Rossum03747111991-08-08 12:10:01 +00001931 fl_getmcolor (arg, &r, &g, &b);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001932
1933 v = newtupleobject(3);
1934
1935 if (v == NULL) return NULL;
1936
Guido van Rossum03747111991-08-08 12:10:01 +00001937 settupleitem(v, 0, newintobject((long)r));
1938 settupleitem(v, 1, newintobject((long)g));
1939 settupleitem(v, 2, newintobject((long)b));
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001940
1941 return v;
1942}
1943
1944static object *
Guido van Rossum75cc8981991-08-08 12:07:45 +00001945forms_get_mouse (self, args)
1946 object *self;
1947 object *args;
1948{
1949 float x, y ;
1950 object *v;
1951
1952 if (!getnoarg(args)) return NULL;
1953
1954 fl_get_mouse (&x, &y);
1955
1956 v = newtupleobject(2);
1957
1958 if (v == NULL) return NULL;
1959
1960 settupleitem(v, 0, newfloatobject(x));
1961 settupleitem(v, 1, newfloatobject(y));
1962
1963 return v;
1964}
1965
1966static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001967forms_tie(self, args)
1968 object *self;
1969 object *args;
1970{
1971 short arg1 ;
1972 short arg2 ;
1973 short arg3 ;
1974 if (!getishortarg(args, 3, 0, &arg1))
1975 return NULL;
1976 if (!getishortarg(args, 3, 1, &arg2))
1977 return NULL;
1978 if (!getishortarg(args, 3, 2, &arg3))
1979 return NULL;
1980 fl_tie( arg1 , arg2 , arg3 );
1981 INCREF(None);
1982 return None;
1983}
1984
Guido van Rossum03747111991-08-08 12:10:01 +00001985static object *
1986forms_show_message (f, args)
1987 object *f;
1988 object *args;
1989{
1990 object *a, *b, *c;
1991
1992 if (!getstrstrstrarg(args, &a, &b, &c)) return NULL;
1993
1994 fl_show_message (
1995 getstringvalue(a), getstringvalue(b), getstringvalue(c));
1996
1997 INCREF (None);
1998 return None;
1999}
2000
2001static object *
2002forms_show_question (f, args)
2003 object *f;
2004 object *args;
2005{
2006 int ret;
2007 object *a, *b, *c;
2008
2009 if (!getstrstrstrarg(args, &a, &b, &c)) return NULL;
2010
2011 ret = fl_show_question (
2012 getstringvalue(a), getstringvalue(b), getstringvalue(c));
2013
2014 return newintobject ((long) ret);
2015}
2016
2017static object *
2018forms_show_input (f, args)
2019 object *f;
2020 object *args;
2021{
2022 char *str;
2023 object *a, *b;
2024
2025 if (!getstrstrarg(args, &a, &b)) return NULL;
2026
2027 str = fl_show_input (getstringvalue(a), getstringvalue(b));
2028
2029 return newstringobject (str);
2030}
2031
2032static object *
2033forms_file_selector (f, args)
2034 object *f;
2035 object *args;
2036{
2037 char *str;
2038 object *a, *b, *c, *d;
2039
2040 if (!getstrstrstrstrarg(args, &a, &b, &c, &d)) return NULL;
2041
2042 str = fl_show_file_selector (getstringvalue(a), getstringvalue(b),
2043 getstringvalue (c), getstringvalue (d));
2044
2045 return newstringobject (str);
2046}
2047
2048
2049static object *
2050forms_file_selector_func (args, func)
2051 object *args;
2052 char *(*func)();
2053{
2054 char *str;
2055
2056 str = (*func) ();
2057
2058 return newstringobject (str);
2059}
2060
2061static object *
2062forms_get_directory (f, args)
2063 object *f;
2064 object *args;
2065{
2066 return forms_file_selector_func (args, fl_get_directory);
2067}
2068
2069static object *
2070forms_get_pattern (f, args)
2071 object *f;
2072 object *args;
2073{
2074 return forms_file_selector_func (args, fl_get_pattern);
2075}
2076
2077static object *
2078forms_get_filename (f, args)
2079 object *f;
2080 object *args;
2081{
2082 return forms_file_selector_func (args, fl_get_filename);
2083
2084}
2085
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002086static struct methodlist forms_methods[] = {
2087/* adm */
2088 {"make_form", forms_make_form},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002089/* gl support wrappers */
2090 {"qdevice", forms_qdevice},
2091 {"unqdevice", forms_unqdevice},
2092 {"isqueued", forms_isqueued},
2093 {"qtest", forms_qtest},
2094 {"qread", forms_qread},
2095/* {"blkqread", forms_blkqread}, */
2096 {"qreset", forms_qreset},
2097 {"qenter", forms_qenter},
Guido van Rossum03747111991-08-08 12:10:01 +00002098 {"get_mouse", forms_get_mouse},
2099 {"tie", forms_tie},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002100/* {"new_events", forms_new_events}, */
2101 {"color", forms_color},
2102 {"mapcolor", forms_mapcolor},
2103 {"getmcolor", forms_getmcolor},
2104/* interaction */
2105 {"do_forms", forms_do_forms},
2106 {"check_forms", forms_check_forms},
2107 {"set_event_call_back", forms_set_event_call_back},
2108/* goodies */
Guido van Rossum03747111991-08-08 12:10:01 +00002109 {"show_message", forms_show_message},
2110 {"show_question", forms_show_question},
2111 {"file_selector", forms_file_selector},
2112 {"get_directory", forms_get_directory},
2113 {"get_pattern", forms_get_pattern},
2114 {"get_filename", forms_get_filename},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002115/*
Guido van Rossum03747111991-08-08 12:10:01 +00002116 {"show_choice", forms_show_choice},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002117 XXX - draw.c
2118*/
Guido van Rossum03747111991-08-08 12:10:01 +00002119 {"show_input", forms_show_input},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002120 {NULL, NULL} /* sentinel */
2121};
2122
2123void
2124initfl()
2125{
2126 initmodule("fl", forms_methods);
2127 foreground ();
2128}
2129
2130
2131/* Support routines */
2132
2133int
2134getintintstrarg(args, a, b, c)
2135 object *args;
2136 int *a, *b;
2137 object **c;
2138{
2139 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2140 err_badarg();
2141 return NULL;
2142 }
2143 return getintarg(gettupleitem(args, 0), a) &&
2144 getintarg(gettupleitem(args, 1), b) &&
2145 getstrarg(gettupleitem(args, 2), c);
2146}
2147
2148int
2149getintfloatfloatarg(args, a, b, c)
2150 object *args;
2151 int *a;
2152 float *b, *c;
2153{
2154 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2155 err_badarg();
2156 return NULL;
2157 }
2158 return getintarg(gettupleitem(args, 0), a) &&
2159 getfloatarg(gettupleitem(args, 1), b) &&
2160 getfloatarg(gettupleitem(args, 2), c);
2161}
2162
2163int
2164getintintintintarg(args, a, b, c, d)
2165 object *args;
2166 int *a, *b, *c, *d;
2167{
2168 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 4) {
2169 err_badarg();
2170 return NULL;
2171 }
2172 return getintarg(gettupleitem(args, 0), a) &&
2173 getintarg(gettupleitem(args, 1), b) &&
2174 getintarg(gettupleitem(args, 2), c) &&
2175 getintarg(gettupleitem(args, 3), d);
2176}
2177
2178int
2179getfloatarg(args, a)
2180 object *args;
2181 float *a;
2182{
2183 double x;
2184 if (!getdoublearg(args, &x))
2185 return 0;
2186 *a = x;
2187 return 1;
2188}
2189
2190int
Guido van Rossum03747111991-08-08 12:10:01 +00002191getintfloatfloatfloatfloatstrarg(args, type, x, y, w, h, name)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002192 object *args;
2193 int *type;
2194 float *x, *y, *w, *h;
2195 object **name;
2196{
2197 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 6) {
2198 err_badarg();
2199 return NULL;
2200 }
2201 return getintarg(gettupleitem(args, 0), type) &&
2202 getfloatarg(gettupleitem(args, 1), x) &&
2203 getfloatarg(gettupleitem(args, 2), y) &&
2204 getfloatarg(gettupleitem(args, 3), w) &&
2205 getfloatarg(gettupleitem(args, 4), h) &&
2206 getstrarg(gettupleitem(args, 5), name);
2207}
2208
2209int
2210getfloatfloatfloatarg(args, f1, f2, f3)
2211 object *args;
2212 float *f1, *f2, *f3;
2213{
2214 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2215 err_badarg();
2216 return NULL;
2217 }
2218 return getfloatarg(gettupleitem(args, 0), f1) &&
2219 getfloatarg(gettupleitem(args, 1), f2) &&
2220 getfloatarg(gettupleitem(args, 2), f3);
2221}
2222
2223int
2224getfloatfloatarg(args, f1, f2)
2225 object *args;
2226 float *f1, *f2;
2227{
2228 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
2229 err_badarg();
2230 return NULL;
2231 }
2232 return getfloatarg(gettupleitem(args, 0), f1) &&
2233 getfloatarg(gettupleitem(args, 1), f2);
2234}
2235
2236int
2237getstrstrstrarg(v, a, b, c)
2238 object *v;
2239 object **a;
2240 object **b;
2241 object **c;
2242{
2243 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3) {
2244 return err_badarg();
2245 }
2246 return getstrarg(gettupleitem(v, 0), a) &&
2247 getstrarg(gettupleitem(v, 1), b)&&
2248 getstrarg(gettupleitem(v, 2), c);
2249}
2250
2251
2252int
2253getstrstrstrstrarg(v, a, b, c, d)
2254 object *v;
2255 object **a;
2256 object **b;
2257 object **c;
2258 object **d;
2259{
2260 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 4) {
2261 return err_badarg();
2262 }
2263 return getstrarg(gettupleitem(v, 0), a) &&
2264 getstrarg(gettupleitem(v, 1), b)&&
2265 getstrarg(gettupleitem(v, 2), c) &&
2266 getstrarg(gettupleitem(v, 3),d);
2267
2268}