blob: 3ed2f4de7b344b68ac8a36cb5fbee50b4c49675b [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
1668static object *
1669form_display_form(f, args)
1670 formobject *f;
1671 object *args;
1672{
1673 int place, border;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001674 char *name;
1675 if (!getargs(args, "(iis)", &place, &border, &name))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001676 return NULL;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001677 fl_show_form(f->ob_form, place, border, name);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001678 INCREF(None);
1679 return None;
1680}
1681
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001682#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001683static object *
1684form_remove_form(f, args)
1685 formobject *f;
1686 object *args;
1687{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001688 return form_call(fl_remove_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001689}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001690#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001691
1692static object *
1693form_activate_form(f, args)
1694 formobject *f;
1695 object *args;
1696{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001697 return form_call(fl_activate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001698}
1699
1700static object *
1701form_deactivate_form(f, args)
1702 formobject *f;
1703 object *args;
1704{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001705 return form_call(fl_deactivate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001706}
1707
Guido van Rossum75cc8981991-08-08 12:07:45 +00001708static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001709form_bgn_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001710 formobject *f;
1711 object *args;
1712{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001713 FL_OBJECT *obj;
1714
1715 fl_addto_form(f-> ob_form);
1716 obj = fl_bgn_group();
1717 fl_end_form();
1718
1719 if (obj == NULL) {
1720 err_nomem();
1721 return NULL;
1722 }
1723
1724 return newgenericobject (obj, (struct methodlist *) NULL);
Guido van Rossum03747111991-08-08 12:10:01 +00001725}
1726
1727static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001728form_end_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001729 formobject *f;
1730 object *args;
1731{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001732 fl_addto_form(f-> ob_form);
Guido van Rossum03747111991-08-08 12:10:01 +00001733 fl_end_group();
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001734 fl_end_form();
Guido van Rossum03747111991-08-08 12:10:01 +00001735 INCREF(None);
1736 return None;
1737}
1738
1739static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001740forms_find_first_or_last(func, f, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00001741 FL_OBJECT *(*func)(FL_FORM *, int, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +00001742 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001743 object *args;
1744{
1745 int type;
1746 float mx, my;
1747 FL_OBJECT *generic;
1748 genericobject *g;
1749
Guido van Rossumfc58e581992-01-27 16:45:55 +00001750 if (!getargs(args, "(iff)", &type, &mx, &my)) return NULL;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001751
Guido van Rossum03747111991-08-08 12:10:01 +00001752 generic = (*func) (f-> ob_form, type, mx, my);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001753
1754 if (generic == NULL)
1755 {
1756 INCREF(None);
1757 return None;
1758 }
1759
1760 g = findgeneric(generic);
1761 if (g == NULL) {
1762 err_setstr(RuntimeError,
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001763 "forms_find_{first|last} returns unknown object");
Guido van Rossum75cc8981991-08-08 12:07:45 +00001764 return NULL;
1765 }
1766 INCREF(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001767 return (object *) g;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001768}
1769
1770static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001771form_find_first(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001772 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001773 object *args;
1774{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001775 return forms_find_first_or_last(fl_find_first, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001776}
1777
1778static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001779form_find_last(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001780 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001781 object *args;
1782{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001783 return forms_find_first_or_last(fl_find_last, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001784}
1785
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001786static struct methodlist form_methods[] = {
1787/* adm */
1788 {"show_form", form_show_form},
1789 {"hide_form", form_hide_form},
1790 {"redraw_form", form_redraw_form},
1791 {"set_form_position", form_set_form_position},
1792 {"freeze_form", form_freeze_form},
1793 {"unfreeze_form", form_unfreeze_form},
1794 {"display_form", form_display_form},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001795#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001796 {"remove_form", form_remove_form},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001797#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001798 {"activate_form", form_activate_form},
1799 {"deactivate_form", form_deactivate_form},
Guido van Rossum03747111991-08-08 12:10:01 +00001800 {"bgn_group", form_bgn_group},
1801 {"end_group", form_end_group},
Guido van Rossum75cc8981991-08-08 12:07:45 +00001802 {"find_first", form_find_first},
1803 {"find_last", form_find_last},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001804
1805/* basic objects */
1806 {"add_button", form_add_button},
1807/* {"add_bitmap", form_add_bitmap}, */
1808 {"add_lightbutton", form_add_lightbutton},
1809 {"add_roundbutton", form_add_roundbutton},
1810 {"add_menu", form_add_menu},
1811 {"add_slider", form_add_slider},
1812 {"add_positioner", form_add_positioner},
1813 {"add_valslider", form_add_valslider},
1814 {"add_dial", form_add_dial},
1815 {"add_counter", form_add_counter},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001816#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001817 {"add_default", form_add_default},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001818#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001819 {"add_box", form_add_box},
1820 {"add_clock", form_add_clock},
1821 {"add_choice", form_add_choice},
1822 {"add_browser", form_add_browser},
1823 {"add_input", form_add_input},
1824 {"add_timer", form_add_timer},
1825 {"add_text", form_add_text},
1826 {NULL, NULL} /* sentinel */
1827};
1828
1829static void
1830form_dealloc(f)
1831 formobject *f;
1832{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001833 releaseobjects(f->ob_form);
Guido van Rossum75f89681991-12-16 13:06:13 +00001834 fl_hide_form(f->ob_form);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001835 fl_free_form(f->ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001836 DEL(f);
1837}
1838
Guido van Rossumd97f0481991-11-19 20:26:28 +00001839#define OFF(x) offsetof(FL_FORM, x)
1840
Guido van Rossum32db5e31991-11-12 15:43:18 +00001841static struct memberlist form_memberlist[] = {
1842 {"window", T_LONG, OFF(window), RO},
1843 {"w", T_FLOAT, OFF(w)},
1844 {"h", T_FLOAT, OFF(h)},
1845 {"x", T_FLOAT, OFF(x)},
1846 {"y", T_FLOAT, OFF(y)},
1847 {"deactivated", T_INT, OFF(deactivated)},
1848 {"visible", T_INT, OFF(visible)},
1849 {"frozen", T_INT, OFF(frozen)},
1850 {"doublebuf", T_INT, OFF(doublebuf)},
1851 {NULL} /* Sentinel */
1852};
1853
Guido van Rossumd97f0481991-11-19 20:26:28 +00001854#undef OFF
1855
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001856static object *
1857form_getattr(f, name)
1858 formobject *f;
1859 char *name;
1860{
Guido van Rossum32db5e31991-11-12 15:43:18 +00001861 object *meth;
1862
1863 meth = findmethod(form_methods, (object *)f, name);
1864 if (meth != NULL)
1865 return meth;
1866 err_clear();
1867 return getmember((char *)f->ob_form, form_memberlist, name);
1868}
1869
1870static int
1871form_setattr(f, name, v)
1872 formobject *f;
1873 char *name;
1874 object *v;
1875{
1876 int ret;
1877
1878 if (v == NULL) {
1879 err_setstr(TypeError, "can't delete form attributes");
1880 return NULL;
1881 }
1882
1883 return setmember((char *)f->ob_form, form_memberlist, name, v);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001884}
1885
1886typeobject Formtype = {
1887 OB_HEAD_INIT(&Typetype)
1888 0, /*ob_size*/
1889 "form", /*tp_name*/
1890 sizeof(formobject), /*tp_size*/
1891 0, /*tp_itemsize*/
1892 /* methods */
1893 form_dealloc, /*tp_dealloc*/
1894 0, /*tp_print*/
1895 form_getattr, /*tp_getattr*/
Guido van Rossum32db5e31991-11-12 15:43:18 +00001896 form_setattr, /*tp_setattr*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001897 0, /*tp_compare*/
1898 0, /*tp_repr*/
1899};
1900
1901static object *
1902newformobject(form)
1903 FL_FORM *form;
1904{
1905 formobject *f;
1906 f = NEWOBJ(formobject, &Formtype);
1907 if (f == NULL)
1908 return NULL;
1909 f->ob_form = form;
1910 return (object *)f;
1911}
1912
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001913
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001914/* The "fl" module */
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001915
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001916static object *
1917forms_make_form(dummy, args)
1918 object *dummy;
1919 object *args;
1920{
1921 int type;
1922 float w, h;
1923 FL_FORM *form;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001924 if (!getargs(args, "(iff)", &type, &w, &h))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001925 return NULL;
1926 form = fl_bgn_form(type, w, h);
1927 if (form == NULL) {
1928 /* XXX Actually, cannot happen! */
1929 err_nomem();
1930 return NULL;
1931 }
1932 fl_end_form();
1933 return newformobject(form);
1934}
1935
1936static object *my_event_callback = NULL;
1937
1938static object *
1939forms_set_event_call_back(dummy, args)
1940 object *dummy;
1941 object *args;
1942{
1943 my_event_callback = args;
1944 XINCREF(args);
1945 INCREF(None);
1946 return None;
1947}
1948
1949static object *
1950forms_do_or_check_forms(dummy, args, func)
1951 object *dummy;
1952 object *args;
1953 FL_OBJECT *(*func)();
1954{
1955 FL_OBJECT *generic;
1956 genericobject *g;
1957 object *arg, *res;
1958
1959 if (!getnoarg(args))
1960 return NULL;
1961
1962 for (;;) {
1963 generic = (*func)();
1964 if (generic == NULL) {
1965 INCREF(None);
1966 return None;
1967 }
1968 if (generic == FL_EVENT) {
1969 int dev;
1970 short val;
1971 if (my_event_callback == NULL)
1972 return newintobject(-1);
1973 dev = fl_qread(&val);
1974 arg = newtupleobject(2);
1975 if (arg == NULL)
1976 return NULL;
1977 settupleitem(arg, 0, newintobject((long)dev));
1978 settupleitem(arg, 1, newintobject((long)val));
1979 res = call_object(my_event_callback, arg);
1980 XDECREF(res);
1981 DECREF(arg);
1982 if (res == NULL)
1983 return NULL; /* Callback raised exception */
1984 continue;
1985 }
1986 g = findgeneric(generic);
1987 if (g == NULL) {
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00001988 /* XXX What kind of weird object is this? */
1989 /* XXX Maybe caused by a bug here */
1990 fprintf(stderr, "weird object: class %d, label '%s'\n",
1991 generic->objclass, generic->label);
1992 continue; /* Ignore it */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001993 }
1994 if (g->ob_callback == NULL) {
1995 INCREF(g);
1996 return ((object *) g);
1997 }
1998 arg = newtupleobject(2);
1999 INCREF(g);
Guido van Rossumabe58351991-08-08 12:34:44 +00002000 settupleitem(arg, 0, (object *)g);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002001 INCREF(g->ob_callback_arg);
2002 settupleitem(arg, 1, g->ob_callback_arg);
2003 res = call_object(g->ob_callback, arg);
2004 XDECREF(res);
2005 DECREF(arg);
2006 if (res == NULL)
2007 return NULL; /* Callback raised exception */
2008 }
2009}
2010
2011static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002012forms_do_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002013 object *dummy;
2014 object *args;
2015{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002016 return forms_do_or_check_forms(dummy, args, fl_do_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002017}
2018
2019static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002020forms_check_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002021 object *dummy;
2022 object *args;
2023{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002024 return forms_do_or_check_forms(dummy, args, fl_check_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002025}
2026
Guido van Rossum03747111991-08-08 12:10:01 +00002027#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002028static object *
2029fl_call(func, args)
2030 object *args;
2031 void (*func)();
2032{
2033 if (!getnoarg(args))
2034 return NULL;
2035 (*func)();
2036 INCREF(None);
2037 return None;
2038}
Guido van Rossum03747111991-08-08 12:10:01 +00002039#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002040
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002041#ifndef FL_V15
2042static object *
2043forms_set_graphics_mode(dummy, args)
2044 object *dummy;
2045 object *args;
2046{
2047 int rgbmode, doublebuf;
2048
2049 if (!getintintarg(args, &rgbmode, &doublebuf))
2050 return NULL;
2051 fl_set_graphics_mode(rgbmode,doublebuf);
2052 INCREF(None);
2053 return None;
2054}
2055
2056static object *
2057forms_get_rgbmode(dummy, args)
2058 object *dummy;
2059 object *args;
2060{
2061 extern fl_rgbmode;
2062
2063 if (args != NULL) {
2064 err_badarg();
2065 return NULL;
2066 }
2067 return newintobject(fl_rgbmode);
2068}
2069#endif /* !FL_V15 */
2070
2071
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002072static object *
2073forms_qdevice(self, args)
2074 object *self;
2075 object *args;
2076{
2077 short arg1 ;
2078 if (!getishortarg(args, 1, 0, &arg1))
2079 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002080 fl_qdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002081 INCREF(None);
2082 return None;
2083}
2084
2085static object *
2086forms_unqdevice(self, args)
2087 object *self;
2088 object *args;
2089{
2090 short arg1 ;
2091 if (!getishortarg(args, 1, 0, &arg1))
2092 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002093 fl_unqdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002094 INCREF(None);
2095 return None;
2096}
2097
2098static object *
2099forms_isqueued(self, args)
2100 object *self;
2101 object *args;
2102{
Guido van Rossum03747111991-08-08 12:10:01 +00002103 long retval;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002104 short arg1 ;
2105 if (!getishortarg(args, 1, 0, &arg1))
2106 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002107 retval = fl_isqueued(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002108
Guido van Rossum03747111991-08-08 12:10:01 +00002109 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002110}
2111
2112static object *
2113forms_qtest(self, args)
2114 object *self;
2115 object *args;
2116{
2117 long retval;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002118 retval = fl_qtest();
Guido van Rossum03747111991-08-08 12:10:01 +00002119 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002120}
2121
2122
2123static object *
2124forms_qread(self, args)
2125 object *self;
2126 object *args;
2127{
2128 long retval;
2129 short arg1 ;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002130 retval = fl_qread(&arg1);
2131 { object *v = newtupleobject(2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002132 if (v == NULL) return NULL;
2133 settupleitem(v, 0, newintobject(retval));
2134 settupleitem(v, 1, newintobject((long)arg1));
2135 return v;
2136 }
2137}
2138
2139static object *
2140forms_qreset(self, args)
2141 object *self;
2142 object *args;
2143{
2144 if (!getnoarg(args)) return NULL;
2145
Guido van Rossum03747111991-08-08 12:10:01 +00002146 fl_qreset();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002147 INCREF(None);
2148 return None;
2149}
2150
2151static object *
2152forms_qenter(self, args)
2153 object *self;
2154 object *args;
2155{
2156 short arg1 ;
2157 short arg2 ;
2158 if (!getishortarg(args, 2, 0, &arg1))
2159 return NULL;
2160 if (!getishortarg(args, 2, 1, &arg2))
2161 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002162 fl_qenter(arg1, arg2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002163 INCREF(None);
2164 return None;
2165}
2166
2167static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002168forms_color(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002169 object *self;
2170 object *args;
2171{
2172 int arg;
2173
2174 if (!getintarg(args, &arg)) return NULL;
2175
2176 fl_color((short) arg);
2177
2178 INCREF(None);
2179 return None;
2180}
2181
2182static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002183forms_mapcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002184 object *self;
2185 object *args;
2186{
2187 int arg0, arg1, arg2, arg3;
2188
Guido van Rossumfc58e581992-01-27 16:45:55 +00002189 if (!getargs(args, "(iiii)", &arg0, &arg1, &arg2, &arg3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002190 return NULL;
2191
2192 fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);
2193
2194 INCREF(None);
2195 return None;
2196}
2197
2198static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002199forms_getmcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002200 object *self;
2201 object *args;
2202{
Guido van Rossum03747111991-08-08 12:10:01 +00002203 int arg;
2204 short r, g, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002205 object *v;
2206
2207 if (!getintarg(args, &arg)) return NULL;
2208
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002209 fl_getmcolor(arg, &r, &g, &b);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002210
2211 v = newtupleobject(3);
2212
2213 if (v == NULL) return NULL;
2214
Guido van Rossum03747111991-08-08 12:10:01 +00002215 settupleitem(v, 0, newintobject((long)r));
2216 settupleitem(v, 1, newintobject((long)g));
2217 settupleitem(v, 2, newintobject((long)b));
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002218
2219 return v;
2220}
2221
2222static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002223forms_get_mouse(self, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00002224 object *self;
2225 object *args;
2226{
2227 float x, y ;
2228 object *v;
2229
2230 if (!getnoarg(args)) return NULL;
2231
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002232 fl_get_mouse(&x, &y);
Guido van Rossum75cc8981991-08-08 12:07:45 +00002233
2234 v = newtupleobject(2);
2235
2236 if (v == NULL) return NULL;
2237
2238 settupleitem(v, 0, newfloatobject(x));
2239 settupleitem(v, 1, newfloatobject(y));
2240
2241 return v;
2242}
2243
2244static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002245forms_tie(self, args)
2246 object *self;
2247 object *args;
2248{
2249 short arg1 ;
2250 short arg2 ;
2251 short arg3 ;
2252 if (!getishortarg(args, 3, 0, &arg1))
2253 return NULL;
2254 if (!getishortarg(args, 3, 1, &arg2))
2255 return NULL;
2256 if (!getishortarg(args, 3, 2, &arg3))
2257 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002258 fl_tie(arg1, arg2, arg3);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002259 INCREF(None);
2260 return None;
2261}
2262
Guido van Rossum03747111991-08-08 12:10:01 +00002263static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002264forms_show_message(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002265 object *f;
2266 object *args;
2267{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002268 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002269
Guido van Rossumfc58e581992-01-27 16:45:55 +00002270 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002271
Guido van Rossumfc58e581992-01-27 16:45:55 +00002272 fl_show_message(a, b, c);
Guido van Rossum03747111991-08-08 12:10:01 +00002273
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002274 INCREF(None);
Guido van Rossum03747111991-08-08 12:10:01 +00002275 return None;
2276}
2277
2278static object *
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002279forms_show_choice(f, args)
2280 object *f;
2281 object *args;
2282{
2283 char *m1, *m2, *m3, *b1, *b2, *b3;
2284 int nb;
2285 char *format;
2286
2287 if (args == NULL || !is_tupleobject(args)) {
2288 err_badarg();
2289 return NULL;
2290 }
2291 nb = gettuplesize(args) - 3;
2292 if (nb <= 0) {
2293 err_setstr(TypeError, "need at least one button label");
2294 return NULL;
2295 }
2296 if (is_intobject(gettupleitem(args, 3))) {
2297 err_setstr(TypeError,
2298 "'number-of-buttons' argument not needed");
2299 return NULL;
2300 }
2301 switch (nb) {
2302 case 1: format = "(ssss)"; break;
2303 case 2: format = "(sssss)"; break;
2304 case 3: format = "(ssssss)"; break;
2305 default:
2306 err_setstr(TypeError, "too many button labels");
2307 return NULL;
2308 }
2309
2310 if (!getargs(args, format, &m1, &m2, &m3, &b1, &b2, &b3))
2311 return NULL;
2312
2313 return newintobject(fl_show_choice(m1, m2, m3, nb, b1, b2, b3));
2314}
2315
2316static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002317forms_show_question(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002318 object *f;
2319 object *args;
2320{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002321 int ret;
2322 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002323
Guido van Rossumfc58e581992-01-27 16:45:55 +00002324 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002325
Guido van Rossumfc58e581992-01-27 16:45:55 +00002326 ret = fl_show_question(a, b, c);
Guido van Rossum03747111991-08-08 12:10:01 +00002327
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002328 return newintobject((long) ret);
Guido van Rossum03747111991-08-08 12:10:01 +00002329}
2330
2331static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002332forms_show_input(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002333 object *f;
2334 object *args;
2335{
2336 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002337 char *a, *b;
Guido van Rossum03747111991-08-08 12:10:01 +00002338
2339 if (!getstrstrarg(args, &a, &b)) return NULL;
2340
Guido van Rossumfc58e581992-01-27 16:45:55 +00002341 str = fl_show_input(a, b);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002342
2343 if (str == NULL) {
2344 INCREF(None);
2345 return None;
2346 }
2347 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002348}
2349
2350static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002351forms_file_selector(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002352 object *f;
2353 object *args;
2354{
2355 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002356 char *a, *b, *c, *d;
Guido van Rossum03747111991-08-08 12:10:01 +00002357
Guido van Rossumfc58e581992-01-27 16:45:55 +00002358 if (!getargs(args, "(ssss)", &a, &b, &c, &d)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002359
Guido van Rossumfc58e581992-01-27 16:45:55 +00002360 str = fl_show_file_selector(a, b, c, d);
Guido van Rossum03747111991-08-08 12:10:01 +00002361
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002362 if (str == NULL) {
2363 INCREF(None);
2364 return None;
2365 }
2366 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002367}
2368
2369
2370static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002371forms_file_selector_func(args, func)
Guido van Rossum03747111991-08-08 12:10:01 +00002372 object *args;
2373 char *(*func)();
2374{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002375 char *str;
Guido van Rossum03747111991-08-08 12:10:01 +00002376
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002377 str = (*func) ();
2378
2379 if (str == NULL) {
2380 INCREF(None);
2381 return None;
2382 }
2383 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002384}
2385
2386static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002387forms_get_directory(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002388 object *f;
2389 object *args;
2390{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002391 return forms_file_selector_func(args, fl_get_directory);
Guido van Rossum03747111991-08-08 12:10:01 +00002392}
2393
2394static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002395forms_get_pattern(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002396 object *f;
2397 object *args;
2398{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002399 return forms_file_selector_func(args, fl_get_pattern);
Guido van Rossum03747111991-08-08 12:10:01 +00002400}
2401
2402static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002403forms_get_filename(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002404 object *f;
2405 object *args;
2406{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002407 return forms_file_selector_func(args, fl_get_filename);
Guido van Rossum03747111991-08-08 12:10:01 +00002408}
2409
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002410static struct methodlist forms_methods[] = {
2411/* adm */
2412 {"make_form", forms_make_form},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002413/* gl support wrappers */
2414 {"qdevice", forms_qdevice},
2415 {"unqdevice", forms_unqdevice},
2416 {"isqueued", forms_isqueued},
2417 {"qtest", forms_qtest},
2418 {"qread", forms_qread},
2419/* {"blkqread", forms_blkqread}, */
2420 {"qreset", forms_qreset},
2421 {"qenter", forms_qenter},
Guido van Rossum03747111991-08-08 12:10:01 +00002422 {"get_mouse", forms_get_mouse},
2423 {"tie", forms_tie},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002424/* {"new_events", forms_new_events}, */
2425 {"color", forms_color},
2426 {"mapcolor", forms_mapcolor},
2427 {"getmcolor", forms_getmcolor},
2428/* interaction */
2429 {"do_forms", forms_do_forms},
2430 {"check_forms", forms_check_forms},
2431 {"set_event_call_back", forms_set_event_call_back},
2432/* goodies */
Guido van Rossum03747111991-08-08 12:10:01 +00002433 {"show_message", forms_show_message},
2434 {"show_question", forms_show_question},
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002435 {"show_choice", forms_show_choice},
2436 {"show_input", forms_show_input},
2437 {"show_file_selector", forms_file_selector},
2438 {"file_selector", forms_file_selector}, /* BW compat */
Guido van Rossum03747111991-08-08 12:10:01 +00002439 {"get_directory", forms_get_directory},
2440 {"get_pattern", forms_get_pattern},
2441 {"get_filename", forms_get_filename},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002442#ifndef FL_V15
2443 {"set_graphics_mode", forms_set_graphics_mode},
2444 {"get_rgbmode", forms_get_rgbmode},
2445#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002446 {NULL, NULL} /* sentinel */
2447};
2448
2449void
2450initfl()
2451{
2452 initmodule("fl", forms_methods);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002453 foreground();
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002454#ifndef FL_V15
2455 fl_init();
2456#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002457}