blob: a4af2df189d78b59b9ee8954f768f65784fc2cc3 [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
Guido van Rossumddc0d3e1991-12-10 13:56:42 +000027/* As distributed, this code works with FORMS 2.0.
28 If you #define the symbol FL_V15 it will work with FORMS 1.5 (I hope),
29 and possibly also with previous versions.
30 (You must also edit FL.py to set _v15 to 1.) */
31
Guido van Rossumc7df79e1991-08-07 11:32:58 +000032#include "forms.h"
33
34#include "allobjects.h"
35#include "import.h"
36#include "modsupport.h"
37#include "structmember.h"
38
39/* #include "ceval.h" */
40extern object *call_object(object *, object *);
41
42/* Generic Forms Objects */
43
44typedef struct {
45 OB_HEAD
46 FL_OBJECT *ob_generic;
47 struct methodlist *ob_methods;
48 object *ob_callback;
49 object *ob_callback_arg;
50} genericobject;
51
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000052extern typeobject GenericObjecttype; /* Forward */
53
54#define is_genericobject(g) ((g)->ob_type == &GenericObjecttype)
55
56/* List of all objects (XXX this should be a hash table on address...) */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000057
58static object *allgenerics = NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000059static int nfreeslots = 0;
60
61/* Add an object to the list of known objects */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000062
63static void
64knowgeneric(g)
65 genericobject *g;
66{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000067 int i, n;
68 /* Create the list if it doesn't already exist */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000069 if (allgenerics == NULL) {
70 allgenerics = newlistobject(0);
71 if (allgenerics == NULL) {
72 err_clear();
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000073 return; /* Too bad, live without allgenerics... */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000074 }
75 }
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000076 if (nfreeslots > 0) {
77 /* Search the list for reusable slots (NULL items) */
78 /* XXX This can be made faster! */
79 n = getlistsize(allgenerics);
80 for (i = 0; i < n; i++) {
81 if (getlistitem(allgenerics, i) == NULL) {
82 INCREF(g);
83 setlistitem(allgenerics, i, (object *)g);
84 nfreeslots--;
85 return;
86 }
87 }
88 /* Strange... no free slots found... */
89 nfreeslots = 0;
90 }
91 /* No free entries, append new item to the end */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000092 addlistitem(allgenerics, (object *)g);
93}
94
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000095/* Find an object in the list of known objects */
96
Guido van Rossumc7df79e1991-08-07 11:32:58 +000097static genericobject *
98findgeneric(generic)
99 FL_OBJECT *generic;
100{
101 int i, n;
102 genericobject *g;
103
104 if (allgenerics == NULL)
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000105 return NULL; /* No objects known yet */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000106 n = getlistsize(allgenerics);
107 for (i = 0; i < n; i++) {
108 g = (genericobject *)getlistitem(allgenerics, i);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000109 if (g != NULL && g->ob_generic == generic)
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000110 return g;
111 }
112 return NULL; /* Unknown object */
113}
114
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000115/* Called when a form is about to be freed --
116 remove all the objects that we know about from it. */
117
118static void
119releaseobjects(form)
120 FL_FORM *form;
121{
122 int i, n;
123 genericobject *g;
124
125 if (allgenerics == NULL)
126 return; /* No objects known yet */
127 n = getlistsize(allgenerics);
128 for (i = 0; i < n; i++) {
129 g = (genericobject *)getlistitem(allgenerics, i);
130 if (g != NULL && g->ob_generic->form == form) {
131 fl_delete_object(g->ob_generic);
132 if (g->ob_refcnt == 1) {
133 /* The object is now unreachable:
134 delete it from the list of known objects */
135 setlistitem(allgenerics, i, (object *)NULL);
136 nfreeslots++;
137 }
138 }
139 }
140 /* XXX Should also get rid of objects with refcnt==1 */
141}
142
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000143
144/* Methods of generic objects */
145
146static object *
147generic_set_call_back(g, args)
148 genericobject *g;
149 object *args;
150{
151 if (args == NULL) {
152 XDECREF(g->ob_callback);
153 XDECREF(g->ob_callback_arg);
154 g->ob_callback = NULL;
155 g->ob_callback_arg = NULL;
156 }
157 else {
158 if (!is_tupleobject(args) || gettuplesize(args) != 2) {
159 err_badarg();
160 return NULL;
161 }
162 XDECREF(g->ob_callback);
163 XDECREF(g->ob_callback_arg);
164 g->ob_callback = gettupleitem(args, 0);
165 INCREF(g->ob_callback);
166 g->ob_callback_arg = gettupleitem(args, 1);
167 INCREF(g->ob_callback_arg);
168 }
169 INCREF(None);
170 return None;
171}
172
173static object *
174generic_call(g, args, func)
175 genericobject *g;
176 object *args;
177 void (*func)(FL_OBJECT *);
178{
179 if (!getnoarg(args))
180 return NULL;
181 (*func)(g->ob_generic);
182 INCREF(None);
183 return None;
184}
185
186static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000187generic_delete_object(g, args)
188 genericobject *g;
189 object *args;
190{
191 object *res;
192 res = generic_call(g, args, fl_delete_object);
193 /* XXX Should remove it from the list of known objects */
194 return res;
195}
196
197static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000198generic_show_object(g, args)
199 genericobject *g;
200 object *args;
201{
202 return generic_call(g, args, fl_show_object);
203}
204
205static object *
206generic_hide_object(g, args)
207 genericobject *g;
208 object *args;
209{
210 return generic_call(g, args, fl_hide_object);
211}
212
213static object *
214generic_redraw_object(g, args)
215 genericobject *g;
216 object *args;
217{
218 return generic_call(g, args, fl_redraw_object);
219}
220
221static object *
222generic_freeze_object(g, args)
223 genericobject *g;
224 object *args;
225{
226 return generic_call(g, args, fl_freeze_object);
227}
228
229static object *
230generic_unfreeze_object(g, args)
231 genericobject *g;
232 object *args;
233{
234 return generic_call(g, args, fl_unfreeze_object);
235}
236
237static struct methodlist generic_methods[] = {
238 {"set_call_back", generic_set_call_back},
Guido van Rossum32db5e31991-11-12 15:43:18 +0000239 {"delete_object", generic_delete_object},
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000240 {"show_object", generic_show_object},
241 {"hide_object", generic_hide_object},
242 {"redraw_object", generic_redraw_object},
243 {"freeze_object", generic_freeze_object},
244 {"unfreeze_object", generic_unfreeze_object},
245#if 0
246 {"handle_object", generic_handle_object},
247 {"handle_object_direct",generic_handle_object_direct},
248#endif
Guido van Rossum03747111991-08-08 12:10:01 +0000249 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000250};
251
252static void
253generic_dealloc(g)
254 genericobject *g;
255{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000256 fl_free_object(g->ob_generic);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000257 DEL(g);
258}
259
260#define OFF(x) offsetof(FL_OBJECT, x)
261
262static struct memberlist generic_memberlist[] = {
263 {"objclass", T_INT, OFF(objclass), RO},
264 {"type", T_INT, OFF(type), RO},
265 {"boxtype", T_INT, OFF(boxtype)},
266 {"x", T_FLOAT, OFF(x)},
267 {"y", T_FLOAT, OFF(y)},
268 {"w", T_FLOAT, OFF(w)},
269 {"h", T_FLOAT, OFF(h)},
270 {"col1", T_INT, OFF(col1)},
271 {"col2", T_INT, OFF(col2)},
272 {"align", T_INT, OFF(align)},
273 {"lcol", T_INT, OFF(lcol)},
274 {"lsize", T_FLOAT, OFF(lsize)},
275 /* "label" is treated specially! */
276 {"lstyle", T_INT, OFF(lstyle)},
277 {"pushed", T_INT, OFF(pushed), RO},
278 {"focus", T_INT, OFF(focus), RO},
279 {"belowmouse", T_INT, OFF(belowmouse),RO},
280 {"frozen", T_INT, OFF(frozen), RO},
281 {"active", T_INT, OFF(active), RO},
282 {"input", T_INT, OFF(input), RO},
283 {"visible", T_INT, OFF(visible), RO},
284 {"radio", T_INT, OFF(radio), RO},
285 {"automatic", T_INT, OFF(automatic), RO},
286 {NULL} /* Sentinel */
287};
288
Guido van Rossumd97f0481991-11-19 20:26:28 +0000289#undef OFF
290
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000291static object *
292generic_getattr(g, name)
293 genericobject *g;
294 char *name;
295{
296 object *meth;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000297
298 /* XXX Ought to special-case name "__methods__" */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000299 if (g-> ob_methods) {
Guido van Rossum03747111991-08-08 12:10:01 +0000300 meth = findmethod(g->ob_methods, (object *)g, name);
301 if (meth != NULL) return meth;
302 err_clear();
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000303 }
304
305 meth = findmethod(generic_methods, (object *)g, name);
306 if (meth != NULL)
307 return meth;
308 err_clear();
309
310 /* "label" is an exception, getmember only works for char pointers,
311 not for char arrays */
312 if (strcmp(name, "label") == 0)
313 return newstringobject(g->ob_generic->label);
314
315 return getmember((char *)g->ob_generic, generic_memberlist, name);
316}
317
318static int
319generic_setattr(g, name, v)
320 genericobject *g;
321 char *name;
322 object *v;
323{
324 int ret;
325
326 if (v == NULL) {
327 err_setstr(TypeError, "can't delete forms object attributes");
328 return NULL;
329 }
330
331 /* "label" is an exception: setmember doesn't set strings;
332 and FORMS wants you to call a function to set the label */
333 if (strcmp(name, "label") == 0) {
334 if (!is_stringobject(v)) {
335 err_setstr(TypeError, "label attr must be string");
336 return NULL;
337 }
338 fl_set_object_label(g->ob_generic, getstringvalue(v));
339 return 0;
340 }
341
342 ret = setmember((char *)g->ob_generic, generic_memberlist, name, v);
343
344 /* Rather than calling all the various set_object_* functions,
345 we call fl_redraw_object here. This is sometimes redundant
346 but I doubt that's a big problem */
347 if (ret == 0)
348 fl_redraw_object(g->ob_generic);
349
350 return ret;
351}
352
353typeobject GenericObjecttype = {
354 OB_HEAD_INIT(&Typetype)
355 0, /*ob_size*/
356 "generic FORMS object", /*tp_name*/
357 sizeof(genericobject), /*tp_size*/
358 0, /*tp_itemsize*/
359 /* methods */
360 generic_dealloc, /*tp_dealloc*/
361 0, /*tp_print*/
362 generic_getattr, /*tp_getattr*/
363 generic_setattr, /*tp_setattr*/
364 0, /*tp_compare*/
365 0, /*tp_repr*/
366};
367
368static object *
369newgenericobject(generic, methods)
370 FL_OBJECT *generic;
371 struct methodlist *methods;
372{
373 genericobject *g;
374 g = NEWOBJ(genericobject, &GenericObjecttype);
375 if (g == NULL)
376 return NULL;
377 g-> ob_generic = generic;
378 g->ob_methods = methods;
379 g->ob_callback = NULL;
380 g->ob_callback_arg = NULL;
381 knowgeneric(g);
382 return (object *)g;
383}
384
385/**********************************************************************/
386/* Some common calling sequences */
387
388/* void func (object, float) */
389static object *
390call_forms_INf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000391 void (*func)(FL_OBJECT *, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000392 FL_OBJECT *obj;
393 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000394{
Guido van Rossum03747111991-08-08 12:10:01 +0000395 float parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000396
Guido van Rossum03747111991-08-08 12:10:01 +0000397 if (!getfloatarg (args, &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000398
Guido van Rossum03747111991-08-08 12:10:01 +0000399 (*func) (obj, parameter);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000400
Guido van Rossum03747111991-08-08 12:10:01 +0000401 INCREF(None);
402 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000403}
404
405/* void func (object, float) */
406static object *
407call_forms_INfINf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000408 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000409 FL_OBJECT *obj;
410 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000411{
Guido van Rossum03747111991-08-08 12:10:01 +0000412 float par1, par2;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000413
Guido van Rossum03747111991-08-08 12:10:01 +0000414 if (!getfloatfloatarg (args, &par1, &par2)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000415
Guido van Rossum03747111991-08-08 12:10:01 +0000416 (*func) (obj, par1, par2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000417
Guido van Rossum03747111991-08-08 12:10:01 +0000418 INCREF(None);
419 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000420}
421
422/* void func (object, int) */
423static object *
424call_forms_INi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000425 void (*func)(FL_OBJECT *, int);
Guido van Rossum03747111991-08-08 12:10:01 +0000426 FL_OBJECT *obj;
427 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000428{
Guido van Rossum03747111991-08-08 12:10:01 +0000429 int parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000430
Guido van Rossum03747111991-08-08 12:10:01 +0000431 if (!getintarg (args, &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000432
Guido van Rossum03747111991-08-08 12:10:01 +0000433 (*func) (obj, parameter);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000434
Guido van Rossum03747111991-08-08 12:10:01 +0000435 INCREF(None);
436 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000437}
438
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000439/* void func (object, char) */
440static object *
441call_forms_INc (func, obj, args)
442 void (*func)(FL_OBJECT *, int);
443 FL_OBJECT *obj;
444 object *args;
445{
446 object *a;
447
448 if (!getstrarg (args, &a)) return NULL;
449
450 (*func) (obj, getstringvalue(a)[0]);
451
452 INCREF(None);
453 return None;
454}
455
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000456/* void func (object, string) */
457static object *
458call_forms_INstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000459 void (*func)(FL_OBJECT *, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000460 FL_OBJECT *obj;
461 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000462{
Guido van Rossum03747111991-08-08 12:10:01 +0000463 object *a;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000464
Guido van Rossum03747111991-08-08 12:10:01 +0000465 if (!getstrarg (args, &a)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000466
Guido van Rossum03747111991-08-08 12:10:01 +0000467 (*func) (obj, getstringvalue (a));
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000468
Guido van Rossum03747111991-08-08 12:10:01 +0000469 INCREF(None);
470 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000471}
472
473
474/* voide func (object, int, string) */
475static object *
476call_forms_INiINstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000477 void (*func)(FL_OBJECT *, int, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000478 FL_OBJECT *obj;
479 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000480{
Guido van Rossum03747111991-08-08 12:10:01 +0000481 object *a;
482 int b;
483
484 if (!getintstrarg (args, &b, &a)) return NULL;
485
486 (*func) (obj, b, getstringvalue (a));
487
488 INCREF(None);
489 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000490}
491
Guido van Rossum03747111991-08-08 12:10:01 +0000492#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000493/* void func (object, float) */
494static object *
495call_forms_INiINi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000496 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000497 FL_OBJECT *obj;
498 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000499{
Guido van Rossum03747111991-08-08 12:10:01 +0000500 int par1, par2;
501
502 if (!getintintarg (args, &par1, &par2)) return NULL;
503
504 (*func) (obj, par1, par2);
505
506 INCREF(None);
507 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000508}
Guido van Rossum03747111991-08-08 12:10:01 +0000509#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000510
511/* int func (object) */
512static object *
513call_forms_Ri (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000514 int (*func)(FL_OBJECT *);
515 FL_OBJECT *obj;
516 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000517{
Guido van Rossum03747111991-08-08 12:10:01 +0000518 int retval;
519
520 if (!getnoarg(args)) return NULL;
521
522 retval = (*func) (obj);
523
524 return newintobject ((long) retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000525}
526
527/* char * func (object) */
528static object *
529call_forms_Rstr (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000530 char * (*func)(FL_OBJECT *);
531 FL_OBJECT *obj;
532 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000533{
Guido van Rossum03747111991-08-08 12:10:01 +0000534 char *str;
535
536 if (!getnoarg (args)) return NULL;
537
538 str = (*func) (obj);
539
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000540 if (str == NULL) {
541 INCREF(None);
542 return None;
543 }
Guido van Rossum03747111991-08-08 12:10:01 +0000544 return newstringobject (str);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000545}
546
547/* int func (object) */
548static object *
549call_forms_Rf (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000550 float (*func)(FL_OBJECT *);
551 FL_OBJECT *obj;
552 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000553{
Guido van Rossum03747111991-08-08 12:10:01 +0000554 float retval;
555
556 if (!getnoarg(args)) return NULL;
557
558 retval = (*func) (obj);
559
560 return newfloatobject (retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000561}
562
563static object *
564call_forms_OUTfOUTf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000565 void (*func)(FL_OBJECT *, float *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000566 FL_OBJECT *obj;
567 object *args;
568{
569 float f1, f2;
570 object *arg;
Guido van Rossum03747111991-08-08 12:10:01 +0000571
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000572 if (!getnoarg(args)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000573
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000574 (*func) (obj, &f1, &f2);
575
576 arg = newtupleobject (2);
577 if (arg == NULL) return NULL;
578
579 settupleitem (arg, 0, newfloatobject (f1));
580 settupleitem (arg, 1, newfloatobject (f2));
581 return arg;
582}
583
Guido van Rossum03747111991-08-08 12:10:01 +0000584#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000585static object *
586call_forms_OUTf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000587 void (*func)(FL_OBJECT *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000588 FL_OBJECT *obj;
589 object *args;
590{
591 float f;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000592
593 if (!getnoarg(args)) return NULL;
594
595 (*func) (obj, &f);
596
597 return newfloatobject (f);
598}
Guido van Rossum03747111991-08-08 12:10:01 +0000599#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000600
601/**********************************************************************/
602/* Class : browser */
603
604static object *
605set_browser_topline(g, args)
606 genericobject *g;
607 object *args;
608{
Guido van Rossum03747111991-08-08 12:10:01 +0000609 return call_forms_INi (fl_set_browser_topline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000610}
611
612static object *
613clear_browser(g, args)
614 genericobject *g;
615 object *args;
616{
Guido van Rossum03747111991-08-08 12:10:01 +0000617 return generic_call (g, args, fl_clear_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000618}
619
620static object *
621add_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000622 genericobject *g;
623 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000624{
Guido van Rossum03747111991-08-08 12:10:01 +0000625 return call_forms_INstr (fl_add_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000626}
627
628static object *
629addto_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000630 genericobject *g;
631 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000632{
Guido van Rossum03747111991-08-08 12:10:01 +0000633 return call_forms_INstr (fl_addto_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000634}
635
636static object *
637insert_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000638 genericobject *g;
639 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000640{
Guido van Rossum03747111991-08-08 12:10:01 +0000641 return call_forms_INiINstr (fl_insert_browser_line,
642 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000643}
644
645static object *
646delete_browser_line (g, args)
647 genericobject *g;
648 object *args;
649{
Guido van Rossum03747111991-08-08 12:10:01 +0000650 return call_forms_INi (fl_delete_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000651}
652
653static object *
654replace_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000655 genericobject *g;
656 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000657{
Guido van Rossum03747111991-08-08 12:10:01 +0000658 return call_forms_INiINstr (fl_replace_browser_line,
659 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000660}
661
662static object *
663get_browser_line(g, args)
664 genericobject *g;
665 object *args;
666{
667 int i;
668 char *str;
669
670 if (!getintarg(args, &i))
671 return NULL;
672
673 str = fl_get_browser_line (g->ob_generic, i);
674
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000675 if (str == NULL) {
676 INCREF(None);
677 return None;
678 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000679 return newstringobject (str);
680}
681
682static object *
683load_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000684 genericobject *g;
685 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000686{
Guido van Rossumabe58351991-08-08 12:34:44 +0000687 /* XXX strictly speaking this is wrong since fl_load_browser
688 XXX returns int, not void */
Guido van Rossum03747111991-08-08 12:10:01 +0000689 return call_forms_INstr (fl_load_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000690}
691
692static object *
693get_browser_maxline(g, args)
694 genericobject *g;
695 object *args;
696{
Guido van Rossum03747111991-08-08 12:10:01 +0000697 return call_forms_Ri (fl_get_browser_maxline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000698}
699
700static object *
701select_browser_line (g, args)
702 genericobject *g;
703 object *args;
704{
Guido van Rossum03747111991-08-08 12:10:01 +0000705 return call_forms_INi (fl_select_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000706}
707
708static object *
709deselect_browser_line (g, args)
710 genericobject *g;
711 object *args;
712{
Guido van Rossum03747111991-08-08 12:10:01 +0000713 return call_forms_INi (fl_deselect_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000714}
715
716static object *
717deselect_browser (g, args)
718 genericobject *g;
719 object *args;
720{
Guido van Rossum03747111991-08-08 12:10:01 +0000721 return generic_call (g, args, fl_deselect_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000722}
723
724static object *
725isselected_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000726 genericobject *g;
727 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000728{
729 int i, j;
Guido van Rossum03747111991-08-08 12:10:01 +0000730
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000731 if (!getintarg(args, &i))
732 return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000733
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000734 j = fl_isselected_browser_line (g->ob_generic, i);
Guido van Rossum03747111991-08-08 12:10:01 +0000735
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000736 return newintobject (j);
737}
738
739static object *
740get_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000741 genericobject *g;
742 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000743{
Guido van Rossum03747111991-08-08 12:10:01 +0000744 return call_forms_Ri (fl_get_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000745}
746
747static object *
748set_browser_fontsize (g, args)
749 genericobject *g;
750 object *args;
751{
Guido van Rossum03747111991-08-08 12:10:01 +0000752 return call_forms_INf (fl_set_browser_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000753}
754
755static object *
756set_browser_fontstyle (g, args)
757 genericobject *g;
758 object *args;
759{
Guido van Rossum03747111991-08-08 12:10:01 +0000760 return call_forms_INi (fl_set_browser_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000761}
762
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000763static object *
764set_browser_specialkey (g, args)
765 genericobject *g;
766 object *args;
767{
768 return call_forms_INc(fl_set_browser_specialkey, g-> ob_generic, args);
769}
770
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000771static struct methodlist browser_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000772 {"set_browser_topline", set_browser_topline},
773 {"clear_browser", clear_browser},
774 {"add_browser_line", add_browser_line},
775 {"addto_browser", addto_browser},
776 {"insert_browser_line", insert_browser_line},
777 {"delete_browser_line", delete_browser_line},
778 {"replace_browser_line", replace_browser_line},
779 {"get_browser_line", get_browser_line},
780 {"load_browser", load_browser},
781 {"get_browser_maxline", get_browser_maxline},
782 {"select_browser_line", select_browser_line},
783 {"deselect_browser_line", deselect_browser_line},
784 {"deselect_browser", deselect_browser},
785 {"isselected_browser_line", isselected_browser_line},
786 {"get_browser", get_browser},
787 {"set_browser_fontsize", set_browser_fontsize},
788 {"set_browser_fontstyle", set_browser_fontstyle},
789 {"set_browser_specialkey", set_browser_specialkey},
790 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000791};
792
793/* Class: button */
794
795static object *
796set_button(g, args)
797 genericobject *g;
798 object *args;
799{
Guido van Rossum03747111991-08-08 12:10:01 +0000800 return call_forms_INi (fl_set_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000801}
802
803static object *
804get_button(g, args)
805 genericobject *g;
806 object *args;
807{
Guido van Rossum03747111991-08-08 12:10:01 +0000808 return call_forms_Ri (fl_get_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000809}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000810static object *
811set_button_shortcut(g, args)
812 genericobject *g;
813 object *args;
814{
815 return call_forms_INstr (fl_set_button_shortcut, g-> ob_generic, args);
816}
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000817
818static struct methodlist button_methods[] = {
819 {"set_button", set_button},
820 {"get_button", get_button},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000821#ifndef FL_V15
822 {"set_button_shortcut", set_button_shortcut},
823#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000824 {NULL, NULL} /* sentinel */
825};
826
827/* Class: choice */
828
829static object *
830set_choice(g, args)
831 genericobject *g;
832 object *args;
833{
Guido van Rossum03747111991-08-08 12:10:01 +0000834 return call_forms_INi (fl_set_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000835}
836
837static object *
838get_choice(g, args)
839 genericobject *g;
840 object *args;
841{
Guido van Rossum03747111991-08-08 12:10:01 +0000842 return call_forms_Ri (fl_get_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000843}
844
845static object *
846clear_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000847 genericobject *g;
848 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000849{
Guido van Rossum03747111991-08-08 12:10:01 +0000850 return generic_call (g, args, fl_clear_choice);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000851}
852
853static object *
854addto_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000855 genericobject *g;
856 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000857{
Guido van Rossum03747111991-08-08 12:10:01 +0000858 return call_forms_INstr (fl_addto_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000859}
860
861static object *
862replace_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000863 genericobject *g;
864 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000865{
Guido van Rossum03747111991-08-08 12:10:01 +0000866 return call_forms_INiINstr (fl_replace_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000867}
868
869static object *
870delete_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000871 genericobject *g;
872 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000873{
Guido van Rossum03747111991-08-08 12:10:01 +0000874 return call_forms_INi (fl_delete_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000875}
876
877static object *
878get_choice_text (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000879 genericobject *g;
880 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000881{
Guido van Rossum03747111991-08-08 12:10:01 +0000882 return call_forms_Rstr (fl_get_choice_text, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000883}
884
885static object *
886set_choice_fontsize (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000887 genericobject *g;
888 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000889{
Guido van Rossum03747111991-08-08 12:10:01 +0000890 return call_forms_INf (fl_set_choice_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000891}
892
893static object *
894set_choice_fontstyle (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000895 genericobject *g;
896 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000897{
Guido van Rossum03747111991-08-08 12:10:01 +0000898 return call_forms_INi (fl_set_choice_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000899}
900
901static struct methodlist choice_methods[] = {
902 {"set_choice", set_choice},
903 {"get_choice", get_choice},
904 {"clear_choice", clear_choice},
905 {"addto_choice", addto_choice},
906 {"replace_choice", replace_choice},
907 {"delete_choice", delete_choice},
908 {"get_choice_text", get_choice_text},
909 {"set_choice_fontsize", set_choice_fontsize},
910 {"set_choice_fontstyle",set_choice_fontstyle},
911 {NULL, NULL} /* sentinel */
912};
913
914/* Class : Clock */
915
916static object *
917get_clock(g, args)
918 genericobject *g;
919 object *args;
920{
921 int i0, i1, i2;
922 object *arg;
923
924 if (!getnoarg(args))
925 return NULL;
926
927 fl_get_clock (g->ob_generic, &i0, &i1, &i2);
928
929 arg = newtupleobject (3);
930 if (arg == NULL) return NULL;
931
932 settupleitem (arg, 0, newintobject (i0));
933 settupleitem (arg, 1, newintobject (i1));
934 settupleitem (arg, 2, newintobject (i2));
935 return arg;
936}
937
938static struct methodlist clock_methods[] = {
939 {"get_clock", get_clock},
940 {NULL, NULL} /* sentinel */
941};
942
943/* CLass : Counters */
944
945static object *
946get_counter_value(g, args)
947 genericobject *g;
948 object *args;
949{
950 return call_forms_Rf (fl_get_counter_value, g-> ob_generic, args);
951}
952
953static object *
954set_counter_value (g, args)
955 genericobject *g;
956 object *args;
957{
958 return call_forms_INf (fl_set_counter_value, g-> ob_generic, args);
959}
960
961static object *
962set_counter_precision (g, args)
963 genericobject *g;
964 object *args;
965{
966 return call_forms_INi (fl_set_counter_precision, g-> ob_generic, args);
967}
968
969static object *
970set_counter_bounds (g, args)
971 genericobject *g;
972 object *args;
973{
974 return call_forms_INfINf (fl_set_counter_bounds, g-> ob_generic, args);
975}
976
977static object *
978set_counter_step (g, args)
979 genericobject *g;
980 object *args;
981{
982 return call_forms_INfINf (fl_set_counter_step, g-> ob_generic, args);
983}
984
985static object *
986set_counter_return (g, args)
987 genericobject *g;
988 object *args;
989{
Guido van Rossum03747111991-08-08 12:10:01 +0000990 return call_forms_INi (fl_set_counter_return, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000991}
992
993static struct methodlist counter_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000994 {"set_counter_value", set_counter_value},
995 {"get_counter_value", get_counter_value},
996 {"set_counter_bounds", set_counter_bounds},
997 {"set_counter_step", set_counter_step},
998 {"set_counter_precision", set_counter_precision},
999 {"set_counter_return", set_counter_return},
1000 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001001};
1002
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001003#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001004/* Class : Defaults */
1005
1006static object *
1007get_default(g, args)
1008 genericobject *g;
1009 object *args;
1010{
Guido van Rossum03747111991-08-08 12:10:01 +00001011 char c;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001012
Guido van Rossum03747111991-08-08 12:10:01 +00001013 if (!getnoarg(args)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001014
Guido van Rossum03747111991-08-08 12:10:01 +00001015 c = fl_get_default (g->ob_generic);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001016
Guido van Rossum03747111991-08-08 12:10:01 +00001017 return ((object *) mknewcharobject (c)); /* in cgensupport.c */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001018}
1019
1020static struct methodlist default_methods[] = {
1021 {"get_default", get_default},
1022 {NULL, NULL} /* sentinel */
1023};
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001024#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001025
1026
1027/* Class: Dials */
1028
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001029#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001030static object *
1031set_dial (g, args)
1032 genericobject *g;
1033 object *args;
1034{
1035 float f1, f2, f3;
1036
1037 if (!getfloatfloatfloatarg(args, &f1, &f2, &f3))
1038 return NULL;
1039 fl_set_dial (g->ob_generic, f1, f2, f3);
1040 INCREF(None);
1041 return None;
1042}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001043#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001044
1045static object *
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001046get_dial_value(g, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001047 genericobject *g;
1048 object *args;
1049{
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001050 return call_forms_Rf (fl_get_dial_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001051}
1052
1053static object *
1054set_dial_value (g, args)
1055 genericobject *g;
1056 object *args;
1057{
1058 return call_forms_INf (fl_set_dial_value, g-> ob_generic, args);
1059}
1060
1061static object *
1062set_dial_bounds (g, args)
1063 genericobject *g;
1064 object *args;
1065{
1066 return call_forms_INfINf (fl_set_dial_bounds, g-> ob_generic, args);
1067}
1068
1069static object *
1070get_dial_bounds (g, args)
1071 genericobject *g;
1072 object *args;
1073{
1074 return call_forms_OUTfOUTf (fl_get_dial_bounds, g-> ob_generic, args);
1075}
1076
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001077#ifndef FL_V15
1078static object *
1079set_dial_step (g, args)
1080 genericobject *g;
1081 object *args;
1082{
1083 return call_forms_INf (fl_set_dial_step, g-> ob_generic, args);
1084}
1085#endif /* !FL_V15 */
1086
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001087static struct methodlist dial_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001088#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001089 {"set_dial", set_dial},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001090 {"get_dial", get_dial_value},
1091#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001092 {"set_dial_value", set_dial_value},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001093 {"get_dial_value", get_dial_value},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001094 {"set_dial_bounds", set_dial_bounds},
1095 {"get_dial_bounds", get_dial_bounds},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001096#ifndef FL_V15
1097 {"set_dial_step", set_dial_step},
1098#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001099 {NULL, NULL} /* sentinel */
1100};
1101
1102/* Class : Input */
1103
1104static object *
1105set_input (g, args)
1106 genericobject *g;
1107 object *args;
1108{
1109 return call_forms_INstr (fl_set_input, g-> ob_generic, args);
1110}
1111
1112static object *
1113get_input (g, args)
1114 genericobject *g;
1115 object *args;
1116{
1117 return call_forms_Rstr (fl_get_input, g-> ob_generic, args);
1118}
1119
1120static object *
1121set_input_color (g, args)
1122 genericobject *g;
1123 object *args;
1124{
1125 return call_forms_INfINf (fl_set_input_color, g-> ob_generic, args);
1126}
1127
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001128#ifndef FL_V15
1129static object *
1130set_input_return (g, args)
1131 genericobject *g;
1132 object *args;
1133{
1134 return call_forms_INi (fl_set_input_return, g-> ob_generic, args);
1135}
1136#endif /* !FL_V15 */
1137
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001138static struct methodlist input_methods[] = {
1139 {"set_input", set_input},
1140 {"get_input", get_input},
1141 {"set_input_color", set_input_color},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001142#ifndef FL_V15
1143 {"set_input_return", set_input_return},
1144#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001145 {NULL, NULL} /* sentinel */
1146};
1147
1148
1149/* Class : Menu */
1150
1151static object *
1152set_menu (g, args)
1153 genericobject *g;
1154 object *args;
1155{
Guido van Rossumabe58351991-08-08 12:34:44 +00001156 return call_forms_INstr (fl_set_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001157}
1158
1159static object *
1160get_menu (g, args)
1161 genericobject *g;
1162 object *args;
1163{
Guido van Rossumabe58351991-08-08 12:34:44 +00001164 /* XXX strictly speaking this is wrong since fl_get_menu
1165 XXX returns long, not int */
1166 return call_forms_Ri (fl_get_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001167}
1168
1169static object *
1170addto_menu (g, args)
1171 genericobject *g;
1172 object *args;
1173{
Guido van Rossumabe58351991-08-08 12:34:44 +00001174 return call_forms_INstr (fl_addto_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001175}
1176
1177static struct methodlist menu_methods[] = {
1178 {"set_menu", set_menu},
1179 {"get_menu", get_menu},
1180 {"addto_menu", addto_menu},
1181 {NULL, NULL} /* sentinel */
1182};
1183
1184
1185/* Class: Sliders */
1186
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001187#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001188static object *
1189set_slider (g, args)
1190 genericobject *g;
1191 object *args;
1192{
1193 float f1, f2, f3;
1194
1195 if (!getfloatfloatfloatarg(args, &f1, &f2, &f3))
1196 return NULL;
1197 fl_set_slider (g->ob_generic, f1, f2, f3);
1198 INCREF(None);
1199 return None;
1200}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001201#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001202
1203static object *
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001204get_slider_value(g, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001205 genericobject *g;
1206 object *args;
1207{
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001208 return call_forms_Rf (fl_get_slider_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001209}
1210
1211static object *
1212set_slider_value (g, args)
1213 genericobject *g;
1214 object *args;
1215{
1216 return call_forms_INf (fl_set_slider_value, g-> ob_generic, args);
1217}
1218
1219static object *
1220set_slider_bounds (g, args)
1221 genericobject *g;
1222 object *args;
1223{
1224 return call_forms_INfINf (fl_set_slider_bounds, g-> ob_generic, args);
1225}
1226
1227static object *
1228get_slider_bounds (g, args)
1229 genericobject *g;
1230 object *args;
1231{
1232 return call_forms_OUTfOUTf(fl_get_slider_bounds, g-> ob_generic, args);
1233}
1234
1235static object *
1236set_slider_return (g, args)
1237 genericobject *g;
1238 object *args;
1239{
1240 return call_forms_INf (fl_set_slider_return, g-> ob_generic, args);
1241}
1242
1243static object *
1244set_slider_size (g, args)
1245 genericobject *g;
1246 object *args;
1247{
1248 return call_forms_INf (fl_set_slider_size, g-> ob_generic, args);
1249}
1250
1251static object *
1252set_slider_precision (g, args)
1253 genericobject *g;
1254 object *args;
1255{
1256 return call_forms_INi (fl_set_slider_precision, g-> ob_generic, args);
1257}
1258
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001259#ifndef FL_V15
1260static object *
1261set_slider_step (g, args)
1262 genericobject *g;
1263 object *args;
1264{
1265 return call_forms_INf (fl_set_slider_step, g-> ob_generic, args);
1266}
1267#endif /* !FL_V15 */
1268
1269
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001270static struct methodlist slider_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001271#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001272 {"set_slider", set_slider},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001273 {"get_slider", get_slider_value},
1274#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001275 {"set_slider_value", set_slider_value},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001276 {"get_slider_value", get_slider_value},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001277 {"set_slider_bounds", set_slider_bounds},
1278 {"get_slider_bounds", get_slider_bounds},
1279 {"set_slider_return", set_slider_return},
1280 {"set_slider_size", set_slider_size},
1281 {"set_slider_precision",set_slider_precision},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001282#ifndef FL_V15
1283 {"set_slider_step", set_slider_step},
1284#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001285 {NULL, NULL} /* sentinel */
1286};
1287
1288static object *
1289set_positioner_xvalue (g, args)
1290 genericobject *g;
1291 object *args;
1292{
1293 return call_forms_INf (fl_set_positioner_xvalue, g-> ob_generic, args);
1294}
1295
1296static object *
1297set_positioner_xbounds (g, args)
1298 genericobject *g;
1299 object *args;
1300{
1301 return call_forms_INfINf (fl_set_positioner_xbounds, g-> ob_generic, args);
1302}
1303
1304static object *
1305set_positioner_yvalue (g, args)
1306 genericobject *g;
1307 object *args;
1308{
1309 return call_forms_INf (fl_set_positioner_yvalue, g-> ob_generic, args);
1310}
1311
1312static object *
1313set_positioner_ybounds (g, args)
1314 genericobject *g;
1315 object *args;
1316{
1317 return call_forms_INfINf (fl_set_positioner_ybounds, g-> ob_generic, args);
1318}
1319
1320static object *
1321get_positioner_xvalue (g, args)
1322 genericobject *g;
1323 object *args;
1324{
1325 return call_forms_Rf (fl_get_positioner_xvalue, g-> ob_generic, args);
1326}
1327
1328static object *
1329get_positioner_xbounds (g, args)
1330 genericobject *g;
1331 object *args;
1332{
1333 return call_forms_OUTfOUTf (fl_get_positioner_xbounds, g-> ob_generic, args);
1334}
1335
1336static object *
1337get_positioner_yvalue (g, args)
1338 genericobject *g;
1339 object *args;
1340{
1341 return call_forms_Rf (fl_get_positioner_yvalue, g-> ob_generic, args);
1342}
1343
1344static object *
1345get_positioner_ybounds (g, args)
1346 genericobject *g;
1347 object *args;
1348{
1349 return call_forms_OUTfOUTf (fl_get_positioner_ybounds, g-> ob_generic, args);
1350}
1351
1352static struct methodlist positioner_methods[] = {
1353 {"set_positioner_xvalue", set_positioner_xvalue},
1354 {"set_positioner_yvalue", set_positioner_yvalue},
1355 {"set_positioner_xbounds", set_positioner_xbounds},
1356 {"set_positioner_ybounds", set_positioner_ybounds},
1357 {"get_positioner_xvalue", get_positioner_xvalue},
1358 {"get_positioner_yvalue", get_positioner_yvalue},
1359 {"get_positioner_xbounds", get_positioner_xbounds},
Guido van Rossum03747111991-08-08 12:10:01 +00001360 {"get_positioner_ybounds", get_positioner_ybounds},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001361 {NULL, NULL} /* sentinel */
1362};
1363
1364/* Class timer */
1365
1366static object *
1367set_timer (g, args)
1368 genericobject *g;
1369 object *args;
1370{
1371 return call_forms_INf (fl_set_timer, g-> ob_generic, args);
1372}
1373
1374static object *
1375get_timer (g, args)
1376 genericobject *g;
1377 object *args;
1378{
1379 return call_forms_Rf (fl_get_timer, g-> ob_generic, args);
1380}
1381
1382static struct methodlist timer_methods[] = {
1383 {"set_timer", set_timer},
1384 {"get_timer", get_timer},
1385 {NULL, NULL} /* sentinel */
1386};
1387
1388/* Form objects */
1389
1390typedef struct {
1391 OB_HEAD
1392 FL_FORM *ob_form;
1393} formobject;
1394
1395extern typeobject Formtype; /* Forward */
1396
1397#define is_formobject(v) ((v)->ob_type == &Formtype)
1398
1399static object *
1400form_show_form(f, args)
1401 formobject *f;
1402 object *args;
1403{
1404 int place, border;
1405 object *name;
1406 if (!getintintstrarg(args, &place, &border, &name))
1407 return NULL;
1408 fl_show_form(f->ob_form, place, border, getstringvalue(name));
1409 INCREF(None);
1410 return None;
1411}
1412
1413static object *
1414form_call(func, f, args)
1415 FL_FORM *f;
1416 object *args;
1417 void (*func)(FL_FORM *);
1418{
1419 if (!getnoarg(args)) return NULL;
1420
1421 (*func)(f);
1422
1423 INCREF(None);
1424 return None;
1425}
1426
1427static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001428form_call_INiINi(func, f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001429 FL_FORM *f;
1430 object *args;
1431 void (*func)(FL_FORM *, int, int);
1432{
1433 int a, b;
1434
1435 if (!getintintarg(args, &a, &b)) return NULL;
1436
1437 (*func)(f, a, b);
1438
1439 INCREF(None);
1440 return None;
1441}
1442
1443static object *
1444form_hide_form(f, args)
1445 formobject *f;
1446 object *args;
1447{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001448 return form_call(fl_hide_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001449}
1450
1451static object *
1452form_redraw_form(f, args)
1453 formobject *f;
1454 object *args;
1455{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001456 return form_call(fl_redraw_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001457}
1458
1459static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001460form_add_object(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001461 formobject *f;
1462 object *args;
1463{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001464 if (args == NULL || !is_genericobject(args)) {
1465 err_badarg();
1466 return NULL;
1467 }
1468
1469 fl_add_object(f->ob_form, ((genericobject *)args) -> ob_generic);
1470
1471 INCREF(None);
1472 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001473}
1474
1475static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001476form_set_form_position(f, args)
1477 formobject *f;
1478 object *args;
1479{
1480 return form_call_INiINi(fl_set_form_position, f-> ob_form, args);
1481}
1482
1483static object *
1484generic_add_object(f, args, func, internal_methods)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001485 formobject *f;
1486 object *args;
1487 FL_OBJECT *(*func)(int, float, float, float, float, char*);
1488 struct methodlist *internal_methods;
1489{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001490 int type;
1491 float x, y, w, h;
1492 object *name;
1493 FL_OBJECT *obj;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001494
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001495 if (!getintfloatfloatfloatfloatstrarg(args,&type,&x,&y,&w,&h,&name))
1496 return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001497
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001498 fl_addto_form (f-> ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001499
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001500 obj = (*func) (type, x, y, w, h, getstringvalue(name));
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001501
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001502 fl_end_form();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001503
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001504 if (obj == NULL) {
1505 err_nomem();
1506 return NULL;
1507 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001508
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001509 return newgenericobject (obj, internal_methods);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001510}
1511
1512static object *
1513form_add_button(f, args)
1514 formobject *f;
1515 object *args;
1516{
1517 return generic_add_object(f, args, fl_add_button, button_methods);
1518}
1519
1520static object *
1521form_add_lightbutton(f, args)
1522 formobject *f;
1523 object *args;
1524{
1525 return generic_add_object(f, args, fl_add_lightbutton, button_methods);
1526}
1527
1528static object *
1529form_add_roundbutton(f, args)
1530 formobject *f;
1531 object *args;
1532{
1533 return generic_add_object(f, args, fl_add_roundbutton, button_methods);
1534}
1535
1536static object *
1537form_add_menu (f, args)
1538 formobject *f;
1539 object *args;
1540{
1541 return generic_add_object(f, args, fl_add_menu, menu_methods);
1542}
1543
1544static object *
1545form_add_slider(f, args)
1546 formobject *f;
1547 object *args;
1548{
1549 return generic_add_object(f, args, fl_add_slider, slider_methods);
1550}
1551
1552static object *
1553form_add_valslider(f, args)
1554 formobject *f;
1555 object *args;
1556{
1557 return generic_add_object(f, args, fl_add_valslider, slider_methods);
1558}
1559
1560static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001561form_add_dial(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001562 formobject *f;
1563 object *args;
1564{
1565 return generic_add_object(f, args, fl_add_dial, dial_methods);
1566}
1567
1568static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001569form_add_counter(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001570 formobject *f;
1571 object *args;
1572{
1573 return generic_add_object(f, args, fl_add_counter, counter_methods);
1574}
1575
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001576#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001577static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001578form_add_default(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001579 formobject *f;
1580 object *args;
1581{
1582 return generic_add_object(f, args, fl_add_default, default_methods);
1583}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001584#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001585
1586static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001587form_add_clock(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001588 formobject *f;
1589 object *args;
1590{
1591 return generic_add_object(f, args, fl_add_clock, clock_methods);
1592}
1593
1594static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001595form_add_box(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001596 formobject *f;
1597 object *args;
1598{
Guido van Rossum03747111991-08-08 12:10:01 +00001599 return generic_add_object(f, args, fl_add_box,
1600 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001601}
1602
1603static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001604form_add_choice(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001605 formobject *f;
1606 object *args;
1607{
1608 return generic_add_object(f, args, fl_add_choice, choice_methods);
1609}
1610
1611static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001612form_add_browser(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001613 formobject *f;
1614 object *args;
1615{
1616 return generic_add_object(f, args, fl_add_browser, browser_methods);
1617}
1618
1619static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001620form_add_positioner(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001621 formobject *f;
1622 object *args;
1623{
1624 return generic_add_object(f, args, fl_add_positioner, positioner_methods);
1625}
1626
1627static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001628form_add_input(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001629 formobject *f;
1630 object *args;
1631{
1632 return generic_add_object(f, args, fl_add_input, input_methods);
1633}
1634
1635static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001636form_add_text(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001637 formobject *f;
1638 object *args;
1639{
Guido van Rossum03747111991-08-08 12:10:01 +00001640 return generic_add_object(f, args, fl_add_text,
1641 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001642}
1643
1644static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001645form_add_timer(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001646 formobject *f;
1647 object *args;
1648{
1649 return generic_add_object(f, args, fl_add_timer, timer_methods);
1650}
1651
1652static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001653form_freeze_form(f, args)
1654 formobject *f;
1655 object *args;
1656{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001657 return form_call(fl_freeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001658}
1659
1660static object *
1661form_unfreeze_form(f, args)
1662 formobject *f;
1663 object *args;
1664{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001665 return form_call(fl_unfreeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001666}
1667
1668static object *
1669form_display_form(f, args)
1670 formobject *f;
1671 object *args;
1672{
1673 int place, border;
1674 object *name;
1675 if (!getintintstrarg(args, &place, &border, &name))
1676 return NULL;
1677 fl_show_form(f->ob_form, place, border, getstringvalue(name));
1678 INCREF(None);
1679 return None;
1680}
1681
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001682#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001683static object *
1684form_remove_form(f, args)
1685 formobject *f;
1686 object *args;
1687{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001688 return form_call(fl_remove_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001689}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001690#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001691
1692static object *
1693form_activate_form(f, args)
1694 formobject *f;
1695 object *args;
1696{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001697 return form_call(fl_activate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001698}
1699
1700static object *
1701form_deactivate_form(f, args)
1702 formobject *f;
1703 object *args;
1704{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001705 return form_call(fl_deactivate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001706}
1707
Guido van Rossum75cc8981991-08-08 12:07:45 +00001708static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001709form_bgn_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001710 formobject *f;
1711 object *args;
1712{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001713 FL_OBJECT *obj;
1714
1715 fl_addto_form(f-> ob_form);
1716 obj = fl_bgn_group();
1717 fl_end_form();
1718
1719 if (obj == NULL) {
1720 err_nomem();
1721 return NULL;
1722 }
1723
1724 return newgenericobject (obj, (struct methodlist *) NULL);
Guido van Rossum03747111991-08-08 12:10:01 +00001725}
1726
1727static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001728form_end_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001729 formobject *f;
1730 object *args;
1731{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001732 fl_addto_form(f-> ob_form);
Guido van Rossum03747111991-08-08 12:10:01 +00001733 fl_end_group();
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001734 fl_end_form();
Guido van Rossum03747111991-08-08 12:10:01 +00001735 INCREF(None);
1736 return None;
1737}
1738
1739static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001740forms_find_first_or_last(func, f, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00001741 FL_OBJECT *(*func)(FL_FORM *, int, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +00001742 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001743 object *args;
1744{
1745 int type;
1746 float mx, my;
1747 FL_OBJECT *generic;
1748 genericobject *g;
1749
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001750 if (!getintfloatfloatarg(args, &type, &mx, &my)) return NULL;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001751
Guido van Rossum03747111991-08-08 12:10:01 +00001752 generic = (*func) (f-> ob_form, type, mx, my);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001753
1754 if (generic == NULL)
1755 {
1756 INCREF(None);
1757 return None;
1758 }
1759
1760 g = findgeneric(generic);
1761 if (g == NULL) {
1762 err_setstr(RuntimeError,
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001763 "forms_find_{first|last} returns unknown object");
Guido van Rossum75cc8981991-08-08 12:07:45 +00001764 return NULL;
1765 }
1766 INCREF(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001767 return (object *) g;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001768}
1769
1770static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001771form_find_first(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001772 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001773 object *args;
1774{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001775 return forms_find_first_or_last(fl_find_first, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001776}
1777
1778static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001779form_find_last(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001780 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001781 object *args;
1782{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001783 return forms_find_first_or_last(fl_find_last, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001784}
1785
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001786static struct methodlist form_methods[] = {
1787/* adm */
1788 {"show_form", form_show_form},
1789 {"hide_form", form_hide_form},
1790 {"redraw_form", form_redraw_form},
1791 {"set_form_position", form_set_form_position},
1792 {"freeze_form", form_freeze_form},
1793 {"unfreeze_form", form_unfreeze_form},
1794 {"display_form", form_display_form},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001795#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001796 {"remove_form", form_remove_form},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001797#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001798 {"activate_form", form_activate_form},
1799 {"deactivate_form", form_deactivate_form},
Guido van Rossum03747111991-08-08 12:10:01 +00001800 {"bgn_group", form_bgn_group},
1801 {"end_group", form_end_group},
Guido van Rossum75cc8981991-08-08 12:07:45 +00001802 {"find_first", form_find_first},
1803 {"find_last", form_find_last},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001804
1805/* basic objects */
1806 {"add_button", form_add_button},
1807/* {"add_bitmap", form_add_bitmap}, */
1808 {"add_lightbutton", form_add_lightbutton},
1809 {"add_roundbutton", form_add_roundbutton},
1810 {"add_menu", form_add_menu},
1811 {"add_slider", form_add_slider},
1812 {"add_positioner", form_add_positioner},
1813 {"add_valslider", form_add_valslider},
1814 {"add_dial", form_add_dial},
1815 {"add_counter", form_add_counter},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001816#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001817 {"add_default", form_add_default},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001818#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001819 {"add_box", form_add_box},
1820 {"add_clock", form_add_clock},
1821 {"add_choice", form_add_choice},
1822 {"add_browser", form_add_browser},
1823 {"add_input", form_add_input},
1824 {"add_timer", form_add_timer},
1825 {"add_text", form_add_text},
1826 {NULL, NULL} /* sentinel */
1827};
1828
1829static void
1830form_dealloc(f)
1831 formobject *f;
1832{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001833 releaseobjects(f->ob_form);
1834 fl_free_form(f->ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001835 DEL(f);
1836}
1837
Guido van Rossumd97f0481991-11-19 20:26:28 +00001838#define OFF(x) offsetof(FL_FORM, x)
1839
Guido van Rossum32db5e31991-11-12 15:43:18 +00001840static struct memberlist form_memberlist[] = {
1841 {"window", T_LONG, OFF(window), RO},
1842 {"w", T_FLOAT, OFF(w)},
1843 {"h", T_FLOAT, OFF(h)},
1844 {"x", T_FLOAT, OFF(x)},
1845 {"y", T_FLOAT, OFF(y)},
1846 {"deactivated", T_INT, OFF(deactivated)},
1847 {"visible", T_INT, OFF(visible)},
1848 {"frozen", T_INT, OFF(frozen)},
1849 {"doublebuf", T_INT, OFF(doublebuf)},
1850 {NULL} /* Sentinel */
1851};
1852
Guido van Rossumd97f0481991-11-19 20:26:28 +00001853#undef OFF
1854
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001855static object *
1856form_getattr(f, name)
1857 formobject *f;
1858 char *name;
1859{
Guido van Rossum32db5e31991-11-12 15:43:18 +00001860 object *meth;
1861
1862 meth = findmethod(form_methods, (object *)f, name);
1863 if (meth != NULL)
1864 return meth;
1865 err_clear();
1866 return getmember((char *)f->ob_form, form_memberlist, name);
1867}
1868
1869static int
1870form_setattr(f, name, v)
1871 formobject *f;
1872 char *name;
1873 object *v;
1874{
1875 int ret;
1876
1877 if (v == NULL) {
1878 err_setstr(TypeError, "can't delete form attributes");
1879 return NULL;
1880 }
1881
1882 return setmember((char *)f->ob_form, form_memberlist, name, v);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001883}
1884
1885typeobject Formtype = {
1886 OB_HEAD_INIT(&Typetype)
1887 0, /*ob_size*/
1888 "form", /*tp_name*/
1889 sizeof(formobject), /*tp_size*/
1890 0, /*tp_itemsize*/
1891 /* methods */
1892 form_dealloc, /*tp_dealloc*/
1893 0, /*tp_print*/
1894 form_getattr, /*tp_getattr*/
Guido van Rossum32db5e31991-11-12 15:43:18 +00001895 form_setattr, /*tp_setattr*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001896 0, /*tp_compare*/
1897 0, /*tp_repr*/
1898};
1899
1900static object *
1901newformobject(form)
1902 FL_FORM *form;
1903{
1904 formobject *f;
1905 f = NEWOBJ(formobject, &Formtype);
1906 if (f == NULL)
1907 return NULL;
1908 f->ob_form = form;
1909 return (object *)f;
1910}
1911
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001912
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001913/* The "fl" module */
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001914
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001915static object *
1916forms_make_form(dummy, args)
1917 object *dummy;
1918 object *args;
1919{
1920 int type;
1921 float w, h;
1922 FL_FORM *form;
1923 if (!getintfloatfloatarg(args, &type, &w, &h))
1924 return NULL;
1925 form = fl_bgn_form(type, w, h);
1926 if (form == NULL) {
1927 /* XXX Actually, cannot happen! */
1928 err_nomem();
1929 return NULL;
1930 }
1931 fl_end_form();
1932 return newformobject(form);
1933}
1934
1935static object *my_event_callback = NULL;
1936
1937static object *
1938forms_set_event_call_back(dummy, args)
1939 object *dummy;
1940 object *args;
1941{
1942 my_event_callback = args;
1943 XINCREF(args);
1944 INCREF(None);
1945 return None;
1946}
1947
1948static object *
1949forms_do_or_check_forms(dummy, args, func)
1950 object *dummy;
1951 object *args;
1952 FL_OBJECT *(*func)();
1953{
1954 FL_OBJECT *generic;
1955 genericobject *g;
1956 object *arg, *res;
1957
1958 if (!getnoarg(args))
1959 return NULL;
1960
1961 for (;;) {
1962 generic = (*func)();
1963 if (generic == NULL) {
1964 INCREF(None);
1965 return None;
1966 }
1967 if (generic == FL_EVENT) {
1968 int dev;
1969 short val;
1970 if (my_event_callback == NULL)
1971 return newintobject(-1);
1972 dev = fl_qread(&val);
1973 arg = newtupleobject(2);
1974 if (arg == NULL)
1975 return NULL;
1976 settupleitem(arg, 0, newintobject((long)dev));
1977 settupleitem(arg, 1, newintobject((long)val));
1978 res = call_object(my_event_callback, arg);
1979 XDECREF(res);
1980 DECREF(arg);
1981 if (res == NULL)
1982 return NULL; /* Callback raised exception */
1983 continue;
1984 }
1985 g = findgeneric(generic);
1986 if (g == NULL) {
1987 err_setstr(RuntimeError,
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001988 "{do|check}_forms returns unknown object");
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001989 return NULL;
1990 }
1991 if (g->ob_callback == NULL) {
1992 INCREF(g);
1993 return ((object *) g);
1994 }
1995 arg = newtupleobject(2);
1996 INCREF(g);
Guido van Rossumabe58351991-08-08 12:34:44 +00001997 settupleitem(arg, 0, (object *)g);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001998 INCREF(g->ob_callback_arg);
1999 settupleitem(arg, 1, g->ob_callback_arg);
2000 res = call_object(g->ob_callback, arg);
2001 XDECREF(res);
2002 DECREF(arg);
2003 if (res == NULL)
2004 return NULL; /* Callback raised exception */
2005 }
2006}
2007
2008static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002009forms_do_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002010 object *dummy;
2011 object *args;
2012{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002013 return forms_do_or_check_forms(dummy, args, fl_do_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002014}
2015
2016static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002017forms_check_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002018 object *dummy;
2019 object *args;
2020{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002021 return forms_do_or_check_forms(dummy, args, fl_check_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002022}
2023
Guido van Rossum03747111991-08-08 12:10:01 +00002024#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002025static object *
2026fl_call(func, args)
2027 object *args;
2028 void (*func)();
2029{
2030 if (!getnoarg(args))
2031 return NULL;
2032 (*func)();
2033 INCREF(None);
2034 return None;
2035}
Guido van Rossum03747111991-08-08 12:10:01 +00002036#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002037
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002038#ifndef FL_V15
2039static object *
2040forms_set_graphics_mode(dummy, args)
2041 object *dummy;
2042 object *args;
2043{
2044 int rgbmode, doublebuf;
2045
2046 if (!getintintarg(args, &rgbmode, &doublebuf))
2047 return NULL;
2048 fl_set_graphics_mode(rgbmode,doublebuf);
2049 INCREF(None);
2050 return None;
2051}
2052
2053static object *
2054forms_get_rgbmode(dummy, args)
2055 object *dummy;
2056 object *args;
2057{
2058 extern fl_rgbmode;
2059
2060 if (args != NULL) {
2061 err_badarg();
2062 return NULL;
2063 }
2064 return newintobject(fl_rgbmode);
2065}
2066#endif /* !FL_V15 */
2067
2068
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002069static object *
2070forms_qdevice(self, args)
2071 object *self;
2072 object *args;
2073{
2074 short arg1 ;
2075 if (!getishortarg(args, 1, 0, &arg1))
2076 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002077 fl_qdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002078 INCREF(None);
2079 return None;
2080}
2081
2082static object *
2083forms_unqdevice(self, args)
2084 object *self;
2085 object *args;
2086{
2087 short arg1 ;
2088 if (!getishortarg(args, 1, 0, &arg1))
2089 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002090 fl_unqdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002091 INCREF(None);
2092 return None;
2093}
2094
2095static object *
2096forms_isqueued(self, args)
2097 object *self;
2098 object *args;
2099{
Guido van Rossum03747111991-08-08 12:10:01 +00002100 long retval;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002101 short arg1 ;
2102 if (!getishortarg(args, 1, 0, &arg1))
2103 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002104 retval = fl_isqueued(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002105
Guido van Rossum03747111991-08-08 12:10:01 +00002106 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002107}
2108
2109static object *
2110forms_qtest(self, args)
2111 object *self;
2112 object *args;
2113{
2114 long retval;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002115 retval = fl_qtest();
Guido van Rossum03747111991-08-08 12:10:01 +00002116 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002117}
2118
2119
2120static object *
2121forms_qread(self, args)
2122 object *self;
2123 object *args;
2124{
2125 long retval;
2126 short arg1 ;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002127 retval = fl_qread(&arg1);
2128 { object *v = newtupleobject(2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002129 if (v == NULL) return NULL;
2130 settupleitem(v, 0, newintobject(retval));
2131 settupleitem(v, 1, newintobject((long)arg1));
2132 return v;
2133 }
2134}
2135
2136static object *
2137forms_qreset(self, args)
2138 object *self;
2139 object *args;
2140{
2141 if (!getnoarg(args)) return NULL;
2142
Guido van Rossum03747111991-08-08 12:10:01 +00002143 fl_qreset();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002144 INCREF(None);
2145 return None;
2146}
2147
2148static object *
2149forms_qenter(self, args)
2150 object *self;
2151 object *args;
2152{
2153 short arg1 ;
2154 short arg2 ;
2155 if (!getishortarg(args, 2, 0, &arg1))
2156 return NULL;
2157 if (!getishortarg(args, 2, 1, &arg2))
2158 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002159 fl_qenter(arg1, arg2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002160 INCREF(None);
2161 return None;
2162}
2163
2164static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002165forms_color(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002166 object *self;
2167 object *args;
2168{
2169 int arg;
2170
2171 if (!getintarg(args, &arg)) return NULL;
2172
2173 fl_color((short) arg);
2174
2175 INCREF(None);
2176 return None;
2177}
2178
2179static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002180forms_mapcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002181 object *self;
2182 object *args;
2183{
2184 int arg0, arg1, arg2, arg3;
2185
2186 if (!getintintintintarg(args, &arg0, &arg1, &arg2, &arg3))
2187 return NULL;
2188
2189 fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);
2190
2191 INCREF(None);
2192 return None;
2193}
2194
2195static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002196forms_getmcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002197 object *self;
2198 object *args;
2199{
Guido van Rossum03747111991-08-08 12:10:01 +00002200 int arg;
2201 short r, g, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002202 object *v;
2203
2204 if (!getintarg(args, &arg)) return NULL;
2205
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002206 fl_getmcolor(arg, &r, &g, &b);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002207
2208 v = newtupleobject(3);
2209
2210 if (v == NULL) return NULL;
2211
Guido van Rossum03747111991-08-08 12:10:01 +00002212 settupleitem(v, 0, newintobject((long)r));
2213 settupleitem(v, 1, newintobject((long)g));
2214 settupleitem(v, 2, newintobject((long)b));
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002215
2216 return v;
2217}
2218
2219static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002220forms_get_mouse(self, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00002221 object *self;
2222 object *args;
2223{
2224 float x, y ;
2225 object *v;
2226
2227 if (!getnoarg(args)) return NULL;
2228
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002229 fl_get_mouse(&x, &y);
Guido van Rossum75cc8981991-08-08 12:07:45 +00002230
2231 v = newtupleobject(2);
2232
2233 if (v == NULL) return NULL;
2234
2235 settupleitem(v, 0, newfloatobject(x));
2236 settupleitem(v, 1, newfloatobject(y));
2237
2238 return v;
2239}
2240
2241static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002242forms_tie(self, args)
2243 object *self;
2244 object *args;
2245{
2246 short arg1 ;
2247 short arg2 ;
2248 short arg3 ;
2249 if (!getishortarg(args, 3, 0, &arg1))
2250 return NULL;
2251 if (!getishortarg(args, 3, 1, &arg2))
2252 return NULL;
2253 if (!getishortarg(args, 3, 2, &arg3))
2254 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002255 fl_tie(arg1, arg2, arg3);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002256 INCREF(None);
2257 return None;
2258}
2259
Guido van Rossum03747111991-08-08 12:10:01 +00002260static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002261forms_show_message(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002262 object *f;
2263 object *args;
2264{
2265 object *a, *b, *c;
2266
2267 if (!getstrstrstrarg(args, &a, &b, &c)) return NULL;
2268
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002269 fl_show_message(
Guido van Rossum03747111991-08-08 12:10:01 +00002270 getstringvalue(a), getstringvalue(b), getstringvalue(c));
2271
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002272 INCREF(None);
Guido van Rossum03747111991-08-08 12:10:01 +00002273 return None;
2274}
2275
2276static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002277forms_show_question(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002278 object *f;
2279 object *args;
2280{
2281 int ret;
2282 object *a, *b, *c;
2283
2284 if (!getstrstrstrarg(args, &a, &b, &c)) return NULL;
2285
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002286 ret = fl_show_question(
Guido van Rossum03747111991-08-08 12:10:01 +00002287 getstringvalue(a), getstringvalue(b), getstringvalue(c));
2288
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002289 return newintobject((long) ret);
Guido van Rossum03747111991-08-08 12:10:01 +00002290}
2291
2292static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002293forms_show_input(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002294 object *f;
2295 object *args;
2296{
2297 char *str;
2298 object *a, *b;
2299
2300 if (!getstrstrarg(args, &a, &b)) return NULL;
2301
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002302 str = fl_show_input(getstringvalue(a), getstringvalue(b));
2303
2304 if (str == NULL) {
2305 INCREF(None);
2306 return None;
2307 }
2308 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002309}
2310
2311static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002312forms_file_selector(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002313 object *f;
2314 object *args;
2315{
2316 char *str;
2317 object *a, *b, *c, *d;
2318
2319 if (!getstrstrstrstrarg(args, &a, &b, &c, &d)) return NULL;
2320
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002321 str = fl_show_file_selector(getstringvalue(a), getstringvalue(b),
2322 getstringvalue(c), getstringvalue(d));
Guido van Rossum03747111991-08-08 12:10:01 +00002323
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002324 if (str == NULL) {
2325 INCREF(None);
2326 return None;
2327 }
2328 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002329}
2330
2331
2332static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002333forms_file_selector_func(args, func)
Guido van Rossum03747111991-08-08 12:10:01 +00002334 object *args;
2335 char *(*func)();
2336{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002337 char *str;
Guido van Rossum03747111991-08-08 12:10:01 +00002338
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002339 str = (*func) ();
2340
2341 if (str == NULL) {
2342 INCREF(None);
2343 return None;
2344 }
2345 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002346}
2347
2348static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002349forms_get_directory(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002350 object *f;
2351 object *args;
2352{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002353 return forms_file_selector_func(args, fl_get_directory);
Guido van Rossum03747111991-08-08 12:10:01 +00002354}
2355
2356static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002357forms_get_pattern(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002358 object *f;
2359 object *args;
2360{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002361 return forms_file_selector_func(args, fl_get_pattern);
Guido van Rossum03747111991-08-08 12:10:01 +00002362}
2363
2364static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002365forms_get_filename(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002366 object *f;
2367 object *args;
2368{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002369 return forms_file_selector_func(args, fl_get_filename);
Guido van Rossum03747111991-08-08 12:10:01 +00002370}
2371
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002372static struct methodlist forms_methods[] = {
2373/* adm */
2374 {"make_form", forms_make_form},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002375/* gl support wrappers */
2376 {"qdevice", forms_qdevice},
2377 {"unqdevice", forms_unqdevice},
2378 {"isqueued", forms_isqueued},
2379 {"qtest", forms_qtest},
2380 {"qread", forms_qread},
2381/* {"blkqread", forms_blkqread}, */
2382 {"qreset", forms_qreset},
2383 {"qenter", forms_qenter},
Guido van Rossum03747111991-08-08 12:10:01 +00002384 {"get_mouse", forms_get_mouse},
2385 {"tie", forms_tie},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002386/* {"new_events", forms_new_events}, */
2387 {"color", forms_color},
2388 {"mapcolor", forms_mapcolor},
2389 {"getmcolor", forms_getmcolor},
2390/* interaction */
2391 {"do_forms", forms_do_forms},
2392 {"check_forms", forms_check_forms},
2393 {"set_event_call_back", forms_set_event_call_back},
2394/* goodies */
Guido van Rossum03747111991-08-08 12:10:01 +00002395 {"show_message", forms_show_message},
2396 {"show_question", forms_show_question},
2397 {"file_selector", forms_file_selector},
2398 {"get_directory", forms_get_directory},
2399 {"get_pattern", forms_get_pattern},
2400 {"get_filename", forms_get_filename},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002401#ifndef FL_V15
2402 {"set_graphics_mode", forms_set_graphics_mode},
2403 {"get_rgbmode", forms_get_rgbmode},
2404#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002405/*
Guido van Rossum03747111991-08-08 12:10:01 +00002406 {"show_choice", forms_show_choice},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002407 XXX - draw.c
2408*/
Guido van Rossum03747111991-08-08 12:10:01 +00002409 {"show_input", forms_show_input},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002410 {NULL, NULL} /* sentinel */
2411};
2412
2413void
2414initfl()
2415{
2416 initmodule("fl", forms_methods);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002417 foreground();
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002418#ifndef FL_V15
2419 fl_init();
2420#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002421}
2422
2423
2424/* Support routines */
2425
2426int
2427getintintstrarg(args, a, b, c)
2428 object *args;
2429 int *a, *b;
2430 object **c;
2431{
2432 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2433 err_badarg();
2434 return NULL;
2435 }
2436 return getintarg(gettupleitem(args, 0), a) &&
2437 getintarg(gettupleitem(args, 1), b) &&
2438 getstrarg(gettupleitem(args, 2), c);
2439}
2440
2441int
2442getintfloatfloatarg(args, a, b, c)
2443 object *args;
2444 int *a;
2445 float *b, *c;
2446{
2447 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2448 err_badarg();
2449 return NULL;
2450 }
2451 return getintarg(gettupleitem(args, 0), a) &&
2452 getfloatarg(gettupleitem(args, 1), b) &&
2453 getfloatarg(gettupleitem(args, 2), c);
2454}
2455
2456int
2457getintintintintarg(args, a, b, c, d)
2458 object *args;
2459 int *a, *b, *c, *d;
2460{
2461 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 4) {
2462 err_badarg();
2463 return NULL;
2464 }
2465 return getintarg(gettupleitem(args, 0), a) &&
2466 getintarg(gettupleitem(args, 1), b) &&
2467 getintarg(gettupleitem(args, 2), c) &&
2468 getintarg(gettupleitem(args, 3), d);
2469}
2470
2471int
2472getfloatarg(args, a)
2473 object *args;
2474 float *a;
2475{
2476 double x;
2477 if (!getdoublearg(args, &x))
2478 return 0;
2479 *a = x;
2480 return 1;
2481}
2482
2483int
Guido van Rossum03747111991-08-08 12:10:01 +00002484getintfloatfloatfloatfloatstrarg(args, type, x, y, w, h, name)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002485 object *args;
2486 int *type;
2487 float *x, *y, *w, *h;
2488 object **name;
2489{
2490 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 6) {
2491 err_badarg();
2492 return NULL;
2493 }
2494 return getintarg(gettupleitem(args, 0), type) &&
2495 getfloatarg(gettupleitem(args, 1), x) &&
2496 getfloatarg(gettupleitem(args, 2), y) &&
2497 getfloatarg(gettupleitem(args, 3), w) &&
2498 getfloatarg(gettupleitem(args, 4), h) &&
2499 getstrarg(gettupleitem(args, 5), name);
2500}
2501
2502int
2503getfloatfloatfloatarg(args, f1, f2, f3)
2504 object *args;
2505 float *f1, *f2, *f3;
2506{
2507 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2508 err_badarg();
2509 return NULL;
2510 }
2511 return getfloatarg(gettupleitem(args, 0), f1) &&
2512 getfloatarg(gettupleitem(args, 1), f2) &&
2513 getfloatarg(gettupleitem(args, 2), f3);
2514}
2515
2516int
2517getfloatfloatarg(args, f1, f2)
2518 object *args;
2519 float *f1, *f2;
2520{
2521 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
2522 err_badarg();
2523 return NULL;
2524 }
2525 return getfloatarg(gettupleitem(args, 0), f1) &&
2526 getfloatarg(gettupleitem(args, 1), f2);
2527}
2528
2529int
2530getstrstrstrarg(v, a, b, c)
2531 object *v;
2532 object **a;
2533 object **b;
2534 object **c;
2535{
2536 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3) {
2537 return err_badarg();
2538 }
2539 return getstrarg(gettupleitem(v, 0), a) &&
2540 getstrarg(gettupleitem(v, 1), b)&&
2541 getstrarg(gettupleitem(v, 2), c);
2542}
2543
2544
2545int
2546getstrstrstrstrarg(v, a, b, c, d)
2547 object *v;
2548 object **a;
2549 object **b;
2550 object **c;
2551 object **d;
2552{
2553 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 4) {
2554 return err_badarg();
2555 }
2556 return getstrarg(gettupleitem(v, 0), a) &&
2557 getstrarg(gettupleitem(v, 1), b)&&
2558 getstrarg(gettupleitem(v, 2), c) &&
2559 getstrarg(gettupleitem(v, 3),d);
2560
2561}