blob: 876a88a7ca86b798d8e673a046054a55f621fba3 [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 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 Rossum75f89681991-12-16 13:06:13 +00001819 fl_hide_form(f->ob_form);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001820 fl_free_form(f->ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001821 DEL(f);
1822}
1823
Guido van Rossumd97f0481991-11-19 20:26:28 +00001824#define OFF(x) offsetof(FL_FORM, x)
1825
Guido van Rossum32db5e31991-11-12 15:43:18 +00001826static struct memberlist form_memberlist[] = {
1827 {"window", T_LONG, OFF(window), RO},
1828 {"w", T_FLOAT, OFF(w)},
1829 {"h", T_FLOAT, OFF(h)},
1830 {"x", T_FLOAT, OFF(x)},
1831 {"y", T_FLOAT, OFF(y)},
1832 {"deactivated", T_INT, OFF(deactivated)},
1833 {"visible", T_INT, OFF(visible)},
1834 {"frozen", T_INT, OFF(frozen)},
1835 {"doublebuf", T_INT, OFF(doublebuf)},
1836 {NULL} /* Sentinel */
1837};
1838
Guido van Rossumd97f0481991-11-19 20:26:28 +00001839#undef OFF
1840
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001841static object *
1842form_getattr(f, name)
1843 formobject *f;
1844 char *name;
1845{
Guido van Rossum32db5e31991-11-12 15:43:18 +00001846 object *meth;
1847
1848 meth = findmethod(form_methods, (object *)f, name);
1849 if (meth != NULL)
1850 return meth;
1851 err_clear();
1852 return getmember((char *)f->ob_form, form_memberlist, name);
1853}
1854
1855static int
1856form_setattr(f, name, v)
1857 formobject *f;
1858 char *name;
1859 object *v;
1860{
1861 int ret;
1862
1863 if (v == NULL) {
1864 err_setstr(TypeError, "can't delete form attributes");
1865 return NULL;
1866 }
1867
1868 return setmember((char *)f->ob_form, form_memberlist, name, v);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001869}
1870
1871typeobject Formtype = {
1872 OB_HEAD_INIT(&Typetype)
1873 0, /*ob_size*/
1874 "form", /*tp_name*/
1875 sizeof(formobject), /*tp_size*/
1876 0, /*tp_itemsize*/
1877 /* methods */
1878 form_dealloc, /*tp_dealloc*/
1879 0, /*tp_print*/
1880 form_getattr, /*tp_getattr*/
Guido van Rossum32db5e31991-11-12 15:43:18 +00001881 form_setattr, /*tp_setattr*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001882 0, /*tp_compare*/
1883 0, /*tp_repr*/
1884};
1885
1886static object *
1887newformobject(form)
1888 FL_FORM *form;
1889{
1890 formobject *f;
1891 f = NEWOBJ(formobject, &Formtype);
1892 if (f == NULL)
1893 return NULL;
1894 f->ob_form = form;
1895 return (object *)f;
1896}
1897
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001898
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001899/* The "fl" module */
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001900
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001901static object *
1902forms_make_form(dummy, args)
1903 object *dummy;
1904 object *args;
1905{
1906 int type;
1907 float w, h;
1908 FL_FORM *form;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001909 if (!getargs(args, "(iff)", &type, &w, &h))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001910 return NULL;
1911 form = fl_bgn_form(type, w, h);
1912 if (form == NULL) {
1913 /* XXX Actually, cannot happen! */
1914 err_nomem();
1915 return NULL;
1916 }
1917 fl_end_form();
1918 return newformobject(form);
1919}
1920
Guido van Rossum2bac4d31992-03-27 17:20:21 +00001921static object *
1922forms_activate_all_forms(f, args)
1923 object *f;
1924 object *args;
1925{
1926 fl_activate_all_forms();
1927 INCREF(None);
1928 return None;
1929}
1930
1931static object *
1932forms_deactivate_all_forms(f, args)
1933 object *f;
1934 object *args;
1935{
1936 fl_deactivate_all_forms();
1937 INCREF(None);
1938 return None;
1939}
1940
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001941static object *my_event_callback = NULL;
1942
1943static object *
1944forms_set_event_call_back(dummy, args)
1945 object *dummy;
1946 object *args;
1947{
1948 my_event_callback = args;
1949 XINCREF(args);
1950 INCREF(None);
1951 return None;
1952}
1953
1954static object *
1955forms_do_or_check_forms(dummy, args, func)
1956 object *dummy;
1957 object *args;
1958 FL_OBJECT *(*func)();
1959{
1960 FL_OBJECT *generic;
1961 genericobject *g;
1962 object *arg, *res;
1963
1964 if (!getnoarg(args))
1965 return NULL;
1966
1967 for (;;) {
1968 generic = (*func)();
1969 if (generic == NULL) {
1970 INCREF(None);
1971 return None;
1972 }
1973 if (generic == FL_EVENT) {
1974 int dev;
1975 short val;
1976 if (my_event_callback == NULL)
1977 return newintobject(-1);
1978 dev = fl_qread(&val);
1979 arg = newtupleobject(2);
1980 if (arg == NULL)
1981 return NULL;
1982 settupleitem(arg, 0, newintobject((long)dev));
1983 settupleitem(arg, 1, newintobject((long)val));
1984 res = call_object(my_event_callback, arg);
1985 XDECREF(res);
1986 DECREF(arg);
1987 if (res == NULL)
1988 return NULL; /* Callback raised exception */
1989 continue;
1990 }
1991 g = findgeneric(generic);
1992 if (g == NULL) {
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00001993 /* XXX What kind of weird object is this? */
1994 /* XXX Maybe caused by a bug here */
1995 fprintf(stderr, "weird object: class %d, label '%s'\n",
1996 generic->objclass, generic->label);
1997 continue; /* Ignore it */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001998 }
1999 if (g->ob_callback == NULL) {
2000 INCREF(g);
2001 return ((object *) g);
2002 }
2003 arg = newtupleobject(2);
2004 INCREF(g);
Guido van Rossumabe58351991-08-08 12:34:44 +00002005 settupleitem(arg, 0, (object *)g);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002006 INCREF(g->ob_callback_arg);
2007 settupleitem(arg, 1, g->ob_callback_arg);
2008 res = call_object(g->ob_callback, arg);
2009 XDECREF(res);
2010 DECREF(arg);
2011 if (res == NULL)
2012 return NULL; /* Callback raised exception */
2013 }
2014}
2015
2016static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002017forms_do_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_do_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002022}
2023
2024static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002025forms_check_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002026 object *dummy;
2027 object *args;
2028{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002029 return forms_do_or_check_forms(dummy, args, fl_check_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002030}
2031
Guido van Rossum03747111991-08-08 12:10:01 +00002032#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002033static object *
2034fl_call(func, args)
2035 object *args;
2036 void (*func)();
2037{
2038 if (!getnoarg(args))
2039 return NULL;
2040 (*func)();
2041 INCREF(None);
2042 return None;
2043}
Guido van Rossum03747111991-08-08 12:10:01 +00002044#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002045
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002046#ifndef FL_V15
2047static object *
2048forms_set_graphics_mode(dummy, args)
2049 object *dummy;
2050 object *args;
2051{
2052 int rgbmode, doublebuf;
2053
2054 if (!getintintarg(args, &rgbmode, &doublebuf))
2055 return NULL;
2056 fl_set_graphics_mode(rgbmode,doublebuf);
2057 INCREF(None);
2058 return None;
2059}
2060
2061static object *
2062forms_get_rgbmode(dummy, args)
2063 object *dummy;
2064 object *args;
2065{
2066 extern fl_rgbmode;
2067
2068 if (args != NULL) {
2069 err_badarg();
2070 return NULL;
2071 }
2072 return newintobject(fl_rgbmode);
2073}
2074#endif /* !FL_V15 */
2075
2076
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002077static object *
2078forms_qdevice(self, args)
2079 object *self;
2080 object *args;
2081{
2082 short arg1 ;
2083 if (!getishortarg(args, 1, 0, &arg1))
2084 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002085 fl_qdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002086 INCREF(None);
2087 return None;
2088}
2089
2090static object *
2091forms_unqdevice(self, args)
2092 object *self;
2093 object *args;
2094{
2095 short arg1 ;
2096 if (!getishortarg(args, 1, 0, &arg1))
2097 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002098 fl_unqdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002099 INCREF(None);
2100 return None;
2101}
2102
2103static object *
2104forms_isqueued(self, args)
2105 object *self;
2106 object *args;
2107{
Guido van Rossum03747111991-08-08 12:10:01 +00002108 long retval;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002109 short arg1 ;
2110 if (!getishortarg(args, 1, 0, &arg1))
2111 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002112 retval = fl_isqueued(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002113
Guido van Rossum03747111991-08-08 12:10:01 +00002114 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002115}
2116
2117static object *
2118forms_qtest(self, args)
2119 object *self;
2120 object *args;
2121{
2122 long retval;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002123 retval = fl_qtest();
Guido van Rossum03747111991-08-08 12:10:01 +00002124 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002125}
2126
2127
2128static object *
2129forms_qread(self, args)
2130 object *self;
2131 object *args;
2132{
2133 long retval;
2134 short arg1 ;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002135 retval = fl_qread(&arg1);
2136 { object *v = newtupleobject(2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002137 if (v == NULL) return NULL;
2138 settupleitem(v, 0, newintobject(retval));
2139 settupleitem(v, 1, newintobject((long)arg1));
2140 return v;
2141 }
2142}
2143
2144static object *
2145forms_qreset(self, args)
2146 object *self;
2147 object *args;
2148{
2149 if (!getnoarg(args)) return NULL;
2150
Guido van Rossum03747111991-08-08 12:10:01 +00002151 fl_qreset();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002152 INCREF(None);
2153 return None;
2154}
2155
2156static object *
2157forms_qenter(self, args)
2158 object *self;
2159 object *args;
2160{
2161 short arg1 ;
2162 short arg2 ;
2163 if (!getishortarg(args, 2, 0, &arg1))
2164 return NULL;
2165 if (!getishortarg(args, 2, 1, &arg2))
2166 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002167 fl_qenter(arg1, arg2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002168 INCREF(None);
2169 return None;
2170}
2171
2172static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002173forms_color(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002174 object *self;
2175 object *args;
2176{
2177 int arg;
2178
2179 if (!getintarg(args, &arg)) return NULL;
2180
2181 fl_color((short) arg);
2182
2183 INCREF(None);
2184 return None;
2185}
2186
2187static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002188forms_mapcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002189 object *self;
2190 object *args;
2191{
2192 int arg0, arg1, arg2, arg3;
2193
Guido van Rossumfc58e581992-01-27 16:45:55 +00002194 if (!getargs(args, "(iiii)", &arg0, &arg1, &arg2, &arg3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002195 return NULL;
2196
2197 fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);
2198
2199 INCREF(None);
2200 return None;
2201}
2202
2203static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002204forms_getmcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002205 object *self;
2206 object *args;
2207{
Guido van Rossum03747111991-08-08 12:10:01 +00002208 int arg;
2209 short r, g, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002210 object *v;
2211
2212 if (!getintarg(args, &arg)) return NULL;
2213
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002214 fl_getmcolor(arg, &r, &g, &b);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002215
2216 v = newtupleobject(3);
2217
2218 if (v == NULL) return NULL;
2219
Guido van Rossum03747111991-08-08 12:10:01 +00002220 settupleitem(v, 0, newintobject((long)r));
2221 settupleitem(v, 1, newintobject((long)g));
2222 settupleitem(v, 2, newintobject((long)b));
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002223
2224 return v;
2225}
2226
2227static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002228forms_get_mouse(self, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00002229 object *self;
2230 object *args;
2231{
2232 float x, y ;
2233 object *v;
2234
2235 if (!getnoarg(args)) return NULL;
2236
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002237 fl_get_mouse(&x, &y);
Guido van Rossum75cc8981991-08-08 12:07:45 +00002238
2239 v = newtupleobject(2);
2240
2241 if (v == NULL) return NULL;
2242
2243 settupleitem(v, 0, newfloatobject(x));
2244 settupleitem(v, 1, newfloatobject(y));
2245
2246 return v;
2247}
2248
2249static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002250forms_tie(self, args)
2251 object *self;
2252 object *args;
2253{
2254 short arg1 ;
2255 short arg2 ;
2256 short arg3 ;
2257 if (!getishortarg(args, 3, 0, &arg1))
2258 return NULL;
2259 if (!getishortarg(args, 3, 1, &arg2))
2260 return NULL;
2261 if (!getishortarg(args, 3, 2, &arg3))
2262 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002263 fl_tie(arg1, arg2, arg3);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002264 INCREF(None);
2265 return None;
2266}
2267
Guido van Rossum03747111991-08-08 12:10:01 +00002268static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002269forms_show_message(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002270 object *f;
2271 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002272{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002273 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002274
Guido van Rossumfc58e581992-01-27 16:45:55 +00002275 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002276
Guido van Rossumfc58e581992-01-27 16:45:55 +00002277 fl_show_message(a, b, c);
Guido van Rossum03747111991-08-08 12:10:01 +00002278
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002279 INCREF(None);
Guido van Rossum03747111991-08-08 12:10:01 +00002280 return None;
2281}
2282
2283static object *
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002284forms_show_choice(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002285 object *f;
2286 object *args;
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002287{
2288 char *m1, *m2, *m3, *b1, *b2, *b3;
2289 int nb;
2290 char *format;
2291
2292 if (args == NULL || !is_tupleobject(args)) {
2293 err_badarg();
2294 return NULL;
2295 }
2296 nb = gettuplesize(args) - 3;
2297 if (nb <= 0) {
2298 err_setstr(TypeError, "need at least one button label");
2299 return NULL;
2300 }
2301 if (is_intobject(gettupleitem(args, 3))) {
2302 err_setstr(TypeError,
2303 "'number-of-buttons' argument not needed");
2304 return NULL;
2305 }
2306 switch (nb) {
2307 case 1: format = "(ssss)"; break;
2308 case 2: format = "(sssss)"; break;
2309 case 3: format = "(ssssss)"; break;
2310 default:
2311 err_setstr(TypeError, "too many button labels");
2312 return NULL;
2313 }
2314
2315 if (!getargs(args, format, &m1, &m2, &m3, &b1, &b2, &b3))
2316 return NULL;
2317
2318 return newintobject(fl_show_choice(m1, m2, m3, nb, b1, b2, b3));
2319}
2320
2321static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002322forms_show_question(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002323 object *f;
2324 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002325{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002326 int ret;
2327 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002328
Guido van Rossumfc58e581992-01-27 16:45:55 +00002329 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002330
Guido van Rossumfc58e581992-01-27 16:45:55 +00002331 ret = fl_show_question(a, b, c);
Guido van Rossum03747111991-08-08 12:10:01 +00002332
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002333 return newintobject((long) ret);
Guido van Rossum03747111991-08-08 12:10:01 +00002334}
2335
2336static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002337forms_show_input(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002338 object *f;
2339 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002340{
2341 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002342 char *a, *b;
Guido van Rossum03747111991-08-08 12:10:01 +00002343
2344 if (!getstrstrarg(args, &a, &b)) return NULL;
2345
Guido van Rossumfc58e581992-01-27 16:45:55 +00002346 str = fl_show_input(a, b);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002347
2348 if (str == NULL) {
2349 INCREF(None);
2350 return None;
2351 }
2352 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002353}
2354
2355static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002356forms_file_selector(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002357 object *f;
2358 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002359{
2360 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002361 char *a, *b, *c, *d;
Guido van Rossum03747111991-08-08 12:10:01 +00002362
Guido van Rossumfc58e581992-01-27 16:45:55 +00002363 if (!getargs(args, "(ssss)", &a, &b, &c, &d)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002364
Guido van Rossumfc58e581992-01-27 16:45:55 +00002365 str = fl_show_file_selector(a, b, c, d);
Guido van Rossum03747111991-08-08 12:10:01 +00002366
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002367 if (str == NULL) {
2368 INCREF(None);
2369 return None;
2370 }
2371 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002372}
2373
2374
2375static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002376forms_file_selector_func(args, func)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002377 object *args;
2378 char *(*func)();
Guido van Rossum03747111991-08-08 12:10:01 +00002379{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002380 char *str;
Guido van Rossum03747111991-08-08 12:10:01 +00002381
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002382 str = (*func) ();
2383
2384 if (str == NULL) {
2385 INCREF(None);
2386 return None;
2387 }
2388 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002389}
2390
2391static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002392forms_get_directory(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002393 object *f;
2394 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002395{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002396 return forms_file_selector_func(args, fl_get_directory);
Guido van Rossum03747111991-08-08 12:10:01 +00002397}
2398
2399static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002400forms_get_pattern(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002401 object *f;
2402 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002403{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002404 return forms_file_selector_func(args, fl_get_pattern);
Guido van Rossum03747111991-08-08 12:10:01 +00002405}
2406
2407static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002408forms_get_filename(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002409 object *f;
2410 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002411{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002412 return forms_file_selector_func(args, fl_get_filename);
Guido van Rossum03747111991-08-08 12:10:01 +00002413}
2414
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002415static struct methodlist forms_methods[] = {
2416/* adm */
2417 {"make_form", forms_make_form},
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002418 {"activate_all_forms", forms_activate_all_forms},
2419 {"deactivate_all_forms",forms_deactivate_all_forms},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002420/* gl support wrappers */
2421 {"qdevice", forms_qdevice},
2422 {"unqdevice", forms_unqdevice},
2423 {"isqueued", forms_isqueued},
2424 {"qtest", forms_qtest},
2425 {"qread", forms_qread},
2426/* {"blkqread", forms_blkqread}, */
2427 {"qreset", forms_qreset},
2428 {"qenter", forms_qenter},
Guido van Rossum03747111991-08-08 12:10:01 +00002429 {"get_mouse", forms_get_mouse},
2430 {"tie", forms_tie},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002431/* {"new_events", forms_new_events}, */
2432 {"color", forms_color},
2433 {"mapcolor", forms_mapcolor},
2434 {"getmcolor", forms_getmcolor},
2435/* interaction */
2436 {"do_forms", forms_do_forms},
2437 {"check_forms", forms_check_forms},
2438 {"set_event_call_back", forms_set_event_call_back},
2439/* goodies */
Guido van Rossum03747111991-08-08 12:10:01 +00002440 {"show_message", forms_show_message},
2441 {"show_question", forms_show_question},
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002442 {"show_choice", forms_show_choice},
2443 {"show_input", forms_show_input},
2444 {"show_file_selector", forms_file_selector},
2445 {"file_selector", forms_file_selector}, /* BW compat */
Guido van Rossum03747111991-08-08 12:10:01 +00002446 {"get_directory", forms_get_directory},
2447 {"get_pattern", forms_get_pattern},
2448 {"get_filename", forms_get_filename},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002449#ifndef FL_V15
2450 {"set_graphics_mode", forms_set_graphics_mode},
2451 {"get_rgbmode", forms_get_rgbmode},
2452#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002453 {NULL, NULL} /* sentinel */
2454};
2455
2456void
2457initfl()
2458{
2459 initmodule("fl", forms_methods);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002460 foreground();
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002461#ifndef FL_V15
2462 fl_init();
2463#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002464}