blob: 89d055c33516b71418f30a550632d52c7f3318df [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
1921static object *my_event_callback = NULL;
1922
1923static object *
1924forms_set_event_call_back(dummy, args)
1925 object *dummy;
1926 object *args;
1927{
1928 my_event_callback = args;
1929 XINCREF(args);
1930 INCREF(None);
1931 return None;
1932}
1933
1934static object *
1935forms_do_or_check_forms(dummy, args, func)
1936 object *dummy;
1937 object *args;
1938 FL_OBJECT *(*func)();
1939{
1940 FL_OBJECT *generic;
1941 genericobject *g;
1942 object *arg, *res;
1943
1944 if (!getnoarg(args))
1945 return NULL;
1946
1947 for (;;) {
1948 generic = (*func)();
1949 if (generic == NULL) {
1950 INCREF(None);
1951 return None;
1952 }
1953 if (generic == FL_EVENT) {
1954 int dev;
1955 short val;
1956 if (my_event_callback == NULL)
1957 return newintobject(-1);
1958 dev = fl_qread(&val);
1959 arg = newtupleobject(2);
1960 if (arg == NULL)
1961 return NULL;
1962 settupleitem(arg, 0, newintobject((long)dev));
1963 settupleitem(arg, 1, newintobject((long)val));
1964 res = call_object(my_event_callback, arg);
1965 XDECREF(res);
1966 DECREF(arg);
1967 if (res == NULL)
1968 return NULL; /* Callback raised exception */
1969 continue;
1970 }
1971 g = findgeneric(generic);
1972 if (g == NULL) {
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00001973 /* XXX What kind of weird object is this? */
1974 /* XXX Maybe caused by a bug here */
1975 fprintf(stderr, "weird object: class %d, label '%s'\n",
1976 generic->objclass, generic->label);
1977 continue; /* Ignore it */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001978 }
1979 if (g->ob_callback == NULL) {
1980 INCREF(g);
1981 return ((object *) g);
1982 }
1983 arg = newtupleobject(2);
1984 INCREF(g);
Guido van Rossumabe58351991-08-08 12:34:44 +00001985 settupleitem(arg, 0, (object *)g);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001986 INCREF(g->ob_callback_arg);
1987 settupleitem(arg, 1, g->ob_callback_arg);
1988 res = call_object(g->ob_callback, arg);
1989 XDECREF(res);
1990 DECREF(arg);
1991 if (res == NULL)
1992 return NULL; /* Callback raised exception */
1993 }
1994}
1995
1996static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001997forms_do_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001998 object *dummy;
1999 object *args;
2000{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002001 return forms_do_or_check_forms(dummy, args, fl_do_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002002}
2003
2004static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002005forms_check_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002006 object *dummy;
2007 object *args;
2008{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002009 return forms_do_or_check_forms(dummy, args, fl_check_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002010}
2011
Guido van Rossum03747111991-08-08 12:10:01 +00002012#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002013static object *
2014fl_call(func, args)
2015 object *args;
2016 void (*func)();
2017{
2018 if (!getnoarg(args))
2019 return NULL;
2020 (*func)();
2021 INCREF(None);
2022 return None;
2023}
Guido van Rossum03747111991-08-08 12:10:01 +00002024#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002025
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002026#ifndef FL_V15
2027static object *
2028forms_set_graphics_mode(dummy, args)
2029 object *dummy;
2030 object *args;
2031{
2032 int rgbmode, doublebuf;
2033
2034 if (!getintintarg(args, &rgbmode, &doublebuf))
2035 return NULL;
2036 fl_set_graphics_mode(rgbmode,doublebuf);
2037 INCREF(None);
2038 return None;
2039}
2040
2041static object *
2042forms_get_rgbmode(dummy, args)
2043 object *dummy;
2044 object *args;
2045{
2046 extern fl_rgbmode;
2047
2048 if (args != NULL) {
2049 err_badarg();
2050 return NULL;
2051 }
2052 return newintobject(fl_rgbmode);
2053}
2054#endif /* !FL_V15 */
2055
2056
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002057static object *
2058forms_qdevice(self, args)
2059 object *self;
2060 object *args;
2061{
2062 short arg1 ;
2063 if (!getishortarg(args, 1, 0, &arg1))
2064 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002065 fl_qdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002066 INCREF(None);
2067 return None;
2068}
2069
2070static object *
2071forms_unqdevice(self, args)
2072 object *self;
2073 object *args;
2074{
2075 short arg1 ;
2076 if (!getishortarg(args, 1, 0, &arg1))
2077 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002078 fl_unqdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002079 INCREF(None);
2080 return None;
2081}
2082
2083static object *
2084forms_isqueued(self, args)
2085 object *self;
2086 object *args;
2087{
Guido van Rossum03747111991-08-08 12:10:01 +00002088 long retval;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002089 short arg1 ;
2090 if (!getishortarg(args, 1, 0, &arg1))
2091 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002092 retval = fl_isqueued(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002093
Guido van Rossum03747111991-08-08 12:10:01 +00002094 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002095}
2096
2097static object *
2098forms_qtest(self, args)
2099 object *self;
2100 object *args;
2101{
2102 long retval;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002103 retval = fl_qtest();
Guido van Rossum03747111991-08-08 12:10:01 +00002104 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002105}
2106
2107
2108static object *
2109forms_qread(self, args)
2110 object *self;
2111 object *args;
2112{
2113 long retval;
2114 short arg1 ;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002115 retval = fl_qread(&arg1);
2116 { object *v = newtupleobject(2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002117 if (v == NULL) return NULL;
2118 settupleitem(v, 0, newintobject(retval));
2119 settupleitem(v, 1, newintobject((long)arg1));
2120 return v;
2121 }
2122}
2123
2124static object *
2125forms_qreset(self, args)
2126 object *self;
2127 object *args;
2128{
2129 if (!getnoarg(args)) return NULL;
2130
Guido van Rossum03747111991-08-08 12:10:01 +00002131 fl_qreset();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002132 INCREF(None);
2133 return None;
2134}
2135
2136static object *
2137forms_qenter(self, args)
2138 object *self;
2139 object *args;
2140{
2141 short arg1 ;
2142 short arg2 ;
2143 if (!getishortarg(args, 2, 0, &arg1))
2144 return NULL;
2145 if (!getishortarg(args, 2, 1, &arg2))
2146 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002147 fl_qenter(arg1, arg2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002148 INCREF(None);
2149 return None;
2150}
2151
2152static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002153forms_color(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002154 object *self;
2155 object *args;
2156{
2157 int arg;
2158
2159 if (!getintarg(args, &arg)) return NULL;
2160
2161 fl_color((short) arg);
2162
2163 INCREF(None);
2164 return None;
2165}
2166
2167static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002168forms_mapcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002169 object *self;
2170 object *args;
2171{
2172 int arg0, arg1, arg2, arg3;
2173
Guido van Rossumfc58e581992-01-27 16:45:55 +00002174 if (!getargs(args, "(iiii)", &arg0, &arg1, &arg2, &arg3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002175 return NULL;
2176
2177 fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);
2178
2179 INCREF(None);
2180 return None;
2181}
2182
2183static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002184forms_getmcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002185 object *self;
2186 object *args;
2187{
Guido van Rossum03747111991-08-08 12:10:01 +00002188 int arg;
2189 short r, g, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002190 object *v;
2191
2192 if (!getintarg(args, &arg)) return NULL;
2193
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002194 fl_getmcolor(arg, &r, &g, &b);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002195
2196 v = newtupleobject(3);
2197
2198 if (v == NULL) return NULL;
2199
Guido van Rossum03747111991-08-08 12:10:01 +00002200 settupleitem(v, 0, newintobject((long)r));
2201 settupleitem(v, 1, newintobject((long)g));
2202 settupleitem(v, 2, newintobject((long)b));
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002203
2204 return v;
2205}
2206
2207static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002208forms_get_mouse(self, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00002209 object *self;
2210 object *args;
2211{
2212 float x, y ;
2213 object *v;
2214
2215 if (!getnoarg(args)) return NULL;
2216
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002217 fl_get_mouse(&x, &y);
Guido van Rossum75cc8981991-08-08 12:07:45 +00002218
2219 v = newtupleobject(2);
2220
2221 if (v == NULL) return NULL;
2222
2223 settupleitem(v, 0, newfloatobject(x));
2224 settupleitem(v, 1, newfloatobject(y));
2225
2226 return v;
2227}
2228
2229static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002230forms_tie(self, args)
2231 object *self;
2232 object *args;
2233{
2234 short arg1 ;
2235 short arg2 ;
2236 short arg3 ;
2237 if (!getishortarg(args, 3, 0, &arg1))
2238 return NULL;
2239 if (!getishortarg(args, 3, 1, &arg2))
2240 return NULL;
2241 if (!getishortarg(args, 3, 2, &arg3))
2242 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002243 fl_tie(arg1, arg2, arg3);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002244 INCREF(None);
2245 return None;
2246}
2247
Guido van Rossum03747111991-08-08 12:10:01 +00002248static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002249forms_show_message(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002250 object *f;
2251 object *args;
2252{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002253 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002254
Guido van Rossumfc58e581992-01-27 16:45:55 +00002255 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002256
Guido van Rossumfc58e581992-01-27 16:45:55 +00002257 fl_show_message(a, b, c);
Guido van Rossum03747111991-08-08 12:10:01 +00002258
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002259 INCREF(None);
Guido van Rossum03747111991-08-08 12:10:01 +00002260 return None;
2261}
2262
2263static object *
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002264forms_show_choice(f, args)
2265 object *f;
2266 object *args;
2267{
2268 char *m1, *m2, *m3, *b1, *b2, *b3;
2269 int nb;
2270 char *format;
2271
2272 if (args == NULL || !is_tupleobject(args)) {
2273 err_badarg();
2274 return NULL;
2275 }
2276 nb = gettuplesize(args) - 3;
2277 if (nb <= 0) {
2278 err_setstr(TypeError, "need at least one button label");
2279 return NULL;
2280 }
2281 if (is_intobject(gettupleitem(args, 3))) {
2282 err_setstr(TypeError,
2283 "'number-of-buttons' argument not needed");
2284 return NULL;
2285 }
2286 switch (nb) {
2287 case 1: format = "(ssss)"; break;
2288 case 2: format = "(sssss)"; break;
2289 case 3: format = "(ssssss)"; break;
2290 default:
2291 err_setstr(TypeError, "too many button labels");
2292 return NULL;
2293 }
2294
2295 if (!getargs(args, format, &m1, &m2, &m3, &b1, &b2, &b3))
2296 return NULL;
2297
2298 return newintobject(fl_show_choice(m1, m2, m3, nb, b1, b2, b3));
2299}
2300
2301static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002302forms_show_question(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002303 object *f;
2304 object *args;
2305{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002306 int ret;
2307 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002308
Guido van Rossumfc58e581992-01-27 16:45:55 +00002309 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002310
Guido van Rossumfc58e581992-01-27 16:45:55 +00002311 ret = fl_show_question(a, b, c);
Guido van Rossum03747111991-08-08 12:10:01 +00002312
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002313 return newintobject((long) ret);
Guido van Rossum03747111991-08-08 12:10:01 +00002314}
2315
2316static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002317forms_show_input(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002318 object *f;
2319 object *args;
2320{
2321 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002322 char *a, *b;
Guido van Rossum03747111991-08-08 12:10:01 +00002323
2324 if (!getstrstrarg(args, &a, &b)) return NULL;
2325
Guido van Rossumfc58e581992-01-27 16:45:55 +00002326 str = fl_show_input(a, b);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002327
2328 if (str == NULL) {
2329 INCREF(None);
2330 return None;
2331 }
2332 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002333}
2334
2335static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002336forms_file_selector(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002337 object *f;
2338 object *args;
2339{
2340 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002341 char *a, *b, *c, *d;
Guido van Rossum03747111991-08-08 12:10:01 +00002342
Guido van Rossumfc58e581992-01-27 16:45:55 +00002343 if (!getargs(args, "(ssss)", &a, &b, &c, &d)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002344
Guido van Rossumfc58e581992-01-27 16:45:55 +00002345 str = fl_show_file_selector(a, b, c, d);
Guido van Rossum03747111991-08-08 12:10:01 +00002346
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002347 if (str == NULL) {
2348 INCREF(None);
2349 return None;
2350 }
2351 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002352}
2353
2354
2355static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002356forms_file_selector_func(args, func)
Guido van Rossum03747111991-08-08 12:10:01 +00002357 object *args;
2358 char *(*func)();
2359{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002360 char *str;
Guido van Rossum03747111991-08-08 12:10:01 +00002361
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002362 str = (*func) ();
2363
2364 if (str == NULL) {
2365 INCREF(None);
2366 return None;
2367 }
2368 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002369}
2370
2371static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002372forms_get_directory(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002373 object *f;
2374 object *args;
2375{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002376 return forms_file_selector_func(args, fl_get_directory);
Guido van Rossum03747111991-08-08 12:10:01 +00002377}
2378
2379static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002380forms_get_pattern(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002381 object *f;
2382 object *args;
2383{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002384 return forms_file_selector_func(args, fl_get_pattern);
Guido van Rossum03747111991-08-08 12:10:01 +00002385}
2386
2387static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002388forms_get_filename(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002389 object *f;
2390 object *args;
2391{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002392 return forms_file_selector_func(args, fl_get_filename);
Guido van Rossum03747111991-08-08 12:10:01 +00002393}
2394
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002395static struct methodlist forms_methods[] = {
2396/* adm */
2397 {"make_form", forms_make_form},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002398/* gl support wrappers */
2399 {"qdevice", forms_qdevice},
2400 {"unqdevice", forms_unqdevice},
2401 {"isqueued", forms_isqueued},
2402 {"qtest", forms_qtest},
2403 {"qread", forms_qread},
2404/* {"blkqread", forms_blkqread}, */
2405 {"qreset", forms_qreset},
2406 {"qenter", forms_qenter},
Guido van Rossum03747111991-08-08 12:10:01 +00002407 {"get_mouse", forms_get_mouse},
2408 {"tie", forms_tie},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002409/* {"new_events", forms_new_events}, */
2410 {"color", forms_color},
2411 {"mapcolor", forms_mapcolor},
2412 {"getmcolor", forms_getmcolor},
2413/* interaction */
2414 {"do_forms", forms_do_forms},
2415 {"check_forms", forms_check_forms},
2416 {"set_event_call_back", forms_set_event_call_back},
2417/* goodies */
Guido van Rossum03747111991-08-08 12:10:01 +00002418 {"show_message", forms_show_message},
2419 {"show_question", forms_show_question},
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002420 {"show_choice", forms_show_choice},
2421 {"show_input", forms_show_input},
2422 {"show_file_selector", forms_file_selector},
2423 {"file_selector", forms_file_selector}, /* BW compat */
Guido van Rossum03747111991-08-08 12:10:01 +00002424 {"get_directory", forms_get_directory},
2425 {"get_pattern", forms_get_pattern},
2426 {"get_filename", forms_get_filename},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002427#ifndef FL_V15
2428 {"set_graphics_mode", forms_set_graphics_mode},
2429 {"get_rgbmode", forms_get_rgbmode},
2430#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002431 {NULL, NULL} /* sentinel */
2432};
2433
2434void
2435initfl()
2436{
2437 initmodule("fl", forms_methods);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002438 foreground();
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002439#ifndef FL_V15
2440 fl_init();
2441#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002442}