blob: 3d424d1fe6681b6ebc920e9691657d4dab961a54 [file] [log] [blame]
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001/**********************************************************
Guido van Rossume5372401993-03-16 12:15:04 +00002Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3Amsterdam, The Netherlands.
Guido van Rossumc7df79e1991-08-07 11:32:58 +00004
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
Jack Jansen743db361992-08-13 14:13:11 +000032/* A half-hearted attempt has been made to allow programs using this
33 * module to exploit parallelism (through the threads module). No provisions
34 * have been made for multiple threads to use this module at the same time,
35 * though. So, a program with a forms thread and a non-forms thread will work
36 * fine but a program with two threads using forms will probably crash (unless
37 * the program takes precaution to ensure that only one thread can be in
38 * this module at any time). This will have to be fixed some time.
39 * (A fix will probably also have to synchronise with the gl module).
40 */
41
Guido van Rossumc7df79e1991-08-07 11:32:58 +000042#include "forms.h"
43
44#include "allobjects.h"
45#include "import.h"
46#include "modsupport.h"
47#include "structmember.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000048#include "ceval.h"
Guido van Rossumc7df79e1991-08-07 11:32:58 +000049
50/* Generic Forms Objects */
51
52typedef struct {
53 OB_HEAD
54 FL_OBJECT *ob_generic;
55 struct methodlist *ob_methods;
56 object *ob_callback;
57 object *ob_callback_arg;
58} genericobject;
59
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000060extern typeobject GenericObjecttype; /* Forward */
61
62#define is_genericobject(g) ((g)->ob_type == &GenericObjecttype)
63
64/* List of all objects (XXX this should be a hash table on address...) */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000065
66static object *allgenerics = NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000067static int nfreeslots = 0;
68
69/* Add an object to the list of known objects */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000070
71static void
72knowgeneric(g)
73 genericobject *g;
74{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000075 int i, n;
76 /* Create the list if it doesn't already exist */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000077 if (allgenerics == NULL) {
78 allgenerics = newlistobject(0);
79 if (allgenerics == NULL) {
80 err_clear();
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000081 return; /* Too bad, live without allgenerics... */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000082 }
83 }
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000084 if (nfreeslots > 0) {
85 /* Search the list for reusable slots (NULL items) */
86 /* XXX This can be made faster! */
87 n = getlistsize(allgenerics);
88 for (i = 0; i < n; i++) {
89 if (getlistitem(allgenerics, i) == NULL) {
90 INCREF(g);
91 setlistitem(allgenerics, i, (object *)g);
92 nfreeslots--;
93 return;
94 }
95 }
96 /* Strange... no free slots found... */
97 nfreeslots = 0;
98 }
99 /* No free entries, append new item to the end */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000100 addlistitem(allgenerics, (object *)g);
101}
102
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000103/* Find an object in the list of known objects */
104
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000105static genericobject *
106findgeneric(generic)
107 FL_OBJECT *generic;
108{
109 int i, n;
110 genericobject *g;
111
112 if (allgenerics == NULL)
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000113 return NULL; /* No objects known yet */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000114 n = getlistsize(allgenerics);
115 for (i = 0; i < n; i++) {
116 g = (genericobject *)getlistitem(allgenerics, i);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000117 if (g != NULL && g->ob_generic == generic)
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000118 return g;
119 }
120 return NULL; /* Unknown object */
121}
122
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000123/* Remove an object from the list of known objects */
124
125static void
126forgetgeneric(g)
127 genericobject *g;
128{
129 int i, n;
130
131 XDECREF(g->ob_callback);
132 g->ob_callback = NULL;
133 XDECREF(g->ob_callback_arg);
134 g->ob_callback_arg = NULL;
135 if (allgenerics == NULL)
136 return; /* No objects known yet */
137 n = getlistsize(allgenerics);
138 for (i = 0; i < n; i++) {
139 if (g == (genericobject *)getlistitem(allgenerics, i)) {
140 setlistitem(allgenerics, i, (object *)NULL);
141 nfreeslots++;
142 break;
143 }
144 }
145}
146
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000147/* Called when a form is about to be freed --
148 remove all the objects that we know about from it. */
149
150static void
151releaseobjects(form)
152 FL_FORM *form;
153{
154 int i, n;
155 genericobject *g;
156
157 if (allgenerics == NULL)
158 return; /* No objects known yet */
159 n = getlistsize(allgenerics);
160 for (i = 0; i < n; i++) {
161 g = (genericobject *)getlistitem(allgenerics, i);
162 if (g != NULL && g->ob_generic->form == form) {
163 fl_delete_object(g->ob_generic);
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000164 /* The object is now unreachable for
165 do_forms and check_forms, so
166 delete it from the list of known objects */
167 XDECREF(g->ob_callback);
168 g->ob_callback = NULL;
169 XDECREF(g->ob_callback_arg);
170 g->ob_callback_arg = NULL;
171 setlistitem(allgenerics, i, (object *)NULL);
172 nfreeslots++;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000173 }
174 }
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000175}
176
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000177
178/* Methods of generic objects */
179
180static object *
181generic_set_call_back(g, args)
182 genericobject *g;
183 object *args;
184{
185 if (args == NULL) {
186 XDECREF(g->ob_callback);
187 XDECREF(g->ob_callback_arg);
188 g->ob_callback = NULL;
189 g->ob_callback_arg = NULL;
190 }
191 else {
192 if (!is_tupleobject(args) || gettuplesize(args) != 2) {
193 err_badarg();
194 return NULL;
195 }
196 XDECREF(g->ob_callback);
197 XDECREF(g->ob_callback_arg);
198 g->ob_callback = gettupleitem(args, 0);
199 INCREF(g->ob_callback);
200 g->ob_callback_arg = gettupleitem(args, 1);
201 INCREF(g->ob_callback_arg);
202 }
203 INCREF(None);
204 return None;
205}
206
207static object *
208generic_call(g, args, func)
209 genericobject *g;
210 object *args;
211 void (*func)(FL_OBJECT *);
212{
213 if (!getnoarg(args))
214 return NULL;
215 (*func)(g->ob_generic);
216 INCREF(None);
217 return None;
218}
219
220static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000221generic_delete_object(g, args)
222 genericobject *g;
223 object *args;
224{
225 object *res;
226 res = generic_call(g, args, fl_delete_object);
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000227 if (res != NULL)
228 forgetgeneric(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000229 return res;
230}
231
232static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000233generic_show_object(g, args)
234 genericobject *g;
235 object *args;
236{
237 return generic_call(g, args, fl_show_object);
238}
239
240static object *
241generic_hide_object(g, args)
242 genericobject *g;
243 object *args;
244{
245 return generic_call(g, args, fl_hide_object);
246}
247
248static object *
249generic_redraw_object(g, args)
250 genericobject *g;
251 object *args;
252{
253 return generic_call(g, args, fl_redraw_object);
254}
255
256static object *
257generic_freeze_object(g, args)
258 genericobject *g;
259 object *args;
260{
261 return generic_call(g, args, fl_freeze_object);
262}
263
264static object *
265generic_unfreeze_object(g, args)
266 genericobject *g;
267 object *args;
268{
269 return generic_call(g, args, fl_unfreeze_object);
270}
271
272static struct methodlist generic_methods[] = {
273 {"set_call_back", generic_set_call_back},
Guido van Rossum32db5e31991-11-12 15:43:18 +0000274 {"delete_object", generic_delete_object},
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000275 {"show_object", generic_show_object},
276 {"hide_object", generic_hide_object},
277 {"redraw_object", generic_redraw_object},
278 {"freeze_object", generic_freeze_object},
279 {"unfreeze_object", generic_unfreeze_object},
280#if 0
281 {"handle_object", generic_handle_object},
282 {"handle_object_direct",generic_handle_object_direct},
283#endif
Guido van Rossum03747111991-08-08 12:10:01 +0000284 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000285};
286
287static void
288generic_dealloc(g)
289 genericobject *g;
290{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000291 fl_free_object(g->ob_generic);
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000292 XDECREF(g->ob_callback);
293 XDECREF(g->ob_callback_arg);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000294 DEL(g);
295}
296
297#define OFF(x) offsetof(FL_OBJECT, x)
298
299static struct memberlist generic_memberlist[] = {
300 {"objclass", T_INT, OFF(objclass), RO},
301 {"type", T_INT, OFF(type), RO},
302 {"boxtype", T_INT, OFF(boxtype)},
303 {"x", T_FLOAT, OFF(x)},
304 {"y", T_FLOAT, OFF(y)},
305 {"w", T_FLOAT, OFF(w)},
306 {"h", T_FLOAT, OFF(h)},
307 {"col1", T_INT, OFF(col1)},
308 {"col2", T_INT, OFF(col2)},
309 {"align", T_INT, OFF(align)},
310 {"lcol", T_INT, OFF(lcol)},
311 {"lsize", T_FLOAT, OFF(lsize)},
312 /* "label" is treated specially! */
313 {"lstyle", T_INT, OFF(lstyle)},
314 {"pushed", T_INT, OFF(pushed), RO},
315 {"focus", T_INT, OFF(focus), RO},
316 {"belowmouse", T_INT, OFF(belowmouse),RO},
317 {"frozen", T_INT, OFF(frozen), RO},
Guido van Rossum7066dd71992-09-17 17:54:56 +0000318 {"active", T_INT, OFF(active)},
319 {"input", T_INT, OFF(input)},
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000320 {"visible", T_INT, OFF(visible), RO},
Guido van Rossum7066dd71992-09-17 17:54:56 +0000321 {"radio", T_INT, OFF(radio)},
322 {"automatic", T_INT, OFF(automatic)},
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000323 {NULL} /* Sentinel */
324};
325
Guido van Rossumd97f0481991-11-19 20:26:28 +0000326#undef OFF
327
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000328static object *
329generic_getattr(g, name)
330 genericobject *g;
331 char *name;
332{
333 object *meth;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000334
335 /* XXX Ought to special-case name "__methods__" */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000336 if (g-> ob_methods) {
Guido van Rossum03747111991-08-08 12:10:01 +0000337 meth = findmethod(g->ob_methods, (object *)g, name);
338 if (meth != NULL) return meth;
339 err_clear();
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000340 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000341
342 meth = findmethod(generic_methods, (object *)g, name);
343 if (meth != NULL)
344 return meth;
345 err_clear();
346
347 /* "label" is an exception, getmember only works for char pointers,
348 not for char arrays */
349 if (strcmp(name, "label") == 0)
350 return newstringobject(g->ob_generic->label);
351
352 return getmember((char *)g->ob_generic, generic_memberlist, name);
353}
354
355static int
356generic_setattr(g, name, v)
357 genericobject *g;
358 char *name;
359 object *v;
360{
361 int ret;
362
363 if (v == NULL) {
364 err_setstr(TypeError, "can't delete forms object attributes");
Guido van Rossum3dd8c981992-06-03 17:07:49 +0000365 return -1;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000366 }
367
368 /* "label" is an exception: setmember doesn't set strings;
369 and FORMS wants you to call a function to set the label */
370 if (strcmp(name, "label") == 0) {
371 if (!is_stringobject(v)) {
372 err_setstr(TypeError, "label attr must be string");
Guido van Rossum3dd8c981992-06-03 17:07:49 +0000373 return -1;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000374 }
375 fl_set_object_label(g->ob_generic, getstringvalue(v));
376 return 0;
377 }
378
379 ret = setmember((char *)g->ob_generic, generic_memberlist, name, v);
380
381 /* Rather than calling all the various set_object_* functions,
382 we call fl_redraw_object here. This is sometimes redundant
383 but I doubt that's a big problem */
384 if (ret == 0)
385 fl_redraw_object(g->ob_generic);
386
387 return ret;
388}
389
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000390static object *
391generic_repr(g)
392 genericobject *g;
393{
394 char buf[100];
395 sprintf(buf, "<FORMS_object at %lx, objclass=%d>",
396 (long)g, g->ob_generic->objclass);
397 return newstringobject(buf);
398}
399
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000400typeobject GenericObjecttype = {
401 OB_HEAD_INIT(&Typetype)
402 0, /*ob_size*/
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000403 "FORMS_object", /*tp_name*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000404 sizeof(genericobject), /*tp_size*/
405 0, /*tp_itemsize*/
406 /* methods */
407 generic_dealloc, /*tp_dealloc*/
408 0, /*tp_print*/
409 generic_getattr, /*tp_getattr*/
410 generic_setattr, /*tp_setattr*/
411 0, /*tp_compare*/
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000412 generic_repr, /*tp_repr*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000413};
414
415static object *
416newgenericobject(generic, methods)
417 FL_OBJECT *generic;
418 struct methodlist *methods;
419{
420 genericobject *g;
421 g = NEWOBJ(genericobject, &GenericObjecttype);
422 if (g == NULL)
423 return NULL;
424 g-> ob_generic = generic;
425 g->ob_methods = methods;
426 g->ob_callback = NULL;
427 g->ob_callback_arg = NULL;
428 knowgeneric(g);
429 return (object *)g;
430}
431
432/**********************************************************************/
433/* Some common calling sequences */
434
435/* void func (object, float) */
436static object *
437call_forms_INf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000438 void (*func)(FL_OBJECT *, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000439 FL_OBJECT *obj;
440 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000441{
Guido van Rossum03747111991-08-08 12:10:01 +0000442 float parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000443
Guido van Rossumfc58e581992-01-27 16:45:55 +0000444 if (!getargs(args, "f", &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000445
Guido van Rossum03747111991-08-08 12:10:01 +0000446 (*func) (obj, parameter);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000447
Guido van Rossum03747111991-08-08 12:10:01 +0000448 INCREF(None);
449 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000450}
451
452/* void func (object, float) */
453static object *
454call_forms_INfINf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000455 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000456 FL_OBJECT *obj;
457 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000458{
Guido van Rossum03747111991-08-08 12:10:01 +0000459 float par1, par2;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000460
Guido van Rossumfc58e581992-01-27 16:45:55 +0000461 if (!getargs(args, "(ff)", &par1, &par2)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000462
Guido van Rossum03747111991-08-08 12:10:01 +0000463 (*func) (obj, par1, par2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000464
Guido van Rossum03747111991-08-08 12:10:01 +0000465 INCREF(None);
466 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000467}
468
469/* void func (object, int) */
470static object *
471call_forms_INi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000472 void (*func)(FL_OBJECT *, int);
Guido van Rossum03747111991-08-08 12:10:01 +0000473 FL_OBJECT *obj;
474 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000475{
Guido van Rossum03747111991-08-08 12:10:01 +0000476 int parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000477
Guido van Rossumfc58e581992-01-27 16:45:55 +0000478 if (!getintarg(args, &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000479
Guido van Rossum03747111991-08-08 12:10:01 +0000480 (*func) (obj, parameter);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000481
Guido van Rossum03747111991-08-08 12:10:01 +0000482 INCREF(None);
483 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000484}
485
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000486/* void func (object, char) */
487static object *
488call_forms_INc (func, obj, args)
489 void (*func)(FL_OBJECT *, int);
490 FL_OBJECT *obj;
491 object *args;
492{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000493 char *a;
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000494
Guido van Rossumfc58e581992-01-27 16:45:55 +0000495 if (!getstrarg(args, &a)) return NULL;
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000496
Guido van Rossumfc58e581992-01-27 16:45:55 +0000497 (*func) (obj, a[0]);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000498
499 INCREF(None);
500 return None;
501}
502
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000503/* void func (object, string) */
504static object *
505call_forms_INstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000506 void (*func)(FL_OBJECT *, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000507 FL_OBJECT *obj;
508 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000509{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000510 char *a;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000511
Guido van Rossumfc58e581992-01-27 16:45:55 +0000512 if (!getstrarg(args, &a)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000513
Guido van Rossumfc58e581992-01-27 16:45:55 +0000514 (*func) (obj, a);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000515
Guido van Rossum03747111991-08-08 12:10:01 +0000516 INCREF(None);
517 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000518}
519
520
521/* voide func (object, int, string) */
522static object *
523call_forms_INiINstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000524 void (*func)(FL_OBJECT *, int, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000525 FL_OBJECT *obj;
526 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000527{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000528 char *b;
529 int a;
Guido van Rossum03747111991-08-08 12:10:01 +0000530
Guido van Rossumfc58e581992-01-27 16:45:55 +0000531 if (!getintstrarg(args, &a, &b)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000532
Guido van Rossumfc58e581992-01-27 16:45:55 +0000533 (*func) (obj, a, b);
Guido van Rossum03747111991-08-08 12:10:01 +0000534
535 INCREF(None);
536 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000537}
538
Guido van Rossum03747111991-08-08 12:10:01 +0000539#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000540/* void func (object, float) */
541static object *
542call_forms_INiINi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000543 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000544 FL_OBJECT *obj;
545 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000546{
Guido van Rossum03747111991-08-08 12:10:01 +0000547 int par1, par2;
548
Guido van Rossumfc58e581992-01-27 16:45:55 +0000549 if (!getintintarg(args, &par1, &par2)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000550
551 (*func) (obj, par1, par2);
552
553 INCREF(None);
554 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000555}
Guido van Rossum03747111991-08-08 12:10:01 +0000556#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000557
558/* int func (object) */
559static object *
560call_forms_Ri (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000561 int (*func)(FL_OBJECT *);
562 FL_OBJECT *obj;
563 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000564{
Guido van Rossum03747111991-08-08 12:10:01 +0000565 int retval;
566
567 if (!getnoarg(args)) return NULL;
568
569 retval = (*func) (obj);
570
571 return newintobject ((long) retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000572}
573
574/* char * func (object) */
575static object *
576call_forms_Rstr (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000577 char * (*func)(FL_OBJECT *);
578 FL_OBJECT *obj;
579 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000580{
Guido van Rossum03747111991-08-08 12:10:01 +0000581 char *str;
582
Guido van Rossumfc58e581992-01-27 16:45:55 +0000583 if (!getnoarg(args)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000584
585 str = (*func) (obj);
586
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000587 if (str == NULL) {
588 INCREF(None);
589 return None;
590 }
Guido van Rossum03747111991-08-08 12:10:01 +0000591 return newstringobject (str);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000592}
593
594/* int func (object) */
595static object *
596call_forms_Rf (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000597 float (*func)(FL_OBJECT *);
598 FL_OBJECT *obj;
599 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000600{
Guido van Rossum03747111991-08-08 12:10:01 +0000601 float retval;
602
603 if (!getnoarg(args)) return NULL;
604
605 retval = (*func) (obj);
606
607 return newfloatobject (retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000608}
609
610static object *
611call_forms_OUTfOUTf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000612 void (*func)(FL_OBJECT *, float *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000613 FL_OBJECT *obj;
614 object *args;
615{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000616 float f1, f2;
Guido van Rossum03747111991-08-08 12:10:01 +0000617
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000618 if (!getnoarg(args)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000619
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000620 (*func) (obj, &f1, &f2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000621
Guido van Rossume5372401993-03-16 12:15:04 +0000622 return mkvalue("(ff)", f1, f2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000623}
624
Guido van Rossum03747111991-08-08 12:10:01 +0000625#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000626static object *
627call_forms_OUTf (func, obj, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000628 void (*func)(FL_OBJECT *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000629 FL_OBJECT *obj;
630 object *args;
631{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000632 float f;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000633
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000634 if (!getnoarg(args)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000635
636 (*func) (obj, &f);
637
638 return newfloatobject (f);
639}
Guido van Rossum03747111991-08-08 12:10:01 +0000640#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000641
642/**********************************************************************/
643/* Class : browser */
644
645static object *
646set_browser_topline(g, args)
647 genericobject *g;
648 object *args;
649{
Guido van Rossum03747111991-08-08 12:10:01 +0000650 return call_forms_INi (fl_set_browser_topline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000651}
652
653static object *
654clear_browser(g, args)
655 genericobject *g;
656 object *args;
657{
Guido van Rossum03747111991-08-08 12:10:01 +0000658 return generic_call (g, args, fl_clear_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000659}
660
661static object *
662add_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000663 genericobject *g;
664 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000665{
Guido van Rossum03747111991-08-08 12:10:01 +0000666 return call_forms_INstr (fl_add_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000667}
668
669static object *
670addto_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000671 genericobject *g;
672 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000673{
Guido van Rossum03747111991-08-08 12:10:01 +0000674 return call_forms_INstr (fl_addto_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000675}
676
677static object *
678insert_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000679 genericobject *g;
680 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000681{
Guido van Rossum03747111991-08-08 12:10:01 +0000682 return call_forms_INiINstr (fl_insert_browser_line,
683 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000684}
685
686static object *
687delete_browser_line (g, args)
688 genericobject *g;
689 object *args;
690{
Guido van Rossum03747111991-08-08 12:10:01 +0000691 return call_forms_INi (fl_delete_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000692}
693
694static object *
695replace_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000696 genericobject *g;
697 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000698{
Guido van Rossum03747111991-08-08 12:10:01 +0000699 return call_forms_INiINstr (fl_replace_browser_line,
700 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000701}
702
703static object *
704get_browser_line(g, args)
705 genericobject *g;
706 object *args;
707{
708 int i;
709 char *str;
710
711 if (!getintarg(args, &i))
712 return NULL;
713
714 str = fl_get_browser_line (g->ob_generic, i);
715
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000716 if (str == NULL) {
717 INCREF(None);
718 return None;
719 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000720 return newstringobject (str);
721}
722
723static object *
724load_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000725 genericobject *g;
726 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000727{
Guido van Rossumabe58351991-08-08 12:34:44 +0000728 /* XXX strictly speaking this is wrong since fl_load_browser
729 XXX returns int, not void */
Guido van Rossum03747111991-08-08 12:10:01 +0000730 return call_forms_INstr (fl_load_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000731}
732
733static object *
734get_browser_maxline(g, args)
735 genericobject *g;
736 object *args;
737{
Guido van Rossum03747111991-08-08 12:10:01 +0000738 return call_forms_Ri (fl_get_browser_maxline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000739}
740
741static object *
742select_browser_line (g, args)
743 genericobject *g;
744 object *args;
745{
Guido van Rossum03747111991-08-08 12:10:01 +0000746 return call_forms_INi (fl_select_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000747}
748
749static object *
750deselect_browser_line (g, args)
751 genericobject *g;
752 object *args;
753{
Guido van Rossum03747111991-08-08 12:10:01 +0000754 return call_forms_INi (fl_deselect_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000755}
756
757static object *
758deselect_browser (g, args)
759 genericobject *g;
760 object *args;
761{
Guido van Rossum03747111991-08-08 12:10:01 +0000762 return generic_call (g, args, fl_deselect_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000763}
764
765static object *
766isselected_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000767 genericobject *g;
768 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000769{
770 int i, j;
Guido van Rossum03747111991-08-08 12:10:01 +0000771
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000772 if (!getintarg(args, &i))
773 return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000774
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000775 j = fl_isselected_browser_line (g->ob_generic, i);
Guido van Rossum03747111991-08-08 12:10:01 +0000776
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000777 return newintobject (j);
778}
779
780static object *
781get_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000782 genericobject *g;
783 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000784{
Guido van Rossum03747111991-08-08 12:10:01 +0000785 return call_forms_Ri (fl_get_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000786}
787
788static object *
789set_browser_fontsize (g, args)
790 genericobject *g;
791 object *args;
792{
Guido van Rossum03747111991-08-08 12:10:01 +0000793 return call_forms_INf (fl_set_browser_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000794}
795
796static object *
797set_browser_fontstyle (g, args)
798 genericobject *g;
799 object *args;
800{
Guido van Rossum03747111991-08-08 12:10:01 +0000801 return call_forms_INi (fl_set_browser_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000802}
803
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000804static object *
805set_browser_specialkey (g, args)
806 genericobject *g;
807 object *args;
808{
809 return call_forms_INc(fl_set_browser_specialkey, g-> ob_generic, args);
810}
811
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000812static struct methodlist browser_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000813 {"set_browser_topline", set_browser_topline},
814 {"clear_browser", clear_browser},
815 {"add_browser_line", add_browser_line},
816 {"addto_browser", addto_browser},
817 {"insert_browser_line", insert_browser_line},
818 {"delete_browser_line", delete_browser_line},
819 {"replace_browser_line", replace_browser_line},
820 {"get_browser_line", get_browser_line},
821 {"load_browser", load_browser},
822 {"get_browser_maxline", get_browser_maxline},
823 {"select_browser_line", select_browser_line},
824 {"deselect_browser_line", deselect_browser_line},
825 {"deselect_browser", deselect_browser},
826 {"isselected_browser_line", isselected_browser_line},
827 {"get_browser", get_browser},
828 {"set_browser_fontsize", set_browser_fontsize},
829 {"set_browser_fontstyle", set_browser_fontstyle},
830 {"set_browser_specialkey", set_browser_specialkey},
831 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000832};
833
834/* Class: button */
835
836static object *
837set_button(g, args)
838 genericobject *g;
839 object *args;
840{
Guido van Rossum03747111991-08-08 12:10:01 +0000841 return call_forms_INi (fl_set_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000842}
843
844static object *
845get_button(g, args)
846 genericobject *g;
847 object *args;
848{
Guido van Rossum03747111991-08-08 12:10:01 +0000849 return call_forms_Ri (fl_get_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000850}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000851static object *
852set_button_shortcut(g, args)
853 genericobject *g;
854 object *args;
855{
856 return call_forms_INstr (fl_set_button_shortcut, g-> ob_generic, args);
857}
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000858
859static struct methodlist button_methods[] = {
860 {"set_button", set_button},
861 {"get_button", get_button},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000862#ifndef FL_V15
863 {"set_button_shortcut", set_button_shortcut},
864#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000865 {NULL, NULL} /* sentinel */
866};
867
868/* Class: choice */
869
870static object *
871set_choice(g, args)
872 genericobject *g;
873 object *args;
874{
Guido van Rossum03747111991-08-08 12:10:01 +0000875 return call_forms_INi (fl_set_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000876}
877
878static object *
879get_choice(g, args)
880 genericobject *g;
881 object *args;
882{
Guido van Rossum03747111991-08-08 12:10:01 +0000883 return call_forms_Ri (fl_get_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000884}
885
886static object *
887clear_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000888 genericobject *g;
889 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000890{
Guido van Rossum03747111991-08-08 12:10:01 +0000891 return generic_call (g, args, fl_clear_choice);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000892}
893
894static object *
895addto_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000896 genericobject *g;
897 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000898{
Guido van Rossum03747111991-08-08 12:10:01 +0000899 return call_forms_INstr (fl_addto_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000900}
901
902static object *
903replace_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000904 genericobject *g;
905 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000906{
Guido van Rossum03747111991-08-08 12:10:01 +0000907 return call_forms_INiINstr (fl_replace_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000908}
909
910static object *
911delete_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000912 genericobject *g;
913 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000914{
Guido van Rossum03747111991-08-08 12:10:01 +0000915 return call_forms_INi (fl_delete_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000916}
917
918static object *
919get_choice_text (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000920 genericobject *g;
921 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000922{
Guido van Rossum03747111991-08-08 12:10:01 +0000923 return call_forms_Rstr (fl_get_choice_text, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000924}
925
926static object *
927set_choice_fontsize (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000928 genericobject *g;
929 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000930{
Guido van Rossum03747111991-08-08 12:10:01 +0000931 return call_forms_INf (fl_set_choice_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000932}
933
934static object *
935set_choice_fontstyle (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000936 genericobject *g;
937 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000938{
Guido van Rossum03747111991-08-08 12:10:01 +0000939 return call_forms_INi (fl_set_choice_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000940}
941
942static struct methodlist choice_methods[] = {
943 {"set_choice", set_choice},
944 {"get_choice", get_choice},
945 {"clear_choice", clear_choice},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000946 {"addto_choice", addto_choice},
947 {"replace_choice", replace_choice},
948 {"delete_choice", delete_choice},
949 {"get_choice_text", get_choice_text},
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000950 {"set_choice_fontsize", set_choice_fontsize},
951 {"set_choice_fontstyle",set_choice_fontstyle},
952 {NULL, NULL} /* sentinel */
953};
954
955/* Class : Clock */
956
957static object *
958get_clock(g, args)
959 genericobject *g;
960 object *args;
961{
962 int i0, i1, i2;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000963
964 if (!getnoarg(args))
965 return NULL;
966
967 fl_get_clock (g->ob_generic, &i0, &i1, &i2);
968
Guido van Rossume5372401993-03-16 12:15:04 +0000969 return mkvalue("(iii)", i0, i1, i2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000970}
971
972static struct methodlist clock_methods[] = {
973 {"get_clock", get_clock},
974 {NULL, NULL} /* sentinel */
975};
976
977/* CLass : Counters */
978
979static object *
980get_counter_value(g, args)
981 genericobject *g;
982 object *args;
983{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000984 return call_forms_Rf (fl_get_counter_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000985}
986
987static object *
988set_counter_value (g, args)
989 genericobject *g;
990 object *args;
991{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000992 return call_forms_INf (fl_set_counter_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000993}
994
995static object *
996set_counter_precision (g, args)
997 genericobject *g;
998 object *args;
999{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001000 return call_forms_INi (fl_set_counter_precision, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001001}
1002
1003static object *
1004set_counter_bounds (g, args)
1005 genericobject *g;
1006 object *args;
1007{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001008 return call_forms_INfINf (fl_set_counter_bounds, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001009}
1010
1011static object *
1012set_counter_step (g, args)
1013 genericobject *g;
1014 object *args;
1015{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001016 return call_forms_INfINf (fl_set_counter_step, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001017}
1018
1019static object *
1020set_counter_return (g, args)
1021 genericobject *g;
1022 object *args;
1023{
Guido van Rossum03747111991-08-08 12:10:01 +00001024 return call_forms_INi (fl_set_counter_return, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001025}
1026
1027static struct methodlist counter_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001028 {"set_counter_value", set_counter_value},
1029 {"get_counter_value", get_counter_value},
1030 {"set_counter_bounds", set_counter_bounds},
1031 {"set_counter_step", set_counter_step},
1032 {"set_counter_precision", set_counter_precision},
1033 {"set_counter_return", set_counter_return},
1034 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001035};
1036
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001037#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001038/* Class : Defaults */
1039
1040static object *
1041get_default(g, args)
1042 genericobject *g;
1043 object *args;
1044{
Guido van Rossum03747111991-08-08 12:10:01 +00001045 char c;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001046
Guido van Rossum03747111991-08-08 12:10:01 +00001047 if (!getnoarg(args)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001048
Guido van Rossum03747111991-08-08 12:10:01 +00001049 c = fl_get_default (g->ob_generic);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001050
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001051 return ((object *) mknewcharobject (c)); /* in cgensupport.c */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001052}
1053
1054static struct methodlist default_methods[] = {
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001055 {"get_default", get_default},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001056 {NULL, NULL} /* sentinel */
1057};
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001058#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001059
1060
1061/* Class: Dials */
1062
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001063#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001064static object *
1065set_dial (g, args)
1066 genericobject *g;
1067 object *args;
1068{
1069 float f1, f2, f3;
1070
Guido van Rossumfc58e581992-01-27 16:45:55 +00001071 if (!getargs(args, "(fff)", &f1, &f2, &f3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001072 return NULL;
1073 fl_set_dial (g->ob_generic, f1, f2, f3);
1074 INCREF(None);
1075 return None;
1076}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001077#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001078
1079static object *
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001080get_dial_value(g, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001081 genericobject *g;
1082 object *args;
1083{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001084 return call_forms_Rf (fl_get_dial_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001085}
1086
1087static object *
1088set_dial_value (g, args)
1089 genericobject *g;
1090 object *args;
1091{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001092 return call_forms_INf (fl_set_dial_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001093}
1094
1095static object *
1096set_dial_bounds (g, args)
1097 genericobject *g;
1098 object *args;
1099{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001100 return call_forms_INfINf (fl_set_dial_bounds, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001101}
1102
1103static object *
1104get_dial_bounds (g, args)
1105 genericobject *g;
1106 object *args;
1107{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001108 return call_forms_OUTfOUTf (fl_get_dial_bounds, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001109}
1110
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001111#ifndef FL_V15
1112static object *
1113set_dial_step (g, args)
1114 genericobject *g;
1115 object *args;
1116{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001117 return call_forms_INf (fl_set_dial_step, g-> ob_generic, args);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001118}
1119#endif /* !FL_V15 */
1120
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001121static struct methodlist dial_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001122#ifdef FL_V15
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001123 {"set_dial", set_dial},
1124 {"get_dial", get_dial_value},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001125#endif /* FL_V15 */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001126 {"set_dial_value", set_dial_value},
1127 {"get_dial_value", get_dial_value},
1128 {"set_dial_bounds", set_dial_bounds},
1129 {"get_dial_bounds", get_dial_bounds},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001130#ifndef FL_V15
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001131 {"set_dial_step", set_dial_step},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001132#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001133 {NULL, NULL} /* sentinel */
1134};
1135
1136/* Class : Input */
1137
1138static object *
1139set_input (g, args)
1140 genericobject *g;
1141 object *args;
1142{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001143 return call_forms_INstr (fl_set_input, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001144}
1145
1146static object *
1147get_input (g, args)
1148 genericobject *g;
1149 object *args;
1150{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001151 return call_forms_Rstr (fl_get_input, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001152}
1153
1154static object *
1155set_input_color (g, args)
1156 genericobject *g;
1157 object *args;
1158{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001159 return call_forms_INfINf (fl_set_input_color, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001160}
1161
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001162#ifndef FL_V15
1163static object *
1164set_input_return (g, args)
1165 genericobject *g;
1166 object *args;
1167{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001168 return call_forms_INi (fl_set_input_return, g-> ob_generic, args);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001169}
1170#endif /* !FL_V15 */
1171
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001172static struct methodlist input_methods[] = {
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001173 {"set_input", set_input},
1174 {"get_input", get_input},
1175 {"set_input_color", set_input_color},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001176#ifndef FL_V15
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001177 {"set_input_return", set_input_return},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001178#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001179 {NULL, NULL} /* sentinel */
1180};
1181
1182
1183/* Class : Menu */
1184
1185static object *
1186set_menu (g, args)
1187 genericobject *g;
1188 object *args;
1189{
Guido van Rossumabe58351991-08-08 12:34:44 +00001190 return call_forms_INstr (fl_set_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001191}
1192
1193static object *
1194get_menu (g, args)
1195 genericobject *g;
1196 object *args;
1197{
Guido van Rossumabe58351991-08-08 12:34:44 +00001198 /* XXX strictly speaking this is wrong since fl_get_menu
1199 XXX returns long, not int */
1200 return call_forms_Ri (fl_get_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001201}
1202
1203static object *
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001204get_menu_text (g, args)
1205 genericobject *g;
1206 object *args;
1207{
1208 return call_forms_Rstr (fl_get_menu_text, g-> ob_generic, args);
1209}
1210
1211static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001212addto_menu (g, args)
1213 genericobject *g;
1214 object *args;
1215{
Guido van Rossumabe58351991-08-08 12:34:44 +00001216 return call_forms_INstr (fl_addto_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001217}
1218
1219static struct methodlist menu_methods[] = {
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001220 {"set_menu", set_menu},
1221 {"get_menu", get_menu},
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001222 {"get_menu_text", get_menu_text},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001223 {"addto_menu", addto_menu},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001224 {NULL, NULL} /* sentinel */
1225};
1226
1227
1228/* Class: Sliders */
1229
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001230#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001231static object *
1232set_slider (g, args)
1233 genericobject *g;
1234 object *args;
1235{
1236 float f1, f2, f3;
1237
Guido van Rossumfc58e581992-01-27 16:45:55 +00001238 if (!args(args, "(fff)", &f1, &f2, &f3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001239 return NULL;
1240 fl_set_slider (g->ob_generic, f1, f2, f3);
1241 INCREF(None);
1242 return None;
1243}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001244#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001245
1246static object *
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001247get_slider_value(g, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001248 genericobject *g;
1249 object *args;
1250{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001251 return call_forms_Rf (fl_get_slider_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001252}
1253
1254static object *
1255set_slider_value (g, args)
1256 genericobject *g;
1257 object *args;
1258{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001259 return call_forms_INf (fl_set_slider_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001260}
1261
1262static object *
1263set_slider_bounds (g, args)
1264 genericobject *g;
1265 object *args;
1266{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001267 return call_forms_INfINf (fl_set_slider_bounds, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001268}
1269
1270static object *
1271get_slider_bounds (g, args)
1272 genericobject *g;
1273 object *args;
1274{
1275 return call_forms_OUTfOUTf(fl_get_slider_bounds, g-> ob_generic, args);
1276}
1277
1278static object *
1279set_slider_return (g, args)
1280 genericobject *g;
1281 object *args;
1282{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001283 return call_forms_INf (fl_set_slider_return, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001284}
1285
1286static object *
1287set_slider_size (g, args)
1288 genericobject *g;
1289 object *args;
1290{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001291 return call_forms_INf (fl_set_slider_size, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001292}
1293
1294static object *
1295set_slider_precision (g, args)
1296 genericobject *g;
1297 object *args;
1298{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001299 return call_forms_INi (fl_set_slider_precision, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001300}
1301
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001302#ifndef FL_V15
1303static object *
1304set_slider_step (g, args)
1305 genericobject *g;
1306 object *args;
1307{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001308 return call_forms_INf (fl_set_slider_step, g-> ob_generic, args);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001309}
1310#endif /* !FL_V15 */
1311
1312
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001313static struct methodlist slider_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001314#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001315 {"set_slider", set_slider},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001316 {"get_slider", get_slider_value},
1317#endif /* FL_V15 */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001318 {"set_slider_value", set_slider_value},
1319 {"get_slider_value", get_slider_value},
1320 {"set_slider_bounds", set_slider_bounds},
1321 {"get_slider_bounds", get_slider_bounds},
1322 {"set_slider_return", set_slider_return},
1323 {"set_slider_size", set_slider_size},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001324 {"set_slider_precision",set_slider_precision},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001325#ifndef FL_V15
1326 {"set_slider_step", set_slider_step},
1327#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001328 {NULL, NULL} /* sentinel */
1329};
1330
1331static object *
1332set_positioner_xvalue (g, args)
1333 genericobject *g;
1334 object *args;
1335{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001336 return call_forms_INf (fl_set_positioner_xvalue, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001337}
1338
1339static object *
1340set_positioner_xbounds (g, args)
1341 genericobject *g;
1342 object *args;
1343{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001344 return call_forms_INfINf (fl_set_positioner_xbounds,
1345 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001346}
1347
1348static object *
1349set_positioner_yvalue (g, args)
1350 genericobject *g;
1351 object *args;
1352{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001353 return call_forms_INf (fl_set_positioner_yvalue, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001354}
1355
1356static object *
1357set_positioner_ybounds (g, args)
1358 genericobject *g;
1359 object *args;
1360{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001361 return call_forms_INfINf (fl_set_positioner_ybounds,
1362 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001363}
1364
1365static object *
1366get_positioner_xvalue (g, args)
1367 genericobject *g;
1368 object *args;
1369{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001370 return call_forms_Rf (fl_get_positioner_xvalue, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001371}
1372
1373static object *
1374get_positioner_xbounds (g, args)
1375 genericobject *g;
1376 object *args;
1377{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001378 return call_forms_OUTfOUTf (fl_get_positioner_xbounds,
1379 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001380}
1381
1382static object *
1383get_positioner_yvalue (g, args)
1384 genericobject *g;
1385 object *args;
1386{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001387 return call_forms_Rf (fl_get_positioner_yvalue, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001388}
1389
1390static object *
1391get_positioner_ybounds (g, args)
1392 genericobject *g;
1393 object *args;
1394{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001395 return call_forms_OUTfOUTf (fl_get_positioner_ybounds,
1396 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001397}
1398
1399static struct methodlist positioner_methods[] = {
1400 {"set_positioner_xvalue", set_positioner_xvalue},
1401 {"set_positioner_yvalue", set_positioner_yvalue},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001402 {"set_positioner_xbounds", set_positioner_xbounds},
1403 {"set_positioner_ybounds", set_positioner_ybounds},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001404 {"get_positioner_xvalue", get_positioner_xvalue},
1405 {"get_positioner_yvalue", get_positioner_yvalue},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001406 {"get_positioner_xbounds", get_positioner_xbounds},
1407 {"get_positioner_ybounds", get_positioner_ybounds},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001408 {NULL, NULL} /* sentinel */
1409};
1410
1411/* Class timer */
1412
1413static object *
1414set_timer (g, args)
1415 genericobject *g;
1416 object *args;
1417{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001418 return call_forms_INf (fl_set_timer, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001419}
1420
1421static object *
1422get_timer (g, args)
1423 genericobject *g;
1424 object *args;
1425{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001426 return call_forms_Rf (fl_get_timer, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001427}
1428
1429static struct methodlist timer_methods[] = {
1430 {"set_timer", set_timer},
1431 {"get_timer", get_timer},
1432 {NULL, NULL} /* sentinel */
1433};
1434
1435/* Form objects */
1436
1437typedef struct {
1438 OB_HEAD
1439 FL_FORM *ob_form;
1440} formobject;
1441
1442extern typeobject Formtype; /* Forward */
1443
1444#define is_formobject(v) ((v)->ob_type == &Formtype)
1445
1446static object *
1447form_show_form(f, args)
1448 formobject *f;
1449 object *args;
1450{
1451 int place, border;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001452 char *name;
1453 if (!getargs(args, "(iis)", &place, &border, &name))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001454 return NULL;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001455 fl_show_form(f->ob_form, place, border, name);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001456 INCREF(None);
1457 return None;
1458}
1459
1460static object *
1461form_call(func, f, args)
1462 FL_FORM *f;
1463 object *args;
1464 void (*func)(FL_FORM *);
1465{
1466 if (!getnoarg(args)) return NULL;
1467
1468 (*func)(f);
1469
1470 INCREF(None);
1471 return None;
1472}
1473
1474static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001475form_call_INiINi(func, f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001476 FL_FORM *f;
1477 object *args;
1478 void (*func)(FL_FORM *, int, int);
1479{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001480 int a, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001481
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001482 if (!getintintarg(args, &a, &b)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001483
1484 (*func)(f, a, b);
1485
1486 INCREF(None);
1487 return None;
1488}
1489
1490static object *
1491form_hide_form(f, args)
1492 formobject *f;
1493 object *args;
1494{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001495 return form_call(fl_hide_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001496}
1497
1498static object *
1499form_redraw_form(f, args)
1500 formobject *f;
1501 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001502{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001503 return form_call(fl_redraw_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001504}
1505
1506static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001507form_add_object(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001508 formobject *f;
1509 object *args;
1510{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001511 genericobject *g;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001512 if (args == NULL || !is_genericobject(args)) {
1513 err_badarg();
1514 return NULL;
1515 }
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001516 g = (genericobject *)args;
1517 if (findgeneric(g->ob_generic) != NULL) {
1518 err_setstr(RuntimeError,
1519 "add_object of object already in a form");
1520 return NULL;
1521 }
1522 fl_add_object(f->ob_form, g->ob_generic);
1523 knowgeneric(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001524
1525 INCREF(None);
1526 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001527}
1528
1529static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001530form_set_form_position(f, args)
1531 formobject *f;
1532 object *args;
1533{
1534 return form_call_INiINi(fl_set_form_position, f-> ob_form, args);
1535}
1536
1537static object *
1538generic_add_object(f, args, func, internal_methods)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001539 formobject *f;
1540 object *args;
1541 FL_OBJECT *(*func)(int, float, float, float, float, char*);
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001542 struct methodlist *internal_methods;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001543{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001544 int type;
1545 float x, y, w, h;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001546 char *name;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001547 FL_OBJECT *obj;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001548
Guido van Rossumfc58e581992-01-27 16:45:55 +00001549 if (!getargs(args,"(iffffs)", &type,&x,&y,&w,&h,&name))
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001550 return NULL;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001551
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001552 fl_addto_form (f-> ob_form);
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001553
Guido van Rossumfc58e581992-01-27 16:45:55 +00001554 obj = (*func) (type, x, y, w, h, name);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001555
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001556 fl_end_form();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001557
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001558 if (obj == NULL) {
1559 err_nomem();
1560 return NULL;
1561 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001562
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001563 return newgenericobject (obj, internal_methods);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001564}
1565
1566static object *
1567form_add_button(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001568 formobject *f;
1569 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001570{
1571 return generic_add_object(f, args, fl_add_button, button_methods);
1572}
1573
1574static object *
1575form_add_lightbutton(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001576 formobject *f;
1577 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001578{
1579 return generic_add_object(f, args, fl_add_lightbutton, button_methods);
1580}
1581
1582static object *
1583form_add_roundbutton(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001584 formobject *f;
1585 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001586{
1587 return generic_add_object(f, args, fl_add_roundbutton, button_methods);
1588}
1589
1590static object *
1591form_add_menu (f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001592 formobject *f;
1593 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001594{
1595 return generic_add_object(f, args, fl_add_menu, menu_methods);
1596}
1597
1598static object *
1599form_add_slider(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001600 formobject *f;
1601 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001602{
1603 return generic_add_object(f, args, fl_add_slider, slider_methods);
1604}
1605
1606static object *
1607form_add_valslider(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001608 formobject *f;
1609 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001610{
1611 return generic_add_object(f, args, fl_add_valslider, slider_methods);
1612}
1613
1614static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001615form_add_dial(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001616 formobject *f;
1617 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001618{
1619 return generic_add_object(f, args, fl_add_dial, dial_methods);
1620}
1621
1622static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001623form_add_counter(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001624 formobject *f;
1625 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001626{
1627 return generic_add_object(f, args, fl_add_counter, counter_methods);
1628}
1629
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001630#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001631static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001632form_add_default(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001633 formobject *f;
1634 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001635{
1636 return generic_add_object(f, args, fl_add_default, default_methods);
1637}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001638#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001639
1640static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001641form_add_clock(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001642 formobject *f;
1643 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001644{
1645 return generic_add_object(f, args, fl_add_clock, clock_methods);
1646}
1647
1648static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001649form_add_box(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001650 formobject *f;
1651 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001652{
Guido van Rossum03747111991-08-08 12:10:01 +00001653 return generic_add_object(f, args, fl_add_box,
1654 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001655}
1656
1657static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001658form_add_choice(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001659 formobject *f;
1660 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001661{
1662 return generic_add_object(f, args, fl_add_choice, choice_methods);
1663}
1664
1665static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001666form_add_browser(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001667 formobject *f;
1668 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001669{
1670 return generic_add_object(f, args, fl_add_browser, browser_methods);
1671}
1672
1673static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001674form_add_positioner(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001675 formobject *f;
1676 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001677{
1678 return generic_add_object(f, args, fl_add_positioner, positioner_methods);
1679}
1680
1681static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001682form_add_input(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001683 formobject *f;
1684 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001685{
1686 return generic_add_object(f, args, fl_add_input, input_methods);
1687}
1688
1689static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001690form_add_text(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001691 formobject *f;
1692 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001693{
Guido van Rossum03747111991-08-08 12:10:01 +00001694 return generic_add_object(f, args, fl_add_text,
1695 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001696}
1697
1698static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001699form_add_timer(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001700 formobject *f;
1701 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001702{
1703 return generic_add_object(f, args, fl_add_timer, timer_methods);
1704}
1705
1706static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001707form_freeze_form(f, args)
1708 formobject *f;
1709 object *args;
1710{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001711 return form_call(fl_freeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001712}
1713
1714static object *
1715form_unfreeze_form(f, args)
1716 formobject *f;
1717 object *args;
1718{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001719 return form_call(fl_unfreeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001720}
1721
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001722#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001723static object *
1724form_remove_form(f, args)
1725 formobject *f;
1726 object *args;
1727{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001728 return form_call(fl_remove_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001729}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001730#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001731
1732static object *
1733form_activate_form(f, args)
1734 formobject *f;
1735 object *args;
1736{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001737 return form_call(fl_activate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001738}
1739
1740static object *
1741form_deactivate_form(f, args)
1742 formobject *f;
1743 object *args;
1744{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001745 return form_call(fl_deactivate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001746}
1747
Guido van Rossum75cc8981991-08-08 12:07:45 +00001748static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001749form_bgn_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001750 formobject *f;
1751 object *args;
1752{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001753 FL_OBJECT *obj;
1754
1755 fl_addto_form(f-> ob_form);
1756 obj = fl_bgn_group();
1757 fl_end_form();
1758
1759 if (obj == NULL) {
1760 err_nomem();
1761 return NULL;
1762 }
1763
1764 return newgenericobject (obj, (struct methodlist *) NULL);
Guido van Rossum03747111991-08-08 12:10:01 +00001765}
1766
1767static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001768form_end_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001769 formobject *f;
1770 object *args;
1771{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001772 fl_addto_form(f-> ob_form);
Guido van Rossum03747111991-08-08 12:10:01 +00001773 fl_end_group();
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001774 fl_end_form();
Guido van Rossum03747111991-08-08 12:10:01 +00001775 INCREF(None);
1776 return None;
1777}
1778
1779static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001780forms_find_first_or_last(func, f, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00001781 FL_OBJECT *(*func)(FL_FORM *, int, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +00001782 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001783 object *args;
1784{
1785 int type;
1786 float mx, my;
1787 FL_OBJECT *generic;
1788 genericobject *g;
1789
Guido van Rossumfc58e581992-01-27 16:45:55 +00001790 if (!getargs(args, "(iff)", &type, &mx, &my)) return NULL;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001791
Guido van Rossum03747111991-08-08 12:10:01 +00001792 generic = (*func) (f-> ob_form, type, mx, my);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001793
1794 if (generic == NULL)
1795 {
1796 INCREF(None);
1797 return None;
1798 }
1799
1800 g = findgeneric(generic);
1801 if (g == NULL) {
1802 err_setstr(RuntimeError,
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001803 "forms_find_{first|last} returns unknown object");
Guido van Rossum75cc8981991-08-08 12:07:45 +00001804 return NULL;
1805 }
1806 INCREF(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001807 return (object *) g;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001808}
1809
1810static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001811form_find_first(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001812 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001813 object *args;
1814{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001815 return forms_find_first_or_last(fl_find_first, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001816}
1817
1818static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001819form_find_last(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001820 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001821 object *args;
1822{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001823 return forms_find_first_or_last(fl_find_last, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001824}
1825
Guido van Rossum7066dd71992-09-17 17:54:56 +00001826static object *
1827form_set_object_focus(f, args)
1828 formobject *f;
1829 object *args;
1830{
1831 genericobject *g;
1832 if (args == NULL || !is_genericobject(args)) {
1833 err_badarg();
1834 return NULL;
1835 }
1836 g = (genericobject *)args;
1837 fl_set_object_focus(f->ob_form, g->ob_generic);
1838 INCREF(None);
1839 return None;
1840}
1841
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001842static struct methodlist form_methods[] = {
1843/* adm */
1844 {"show_form", form_show_form},
1845 {"hide_form", form_hide_form},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001846 {"redraw_form", form_redraw_form},
1847 {"set_form_position", form_set_form_position},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001848 {"freeze_form", form_freeze_form},
1849 {"unfreeze_form", form_unfreeze_form},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001850#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001851 {"remove_form", form_remove_form},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001852#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001853 {"activate_form", form_activate_form},
1854 {"deactivate_form", form_deactivate_form},
Guido van Rossum03747111991-08-08 12:10:01 +00001855 {"bgn_group", form_bgn_group},
1856 {"end_group", form_end_group},
Guido van Rossum75cc8981991-08-08 12:07:45 +00001857 {"find_first", form_find_first},
1858 {"find_last", form_find_last},
Guido van Rossum7066dd71992-09-17 17:54:56 +00001859 {"set_object_focus", form_set_object_focus},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001860
1861/* basic objects */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001862 {"add_button", form_add_button},
1863/* {"add_bitmap", form_add_bitmap}, */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001864 {"add_lightbutton", form_add_lightbutton},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001865 {"add_roundbutton", form_add_roundbutton},
1866 {"add_menu", form_add_menu},
1867 {"add_slider", form_add_slider},
1868 {"add_positioner", form_add_positioner},
1869 {"add_valslider", form_add_valslider},
1870 {"add_dial", form_add_dial},
1871 {"add_counter", form_add_counter},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001872#ifdef FL_V15
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001873 {"add_default", form_add_default},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001874#endif /* FL_V15 */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001875 {"add_box", form_add_box},
1876 {"add_clock", form_add_clock},
1877 {"add_choice", form_add_choice},
1878 {"add_browser", form_add_browser},
1879 {"add_input", form_add_input},
1880 {"add_timer", form_add_timer},
1881 {"add_text", form_add_text},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001882 {NULL, NULL} /* sentinel */
1883};
1884
1885static void
1886form_dealloc(f)
1887 formobject *f;
1888{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001889 releaseobjects(f->ob_form);
Guido van Rossum336b5911992-04-08 11:16:25 +00001890 if (f->ob_form->visible)
1891 fl_hide_form(f->ob_form);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001892 fl_free_form(f->ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001893 DEL(f);
1894}
1895
Guido van Rossumd97f0481991-11-19 20:26:28 +00001896#define OFF(x) offsetof(FL_FORM, x)
1897
Guido van Rossum32db5e31991-11-12 15:43:18 +00001898static struct memberlist form_memberlist[] = {
1899 {"window", T_LONG, OFF(window), RO},
1900 {"w", T_FLOAT, OFF(w)},
1901 {"h", T_FLOAT, OFF(h)},
Guido van Rossum7066dd71992-09-17 17:54:56 +00001902 {"x", T_FLOAT, OFF(x), RO},
1903 {"y", T_FLOAT, OFF(y), RO},
Guido van Rossum32db5e31991-11-12 15:43:18 +00001904 {"deactivated", T_INT, OFF(deactivated)},
Guido van Rossum7066dd71992-09-17 17:54:56 +00001905 {"visible", T_INT, OFF(visible), RO},
1906 {"frozen", T_INT, OFF(frozen), RO},
Guido van Rossum32db5e31991-11-12 15:43:18 +00001907 {"doublebuf", T_INT, OFF(doublebuf)},
1908 {NULL} /* Sentinel */
1909};
1910
Guido van Rossumd97f0481991-11-19 20:26:28 +00001911#undef OFF
1912
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001913static object *
1914form_getattr(f, name)
1915 formobject *f;
1916 char *name;
1917{
Guido van Rossum32db5e31991-11-12 15:43:18 +00001918 object *meth;
1919
1920 meth = findmethod(form_methods, (object *)f, name);
1921 if (meth != NULL)
1922 return meth;
1923 err_clear();
1924 return getmember((char *)f->ob_form, form_memberlist, name);
1925}
1926
1927static int
1928form_setattr(f, name, v)
1929 formobject *f;
1930 char *name;
1931 object *v;
1932{
1933 int ret;
1934
1935 if (v == NULL) {
1936 err_setstr(TypeError, "can't delete form attributes");
1937 return NULL;
1938 }
1939
1940 return setmember((char *)f->ob_form, form_memberlist, name, v);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001941}
1942
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001943static object *
1944form_repr(f)
1945 formobject *f;
1946{
1947 char buf[100];
1948 sprintf(buf, "<FORMS_form at %lx, window=%ld>",
1949 (long)f, f->ob_form->window);
1950 return newstringobject(buf);
1951}
1952
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001953typeobject Formtype = {
1954 OB_HEAD_INIT(&Typetype)
1955 0, /*ob_size*/
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001956 "FORMS_form", /*tp_name*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001957 sizeof(formobject), /*tp_size*/
1958 0, /*tp_itemsize*/
1959 /* methods */
1960 form_dealloc, /*tp_dealloc*/
1961 0, /*tp_print*/
1962 form_getattr, /*tp_getattr*/
Guido van Rossum32db5e31991-11-12 15:43:18 +00001963 form_setattr, /*tp_setattr*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001964 0, /*tp_compare*/
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001965 form_repr, /*tp_repr*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001966};
1967
1968static object *
1969newformobject(form)
1970 FL_FORM *form;
1971{
1972 formobject *f;
1973 f = NEWOBJ(formobject, &Formtype);
1974 if (f == NULL)
1975 return NULL;
1976 f->ob_form = form;
1977 return (object *)f;
1978}
1979
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001980
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001981/* The "fl" module */
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001982
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001983static object *
1984forms_make_form(dummy, args)
1985 object *dummy;
1986 object *args;
1987{
1988 int type;
1989 float w, h;
1990 FL_FORM *form;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001991 if (!getargs(args, "(iff)", &type, &w, &h))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001992 return NULL;
1993 form = fl_bgn_form(type, w, h);
1994 if (form == NULL) {
1995 /* XXX Actually, cannot happen! */
1996 err_nomem();
1997 return NULL;
1998 }
1999 fl_end_form();
2000 return newformobject(form);
2001}
2002
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002003static object *
2004forms_activate_all_forms(f, args)
2005 object *f;
2006 object *args;
2007{
2008 fl_activate_all_forms();
2009 INCREF(None);
2010 return None;
2011}
2012
2013static object *
2014forms_deactivate_all_forms(f, args)
2015 object *f;
2016 object *args;
2017{
2018 fl_deactivate_all_forms();
2019 INCREF(None);
2020 return None;
2021}
2022
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002023static object *my_event_callback = NULL;
2024
2025static object *
2026forms_set_event_call_back(dummy, args)
2027 object *dummy;
2028 object *args;
2029{
2030 my_event_callback = args;
2031 XINCREF(args);
2032 INCREF(None);
2033 return None;
2034}
2035
2036static object *
2037forms_do_or_check_forms(dummy, args, func)
2038 object *dummy;
2039 object *args;
2040 FL_OBJECT *(*func)();
2041{
2042 FL_OBJECT *generic;
2043 genericobject *g;
2044 object *arg, *res;
2045
2046 if (!getnoarg(args))
2047 return NULL;
2048
2049 for (;;) {
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002050 BGN_SAVE
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002051 generic = (*func)();
Jack Jansen743db361992-08-13 14:13:11 +00002052 END_SAVE
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002053 if (generic == NULL) {
2054 INCREF(None);
2055 return None;
2056 }
2057 if (generic == FL_EVENT) {
2058 int dev;
2059 short val;
2060 if (my_event_callback == NULL)
Guido van Rossum7066dd71992-09-17 17:54:56 +00002061 return newintobject(-1L);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002062 dev = fl_qread(&val);
Guido van Rossume5372401993-03-16 12:15:04 +00002063 arg = mkvalue("(ih)", dev, val);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002064 if (arg == NULL)
2065 return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002066 res = call_object(my_event_callback, arg);
2067 XDECREF(res);
2068 DECREF(arg);
2069 if (res == NULL)
2070 return NULL; /* Callback raised exception */
2071 continue;
2072 }
2073 g = findgeneric(generic);
2074 if (g == NULL) {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00002075 /* Object not known to us (some dialogs cause this) */
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002076 continue; /* Ignore it */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002077 }
2078 if (g->ob_callback == NULL) {
2079 INCREF(g);
2080 return ((object *) g);
2081 }
Guido van Rossume5372401993-03-16 12:15:04 +00002082 arg = mkvalue("(OO)", (object *)g, g->ob_callback_arg);
2083 if (arg == NULL)
2084 return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002085 res = call_object(g->ob_callback, arg);
2086 XDECREF(res);
2087 DECREF(arg);
2088 if (res == NULL)
2089 return NULL; /* Callback raised exception */
2090 }
2091}
2092
2093static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002094forms_do_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002095 object *dummy;
2096 object *args;
2097{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002098 return forms_do_or_check_forms(dummy, args, fl_do_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002099}
2100
2101static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002102forms_check_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002103 object *dummy;
2104 object *args;
2105{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002106 return forms_do_or_check_forms(dummy, args, fl_check_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002107}
2108
Guido van Rossum7066dd71992-09-17 17:54:56 +00002109static object *
2110forms_do_only_forms(dummy, args)
2111 object *dummy;
2112 object *args;
2113{
2114 return forms_do_or_check_forms(dummy, args, fl_do_only_forms);
2115}
2116
2117static object *
2118forms_check_only_forms(dummy, args)
2119 object *dummy;
2120 object *args;
2121{
2122 return forms_do_or_check_forms(dummy, args, fl_check_only_forms);
2123}
2124
Guido van Rossum03747111991-08-08 12:10:01 +00002125#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002126static object *
2127fl_call(func, args)
2128 object *args;
2129 void (*func)();
2130{
2131 if (!getnoarg(args))
2132 return NULL;
2133 (*func)();
2134 INCREF(None);
2135 return None;
2136}
Guido van Rossum03747111991-08-08 12:10:01 +00002137#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002138
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002139#ifndef FL_V15
2140static object *
2141forms_set_graphics_mode(dummy, args)
2142 object *dummy;
2143 object *args;
2144{
2145 int rgbmode, doublebuf;
2146
2147 if (!getintintarg(args, &rgbmode, &doublebuf))
2148 return NULL;
2149 fl_set_graphics_mode(rgbmode,doublebuf);
2150 INCREF(None);
2151 return None;
2152}
2153
2154static object *
2155forms_get_rgbmode(dummy, args)
2156 object *dummy;
2157 object *args;
2158{
Guido van Rossum7066dd71992-09-17 17:54:56 +00002159 extern int fl_rgbmode;
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002160
2161 if (args != NULL) {
2162 err_badarg();
2163 return NULL;
2164 }
Guido van Rossum7066dd71992-09-17 17:54:56 +00002165 return newintobject((long)fl_rgbmode);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002166}
Guido van Rossum7066dd71992-09-17 17:54:56 +00002167
2168static object *
2169forms_show_errors(dummy, args)
2170 object *dummy;
2171 object *args;
2172{
2173 int show;
2174 if (!getargs(args, "i", &show))
2175 return NULL;
2176 fl_show_errors(show);
2177 INCREF(None);
2178 return None;
2179}
2180
2181static object *
2182forms_set_font_name(dummy, args)
2183 object *dummy;
2184 object *args;
2185{
2186 int numb;
2187 char *name;
2188 if (!getargs(args, "(is)", &numb, &name))
2189 return NULL;
2190 fl_set_font_name(numb, name);
2191 INCREF(None);
2192 return None;
2193}
2194
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002195#endif /* !FL_V15 */
2196
2197
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002198static object *
2199forms_qdevice(self, args)
2200 object *self;
2201 object *args;
2202{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002203 short arg1;
2204 if (!getargs(args, "h", &arg1))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002205 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002206 fl_qdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002207 INCREF(None);
2208 return None;
2209}
2210
2211static object *
2212forms_unqdevice(self, args)
2213 object *self;
2214 object *args;
2215{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002216 short arg1;
2217 if (!getargs(args, "h", &arg1))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002218 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002219 fl_unqdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002220 INCREF(None);
2221 return None;
2222}
2223
2224static object *
2225forms_isqueued(self, args)
2226 object *self;
2227 object *args;
2228{
Guido van Rossum03747111991-08-08 12:10:01 +00002229 long retval;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002230 short arg1;
2231 if (!getargs(args, "h", &arg1))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002232 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002233 retval = fl_isqueued(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002234
Guido van Rossum03747111991-08-08 12:10:01 +00002235 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002236}
2237
2238static object *
2239forms_qtest(self, args)
2240 object *self;
2241 object *args;
2242{
2243 long retval;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002244 retval = fl_qtest();
Guido van Rossum03747111991-08-08 12:10:01 +00002245 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002246}
2247
2248
2249static object *
2250forms_qread(self, args)
2251 object *self;
2252 object *args;
2253{
Guido van Rossume5372401993-03-16 12:15:04 +00002254 int dev;
2255 short val;
Jack Jansen743db361992-08-13 14:13:11 +00002256 BGN_SAVE
Guido van Rossume5372401993-03-16 12:15:04 +00002257 dev = fl_qread(&val);
Jack Jansen743db361992-08-13 14:13:11 +00002258 END_SAVE
Guido van Rossume5372401993-03-16 12:15:04 +00002259 return mkvalue("(ih)", dev, val);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002260}
2261
2262static object *
2263forms_qreset(self, args)
2264 object *self;
2265 object *args;
2266{
2267 if (!getnoarg(args)) return NULL;
2268
Guido van Rossum03747111991-08-08 12:10:01 +00002269 fl_qreset();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002270 INCREF(None);
2271 return None;
2272}
2273
2274static object *
2275forms_qenter(self, args)
2276 object *self;
2277 object *args;
2278{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002279 short arg1, arg2;
2280 if (!getargs(args, "(hh)", &arg1, &arg2))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002281 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002282 fl_qenter(arg1, arg2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002283 INCREF(None);
2284 return None;
2285}
2286
2287static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002288forms_color(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002289 object *self;
2290 object *args;
2291{
2292 int arg;
2293
2294 if (!getintarg(args, &arg)) return NULL;
2295
2296 fl_color((short) arg);
2297
2298 INCREF(None);
2299 return None;
2300}
2301
2302static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002303forms_mapcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002304 object *self;
2305 object *args;
2306{
2307 int arg0, arg1, arg2, arg3;
2308
Guido van Rossumfc58e581992-01-27 16:45:55 +00002309 if (!getargs(args, "(iiii)", &arg0, &arg1, &arg2, &arg3))
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002310 return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002311
2312 fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);
2313
2314 INCREF(None);
2315 return None;
2316}
2317
2318static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002319forms_getmcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002320 object *self;
2321 object *args;
2322{
Guido van Rossum03747111991-08-08 12:10:01 +00002323 int arg;
2324 short r, g, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002325
2326 if (!getintarg(args, &arg)) return NULL;
2327
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002328 fl_getmcolor(arg, &r, &g, &b);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002329
Guido van Rossume5372401993-03-16 12:15:04 +00002330 return mkvalue("(hhh)", r, g, b);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002331}
2332
2333static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002334forms_get_mouse(self, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00002335 object *self;
2336 object *args;
2337{
Guido van Rossume5372401993-03-16 12:15:04 +00002338 float x, y;
Guido van Rossum75cc8981991-08-08 12:07:45 +00002339
2340 if (!getnoarg(args)) return NULL;
2341
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002342 fl_get_mouse(&x, &y);
Guido van Rossum75cc8981991-08-08 12:07:45 +00002343
Guido van Rossume5372401993-03-16 12:15:04 +00002344 return mkvalue("(ff)", x, y);
Guido van Rossum75cc8981991-08-08 12:07:45 +00002345}
2346
2347static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002348forms_tie(self, args)
2349 object *self;
2350 object *args;
2351{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002352 short arg1, arg2, arg3;
2353 if (!getargs(args, "(hhh)", &arg1, &arg2, &arg3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002354 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002355 fl_tie(arg1, arg2, arg3);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002356 INCREF(None);
2357 return None;
2358}
2359
Guido van Rossum03747111991-08-08 12:10:01 +00002360static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002361forms_show_message(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002362 object *f;
2363 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002364{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002365 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002366
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002367 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002368
Jack Jansen743db361992-08-13 14:13:11 +00002369 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002370 fl_show_message(a, b, c);
Jack Jansen743db361992-08-13 14:13:11 +00002371 END_SAVE
Guido van Rossum03747111991-08-08 12:10:01 +00002372
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002373 INCREF(None);
Guido van Rossum03747111991-08-08 12:10:01 +00002374 return None;
2375}
2376
2377static object *
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002378forms_show_choice(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002379 object *f;
2380 object *args;
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002381{
2382 char *m1, *m2, *m3, *b1, *b2, *b3;
2383 int nb;
2384 char *format;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002385 long rv;
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002386
2387 if (args == NULL || !is_tupleobject(args)) {
2388 err_badarg();
2389 return NULL;
2390 }
2391 nb = gettuplesize(args) - 3;
2392 if (nb <= 0) {
2393 err_setstr(TypeError, "need at least one button label");
2394 return NULL;
2395 }
2396 if (is_intobject(gettupleitem(args, 3))) {
2397 err_setstr(TypeError,
2398 "'number-of-buttons' argument not needed");
2399 return NULL;
2400 }
2401 switch (nb) {
2402 case 1: format = "(ssss)"; break;
2403 case 2: format = "(sssss)"; break;
2404 case 3: format = "(ssssss)"; break;
2405 default:
2406 err_setstr(TypeError, "too many button labels");
2407 return NULL;
2408 }
2409
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002410 if (!getargs(args, format, &m1, &m2, &m3, &b1, &b2, &b3))
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002411 return NULL;
2412
Jack Jansen743db361992-08-13 14:13:11 +00002413 BGN_SAVE
2414 rv = fl_show_choice(m1, m2, m3, nb, b1, b2, b3);
2415 END_SAVE
2416 return newintobject(rv);
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002417}
2418
2419static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002420forms_show_question(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002421 object *f;
2422 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002423{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002424 int ret;
2425 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002426
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002427 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002428
Jack Jansen743db361992-08-13 14:13:11 +00002429 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002430 ret = fl_show_question(a, b, c);
Jack Jansen743db361992-08-13 14:13:11 +00002431 END_SAVE
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002432
2433 return newintobject((long) ret);
Guido van Rossum03747111991-08-08 12:10:01 +00002434}
2435
2436static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002437forms_show_input(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002438 object *f;
2439 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002440{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002441 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002442 char *a, *b;
Guido van Rossum03747111991-08-08 12:10:01 +00002443
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002444 if (!getstrstrarg(args, &a, &b)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002445
Jack Jansen743db361992-08-13 14:13:11 +00002446 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002447 str = fl_show_input(a, b);
Jack Jansen743db361992-08-13 14:13:11 +00002448 END_SAVE
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002449
2450 if (str == NULL) {
2451 INCREF(None);
2452 return None;
2453 }
2454 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002455}
2456
2457static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002458forms_file_selector(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002459 object *f;
2460 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002461{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002462 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002463 char *a, *b, *c, *d;
Guido van Rossum03747111991-08-08 12:10:01 +00002464
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002465 if (!getargs(args, "(ssss)", &a, &b, &c, &d)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002466
Jack Jansen743db361992-08-13 14:13:11 +00002467 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002468 str = fl_show_file_selector(a, b, c, d);
Jack Jansen743db361992-08-13 14:13:11 +00002469 END_SAVE
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002470
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002471 if (str == NULL) {
2472 INCREF(None);
2473 return None;
2474 }
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002475 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002476}
2477
2478
2479static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002480forms_file_selector_func(args, func)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002481 object *args;
2482 char *(*func)();
Guido van Rossum03747111991-08-08 12:10:01 +00002483{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002484 char *str;
Guido van Rossum03747111991-08-08 12:10:01 +00002485
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002486 str = (*func) ();
2487
2488 if (str == NULL) {
2489 INCREF(None);
2490 return None;
2491 }
2492 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002493}
2494
2495static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002496forms_get_directory(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002497 object *f;
2498 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002499{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002500 return forms_file_selector_func(args, fl_get_directory);
Guido van Rossum03747111991-08-08 12:10:01 +00002501}
2502
2503static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002504forms_get_pattern(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002505 object *f;
2506 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002507{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002508 return forms_file_selector_func(args, fl_get_pattern);
Guido van Rossum03747111991-08-08 12:10:01 +00002509}
2510
2511static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002512forms_get_filename(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002513 object *f;
2514 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002515{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002516 return forms_file_selector_func(args, fl_get_filename);
Guido van Rossum03747111991-08-08 12:10:01 +00002517}
2518
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002519static struct methodlist forms_methods[] = {
2520/* adm */
2521 {"make_form", forms_make_form},
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002522 {"activate_all_forms", forms_activate_all_forms},
2523 {"deactivate_all_forms",forms_deactivate_all_forms},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002524/* gl support wrappers */
2525 {"qdevice", forms_qdevice},
2526 {"unqdevice", forms_unqdevice},
2527 {"isqueued", forms_isqueued},
2528 {"qtest", forms_qtest},
2529 {"qread", forms_qread},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002530/* {"blkqread", forms_blkqread}, */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002531 {"qreset", forms_qreset},
2532 {"qenter", forms_qenter},
Guido van Rossum03747111991-08-08 12:10:01 +00002533 {"get_mouse", forms_get_mouse},
2534 {"tie", forms_tie},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002535/* {"new_events", forms_new_events}, */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002536 {"color", forms_color},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002537 {"mapcolor", forms_mapcolor},
2538 {"getmcolor", forms_getmcolor},
2539/* interaction */
2540 {"do_forms", forms_do_forms},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00002541 {"do_only_forms", forms_do_only_forms},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002542 {"check_forms", forms_check_forms},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00002543 {"check_only_forms", forms_check_only_forms},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002544 {"set_event_call_back", forms_set_event_call_back},
2545/* goodies */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002546 {"show_message", forms_show_message},
2547 {"show_question", forms_show_question},
2548 {"show_choice", forms_show_choice},
2549 {"show_input", forms_show_input},
2550 {"show_file_selector", forms_file_selector},
2551 {"file_selector", forms_file_selector}, /* BW compat */
2552 {"get_directory", forms_get_directory},
2553 {"get_pattern", forms_get_pattern},
2554 {"get_filename", forms_get_filename},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002555#ifndef FL_V15
2556 {"set_graphics_mode", forms_set_graphics_mode},
2557 {"get_rgbmode", forms_get_rgbmode},
Guido van Rossum7066dd71992-09-17 17:54:56 +00002558 {"show_errors", forms_show_errors},
2559 {"set_font_name", forms_set_font_name},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002560#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002561 {NULL, NULL} /* sentinel */
2562};
2563
2564void
2565initfl()
2566{
2567 initmodule("fl", forms_methods);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002568 foreground();
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002569#ifndef FL_V15
2570 fl_init();
2571#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002572}