blob: bd5ff56666f74e643227549bea6e5c0f18bbc3c6 [file] [log] [blame]
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001/**********************************************************
Guido van Rossumbab9d031992-04-05 14:26:55 +00002Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
Guido van Rossumc7df79e1991-08-07 11:32:58 +00003Netherlands.
4
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* FL module -- interface to Mark Overmars' FORMS Library. */
26
Guido van Rossumddc0d3e1991-12-10 13:56:42 +000027/* As distributed, this code works with FORMS 2.0.
28 If you #define the symbol FL_V15 it will work with FORMS 1.5 (I hope),
29 and possibly also with previous versions.
30 (You must also edit FL.py to set _v15 to 1.) */
31
Guido van Rossumc7df79e1991-08-07 11:32:58 +000032#include "forms.h"
33
34#include "allobjects.h"
35#include "import.h"
36#include "modsupport.h"
37#include "structmember.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000038#include "ceval.h"
Guido van Rossumc7df79e1991-08-07 11:32:58 +000039
40/* Generic Forms Objects */
41
42typedef struct {
43 OB_HEAD
44 FL_OBJECT *ob_generic;
45 struct methodlist *ob_methods;
46 object *ob_callback;
47 object *ob_callback_arg;
48} genericobject;
49
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000050extern typeobject GenericObjecttype; /* Forward */
51
52#define is_genericobject(g) ((g)->ob_type == &GenericObjecttype)
53
54/* List of all objects (XXX this should be a hash table on address...) */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000055
56static object *allgenerics = NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000057static int nfreeslots = 0;
58
59/* Add an object to the list of known objects */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000060
61static void
62knowgeneric(g)
63 genericobject *g;
64{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000065 int i, n;
66 /* Create the list if it doesn't already exist */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000067 if (allgenerics == NULL) {
68 allgenerics = newlistobject(0);
69 if (allgenerics == NULL) {
70 err_clear();
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000071 return; /* Too bad, live without allgenerics... */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000072 }
73 }
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000074 if (nfreeslots > 0) {
75 /* Search the list for reusable slots (NULL items) */
76 /* XXX This can be made faster! */
77 n = getlistsize(allgenerics);
78 for (i = 0; i < n; i++) {
79 if (getlistitem(allgenerics, i) == NULL) {
80 INCREF(g);
81 setlistitem(allgenerics, i, (object *)g);
82 nfreeslots--;
83 return;
84 }
85 }
86 /* Strange... no free slots found... */
87 nfreeslots = 0;
88 }
89 /* No free entries, append new item to the end */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000090 addlistitem(allgenerics, (object *)g);
91}
92
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000093/* Find an object in the list of known objects */
94
Guido van Rossumc7df79e1991-08-07 11:32:58 +000095static genericobject *
96findgeneric(generic)
97 FL_OBJECT *generic;
98{
99 int i, n;
100 genericobject *g;
101
102 if (allgenerics == NULL)
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000103 return NULL; /* No objects known yet */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000104 n = getlistsize(allgenerics);
105 for (i = 0; i < n; i++) {
106 g = (genericobject *)getlistitem(allgenerics, i);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000107 if (g != NULL && g->ob_generic == generic)
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000108 return g;
109 }
110 return NULL; /* Unknown object */
111}
112
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000113/* Called when a form is about to be freed --
114 remove all the objects that we know about from it. */
115
116static void
117releaseobjects(form)
118 FL_FORM *form;
119{
120 int i, n;
121 genericobject *g;
122
123 if (allgenerics == NULL)
124 return; /* No objects known yet */
125 n = getlistsize(allgenerics);
126 for (i = 0; i < n; i++) {
127 g = (genericobject *)getlistitem(allgenerics, i);
128 if (g != NULL && g->ob_generic->form == form) {
129 fl_delete_object(g->ob_generic);
130 if (g->ob_refcnt == 1) {
131 /* The object is now unreachable:
132 delete it from the list of known objects */
133 setlistitem(allgenerics, i, (object *)NULL);
134 nfreeslots++;
135 }
136 }
137 }
138 /* XXX Should also get rid of objects with refcnt==1 */
139}
140
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000141
142/* Methods of generic objects */
143
144static object *
145generic_set_call_back(g, args)
146 genericobject *g;
147 object *args;
148{
149 if (args == NULL) {
150 XDECREF(g->ob_callback);
151 XDECREF(g->ob_callback_arg);
152 g->ob_callback = NULL;
153 g->ob_callback_arg = NULL;
154 }
155 else {
156 if (!is_tupleobject(args) || gettuplesize(args) != 2) {
157 err_badarg();
158 return NULL;
159 }
160 XDECREF(g->ob_callback);
161 XDECREF(g->ob_callback_arg);
162 g->ob_callback = gettupleitem(args, 0);
163 INCREF(g->ob_callback);
164 g->ob_callback_arg = gettupleitem(args, 1);
165 INCREF(g->ob_callback_arg);
166 }
167 INCREF(None);
168 return None;
169}
170
171static object *
172generic_call(g, args, func)
173 genericobject *g;
174 object *args;
175 void (*func)(FL_OBJECT *);
176{
177 if (!getnoarg(args))
178 return NULL;
179 (*func)(g->ob_generic);
180 INCREF(None);
181 return None;
182}
183
184static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000185generic_delete_object(g, args)
186 genericobject *g;
187 object *args;
188{
189 object *res;
190 res = generic_call(g, args, fl_delete_object);
191 /* XXX Should remove it from the list of known objects */
192 return res;
193}
194
195static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000196generic_show_object(g, args)
197 genericobject *g;
198 object *args;
199{
200 return generic_call(g, args, fl_show_object);
201}
202
203static object *
204generic_hide_object(g, args)
205 genericobject *g;
206 object *args;
207{
208 return generic_call(g, args, fl_hide_object);
209}
210
211static object *
212generic_redraw_object(g, args)
213 genericobject *g;
214 object *args;
215{
216 return generic_call(g, args, fl_redraw_object);
217}
218
219static object *
220generic_freeze_object(g, args)
221 genericobject *g;
222 object *args;
223{
224 return generic_call(g, args, fl_freeze_object);
225}
226
227static object *
228generic_unfreeze_object(g, args)
229 genericobject *g;
230 object *args;
231{
232 return generic_call(g, args, fl_unfreeze_object);
233}
234
235static struct methodlist generic_methods[] = {
236 {"set_call_back", generic_set_call_back},
Guido van Rossum32db5e31991-11-12 15:43:18 +0000237 {"delete_object", generic_delete_object},
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000238 {"show_object", generic_show_object},
239 {"hide_object", generic_hide_object},
240 {"redraw_object", generic_redraw_object},
241 {"freeze_object", generic_freeze_object},
242 {"unfreeze_object", generic_unfreeze_object},
243#if 0
244 {"handle_object", generic_handle_object},
245 {"handle_object_direct",generic_handle_object_direct},
246#endif
Guido van Rossum03747111991-08-08 12:10:01 +0000247 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000248};
249
250static void
251generic_dealloc(g)
252 genericobject *g;
253{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000254 fl_free_object(g->ob_generic);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000255 DEL(g);
256}
257
258#define OFF(x) offsetof(FL_OBJECT, x)
259
260static struct memberlist generic_memberlist[] = {
261 {"objclass", T_INT, OFF(objclass), RO},
262 {"type", T_INT, OFF(type), RO},
263 {"boxtype", T_INT, OFF(boxtype)},
264 {"x", T_FLOAT, OFF(x)},
265 {"y", T_FLOAT, OFF(y)},
266 {"w", T_FLOAT, OFF(w)},
267 {"h", T_FLOAT, OFF(h)},
268 {"col1", T_INT, OFF(col1)},
269 {"col2", T_INT, OFF(col2)},
270 {"align", T_INT, OFF(align)},
271 {"lcol", T_INT, OFF(lcol)},
272 {"lsize", T_FLOAT, OFF(lsize)},
273 /* "label" is treated specially! */
274 {"lstyle", T_INT, OFF(lstyle)},
275 {"pushed", T_INT, OFF(pushed), RO},
276 {"focus", T_INT, OFF(focus), RO},
277 {"belowmouse", T_INT, OFF(belowmouse),RO},
278 {"frozen", T_INT, OFF(frozen), RO},
279 {"active", T_INT, OFF(active), RO},
280 {"input", T_INT, OFF(input), RO},
281 {"visible", T_INT, OFF(visible), RO},
282 {"radio", T_INT, OFF(radio), RO},
283 {"automatic", T_INT, OFF(automatic), RO},
284 {NULL} /* Sentinel */
285};
286
Guido van Rossumd97f0481991-11-19 20:26:28 +0000287#undef OFF
288
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000289static object *
290generic_getattr(g, name)
291 genericobject *g;
292 char *name;
293{
294 object *meth;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000295
296 /* XXX Ought to special-case name "__methods__" */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000297 if (g-> ob_methods) {
Guido van Rossum03747111991-08-08 12:10:01 +0000298 meth = findmethod(g->ob_methods, (object *)g, name);
299 if (meth != NULL) return meth;
300 err_clear();
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000301 }
302
303 meth = findmethod(generic_methods, (object *)g, name);
304 if (meth != NULL)
305 return meth;
306 err_clear();
307
308 /* "label" is an exception, getmember only works for char pointers,
309 not for char arrays */
310 if (strcmp(name, "label") == 0)
311 return newstringobject(g->ob_generic->label);
312
313 return getmember((char *)g->ob_generic, generic_memberlist, name);
314}
315
316static int
317generic_setattr(g, name, v)
318 genericobject *g;
319 char *name;
320 object *v;
321{
322 int ret;
323
324 if (v == NULL) {
325 err_setstr(TypeError, "can't delete forms object attributes");
Guido van Rossum3dd8c981992-06-03 17:07:49 +0000326 return -1;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000327 }
328
329 /* "label" is an exception: setmember doesn't set strings;
330 and FORMS wants you to call a function to set the label */
331 if (strcmp(name, "label") == 0) {
332 if (!is_stringobject(v)) {
333 err_setstr(TypeError, "label attr must be string");
Guido van Rossum3dd8c981992-06-03 17:07:49 +0000334 return -1;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000335 }
336 fl_set_object_label(g->ob_generic, getstringvalue(v));
337 return 0;
338 }
339
340 ret = setmember((char *)g->ob_generic, generic_memberlist, name, v);
341
342 /* Rather than calling all the various set_object_* functions,
343 we call fl_redraw_object here. This is sometimes redundant
344 but I doubt that's a big problem */
345 if (ret == 0)
346 fl_redraw_object(g->ob_generic);
347
348 return ret;
349}
350
351typeobject GenericObjecttype = {
352 OB_HEAD_INIT(&Typetype)
353 0, /*ob_size*/
354 "generic FORMS object", /*tp_name*/
355 sizeof(genericobject), /*tp_size*/
356 0, /*tp_itemsize*/
357 /* methods */
358 generic_dealloc, /*tp_dealloc*/
359 0, /*tp_print*/
360 generic_getattr, /*tp_getattr*/
361 generic_setattr, /*tp_setattr*/
362 0, /*tp_compare*/
363 0, /*tp_repr*/
364};
365
366static object *
367newgenericobject(generic, methods)
368 FL_OBJECT *generic;
369 struct methodlist *methods;
370{
371 genericobject *g;
372 g = NEWOBJ(genericobject, &GenericObjecttype);
373 if (g == NULL)
374 return NULL;
375 g-> ob_generic = generic;
376 g->ob_methods = methods;
377 g->ob_callback = NULL;
378 g->ob_callback_arg = NULL;
379 knowgeneric(g);
380 return (object *)g;
381}
382
383/**********************************************************************/
384/* Some common calling sequences */
385
386/* void func (object, float) */
387static object *
388call_forms_INf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000389 void (*func)(FL_OBJECT *, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000390 FL_OBJECT *obj;
391 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000392{
Guido van Rossum03747111991-08-08 12:10:01 +0000393 float parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000394
Guido van Rossumfc58e581992-01-27 16:45:55 +0000395 if (!getargs(args, "f", &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000396
Guido van Rossum03747111991-08-08 12:10:01 +0000397 (*func) (obj, parameter);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000398
Guido van Rossum03747111991-08-08 12:10:01 +0000399 INCREF(None);
400 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000401}
402
403/* void func (object, float) */
404static object *
405call_forms_INfINf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000406 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000407 FL_OBJECT *obj;
408 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000409{
Guido van Rossum03747111991-08-08 12:10:01 +0000410 float par1, par2;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000411
Guido van Rossumfc58e581992-01-27 16:45:55 +0000412 if (!getargs(args, "(ff)", &par1, &par2)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000413
Guido van Rossum03747111991-08-08 12:10:01 +0000414 (*func) (obj, par1, par2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000415
Guido van Rossum03747111991-08-08 12:10:01 +0000416 INCREF(None);
417 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000418}
419
420/* void func (object, int) */
421static object *
422call_forms_INi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000423 void (*func)(FL_OBJECT *, int);
Guido van Rossum03747111991-08-08 12:10:01 +0000424 FL_OBJECT *obj;
425 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000426{
Guido van Rossum03747111991-08-08 12:10:01 +0000427 int parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000428
Guido van Rossumfc58e581992-01-27 16:45:55 +0000429 if (!getintarg(args, &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000430
Guido van Rossum03747111991-08-08 12:10:01 +0000431 (*func) (obj, parameter);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000432
Guido van Rossum03747111991-08-08 12:10:01 +0000433 INCREF(None);
434 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000435}
436
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000437/* void func (object, char) */
438static object *
439call_forms_INc (func, obj, args)
440 void (*func)(FL_OBJECT *, int);
441 FL_OBJECT *obj;
442 object *args;
443{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000444 char *a;
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000445
Guido van Rossumfc58e581992-01-27 16:45:55 +0000446 if (!getstrarg(args, &a)) return NULL;
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000447
Guido van Rossumfc58e581992-01-27 16:45:55 +0000448 (*func) (obj, a[0]);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000449
450 INCREF(None);
451 return None;
452}
453
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000454/* void func (object, string) */
455static object *
456call_forms_INstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000457 void (*func)(FL_OBJECT *, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000458 FL_OBJECT *obj;
459 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000460{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000461 char *a;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000462
Guido van Rossumfc58e581992-01-27 16:45:55 +0000463 if (!getstrarg(args, &a)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000464
Guido van Rossumfc58e581992-01-27 16:45:55 +0000465 (*func) (obj, a);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000466
Guido van Rossum03747111991-08-08 12:10:01 +0000467 INCREF(None);
468 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000469}
470
471
472/* voide func (object, int, string) */
473static object *
474call_forms_INiINstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000475 void (*func)(FL_OBJECT *, int, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000476 FL_OBJECT *obj;
477 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000478{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000479 char *b;
480 int a;
Guido van Rossum03747111991-08-08 12:10:01 +0000481
Guido van Rossumfc58e581992-01-27 16:45:55 +0000482 if (!getintstrarg(args, &a, &b)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000483
Guido van Rossumfc58e581992-01-27 16:45:55 +0000484 (*func) (obj, a, b);
Guido van Rossum03747111991-08-08 12:10:01 +0000485
486 INCREF(None);
487 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000488}
489
Guido van Rossum03747111991-08-08 12:10:01 +0000490#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000491/* void func (object, float) */
492static object *
493call_forms_INiINi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000494 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000495 FL_OBJECT *obj;
496 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000497{
Guido van Rossum03747111991-08-08 12:10:01 +0000498 int par1, par2;
499
Guido van Rossumfc58e581992-01-27 16:45:55 +0000500 if (!getintintarg(args, &par1, &par2)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000501
502 (*func) (obj, par1, par2);
503
504 INCREF(None);
505 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000506}
Guido van Rossum03747111991-08-08 12:10:01 +0000507#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000508
509/* int func (object) */
510static object *
511call_forms_Ri (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000512 int (*func)(FL_OBJECT *);
513 FL_OBJECT *obj;
514 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000515{
Guido van Rossum03747111991-08-08 12:10:01 +0000516 int retval;
517
518 if (!getnoarg(args)) return NULL;
519
520 retval = (*func) (obj);
521
522 return newintobject ((long) retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000523}
524
525/* char * func (object) */
526static object *
527call_forms_Rstr (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000528 char * (*func)(FL_OBJECT *);
529 FL_OBJECT *obj;
530 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000531{
Guido van Rossum03747111991-08-08 12:10:01 +0000532 char *str;
533
Guido van Rossumfc58e581992-01-27 16:45:55 +0000534 if (!getnoarg(args)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000535
536 str = (*func) (obj);
537
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000538 if (str == NULL) {
539 INCREF(None);
540 return None;
541 }
Guido van Rossum03747111991-08-08 12:10:01 +0000542 return newstringobject (str);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000543}
544
545/* int func (object) */
546static object *
547call_forms_Rf (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000548 float (*func)(FL_OBJECT *);
549 FL_OBJECT *obj;
550 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000551{
Guido van Rossum03747111991-08-08 12:10:01 +0000552 float retval;
553
554 if (!getnoarg(args)) return NULL;
555
556 retval = (*func) (obj);
557
558 return newfloatobject (retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000559}
560
561static object *
562call_forms_OUTfOUTf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000563 void (*func)(FL_OBJECT *, float *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000564 FL_OBJECT *obj;
565 object *args;
566{
567 float f1, f2;
568 object *arg;
Guido van Rossum03747111991-08-08 12:10:01 +0000569
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000570 if (!getnoarg(args)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000571
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000572 (*func) (obj, &f1, &f2);
573
574 arg = newtupleobject (2);
575 if (arg == NULL) return NULL;
576
577 settupleitem (arg, 0, newfloatobject (f1));
578 settupleitem (arg, 1, newfloatobject (f2));
579 return arg;
580}
581
Guido van Rossum03747111991-08-08 12:10:01 +0000582#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000583static object *
584call_forms_OUTf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000585 void (*func)(FL_OBJECT *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000586 FL_OBJECT *obj;
587 object *args;
588{
589 float f;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000590
591 if (!getnoarg(args)) return NULL;
592
593 (*func) (obj, &f);
594
595 return newfloatobject (f);
596}
Guido van Rossum03747111991-08-08 12:10:01 +0000597#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000598
599/**********************************************************************/
600/* Class : browser */
601
602static object *
603set_browser_topline(g, args)
604 genericobject *g;
605 object *args;
606{
Guido van Rossum03747111991-08-08 12:10:01 +0000607 return call_forms_INi (fl_set_browser_topline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000608}
609
610static object *
611clear_browser(g, args)
612 genericobject *g;
613 object *args;
614{
Guido van Rossum03747111991-08-08 12:10:01 +0000615 return generic_call (g, args, fl_clear_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000616}
617
618static object *
619add_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000620 genericobject *g;
621 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000622{
Guido van Rossum03747111991-08-08 12:10:01 +0000623 return call_forms_INstr (fl_add_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000624}
625
626static object *
627addto_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000628 genericobject *g;
629 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000630{
Guido van Rossum03747111991-08-08 12:10:01 +0000631 return call_forms_INstr (fl_addto_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000632}
633
634static object *
635insert_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000636 genericobject *g;
637 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000638{
Guido van Rossum03747111991-08-08 12:10:01 +0000639 return call_forms_INiINstr (fl_insert_browser_line,
640 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000641}
642
643static object *
644delete_browser_line (g, args)
645 genericobject *g;
646 object *args;
647{
Guido van Rossum03747111991-08-08 12:10:01 +0000648 return call_forms_INi (fl_delete_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000649}
650
651static object *
652replace_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000653 genericobject *g;
654 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000655{
Guido van Rossum03747111991-08-08 12:10:01 +0000656 return call_forms_INiINstr (fl_replace_browser_line,
657 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000658}
659
660static object *
661get_browser_line(g, args)
662 genericobject *g;
663 object *args;
664{
665 int i;
666 char *str;
667
668 if (!getintarg(args, &i))
669 return NULL;
670
671 str = fl_get_browser_line (g->ob_generic, i);
672
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000673 if (str == NULL) {
674 INCREF(None);
675 return None;
676 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000677 return newstringobject (str);
678}
679
680static object *
681load_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000682 genericobject *g;
683 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000684{
Guido van Rossumabe58351991-08-08 12:34:44 +0000685 /* XXX strictly speaking this is wrong since fl_load_browser
686 XXX returns int, not void */
Guido van Rossum03747111991-08-08 12:10:01 +0000687 return call_forms_INstr (fl_load_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000688}
689
690static object *
691get_browser_maxline(g, args)
692 genericobject *g;
693 object *args;
694{
Guido van Rossum03747111991-08-08 12:10:01 +0000695 return call_forms_Ri (fl_get_browser_maxline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000696}
697
698static object *
699select_browser_line (g, args)
700 genericobject *g;
701 object *args;
702{
Guido van Rossum03747111991-08-08 12:10:01 +0000703 return call_forms_INi (fl_select_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000704}
705
706static object *
707deselect_browser_line (g, args)
708 genericobject *g;
709 object *args;
710{
Guido van Rossum03747111991-08-08 12:10:01 +0000711 return call_forms_INi (fl_deselect_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000712}
713
714static object *
715deselect_browser (g, args)
716 genericobject *g;
717 object *args;
718{
Guido van Rossum03747111991-08-08 12:10:01 +0000719 return generic_call (g, args, fl_deselect_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000720}
721
722static object *
723isselected_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000724 genericobject *g;
725 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000726{
727 int i, j;
Guido van Rossum03747111991-08-08 12:10:01 +0000728
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000729 if (!getintarg(args, &i))
730 return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000731
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000732 j = fl_isselected_browser_line (g->ob_generic, i);
Guido van Rossum03747111991-08-08 12:10:01 +0000733
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000734 return newintobject (j);
735}
736
737static object *
738get_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000739 genericobject *g;
740 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000741{
Guido van Rossum03747111991-08-08 12:10:01 +0000742 return call_forms_Ri (fl_get_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000743}
744
745static object *
746set_browser_fontsize (g, args)
747 genericobject *g;
748 object *args;
749{
Guido van Rossum03747111991-08-08 12:10:01 +0000750 return call_forms_INf (fl_set_browser_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000751}
752
753static object *
754set_browser_fontstyle (g, args)
755 genericobject *g;
756 object *args;
757{
Guido van Rossum03747111991-08-08 12:10:01 +0000758 return call_forms_INi (fl_set_browser_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000759}
760
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000761static object *
762set_browser_specialkey (g, args)
763 genericobject *g;
764 object *args;
765{
766 return call_forms_INc(fl_set_browser_specialkey, g-> ob_generic, args);
767}
768
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000769static struct methodlist browser_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000770 {"set_browser_topline", set_browser_topline},
771 {"clear_browser", clear_browser},
772 {"add_browser_line", add_browser_line},
773 {"addto_browser", addto_browser},
774 {"insert_browser_line", insert_browser_line},
775 {"delete_browser_line", delete_browser_line},
776 {"replace_browser_line", replace_browser_line},
777 {"get_browser_line", get_browser_line},
778 {"load_browser", load_browser},
779 {"get_browser_maxline", get_browser_maxline},
780 {"select_browser_line", select_browser_line},
781 {"deselect_browser_line", deselect_browser_line},
782 {"deselect_browser", deselect_browser},
783 {"isselected_browser_line", isselected_browser_line},
784 {"get_browser", get_browser},
785 {"set_browser_fontsize", set_browser_fontsize},
786 {"set_browser_fontstyle", set_browser_fontstyle},
787 {"set_browser_specialkey", set_browser_specialkey},
788 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000789};
790
791/* Class: button */
792
793static object *
794set_button(g, args)
795 genericobject *g;
796 object *args;
797{
Guido van Rossum03747111991-08-08 12:10:01 +0000798 return call_forms_INi (fl_set_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000799}
800
801static object *
802get_button(g, args)
803 genericobject *g;
804 object *args;
805{
Guido van Rossum03747111991-08-08 12:10:01 +0000806 return call_forms_Ri (fl_get_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000807}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000808static object *
809set_button_shortcut(g, args)
810 genericobject *g;
811 object *args;
812{
813 return call_forms_INstr (fl_set_button_shortcut, g-> ob_generic, args);
814}
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000815
816static struct methodlist button_methods[] = {
817 {"set_button", set_button},
818 {"get_button", get_button},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000819#ifndef FL_V15
820 {"set_button_shortcut", set_button_shortcut},
821#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000822 {NULL, NULL} /* sentinel */
823};
824
825/* Class: choice */
826
827static object *
828set_choice(g, args)
829 genericobject *g;
830 object *args;
831{
Guido van Rossum03747111991-08-08 12:10:01 +0000832 return call_forms_INi (fl_set_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000833}
834
835static object *
836get_choice(g, args)
837 genericobject *g;
838 object *args;
839{
Guido van Rossum03747111991-08-08 12:10:01 +0000840 return call_forms_Ri (fl_get_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000841}
842
843static object *
844clear_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000845 genericobject *g;
846 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000847{
Guido van Rossum03747111991-08-08 12:10:01 +0000848 return generic_call (g, args, fl_clear_choice);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000849}
850
851static object *
852addto_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000853 genericobject *g;
854 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000855{
Guido van Rossum03747111991-08-08 12:10:01 +0000856 return call_forms_INstr (fl_addto_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000857}
858
859static object *
860replace_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000861 genericobject *g;
862 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000863{
Guido van Rossum03747111991-08-08 12:10:01 +0000864 return call_forms_INiINstr (fl_replace_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000865}
866
867static object *
868delete_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000869 genericobject *g;
870 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000871{
Guido van Rossum03747111991-08-08 12:10:01 +0000872 return call_forms_INi (fl_delete_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000873}
874
875static object *
876get_choice_text (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000877 genericobject *g;
878 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000879{
Guido van Rossum03747111991-08-08 12:10:01 +0000880 return call_forms_Rstr (fl_get_choice_text, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000881}
882
883static object *
884set_choice_fontsize (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000885 genericobject *g;
886 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000887{
Guido van Rossum03747111991-08-08 12:10:01 +0000888 return call_forms_INf (fl_set_choice_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000889}
890
891static object *
892set_choice_fontstyle (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000893 genericobject *g;
894 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000895{
Guido van Rossum03747111991-08-08 12:10:01 +0000896 return call_forms_INi (fl_set_choice_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000897}
898
899static struct methodlist choice_methods[] = {
900 {"set_choice", set_choice},
901 {"get_choice", get_choice},
902 {"clear_choice", clear_choice},
903 {"addto_choice", addto_choice},
904 {"replace_choice", replace_choice},
905 {"delete_choice", delete_choice},
906 {"get_choice_text", get_choice_text},
907 {"set_choice_fontsize", set_choice_fontsize},
908 {"set_choice_fontstyle",set_choice_fontstyle},
909 {NULL, NULL} /* sentinel */
910};
911
912/* Class : Clock */
913
914static object *
915get_clock(g, args)
916 genericobject *g;
917 object *args;
918{
919 int i0, i1, i2;
920 object *arg;
921
922 if (!getnoarg(args))
923 return NULL;
924
925 fl_get_clock (g->ob_generic, &i0, &i1, &i2);
926
927 arg = newtupleobject (3);
928 if (arg == NULL) return NULL;
929
930 settupleitem (arg, 0, newintobject (i0));
931 settupleitem (arg, 1, newintobject (i1));
932 settupleitem (arg, 2, newintobject (i2));
933 return arg;
934}
935
936static struct methodlist clock_methods[] = {
937 {"get_clock", get_clock},
938 {NULL, NULL} /* sentinel */
939};
940
941/* CLass : Counters */
942
943static object *
944get_counter_value(g, args)
945 genericobject *g;
946 object *args;
947{
948 return call_forms_Rf (fl_get_counter_value, g-> ob_generic, args);
949}
950
951static object *
952set_counter_value (g, args)
953 genericobject *g;
954 object *args;
955{
956 return call_forms_INf (fl_set_counter_value, g-> ob_generic, args);
957}
958
959static object *
960set_counter_precision (g, args)
961 genericobject *g;
962 object *args;
963{
964 return call_forms_INi (fl_set_counter_precision, g-> ob_generic, args);
965}
966
967static object *
968set_counter_bounds (g, args)
969 genericobject *g;
970 object *args;
971{
972 return call_forms_INfINf (fl_set_counter_bounds, g-> ob_generic, args);
973}
974
975static object *
976set_counter_step (g, args)
977 genericobject *g;
978 object *args;
979{
980 return call_forms_INfINf (fl_set_counter_step, g-> ob_generic, args);
981}
982
983static object *
984set_counter_return (g, args)
985 genericobject *g;
986 object *args;
987{
Guido van Rossum03747111991-08-08 12:10:01 +0000988 return call_forms_INi (fl_set_counter_return, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000989}
990
991static struct methodlist counter_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000992 {"set_counter_value", set_counter_value},
993 {"get_counter_value", get_counter_value},
994 {"set_counter_bounds", set_counter_bounds},
995 {"set_counter_step", set_counter_step},
996 {"set_counter_precision", set_counter_precision},
997 {"set_counter_return", set_counter_return},
998 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000999};
1000
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001001#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001002/* Class : Defaults */
1003
1004static object *
1005get_default(g, args)
1006 genericobject *g;
1007 object *args;
1008{
Guido van Rossum03747111991-08-08 12:10:01 +00001009 char c;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001010
Guido van Rossum03747111991-08-08 12:10:01 +00001011 if (!getnoarg(args)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001012
Guido van Rossum03747111991-08-08 12:10:01 +00001013 c = fl_get_default (g->ob_generic);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001014
Guido van Rossum03747111991-08-08 12:10:01 +00001015 return ((object *) mknewcharobject (c)); /* in cgensupport.c */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001016}
1017
1018static struct methodlist default_methods[] = {
1019 {"get_default", get_default},
1020 {NULL, NULL} /* sentinel */
1021};
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001022#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001023
1024
1025/* Class: Dials */
1026
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001027#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001028static object *
1029set_dial (g, args)
1030 genericobject *g;
1031 object *args;
1032{
1033 float f1, f2, f3;
1034
Guido van Rossumfc58e581992-01-27 16:45:55 +00001035 if (!getargs(args, "(fff)", &f1, &f2, &f3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001036 return NULL;
1037 fl_set_dial (g->ob_generic, f1, f2, f3);
1038 INCREF(None);
1039 return None;
1040}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001041#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001042
1043static object *
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001044get_dial_value(g, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001045 genericobject *g;
1046 object *args;
1047{
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001048 return call_forms_Rf (fl_get_dial_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001049}
1050
1051static object *
1052set_dial_value (g, args)
1053 genericobject *g;
1054 object *args;
1055{
1056 return call_forms_INf (fl_set_dial_value, g-> ob_generic, args);
1057}
1058
1059static object *
1060set_dial_bounds (g, args)
1061 genericobject *g;
1062 object *args;
1063{
1064 return call_forms_INfINf (fl_set_dial_bounds, g-> ob_generic, args);
1065}
1066
1067static object *
1068get_dial_bounds (g, args)
1069 genericobject *g;
1070 object *args;
1071{
1072 return call_forms_OUTfOUTf (fl_get_dial_bounds, g-> ob_generic, args);
1073}
1074
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001075#ifndef FL_V15
1076static object *
1077set_dial_step (g, args)
1078 genericobject *g;
1079 object *args;
1080{
1081 return call_forms_INf (fl_set_dial_step, g-> ob_generic, args);
1082}
1083#endif /* !FL_V15 */
1084
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001085static struct methodlist dial_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001086#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001087 {"set_dial", set_dial},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001088 {"get_dial", get_dial_value},
1089#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001090 {"set_dial_value", set_dial_value},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001091 {"get_dial_value", get_dial_value},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001092 {"set_dial_bounds", set_dial_bounds},
1093 {"get_dial_bounds", get_dial_bounds},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001094#ifndef FL_V15
1095 {"set_dial_step", set_dial_step},
1096#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001097 {NULL, NULL} /* sentinel */
1098};
1099
1100/* Class : Input */
1101
1102static object *
1103set_input (g, args)
1104 genericobject *g;
1105 object *args;
1106{
1107 return call_forms_INstr (fl_set_input, g-> ob_generic, args);
1108}
1109
1110static object *
1111get_input (g, args)
1112 genericobject *g;
1113 object *args;
1114{
1115 return call_forms_Rstr (fl_get_input, g-> ob_generic, args);
1116}
1117
1118static object *
1119set_input_color (g, args)
1120 genericobject *g;
1121 object *args;
1122{
1123 return call_forms_INfINf (fl_set_input_color, g-> ob_generic, args);
1124}
1125
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001126#ifndef FL_V15
1127static object *
1128set_input_return (g, args)
1129 genericobject *g;
1130 object *args;
1131{
1132 return call_forms_INi (fl_set_input_return, g-> ob_generic, args);
1133}
1134#endif /* !FL_V15 */
1135
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001136static struct methodlist input_methods[] = {
1137 {"set_input", set_input},
1138 {"get_input", get_input},
1139 {"set_input_color", set_input_color},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001140#ifndef FL_V15
1141 {"set_input_return", set_input_return},
1142#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001143 {NULL, NULL} /* sentinel */
1144};
1145
1146
1147/* Class : Menu */
1148
1149static object *
1150set_menu (g, args)
1151 genericobject *g;
1152 object *args;
1153{
Guido van Rossumabe58351991-08-08 12:34:44 +00001154 return call_forms_INstr (fl_set_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001155}
1156
1157static object *
1158get_menu (g, args)
1159 genericobject *g;
1160 object *args;
1161{
Guido van Rossumabe58351991-08-08 12:34:44 +00001162 /* XXX strictly speaking this is wrong since fl_get_menu
1163 XXX returns long, not int */
1164 return call_forms_Ri (fl_get_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001165}
1166
1167static object *
1168addto_menu (g, args)
1169 genericobject *g;
1170 object *args;
1171{
Guido van Rossumabe58351991-08-08 12:34:44 +00001172 return call_forms_INstr (fl_addto_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001173}
1174
1175static struct methodlist menu_methods[] = {
1176 {"set_menu", set_menu},
1177 {"get_menu", get_menu},
1178 {"addto_menu", addto_menu},
1179 {NULL, NULL} /* sentinel */
1180};
1181
1182
1183/* Class: Sliders */
1184
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001185#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001186static object *
1187set_slider (g, args)
1188 genericobject *g;
1189 object *args;
1190{
1191 float f1, f2, f3;
1192
Guido van Rossumfc58e581992-01-27 16:45:55 +00001193 if (!args(args, "(fff)", &f1, &f2, &f3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001194 return NULL;
1195 fl_set_slider (g->ob_generic, f1, f2, f3);
1196 INCREF(None);
1197 return None;
1198}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001199#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001200
1201static object *
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001202get_slider_value(g, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001203 genericobject *g;
1204 object *args;
1205{
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001206 return call_forms_Rf (fl_get_slider_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001207}
1208
1209static object *
1210set_slider_value (g, args)
1211 genericobject *g;
1212 object *args;
1213{
1214 return call_forms_INf (fl_set_slider_value, g-> ob_generic, args);
1215}
1216
1217static object *
1218set_slider_bounds (g, args)
1219 genericobject *g;
1220 object *args;
1221{
1222 return call_forms_INfINf (fl_set_slider_bounds, g-> ob_generic, args);
1223}
1224
1225static object *
1226get_slider_bounds (g, args)
1227 genericobject *g;
1228 object *args;
1229{
1230 return call_forms_OUTfOUTf(fl_get_slider_bounds, g-> ob_generic, args);
1231}
1232
1233static object *
1234set_slider_return (g, args)
1235 genericobject *g;
1236 object *args;
1237{
1238 return call_forms_INf (fl_set_slider_return, g-> ob_generic, args);
1239}
1240
1241static object *
1242set_slider_size (g, args)
1243 genericobject *g;
1244 object *args;
1245{
1246 return call_forms_INf (fl_set_slider_size, g-> ob_generic, args);
1247}
1248
1249static object *
1250set_slider_precision (g, args)
1251 genericobject *g;
1252 object *args;
1253{
1254 return call_forms_INi (fl_set_slider_precision, g-> ob_generic, args);
1255}
1256
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001257#ifndef FL_V15
1258static object *
1259set_slider_step (g, args)
1260 genericobject *g;
1261 object *args;
1262{
1263 return call_forms_INf (fl_set_slider_step, g-> ob_generic, args);
1264}
1265#endif /* !FL_V15 */
1266
1267
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001268static struct methodlist slider_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001269#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001270 {"set_slider", set_slider},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001271 {"get_slider", get_slider_value},
1272#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001273 {"set_slider_value", set_slider_value},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001274 {"get_slider_value", get_slider_value},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001275 {"set_slider_bounds", set_slider_bounds},
1276 {"get_slider_bounds", get_slider_bounds},
1277 {"set_slider_return", set_slider_return},
1278 {"set_slider_size", set_slider_size},
1279 {"set_slider_precision",set_slider_precision},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001280#ifndef FL_V15
1281 {"set_slider_step", set_slider_step},
1282#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001283 {NULL, NULL} /* sentinel */
1284};
1285
1286static object *
1287set_positioner_xvalue (g, args)
1288 genericobject *g;
1289 object *args;
1290{
1291 return call_forms_INf (fl_set_positioner_xvalue, g-> ob_generic, args);
1292}
1293
1294static object *
1295set_positioner_xbounds (g, args)
1296 genericobject *g;
1297 object *args;
1298{
1299 return call_forms_INfINf (fl_set_positioner_xbounds, g-> ob_generic, args);
1300}
1301
1302static object *
1303set_positioner_yvalue (g, args)
1304 genericobject *g;
1305 object *args;
1306{
1307 return call_forms_INf (fl_set_positioner_yvalue, g-> ob_generic, args);
1308}
1309
1310static object *
1311set_positioner_ybounds (g, args)
1312 genericobject *g;
1313 object *args;
1314{
1315 return call_forms_INfINf (fl_set_positioner_ybounds, g-> ob_generic, args);
1316}
1317
1318static object *
1319get_positioner_xvalue (g, args)
1320 genericobject *g;
1321 object *args;
1322{
1323 return call_forms_Rf (fl_get_positioner_xvalue, g-> ob_generic, args);
1324}
1325
1326static object *
1327get_positioner_xbounds (g, args)
1328 genericobject *g;
1329 object *args;
1330{
1331 return call_forms_OUTfOUTf (fl_get_positioner_xbounds, g-> ob_generic, args);
1332}
1333
1334static object *
1335get_positioner_yvalue (g, args)
1336 genericobject *g;
1337 object *args;
1338{
1339 return call_forms_Rf (fl_get_positioner_yvalue, g-> ob_generic, args);
1340}
1341
1342static object *
1343get_positioner_ybounds (g, args)
1344 genericobject *g;
1345 object *args;
1346{
1347 return call_forms_OUTfOUTf (fl_get_positioner_ybounds, g-> ob_generic, args);
1348}
1349
1350static struct methodlist positioner_methods[] = {
1351 {"set_positioner_xvalue", set_positioner_xvalue},
1352 {"set_positioner_yvalue", set_positioner_yvalue},
1353 {"set_positioner_xbounds", set_positioner_xbounds},
1354 {"set_positioner_ybounds", set_positioner_ybounds},
1355 {"get_positioner_xvalue", get_positioner_xvalue},
1356 {"get_positioner_yvalue", get_positioner_yvalue},
1357 {"get_positioner_xbounds", get_positioner_xbounds},
Guido van Rossum03747111991-08-08 12:10:01 +00001358 {"get_positioner_ybounds", get_positioner_ybounds},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001359 {NULL, NULL} /* sentinel */
1360};
1361
1362/* Class timer */
1363
1364static object *
1365set_timer (g, args)
1366 genericobject *g;
1367 object *args;
1368{
1369 return call_forms_INf (fl_set_timer, g-> ob_generic, args);
1370}
1371
1372static object *
1373get_timer (g, args)
1374 genericobject *g;
1375 object *args;
1376{
1377 return call_forms_Rf (fl_get_timer, g-> ob_generic, args);
1378}
1379
1380static struct methodlist timer_methods[] = {
1381 {"set_timer", set_timer},
1382 {"get_timer", get_timer},
1383 {NULL, NULL} /* sentinel */
1384};
1385
1386/* Form objects */
1387
1388typedef struct {
1389 OB_HEAD
1390 FL_FORM *ob_form;
1391} formobject;
1392
1393extern typeobject Formtype; /* Forward */
1394
1395#define is_formobject(v) ((v)->ob_type == &Formtype)
1396
1397static object *
1398form_show_form(f, args)
1399 formobject *f;
1400 object *args;
1401{
1402 int place, border;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001403 char *name;
1404 if (!getargs(args, "(iis)", &place, &border, &name))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001405 return NULL;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001406 fl_show_form(f->ob_form, place, border, name);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001407 INCREF(None);
1408 return None;
1409}
1410
1411static object *
1412form_call(func, f, args)
1413 FL_FORM *f;
1414 object *args;
1415 void (*func)(FL_FORM *);
1416{
1417 if (!getnoarg(args)) return NULL;
1418
1419 (*func)(f);
1420
1421 INCREF(None);
1422 return None;
1423}
1424
1425static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001426form_call_INiINi(func, f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001427 FL_FORM *f;
1428 object *args;
1429 void (*func)(FL_FORM *, int, int);
1430{
1431 int a, b;
1432
1433 if (!getintintarg(args, &a, &b)) return NULL;
1434
1435 (*func)(f, a, b);
1436
1437 INCREF(None);
1438 return None;
1439}
1440
1441static object *
1442form_hide_form(f, args)
1443 formobject *f;
1444 object *args;
1445{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001446 return form_call(fl_hide_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001447}
1448
1449static object *
1450form_redraw_form(f, args)
1451 formobject *f;
1452 object *args;
1453{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001454 return form_call(fl_redraw_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001455}
1456
1457static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001458form_add_object(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001459 formobject *f;
1460 object *args;
1461{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001462 if (args == NULL || !is_genericobject(args)) {
1463 err_badarg();
1464 return NULL;
1465 }
1466
1467 fl_add_object(f->ob_form, ((genericobject *)args) -> ob_generic);
1468
1469 INCREF(None);
1470 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001471}
1472
1473static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001474form_set_form_position(f, args)
1475 formobject *f;
1476 object *args;
1477{
1478 return form_call_INiINi(fl_set_form_position, f-> ob_form, args);
1479}
1480
1481static object *
1482generic_add_object(f, args, func, internal_methods)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001483 formobject *f;
1484 object *args;
1485 FL_OBJECT *(*func)(int, float, float, float, float, char*);
1486 struct methodlist *internal_methods;
1487{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001488 int type;
1489 float x, y, w, h;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001490 char *name;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001491 FL_OBJECT *obj;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001492
Guido van Rossumfc58e581992-01-27 16:45:55 +00001493 if (!getargs(args,"(iffffs)", &type,&x,&y,&w,&h,&name))
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001494 return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001495
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001496 fl_addto_form (f-> ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001497
Guido van Rossumfc58e581992-01-27 16:45:55 +00001498 obj = (*func) (type, x, y, w, h, name);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001499
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001500 fl_end_form();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001501
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001502 if (obj == NULL) {
1503 err_nomem();
1504 return NULL;
1505 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001506
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001507 return newgenericobject (obj, internal_methods);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001508}
1509
1510static object *
1511form_add_button(f, args)
1512 formobject *f;
1513 object *args;
1514{
1515 return generic_add_object(f, args, fl_add_button, button_methods);
1516}
1517
1518static object *
1519form_add_lightbutton(f, args)
1520 formobject *f;
1521 object *args;
1522{
1523 return generic_add_object(f, args, fl_add_lightbutton, button_methods);
1524}
1525
1526static object *
1527form_add_roundbutton(f, args)
1528 formobject *f;
1529 object *args;
1530{
1531 return generic_add_object(f, args, fl_add_roundbutton, button_methods);
1532}
1533
1534static object *
1535form_add_menu (f, args)
1536 formobject *f;
1537 object *args;
1538{
1539 return generic_add_object(f, args, fl_add_menu, menu_methods);
1540}
1541
1542static object *
1543form_add_slider(f, args)
1544 formobject *f;
1545 object *args;
1546{
1547 return generic_add_object(f, args, fl_add_slider, slider_methods);
1548}
1549
1550static object *
1551form_add_valslider(f, args)
1552 formobject *f;
1553 object *args;
1554{
1555 return generic_add_object(f, args, fl_add_valslider, slider_methods);
1556}
1557
1558static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001559form_add_dial(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001560 formobject *f;
1561 object *args;
1562{
1563 return generic_add_object(f, args, fl_add_dial, dial_methods);
1564}
1565
1566static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001567form_add_counter(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001568 formobject *f;
1569 object *args;
1570{
1571 return generic_add_object(f, args, fl_add_counter, counter_methods);
1572}
1573
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001574#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001575static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001576form_add_default(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001577 formobject *f;
1578 object *args;
1579{
1580 return generic_add_object(f, args, fl_add_default, default_methods);
1581}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001582#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001583
1584static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001585form_add_clock(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001586 formobject *f;
1587 object *args;
1588{
1589 return generic_add_object(f, args, fl_add_clock, clock_methods);
1590}
1591
1592static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001593form_add_box(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001594 formobject *f;
1595 object *args;
1596{
Guido van Rossum03747111991-08-08 12:10:01 +00001597 return generic_add_object(f, args, fl_add_box,
1598 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001599}
1600
1601static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001602form_add_choice(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001603 formobject *f;
1604 object *args;
1605{
1606 return generic_add_object(f, args, fl_add_choice, choice_methods);
1607}
1608
1609static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001610form_add_browser(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001611 formobject *f;
1612 object *args;
1613{
1614 return generic_add_object(f, args, fl_add_browser, browser_methods);
1615}
1616
1617static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001618form_add_positioner(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001619 formobject *f;
1620 object *args;
1621{
1622 return generic_add_object(f, args, fl_add_positioner, positioner_methods);
1623}
1624
1625static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001626form_add_input(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001627 formobject *f;
1628 object *args;
1629{
1630 return generic_add_object(f, args, fl_add_input, input_methods);
1631}
1632
1633static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001634form_add_text(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001635 formobject *f;
1636 object *args;
1637{
Guido van Rossum03747111991-08-08 12:10:01 +00001638 return generic_add_object(f, args, fl_add_text,
1639 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001640}
1641
1642static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001643form_add_timer(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001644 formobject *f;
1645 object *args;
1646{
1647 return generic_add_object(f, args, fl_add_timer, timer_methods);
1648}
1649
1650static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001651form_freeze_form(f, args)
1652 formobject *f;
1653 object *args;
1654{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001655 return form_call(fl_freeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001656}
1657
1658static object *
1659form_unfreeze_form(f, args)
1660 formobject *f;
1661 object *args;
1662{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001663 return form_call(fl_unfreeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001664}
1665
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001666#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001667static object *
1668form_remove_form(f, args)
1669 formobject *f;
1670 object *args;
1671{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001672 return form_call(fl_remove_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001673}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001674#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001675
1676static object *
1677form_activate_form(f, args)
1678 formobject *f;
1679 object *args;
1680{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001681 return form_call(fl_activate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001682}
1683
1684static object *
1685form_deactivate_form(f, args)
1686 formobject *f;
1687 object *args;
1688{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001689 return form_call(fl_deactivate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001690}
1691
Guido van Rossum75cc8981991-08-08 12:07:45 +00001692static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001693form_bgn_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001694 formobject *f;
1695 object *args;
1696{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001697 FL_OBJECT *obj;
1698
1699 fl_addto_form(f-> ob_form);
1700 obj = fl_bgn_group();
1701 fl_end_form();
1702
1703 if (obj == NULL) {
1704 err_nomem();
1705 return NULL;
1706 }
1707
1708 return newgenericobject (obj, (struct methodlist *) NULL);
Guido van Rossum03747111991-08-08 12:10:01 +00001709}
1710
1711static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001712form_end_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001713 formobject *f;
1714 object *args;
1715{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001716 fl_addto_form(f-> ob_form);
Guido van Rossum03747111991-08-08 12:10:01 +00001717 fl_end_group();
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001718 fl_end_form();
Guido van Rossum03747111991-08-08 12:10:01 +00001719 INCREF(None);
1720 return None;
1721}
1722
1723static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001724forms_find_first_or_last(func, f, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00001725 FL_OBJECT *(*func)(FL_FORM *, int, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +00001726 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001727 object *args;
1728{
1729 int type;
1730 float mx, my;
1731 FL_OBJECT *generic;
1732 genericobject *g;
1733
Guido van Rossumfc58e581992-01-27 16:45:55 +00001734 if (!getargs(args, "(iff)", &type, &mx, &my)) return NULL;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001735
Guido van Rossum03747111991-08-08 12:10:01 +00001736 generic = (*func) (f-> ob_form, type, mx, my);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001737
1738 if (generic == NULL)
1739 {
1740 INCREF(None);
1741 return None;
1742 }
1743
1744 g = findgeneric(generic);
1745 if (g == NULL) {
1746 err_setstr(RuntimeError,
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001747 "forms_find_{first|last} returns unknown object");
Guido van Rossum75cc8981991-08-08 12:07:45 +00001748 return NULL;
1749 }
1750 INCREF(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001751 return (object *) g;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001752}
1753
1754static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001755form_find_first(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001756 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001757 object *args;
1758{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001759 return forms_find_first_or_last(fl_find_first, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001760}
1761
1762static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001763form_find_last(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001764 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001765 object *args;
1766{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001767 return forms_find_first_or_last(fl_find_last, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001768}
1769
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001770static struct methodlist form_methods[] = {
1771/* adm */
1772 {"show_form", form_show_form},
1773 {"hide_form", form_hide_form},
1774 {"redraw_form", form_redraw_form},
1775 {"set_form_position", form_set_form_position},
1776 {"freeze_form", form_freeze_form},
1777 {"unfreeze_form", form_unfreeze_form},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001778#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001779 {"remove_form", form_remove_form},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001780#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001781 {"activate_form", form_activate_form},
1782 {"deactivate_form", form_deactivate_form},
Guido van Rossum03747111991-08-08 12:10:01 +00001783 {"bgn_group", form_bgn_group},
1784 {"end_group", form_end_group},
Guido van Rossum75cc8981991-08-08 12:07:45 +00001785 {"find_first", form_find_first},
1786 {"find_last", form_find_last},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001787
1788/* basic objects */
1789 {"add_button", form_add_button},
1790/* {"add_bitmap", form_add_bitmap}, */
1791 {"add_lightbutton", form_add_lightbutton},
1792 {"add_roundbutton", form_add_roundbutton},
1793 {"add_menu", form_add_menu},
1794 {"add_slider", form_add_slider},
1795 {"add_positioner", form_add_positioner},
1796 {"add_valslider", form_add_valslider},
1797 {"add_dial", form_add_dial},
1798 {"add_counter", form_add_counter},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001799#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001800 {"add_default", form_add_default},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001801#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001802 {"add_box", form_add_box},
1803 {"add_clock", form_add_clock},
1804 {"add_choice", form_add_choice},
1805 {"add_browser", form_add_browser},
1806 {"add_input", form_add_input},
1807 {"add_timer", form_add_timer},
1808 {"add_text", form_add_text},
1809 {NULL, NULL} /* sentinel */
1810};
1811
1812static void
1813form_dealloc(f)
1814 formobject *f;
1815{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001816 releaseobjects(f->ob_form);
Guido van Rossum336b5911992-04-08 11:16:25 +00001817 if (f->ob_form->visible)
1818 fl_hide_form(f->ob_form);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001819 fl_free_form(f->ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001820 DEL(f);
1821}
1822
Guido van Rossumd97f0481991-11-19 20:26:28 +00001823#define OFF(x) offsetof(FL_FORM, x)
1824
Guido van Rossum32db5e31991-11-12 15:43:18 +00001825static struct memberlist form_memberlist[] = {
1826 {"window", T_LONG, OFF(window), RO},
1827 {"w", T_FLOAT, OFF(w)},
1828 {"h", T_FLOAT, OFF(h)},
1829 {"x", T_FLOAT, OFF(x)},
1830 {"y", T_FLOAT, OFF(y)},
1831 {"deactivated", T_INT, OFF(deactivated)},
1832 {"visible", T_INT, OFF(visible)},
1833 {"frozen", T_INT, OFF(frozen)},
1834 {"doublebuf", T_INT, OFF(doublebuf)},
1835 {NULL} /* Sentinel */
1836};
1837
Guido van Rossumd97f0481991-11-19 20:26:28 +00001838#undef OFF
1839
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001840static object *
1841form_getattr(f, name)
1842 formobject *f;
1843 char *name;
1844{
Guido van Rossum32db5e31991-11-12 15:43:18 +00001845 object *meth;
1846
1847 meth = findmethod(form_methods, (object *)f, name);
1848 if (meth != NULL)
1849 return meth;
1850 err_clear();
1851 return getmember((char *)f->ob_form, form_memberlist, name);
1852}
1853
1854static int
1855form_setattr(f, name, v)
1856 formobject *f;
1857 char *name;
1858 object *v;
1859{
1860 int ret;
1861
1862 if (v == NULL) {
1863 err_setstr(TypeError, "can't delete form attributes");
1864 return NULL;
1865 }
1866
1867 return setmember((char *)f->ob_form, form_memberlist, name, v);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001868}
1869
1870typeobject Formtype = {
1871 OB_HEAD_INIT(&Typetype)
1872 0, /*ob_size*/
1873 "form", /*tp_name*/
1874 sizeof(formobject), /*tp_size*/
1875 0, /*tp_itemsize*/
1876 /* methods */
1877 form_dealloc, /*tp_dealloc*/
1878 0, /*tp_print*/
1879 form_getattr, /*tp_getattr*/
Guido van Rossum32db5e31991-11-12 15:43:18 +00001880 form_setattr, /*tp_setattr*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001881 0, /*tp_compare*/
1882 0, /*tp_repr*/
1883};
1884
1885static object *
1886newformobject(form)
1887 FL_FORM *form;
1888{
1889 formobject *f;
1890 f = NEWOBJ(formobject, &Formtype);
1891 if (f == NULL)
1892 return NULL;
1893 f->ob_form = form;
1894 return (object *)f;
1895}
1896
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001897
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001898/* The "fl" module */
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001899
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001900static object *
1901forms_make_form(dummy, args)
1902 object *dummy;
1903 object *args;
1904{
1905 int type;
1906 float w, h;
1907 FL_FORM *form;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001908 if (!getargs(args, "(iff)", &type, &w, &h))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001909 return NULL;
1910 form = fl_bgn_form(type, w, h);
1911 if (form == NULL) {
1912 /* XXX Actually, cannot happen! */
1913 err_nomem();
1914 return NULL;
1915 }
1916 fl_end_form();
1917 return newformobject(form);
1918}
1919
Guido van Rossum2bac4d31992-03-27 17:20:21 +00001920static object *
1921forms_activate_all_forms(f, args)
1922 object *f;
1923 object *args;
1924{
1925 fl_activate_all_forms();
1926 INCREF(None);
1927 return None;
1928}
1929
1930static object *
1931forms_deactivate_all_forms(f, args)
1932 object *f;
1933 object *args;
1934{
1935 fl_deactivate_all_forms();
1936 INCREF(None);
1937 return None;
1938}
1939
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001940static object *my_event_callback = NULL;
1941
1942static object *
1943forms_set_event_call_back(dummy, args)
1944 object *dummy;
1945 object *args;
1946{
1947 my_event_callback = args;
1948 XINCREF(args);
1949 INCREF(None);
1950 return None;
1951}
1952
1953static object *
1954forms_do_or_check_forms(dummy, args, func)
1955 object *dummy;
1956 object *args;
1957 FL_OBJECT *(*func)();
1958{
1959 FL_OBJECT *generic;
1960 genericobject *g;
1961 object *arg, *res;
1962
1963 if (!getnoarg(args))
1964 return NULL;
1965
1966 for (;;) {
1967 generic = (*func)();
1968 if (generic == NULL) {
1969 INCREF(None);
1970 return None;
1971 }
1972 if (generic == FL_EVENT) {
1973 int dev;
1974 short val;
1975 if (my_event_callback == NULL)
1976 return newintobject(-1);
1977 dev = fl_qread(&val);
1978 arg = newtupleobject(2);
1979 if (arg == NULL)
1980 return NULL;
1981 settupleitem(arg, 0, newintobject((long)dev));
1982 settupleitem(arg, 1, newintobject((long)val));
1983 res = call_object(my_event_callback, arg);
1984 XDECREF(res);
1985 DECREF(arg);
1986 if (res == NULL)
1987 return NULL; /* Callback raised exception */
1988 continue;
1989 }
1990 g = findgeneric(generic);
1991 if (g == NULL) {
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00001992 /* XXX What kind of weird object is this? */
1993 /* XXX Maybe caused by a bug here */
1994 fprintf(stderr, "weird object: class %d, label '%s'\n",
1995 generic->objclass, generic->label);
1996 continue; /* Ignore it */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001997 }
1998 if (g->ob_callback == NULL) {
1999 INCREF(g);
2000 return ((object *) g);
2001 }
2002 arg = newtupleobject(2);
2003 INCREF(g);
Guido van Rossumabe58351991-08-08 12:34:44 +00002004 settupleitem(arg, 0, (object *)g);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002005 INCREF(g->ob_callback_arg);
2006 settupleitem(arg, 1, g->ob_callback_arg);
2007 res = call_object(g->ob_callback, arg);
2008 XDECREF(res);
2009 DECREF(arg);
2010 if (res == NULL)
2011 return NULL; /* Callback raised exception */
2012 }
2013}
2014
2015static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002016forms_do_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002017 object *dummy;
2018 object *args;
2019{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002020 return forms_do_or_check_forms(dummy, args, fl_do_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002021}
2022
2023static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002024forms_check_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002025 object *dummy;
2026 object *args;
2027{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002028 return forms_do_or_check_forms(dummy, args, fl_check_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002029}
2030
Guido van Rossum03747111991-08-08 12:10:01 +00002031#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002032static object *
2033fl_call(func, args)
2034 object *args;
2035 void (*func)();
2036{
2037 if (!getnoarg(args))
2038 return NULL;
2039 (*func)();
2040 INCREF(None);
2041 return None;
2042}
Guido van Rossum03747111991-08-08 12:10:01 +00002043#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002044
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002045#ifndef FL_V15
2046static object *
2047forms_set_graphics_mode(dummy, args)
2048 object *dummy;
2049 object *args;
2050{
2051 int rgbmode, doublebuf;
2052
2053 if (!getintintarg(args, &rgbmode, &doublebuf))
2054 return NULL;
2055 fl_set_graphics_mode(rgbmode,doublebuf);
2056 INCREF(None);
2057 return None;
2058}
2059
2060static object *
2061forms_get_rgbmode(dummy, args)
2062 object *dummy;
2063 object *args;
2064{
2065 extern fl_rgbmode;
2066
2067 if (args != NULL) {
2068 err_badarg();
2069 return NULL;
2070 }
2071 return newintobject(fl_rgbmode);
2072}
2073#endif /* !FL_V15 */
2074
2075
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002076static object *
2077forms_qdevice(self, args)
2078 object *self;
2079 object *args;
2080{
2081 short arg1 ;
2082 if (!getishortarg(args, 1, 0, &arg1))
2083 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002084 fl_qdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002085 INCREF(None);
2086 return None;
2087}
2088
2089static object *
2090forms_unqdevice(self, args)
2091 object *self;
2092 object *args;
2093{
2094 short arg1 ;
2095 if (!getishortarg(args, 1, 0, &arg1))
2096 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002097 fl_unqdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002098 INCREF(None);
2099 return None;
2100}
2101
2102static object *
2103forms_isqueued(self, args)
2104 object *self;
2105 object *args;
2106{
Guido van Rossum03747111991-08-08 12:10:01 +00002107 long retval;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002108 short arg1 ;
2109 if (!getishortarg(args, 1, 0, &arg1))
2110 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002111 retval = fl_isqueued(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002112
Guido van Rossum03747111991-08-08 12:10:01 +00002113 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002114}
2115
2116static object *
2117forms_qtest(self, args)
2118 object *self;
2119 object *args;
2120{
2121 long retval;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002122 retval = fl_qtest();
Guido van Rossum03747111991-08-08 12:10:01 +00002123 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002124}
2125
2126
2127static object *
2128forms_qread(self, args)
2129 object *self;
2130 object *args;
2131{
2132 long retval;
2133 short arg1 ;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002134 retval = fl_qread(&arg1);
2135 { object *v = newtupleobject(2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002136 if (v == NULL) return NULL;
2137 settupleitem(v, 0, newintobject(retval));
2138 settupleitem(v, 1, newintobject((long)arg1));
2139 return v;
2140 }
2141}
2142
2143static object *
2144forms_qreset(self, args)
2145 object *self;
2146 object *args;
2147{
2148 if (!getnoarg(args)) return NULL;
2149
Guido van Rossum03747111991-08-08 12:10:01 +00002150 fl_qreset();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002151 INCREF(None);
2152 return None;
2153}
2154
2155static object *
2156forms_qenter(self, args)
2157 object *self;
2158 object *args;
2159{
2160 short arg1 ;
2161 short arg2 ;
2162 if (!getishortarg(args, 2, 0, &arg1))
2163 return NULL;
2164 if (!getishortarg(args, 2, 1, &arg2))
2165 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002166 fl_qenter(arg1, arg2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002167 INCREF(None);
2168 return None;
2169}
2170
2171static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002172forms_color(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002173 object *self;
2174 object *args;
2175{
2176 int arg;
2177
2178 if (!getintarg(args, &arg)) return NULL;
2179
2180 fl_color((short) arg);
2181
2182 INCREF(None);
2183 return None;
2184}
2185
2186static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002187forms_mapcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002188 object *self;
2189 object *args;
2190{
2191 int arg0, arg1, arg2, arg3;
2192
Guido van Rossumfc58e581992-01-27 16:45:55 +00002193 if (!getargs(args, "(iiii)", &arg0, &arg1, &arg2, &arg3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002194 return NULL;
2195
2196 fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);
2197
2198 INCREF(None);
2199 return None;
2200}
2201
2202static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002203forms_getmcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002204 object *self;
2205 object *args;
2206{
Guido van Rossum03747111991-08-08 12:10:01 +00002207 int arg;
2208 short r, g, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002209 object *v;
2210
2211 if (!getintarg(args, &arg)) return NULL;
2212
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002213 fl_getmcolor(arg, &r, &g, &b);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002214
2215 v = newtupleobject(3);
2216
2217 if (v == NULL) return NULL;
2218
Guido van Rossum03747111991-08-08 12:10:01 +00002219 settupleitem(v, 0, newintobject((long)r));
2220 settupleitem(v, 1, newintobject((long)g));
2221 settupleitem(v, 2, newintobject((long)b));
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002222
2223 return v;
2224}
2225
2226static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002227forms_get_mouse(self, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00002228 object *self;
2229 object *args;
2230{
2231 float x, y ;
2232 object *v;
2233
2234 if (!getnoarg(args)) return NULL;
2235
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002236 fl_get_mouse(&x, &y);
Guido van Rossum75cc8981991-08-08 12:07:45 +00002237
2238 v = newtupleobject(2);
2239
2240 if (v == NULL) return NULL;
2241
2242 settupleitem(v, 0, newfloatobject(x));
2243 settupleitem(v, 1, newfloatobject(y));
2244
2245 return v;
2246}
2247
2248static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002249forms_tie(self, args)
2250 object *self;
2251 object *args;
2252{
2253 short arg1 ;
2254 short arg2 ;
2255 short arg3 ;
2256 if (!getishortarg(args, 3, 0, &arg1))
2257 return NULL;
2258 if (!getishortarg(args, 3, 1, &arg2))
2259 return NULL;
2260 if (!getishortarg(args, 3, 2, &arg3))
2261 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002262 fl_tie(arg1, arg2, arg3);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002263 INCREF(None);
2264 return None;
2265}
2266
Guido van Rossum03747111991-08-08 12:10:01 +00002267static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002268forms_show_message(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002269 object *f;
2270 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002271{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002272 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002273
Guido van Rossumfc58e581992-01-27 16:45:55 +00002274 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002275
Guido van Rossumfc58e581992-01-27 16:45:55 +00002276 fl_show_message(a, b, c);
Guido van Rossum03747111991-08-08 12:10:01 +00002277
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002278 INCREF(None);
Guido van Rossum03747111991-08-08 12:10:01 +00002279 return None;
2280}
2281
2282static object *
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002283forms_show_choice(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002284 object *f;
2285 object *args;
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002286{
2287 char *m1, *m2, *m3, *b1, *b2, *b3;
2288 int nb;
2289 char *format;
2290
2291 if (args == NULL || !is_tupleobject(args)) {
2292 err_badarg();
2293 return NULL;
2294 }
2295 nb = gettuplesize(args) - 3;
2296 if (nb <= 0) {
2297 err_setstr(TypeError, "need at least one button label");
2298 return NULL;
2299 }
2300 if (is_intobject(gettupleitem(args, 3))) {
2301 err_setstr(TypeError,
2302 "'number-of-buttons' argument not needed");
2303 return NULL;
2304 }
2305 switch (nb) {
2306 case 1: format = "(ssss)"; break;
2307 case 2: format = "(sssss)"; break;
2308 case 3: format = "(ssssss)"; break;
2309 default:
2310 err_setstr(TypeError, "too many button labels");
2311 return NULL;
2312 }
2313
2314 if (!getargs(args, format, &m1, &m2, &m3, &b1, &b2, &b3))
2315 return NULL;
2316
2317 return newintobject(fl_show_choice(m1, m2, m3, nb, b1, b2, b3));
2318}
2319
2320static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002321forms_show_question(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002322 object *f;
2323 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002324{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002325 int ret;
2326 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002327
Guido van Rossumfc58e581992-01-27 16:45:55 +00002328 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002329
Guido van Rossumfc58e581992-01-27 16:45:55 +00002330 ret = fl_show_question(a, b, c);
Guido van Rossum03747111991-08-08 12:10:01 +00002331
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002332 return newintobject((long) ret);
Guido van Rossum03747111991-08-08 12:10:01 +00002333}
2334
2335static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002336forms_show_input(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002337 object *f;
2338 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002339{
2340 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002341 char *a, *b;
Guido van Rossum03747111991-08-08 12:10:01 +00002342
2343 if (!getstrstrarg(args, &a, &b)) return NULL;
2344
Guido van Rossumfc58e581992-01-27 16:45:55 +00002345 str = fl_show_input(a, b);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002346
2347 if (str == NULL) {
2348 INCREF(None);
2349 return None;
2350 }
2351 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002352}
2353
2354static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002355forms_file_selector(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002356 object *f;
2357 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002358{
2359 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002360 char *a, *b, *c, *d;
Guido van Rossum03747111991-08-08 12:10:01 +00002361
Guido van Rossumfc58e581992-01-27 16:45:55 +00002362 if (!getargs(args, "(ssss)", &a, &b, &c, &d)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002363
Guido van Rossumfc58e581992-01-27 16:45:55 +00002364 str = fl_show_file_selector(a, b, c, d);
Guido van Rossum03747111991-08-08 12:10:01 +00002365
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002366 if (str == NULL) {
2367 INCREF(None);
2368 return None;
2369 }
2370 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002371}
2372
2373
2374static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002375forms_file_selector_func(args, func)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002376 object *args;
2377 char *(*func)();
Guido van Rossum03747111991-08-08 12:10:01 +00002378{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002379 char *str;
Guido van Rossum03747111991-08-08 12:10:01 +00002380
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002381 str = (*func) ();
2382
2383 if (str == NULL) {
2384 INCREF(None);
2385 return None;
2386 }
2387 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002388}
2389
2390static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002391forms_get_directory(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002392 object *f;
2393 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002394{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002395 return forms_file_selector_func(args, fl_get_directory);
Guido van Rossum03747111991-08-08 12:10:01 +00002396}
2397
2398static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002399forms_get_pattern(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002400 object *f;
2401 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002402{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002403 return forms_file_selector_func(args, fl_get_pattern);
Guido van Rossum03747111991-08-08 12:10:01 +00002404}
2405
2406static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002407forms_get_filename(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002408 object *f;
2409 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002410{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002411 return forms_file_selector_func(args, fl_get_filename);
Guido van Rossum03747111991-08-08 12:10:01 +00002412}
2413
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002414static struct methodlist forms_methods[] = {
2415/* adm */
2416 {"make_form", forms_make_form},
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002417 {"activate_all_forms", forms_activate_all_forms},
2418 {"deactivate_all_forms",forms_deactivate_all_forms},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002419/* gl support wrappers */
2420 {"qdevice", forms_qdevice},
2421 {"unqdevice", forms_unqdevice},
2422 {"isqueued", forms_isqueued},
2423 {"qtest", forms_qtest},
2424 {"qread", forms_qread},
2425/* {"blkqread", forms_blkqread}, */
2426 {"qreset", forms_qreset},
2427 {"qenter", forms_qenter},
Guido van Rossum03747111991-08-08 12:10:01 +00002428 {"get_mouse", forms_get_mouse},
2429 {"tie", forms_tie},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002430/* {"new_events", forms_new_events}, */
2431 {"color", forms_color},
2432 {"mapcolor", forms_mapcolor},
2433 {"getmcolor", forms_getmcolor},
2434/* interaction */
2435 {"do_forms", forms_do_forms},
2436 {"check_forms", forms_check_forms},
2437 {"set_event_call_back", forms_set_event_call_back},
2438/* goodies */
Guido van Rossum03747111991-08-08 12:10:01 +00002439 {"show_message", forms_show_message},
2440 {"show_question", forms_show_question},
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002441 {"show_choice", forms_show_choice},
2442 {"show_input", forms_show_input},
2443 {"show_file_selector", forms_file_selector},
2444 {"file_selector", forms_file_selector}, /* BW compat */
Guido van Rossum03747111991-08-08 12:10:01 +00002445 {"get_directory", forms_get_directory},
2446 {"get_pattern", forms_get_pattern},
2447 {"get_filename", forms_get_filename},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002448#ifndef FL_V15
2449 {"set_graphics_mode", forms_set_graphics_mode},
2450 {"get_rgbmode", forms_get_rgbmode},
2451#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002452 {NULL, NULL} /* sentinel */
2453};
2454
2455void
2456initfl()
2457{
2458 initmodule("fl", forms_methods);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002459 foreground();
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002460#ifndef FL_V15
2461 fl_init();
2462#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002463}