blob: 2d26533f1f09a9927750ca6ef0074bc98f0ba108 [file] [log] [blame]
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001/**********************************************************
Guido van Rossumbab9d031992-04-05 14:26:55 +00002Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
Guido van Rossumc7df79e1991-08-07 11:32:58 +00003Netherlands.
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 Rossumfc58e581992-01-27 16:45:55 +0000397 if (!getargs(args, "f", &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 Rossumfc58e581992-01-27 16:45:55 +0000414 if (!getargs(args, "(ff)", &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 Rossumfc58e581992-01-27 16:45:55 +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{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000446 char *a;
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000447
Guido van Rossumfc58e581992-01-27 16:45:55 +0000448 if (!getstrarg(args, &a)) return NULL;
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000449
Guido van Rossumfc58e581992-01-27 16:45:55 +0000450 (*func) (obj, a[0]);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000451
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 Rossumfc58e581992-01-27 16:45:55 +0000463 char *a;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000464
Guido van Rossumfc58e581992-01-27 16:45:55 +0000465 if (!getstrarg(args, &a)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000466
Guido van Rossumfc58e581992-01-27 16:45:55 +0000467 (*func) (obj, 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 Rossumfc58e581992-01-27 16:45:55 +0000481 char *b;
482 int a;
Guido van Rossum03747111991-08-08 12:10:01 +0000483
Guido van Rossumfc58e581992-01-27 16:45:55 +0000484 if (!getintstrarg(args, &a, &b)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000485
Guido van Rossumfc58e581992-01-27 16:45:55 +0000486 (*func) (obj, a, b);
Guido van Rossum03747111991-08-08 12:10:01 +0000487
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
Guido van Rossumfc58e581992-01-27 16:45:55 +0000502 if (!getintintarg(args, &par1, &par2)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000503
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
Guido van Rossumfc58e581992-01-27 16:45:55 +0000536 if (!getnoarg(args)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000537
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
Guido van Rossumfc58e581992-01-27 16:45:55 +00001037 if (!getargs(args, "(fff)", &f1, &f2, &f3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001038 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
Guido van Rossumfc58e581992-01-27 16:45:55 +00001195 if (!args(args, "(fff)", &f1, &f2, &f3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001196 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;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001405 char *name;
1406 if (!getargs(args, "(iis)", &place, &border, &name))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001407 return NULL;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001408 fl_show_form(f->ob_form, place, border, name);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001409 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;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001492 char *name;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001493 FL_OBJECT *obj;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001494
Guido van Rossumfc58e581992-01-27 16:45:55 +00001495 if (!getargs(args,"(iffffs)", &type,&x,&y,&w,&h,&name))
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001496 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 Rossumfc58e581992-01-27 16:45:55 +00001500 obj = (*func) (type, x, y, w, h, 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
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001668#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001669static object *
1670form_remove_form(f, args)
1671 formobject *f;
1672 object *args;
1673{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001674 return form_call(fl_remove_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001675}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001676#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001677
1678static object *
1679form_activate_form(f, args)
1680 formobject *f;
1681 object *args;
1682{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001683 return form_call(fl_activate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001684}
1685
1686static object *
1687form_deactivate_form(f, args)
1688 formobject *f;
1689 object *args;
1690{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001691 return form_call(fl_deactivate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001692}
1693
Guido van Rossum75cc8981991-08-08 12:07:45 +00001694static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001695form_bgn_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001696 formobject *f;
1697 object *args;
1698{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001699 FL_OBJECT *obj;
1700
1701 fl_addto_form(f-> ob_form);
1702 obj = fl_bgn_group();
1703 fl_end_form();
1704
1705 if (obj == NULL) {
1706 err_nomem();
1707 return NULL;
1708 }
1709
1710 return newgenericobject (obj, (struct methodlist *) NULL);
Guido van Rossum03747111991-08-08 12:10:01 +00001711}
1712
1713static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001714form_end_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001715 formobject *f;
1716 object *args;
1717{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001718 fl_addto_form(f-> ob_form);
Guido van Rossum03747111991-08-08 12:10:01 +00001719 fl_end_group();
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001720 fl_end_form();
Guido van Rossum03747111991-08-08 12:10:01 +00001721 INCREF(None);
1722 return None;
1723}
1724
1725static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001726forms_find_first_or_last(func, f, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00001727 FL_OBJECT *(*func)(FL_FORM *, int, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +00001728 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001729 object *args;
1730{
1731 int type;
1732 float mx, my;
1733 FL_OBJECT *generic;
1734 genericobject *g;
1735
Guido van Rossumfc58e581992-01-27 16:45:55 +00001736 if (!getargs(args, "(iff)", &type, &mx, &my)) return NULL;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001737
Guido van Rossum03747111991-08-08 12:10:01 +00001738 generic = (*func) (f-> ob_form, type, mx, my);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001739
1740 if (generic == NULL)
1741 {
1742 INCREF(None);
1743 return None;
1744 }
1745
1746 g = findgeneric(generic);
1747 if (g == NULL) {
1748 err_setstr(RuntimeError,
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001749 "forms_find_{first|last} returns unknown object");
Guido van Rossum75cc8981991-08-08 12:07:45 +00001750 return NULL;
1751 }
1752 INCREF(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001753 return (object *) g;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001754}
1755
1756static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001757form_find_first(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001758 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001759 object *args;
1760{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001761 return forms_find_first_or_last(fl_find_first, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001762}
1763
1764static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001765form_find_last(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001766 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001767 object *args;
1768{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001769 return forms_find_first_or_last(fl_find_last, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001770}
1771
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001772static struct methodlist form_methods[] = {
1773/* adm */
1774 {"show_form", form_show_form},
1775 {"hide_form", form_hide_form},
1776 {"redraw_form", form_redraw_form},
1777 {"set_form_position", form_set_form_position},
1778 {"freeze_form", form_freeze_form},
1779 {"unfreeze_form", form_unfreeze_form},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001780#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001781 {"remove_form", form_remove_form},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001782#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001783 {"activate_form", form_activate_form},
1784 {"deactivate_form", form_deactivate_form},
Guido van Rossum03747111991-08-08 12:10:01 +00001785 {"bgn_group", form_bgn_group},
1786 {"end_group", form_end_group},
Guido van Rossum75cc8981991-08-08 12:07:45 +00001787 {"find_first", form_find_first},
1788 {"find_last", form_find_last},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001789
1790/* basic objects */
1791 {"add_button", form_add_button},
1792/* {"add_bitmap", form_add_bitmap}, */
1793 {"add_lightbutton", form_add_lightbutton},
1794 {"add_roundbutton", form_add_roundbutton},
1795 {"add_menu", form_add_menu},
1796 {"add_slider", form_add_slider},
1797 {"add_positioner", form_add_positioner},
1798 {"add_valslider", form_add_valslider},
1799 {"add_dial", form_add_dial},
1800 {"add_counter", form_add_counter},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001801#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001802 {"add_default", form_add_default},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001803#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001804 {"add_box", form_add_box},
1805 {"add_clock", form_add_clock},
1806 {"add_choice", form_add_choice},
1807 {"add_browser", form_add_browser},
1808 {"add_input", form_add_input},
1809 {"add_timer", form_add_timer},
1810 {"add_text", form_add_text},
1811 {NULL, NULL} /* sentinel */
1812};
1813
1814static void
1815form_dealloc(f)
1816 formobject *f;
1817{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001818 releaseobjects(f->ob_form);
Guido van Rossum336b5911992-04-08 11:16:25 +00001819 if (f->ob_form->visible)
1820 fl_hide_form(f->ob_form);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001821 fl_free_form(f->ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001822 DEL(f);
1823}
1824
Guido van Rossumd97f0481991-11-19 20:26:28 +00001825#define OFF(x) offsetof(FL_FORM, x)
1826
Guido van Rossum32db5e31991-11-12 15:43:18 +00001827static struct memberlist form_memberlist[] = {
1828 {"window", T_LONG, OFF(window), RO},
1829 {"w", T_FLOAT, OFF(w)},
1830 {"h", T_FLOAT, OFF(h)},
1831 {"x", T_FLOAT, OFF(x)},
1832 {"y", T_FLOAT, OFF(y)},
1833 {"deactivated", T_INT, OFF(deactivated)},
1834 {"visible", T_INT, OFF(visible)},
1835 {"frozen", T_INT, OFF(frozen)},
1836 {"doublebuf", T_INT, OFF(doublebuf)},
1837 {NULL} /* Sentinel */
1838};
1839
Guido van Rossumd97f0481991-11-19 20:26:28 +00001840#undef OFF
1841
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001842static object *
1843form_getattr(f, name)
1844 formobject *f;
1845 char *name;
1846{
Guido van Rossum32db5e31991-11-12 15:43:18 +00001847 object *meth;
1848
1849 meth = findmethod(form_methods, (object *)f, name);
1850 if (meth != NULL)
1851 return meth;
1852 err_clear();
1853 return getmember((char *)f->ob_form, form_memberlist, name);
1854}
1855
1856static int
1857form_setattr(f, name, v)
1858 formobject *f;
1859 char *name;
1860 object *v;
1861{
1862 int ret;
1863
1864 if (v == NULL) {
1865 err_setstr(TypeError, "can't delete form attributes");
1866 return NULL;
1867 }
1868
1869 return setmember((char *)f->ob_form, form_memberlist, name, v);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001870}
1871
1872typeobject Formtype = {
1873 OB_HEAD_INIT(&Typetype)
1874 0, /*ob_size*/
1875 "form", /*tp_name*/
1876 sizeof(formobject), /*tp_size*/
1877 0, /*tp_itemsize*/
1878 /* methods */
1879 form_dealloc, /*tp_dealloc*/
1880 0, /*tp_print*/
1881 form_getattr, /*tp_getattr*/
Guido van Rossum32db5e31991-11-12 15:43:18 +00001882 form_setattr, /*tp_setattr*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001883 0, /*tp_compare*/
1884 0, /*tp_repr*/
1885};
1886
1887static object *
1888newformobject(form)
1889 FL_FORM *form;
1890{
1891 formobject *f;
1892 f = NEWOBJ(formobject, &Formtype);
1893 if (f == NULL)
1894 return NULL;
1895 f->ob_form = form;
1896 return (object *)f;
1897}
1898
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001899
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001900/* The "fl" module */
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001901
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001902static object *
1903forms_make_form(dummy, args)
1904 object *dummy;
1905 object *args;
1906{
1907 int type;
1908 float w, h;
1909 FL_FORM *form;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001910 if (!getargs(args, "(iff)", &type, &w, &h))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001911 return NULL;
1912 form = fl_bgn_form(type, w, h);
1913 if (form == NULL) {
1914 /* XXX Actually, cannot happen! */
1915 err_nomem();
1916 return NULL;
1917 }
1918 fl_end_form();
1919 return newformobject(form);
1920}
1921
Guido van Rossum2bac4d31992-03-27 17:20:21 +00001922static object *
1923forms_activate_all_forms(f, args)
1924 object *f;
1925 object *args;
1926{
1927 fl_activate_all_forms();
1928 INCREF(None);
1929 return None;
1930}
1931
1932static object *
1933forms_deactivate_all_forms(f, args)
1934 object *f;
1935 object *args;
1936{
1937 fl_deactivate_all_forms();
1938 INCREF(None);
1939 return None;
1940}
1941
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001942static object *my_event_callback = NULL;
1943
1944static object *
1945forms_set_event_call_back(dummy, args)
1946 object *dummy;
1947 object *args;
1948{
1949 my_event_callback = args;
1950 XINCREF(args);
1951 INCREF(None);
1952 return None;
1953}
1954
1955static object *
1956forms_do_or_check_forms(dummy, args, func)
1957 object *dummy;
1958 object *args;
1959 FL_OBJECT *(*func)();
1960{
1961 FL_OBJECT *generic;
1962 genericobject *g;
1963 object *arg, *res;
1964
1965 if (!getnoarg(args))
1966 return NULL;
1967
1968 for (;;) {
1969 generic = (*func)();
1970 if (generic == NULL) {
1971 INCREF(None);
1972 return None;
1973 }
1974 if (generic == FL_EVENT) {
1975 int dev;
1976 short val;
1977 if (my_event_callback == NULL)
1978 return newintobject(-1);
1979 dev = fl_qread(&val);
1980 arg = newtupleobject(2);
1981 if (arg == NULL)
1982 return NULL;
1983 settupleitem(arg, 0, newintobject((long)dev));
1984 settupleitem(arg, 1, newintobject((long)val));
1985 res = call_object(my_event_callback, arg);
1986 XDECREF(res);
1987 DECREF(arg);
1988 if (res == NULL)
1989 return NULL; /* Callback raised exception */
1990 continue;
1991 }
1992 g = findgeneric(generic);
1993 if (g == NULL) {
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00001994 /* XXX What kind of weird object is this? */
1995 /* XXX Maybe caused by a bug here */
1996 fprintf(stderr, "weird object: class %d, label '%s'\n",
1997 generic->objclass, generic->label);
1998 continue; /* Ignore it */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001999 }
2000 if (g->ob_callback == NULL) {
2001 INCREF(g);
2002 return ((object *) g);
2003 }
2004 arg = newtupleobject(2);
2005 INCREF(g);
Guido van Rossumabe58351991-08-08 12:34:44 +00002006 settupleitem(arg, 0, (object *)g);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002007 INCREF(g->ob_callback_arg);
2008 settupleitem(arg, 1, g->ob_callback_arg);
2009 res = call_object(g->ob_callback, arg);
2010 XDECREF(res);
2011 DECREF(arg);
2012 if (res == NULL)
2013 return NULL; /* Callback raised exception */
2014 }
2015}
2016
2017static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002018forms_do_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002019 object *dummy;
2020 object *args;
2021{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002022 return forms_do_or_check_forms(dummy, args, fl_do_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002023}
2024
2025static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002026forms_check_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002027 object *dummy;
2028 object *args;
2029{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002030 return forms_do_or_check_forms(dummy, args, fl_check_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002031}
2032
Guido van Rossum03747111991-08-08 12:10:01 +00002033#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002034static object *
2035fl_call(func, args)
2036 object *args;
2037 void (*func)();
2038{
2039 if (!getnoarg(args))
2040 return NULL;
2041 (*func)();
2042 INCREF(None);
2043 return None;
2044}
Guido van Rossum03747111991-08-08 12:10:01 +00002045#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002046
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002047#ifndef FL_V15
2048static object *
2049forms_set_graphics_mode(dummy, args)
2050 object *dummy;
2051 object *args;
2052{
2053 int rgbmode, doublebuf;
2054
2055 if (!getintintarg(args, &rgbmode, &doublebuf))
2056 return NULL;
2057 fl_set_graphics_mode(rgbmode,doublebuf);
2058 INCREF(None);
2059 return None;
2060}
2061
2062static object *
2063forms_get_rgbmode(dummy, args)
2064 object *dummy;
2065 object *args;
2066{
2067 extern fl_rgbmode;
2068
2069 if (args != NULL) {
2070 err_badarg();
2071 return NULL;
2072 }
2073 return newintobject(fl_rgbmode);
2074}
2075#endif /* !FL_V15 */
2076
2077
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002078static object *
2079forms_qdevice(self, args)
2080 object *self;
2081 object *args;
2082{
2083 short arg1 ;
2084 if (!getishortarg(args, 1, 0, &arg1))
2085 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002086 fl_qdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002087 INCREF(None);
2088 return None;
2089}
2090
2091static object *
2092forms_unqdevice(self, args)
2093 object *self;
2094 object *args;
2095{
2096 short arg1 ;
2097 if (!getishortarg(args, 1, 0, &arg1))
2098 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002099 fl_unqdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002100 INCREF(None);
2101 return None;
2102}
2103
2104static object *
2105forms_isqueued(self, args)
2106 object *self;
2107 object *args;
2108{
Guido van Rossum03747111991-08-08 12:10:01 +00002109 long retval;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002110 short arg1 ;
2111 if (!getishortarg(args, 1, 0, &arg1))
2112 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002113 retval = fl_isqueued(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002114
Guido van Rossum03747111991-08-08 12:10:01 +00002115 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002116}
2117
2118static object *
2119forms_qtest(self, args)
2120 object *self;
2121 object *args;
2122{
2123 long retval;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002124 retval = fl_qtest();
Guido van Rossum03747111991-08-08 12:10:01 +00002125 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002126}
2127
2128
2129static object *
2130forms_qread(self, args)
2131 object *self;
2132 object *args;
2133{
2134 long retval;
2135 short arg1 ;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002136 retval = fl_qread(&arg1);
2137 { object *v = newtupleobject(2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002138 if (v == NULL) return NULL;
2139 settupleitem(v, 0, newintobject(retval));
2140 settupleitem(v, 1, newintobject((long)arg1));
2141 return v;
2142 }
2143}
2144
2145static object *
2146forms_qreset(self, args)
2147 object *self;
2148 object *args;
2149{
2150 if (!getnoarg(args)) return NULL;
2151
Guido van Rossum03747111991-08-08 12:10:01 +00002152 fl_qreset();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002153 INCREF(None);
2154 return None;
2155}
2156
2157static object *
2158forms_qenter(self, args)
2159 object *self;
2160 object *args;
2161{
2162 short arg1 ;
2163 short arg2 ;
2164 if (!getishortarg(args, 2, 0, &arg1))
2165 return NULL;
2166 if (!getishortarg(args, 2, 1, &arg2))
2167 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002168 fl_qenter(arg1, arg2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002169 INCREF(None);
2170 return None;
2171}
2172
2173static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002174forms_color(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002175 object *self;
2176 object *args;
2177{
2178 int arg;
2179
2180 if (!getintarg(args, &arg)) return NULL;
2181
2182 fl_color((short) arg);
2183
2184 INCREF(None);
2185 return None;
2186}
2187
2188static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002189forms_mapcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002190 object *self;
2191 object *args;
2192{
2193 int arg0, arg1, arg2, arg3;
2194
Guido van Rossumfc58e581992-01-27 16:45:55 +00002195 if (!getargs(args, "(iiii)", &arg0, &arg1, &arg2, &arg3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002196 return NULL;
2197
2198 fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);
2199
2200 INCREF(None);
2201 return None;
2202}
2203
2204static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002205forms_getmcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002206 object *self;
2207 object *args;
2208{
Guido van Rossum03747111991-08-08 12:10:01 +00002209 int arg;
2210 short r, g, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002211 object *v;
2212
2213 if (!getintarg(args, &arg)) return NULL;
2214
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002215 fl_getmcolor(arg, &r, &g, &b);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002216
2217 v = newtupleobject(3);
2218
2219 if (v == NULL) return NULL;
2220
Guido van Rossum03747111991-08-08 12:10:01 +00002221 settupleitem(v, 0, newintobject((long)r));
2222 settupleitem(v, 1, newintobject((long)g));
2223 settupleitem(v, 2, newintobject((long)b));
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002224
2225 return v;
2226}
2227
2228static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002229forms_get_mouse(self, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00002230 object *self;
2231 object *args;
2232{
2233 float x, y ;
2234 object *v;
2235
2236 if (!getnoarg(args)) return NULL;
2237
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002238 fl_get_mouse(&x, &y);
Guido van Rossum75cc8981991-08-08 12:07:45 +00002239
2240 v = newtupleobject(2);
2241
2242 if (v == NULL) return NULL;
2243
2244 settupleitem(v, 0, newfloatobject(x));
2245 settupleitem(v, 1, newfloatobject(y));
2246
2247 return v;
2248}
2249
2250static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002251forms_tie(self, args)
2252 object *self;
2253 object *args;
2254{
2255 short arg1 ;
2256 short arg2 ;
2257 short arg3 ;
2258 if (!getishortarg(args, 3, 0, &arg1))
2259 return NULL;
2260 if (!getishortarg(args, 3, 1, &arg2))
2261 return NULL;
2262 if (!getishortarg(args, 3, 2, &arg3))
2263 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002264 fl_tie(arg1, arg2, arg3);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002265 INCREF(None);
2266 return None;
2267}
2268
Guido van Rossum03747111991-08-08 12:10:01 +00002269static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002270forms_show_message(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002271 object *f;
2272 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002273{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002274 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002275
Guido van Rossumfc58e581992-01-27 16:45:55 +00002276 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002277
Guido van Rossumfc58e581992-01-27 16:45:55 +00002278 fl_show_message(a, b, c);
Guido van Rossum03747111991-08-08 12:10:01 +00002279
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002280 INCREF(None);
Guido van Rossum03747111991-08-08 12:10:01 +00002281 return None;
2282}
2283
2284static object *
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002285forms_show_choice(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002286 object *f;
2287 object *args;
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002288{
2289 char *m1, *m2, *m3, *b1, *b2, *b3;
2290 int nb;
2291 char *format;
2292
2293 if (args == NULL || !is_tupleobject(args)) {
2294 err_badarg();
2295 return NULL;
2296 }
2297 nb = gettuplesize(args) - 3;
2298 if (nb <= 0) {
2299 err_setstr(TypeError, "need at least one button label");
2300 return NULL;
2301 }
2302 if (is_intobject(gettupleitem(args, 3))) {
2303 err_setstr(TypeError,
2304 "'number-of-buttons' argument not needed");
2305 return NULL;
2306 }
2307 switch (nb) {
2308 case 1: format = "(ssss)"; break;
2309 case 2: format = "(sssss)"; break;
2310 case 3: format = "(ssssss)"; break;
2311 default:
2312 err_setstr(TypeError, "too many button labels");
2313 return NULL;
2314 }
2315
2316 if (!getargs(args, format, &m1, &m2, &m3, &b1, &b2, &b3))
2317 return NULL;
2318
2319 return newintobject(fl_show_choice(m1, m2, m3, nb, b1, b2, b3));
2320}
2321
2322static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002323forms_show_question(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002324 object *f;
2325 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002326{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002327 int ret;
2328 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002329
Guido van Rossumfc58e581992-01-27 16:45:55 +00002330 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002331
Guido van Rossumfc58e581992-01-27 16:45:55 +00002332 ret = fl_show_question(a, b, c);
Guido van Rossum03747111991-08-08 12:10:01 +00002333
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002334 return newintobject((long) ret);
Guido van Rossum03747111991-08-08 12:10:01 +00002335}
2336
2337static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002338forms_show_input(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002339 object *f;
2340 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002341{
2342 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002343 char *a, *b;
Guido van Rossum03747111991-08-08 12:10:01 +00002344
2345 if (!getstrstrarg(args, &a, &b)) return NULL;
2346
Guido van Rossumfc58e581992-01-27 16:45:55 +00002347 str = fl_show_input(a, b);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002348
2349 if (str == NULL) {
2350 INCREF(None);
2351 return None;
2352 }
2353 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002354}
2355
2356static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002357forms_file_selector(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002358 object *f;
2359 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002360{
2361 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002362 char *a, *b, *c, *d;
Guido van Rossum03747111991-08-08 12:10:01 +00002363
Guido van Rossumfc58e581992-01-27 16:45:55 +00002364 if (!getargs(args, "(ssss)", &a, &b, &c, &d)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002365
Guido van Rossumfc58e581992-01-27 16:45:55 +00002366 str = fl_show_file_selector(a, b, c, d);
Guido van Rossum03747111991-08-08 12:10:01 +00002367
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002368 if (str == NULL) {
2369 INCREF(None);
2370 return None;
2371 }
2372 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002373}
2374
2375
2376static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002377forms_file_selector_func(args, func)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002378 object *args;
2379 char *(*func)();
Guido van Rossum03747111991-08-08 12:10:01 +00002380{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002381 char *str;
Guido van Rossum03747111991-08-08 12:10:01 +00002382
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002383 str = (*func) ();
2384
2385 if (str == NULL) {
2386 INCREF(None);
2387 return None;
2388 }
2389 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002390}
2391
2392static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002393forms_get_directory(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002394 object *f;
2395 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002396{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002397 return forms_file_selector_func(args, fl_get_directory);
Guido van Rossum03747111991-08-08 12:10:01 +00002398}
2399
2400static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002401forms_get_pattern(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002402 object *f;
2403 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002404{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002405 return forms_file_selector_func(args, fl_get_pattern);
Guido van Rossum03747111991-08-08 12:10:01 +00002406}
2407
2408static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002409forms_get_filename(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002410 object *f;
2411 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002412{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002413 return forms_file_selector_func(args, fl_get_filename);
Guido van Rossum03747111991-08-08 12:10:01 +00002414}
2415
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002416static struct methodlist forms_methods[] = {
2417/* adm */
2418 {"make_form", forms_make_form},
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002419 {"activate_all_forms", forms_activate_all_forms},
2420 {"deactivate_all_forms",forms_deactivate_all_forms},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002421/* gl support wrappers */
2422 {"qdevice", forms_qdevice},
2423 {"unqdevice", forms_unqdevice},
2424 {"isqueued", forms_isqueued},
2425 {"qtest", forms_qtest},
2426 {"qread", forms_qread},
2427/* {"blkqread", forms_blkqread}, */
2428 {"qreset", forms_qreset},
2429 {"qenter", forms_qenter},
Guido van Rossum03747111991-08-08 12:10:01 +00002430 {"get_mouse", forms_get_mouse},
2431 {"tie", forms_tie},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002432/* {"new_events", forms_new_events}, */
2433 {"color", forms_color},
2434 {"mapcolor", forms_mapcolor},
2435 {"getmcolor", forms_getmcolor},
2436/* interaction */
2437 {"do_forms", forms_do_forms},
2438 {"check_forms", forms_check_forms},
2439 {"set_event_call_back", forms_set_event_call_back},
2440/* goodies */
Guido van Rossum03747111991-08-08 12:10:01 +00002441 {"show_message", forms_show_message},
2442 {"show_question", forms_show_question},
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002443 {"show_choice", forms_show_choice},
2444 {"show_input", forms_show_input},
2445 {"show_file_selector", forms_file_selector},
2446 {"file_selector", forms_file_selector}, /* BW compat */
Guido van Rossum03747111991-08-08 12:10:01 +00002447 {"get_directory", forms_get_directory},
2448 {"get_pattern", forms_get_pattern},
2449 {"get_filename", forms_get_filename},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002450#ifndef FL_V15
2451 {"set_graphics_mode", forms_set_graphics_mode},
2452 {"get_rgbmode", forms_get_rgbmode},
2453#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002454 {NULL, NULL} /* sentinel */
2455};
2456
2457void
2458initfl()
2459{
2460 initmodule("fl", forms_methods);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002461 foreground();
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002462#ifndef FL_V15
2463 fl_init();
2464#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002465}