blob: 796e297ff0f13437d08021f0b51119f9019b5f52 [file] [log] [blame]
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001/**********************************************************
Guido van Rossumbab9d031992-04-05 14:26:55 +00002Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
Guido van Rossumc7df79e1991-08-07 11:32:58 +00003Netherlands.
4
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* FL module -- interface to Mark Overmars' FORMS Library. */
26
Guido van Rossumddc0d3e1991-12-10 13:56:42 +000027/* As distributed, this code works with FORMS 2.0.
28 If you #define the symbol FL_V15 it will work with FORMS 1.5 (I hope),
29 and possibly also with previous versions.
30 (You must also edit FL.py to set _v15 to 1.) */
31
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 Rossum2df7bcc1991-10-20 20:18:26 +0000123/* Called when a form is about to be freed --
124 remove all the objects that we know about from it. */
125
126static void
127releaseobjects(form)
128 FL_FORM *form;
129{
130 int i, n;
131 genericobject *g;
132
133 if (allgenerics == NULL)
134 return; /* No objects known yet */
135 n = getlistsize(allgenerics);
136 for (i = 0; i < n; i++) {
137 g = (genericobject *)getlistitem(allgenerics, i);
138 if (g != NULL && g->ob_generic->form == form) {
139 fl_delete_object(g->ob_generic);
140 if (g->ob_refcnt == 1) {
141 /* The object is now unreachable:
142 delete it from the list of known objects */
143 setlistitem(allgenerics, i, (object *)NULL);
144 nfreeslots++;
145 }
146 }
147 }
148 /* XXX Should also get rid of objects with refcnt==1 */
149}
150
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000151
152/* Methods of generic objects */
153
154static object *
155generic_set_call_back(g, args)
156 genericobject *g;
157 object *args;
158{
159 if (args == NULL) {
160 XDECREF(g->ob_callback);
161 XDECREF(g->ob_callback_arg);
162 g->ob_callback = NULL;
163 g->ob_callback_arg = NULL;
164 }
165 else {
166 if (!is_tupleobject(args) || gettuplesize(args) != 2) {
167 err_badarg();
168 return NULL;
169 }
170 XDECREF(g->ob_callback);
171 XDECREF(g->ob_callback_arg);
172 g->ob_callback = gettupleitem(args, 0);
173 INCREF(g->ob_callback);
174 g->ob_callback_arg = gettupleitem(args, 1);
175 INCREF(g->ob_callback_arg);
176 }
177 INCREF(None);
178 return None;
179}
180
181static object *
182generic_call(g, args, func)
183 genericobject *g;
184 object *args;
185 void (*func)(FL_OBJECT *);
186{
187 if (!getnoarg(args))
188 return NULL;
189 (*func)(g->ob_generic);
190 INCREF(None);
191 return None;
192}
193
194static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000195generic_delete_object(g, args)
196 genericobject *g;
197 object *args;
198{
199 object *res;
200 res = generic_call(g, args, fl_delete_object);
201 /* XXX Should remove it from the list of known objects */
202 return res;
203}
204
205static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000206generic_show_object(g, args)
207 genericobject *g;
208 object *args;
209{
210 return generic_call(g, args, fl_show_object);
211}
212
213static object *
214generic_hide_object(g, args)
215 genericobject *g;
216 object *args;
217{
218 return generic_call(g, args, fl_hide_object);
219}
220
221static object *
222generic_redraw_object(g, args)
223 genericobject *g;
224 object *args;
225{
226 return generic_call(g, args, fl_redraw_object);
227}
228
229static object *
230generic_freeze_object(g, args)
231 genericobject *g;
232 object *args;
233{
234 return generic_call(g, args, fl_freeze_object);
235}
236
237static object *
238generic_unfreeze_object(g, args)
239 genericobject *g;
240 object *args;
241{
242 return generic_call(g, args, fl_unfreeze_object);
243}
244
245static struct methodlist generic_methods[] = {
246 {"set_call_back", generic_set_call_back},
Guido van Rossum32db5e31991-11-12 15:43:18 +0000247 {"delete_object", generic_delete_object},
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000248 {"show_object", generic_show_object},
249 {"hide_object", generic_hide_object},
250 {"redraw_object", generic_redraw_object},
251 {"freeze_object", generic_freeze_object},
252 {"unfreeze_object", generic_unfreeze_object},
253#if 0
254 {"handle_object", generic_handle_object},
255 {"handle_object_direct",generic_handle_object_direct},
256#endif
Guido van Rossum03747111991-08-08 12:10:01 +0000257 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000258};
259
260static void
261generic_dealloc(g)
262 genericobject *g;
263{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000264 fl_free_object(g->ob_generic);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000265 DEL(g);
266}
267
268#define OFF(x) offsetof(FL_OBJECT, x)
269
270static struct memberlist generic_memberlist[] = {
271 {"objclass", T_INT, OFF(objclass), RO},
272 {"type", T_INT, OFF(type), RO},
273 {"boxtype", T_INT, OFF(boxtype)},
274 {"x", T_FLOAT, OFF(x)},
275 {"y", T_FLOAT, OFF(y)},
276 {"w", T_FLOAT, OFF(w)},
277 {"h", T_FLOAT, OFF(h)},
278 {"col1", T_INT, OFF(col1)},
279 {"col2", T_INT, OFF(col2)},
280 {"align", T_INT, OFF(align)},
281 {"lcol", T_INT, OFF(lcol)},
282 {"lsize", T_FLOAT, OFF(lsize)},
283 /* "label" is treated specially! */
284 {"lstyle", T_INT, OFF(lstyle)},
285 {"pushed", T_INT, OFF(pushed), RO},
286 {"focus", T_INT, OFF(focus), RO},
287 {"belowmouse", T_INT, OFF(belowmouse),RO},
288 {"frozen", T_INT, OFF(frozen), RO},
289 {"active", T_INT, OFF(active), RO},
290 {"input", T_INT, OFF(input), RO},
291 {"visible", T_INT, OFF(visible), RO},
292 {"radio", T_INT, OFF(radio), RO},
293 {"automatic", T_INT, OFF(automatic), RO},
294 {NULL} /* Sentinel */
295};
296
Guido van Rossumd97f0481991-11-19 20:26:28 +0000297#undef OFF
298
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000299static object *
300generic_getattr(g, name)
301 genericobject *g;
302 char *name;
303{
304 object *meth;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000305
306 /* XXX Ought to special-case name "__methods__" */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000307 if (g-> ob_methods) {
Guido van Rossum03747111991-08-08 12:10:01 +0000308 meth = findmethod(g->ob_methods, (object *)g, name);
309 if (meth != NULL) return meth;
310 err_clear();
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000311 }
312
313 meth = findmethod(generic_methods, (object *)g, name);
314 if (meth != NULL)
315 return meth;
316 err_clear();
317
318 /* "label" is an exception, getmember only works for char pointers,
319 not for char arrays */
320 if (strcmp(name, "label") == 0)
321 return newstringobject(g->ob_generic->label);
322
323 return getmember((char *)g->ob_generic, generic_memberlist, name);
324}
325
326static int
327generic_setattr(g, name, v)
328 genericobject *g;
329 char *name;
330 object *v;
331{
332 int ret;
333
334 if (v == NULL) {
335 err_setstr(TypeError, "can't delete forms object attributes");
Guido van Rossum3dd8c981992-06-03 17:07:49 +0000336 return -1;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000337 }
338
339 /* "label" is an exception: setmember doesn't set strings;
340 and FORMS wants you to call a function to set the label */
341 if (strcmp(name, "label") == 0) {
342 if (!is_stringobject(v)) {
343 err_setstr(TypeError, "label attr must be string");
Guido van Rossum3dd8c981992-06-03 17:07:49 +0000344 return -1;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000345 }
346 fl_set_object_label(g->ob_generic, getstringvalue(v));
347 return 0;
348 }
349
350 ret = setmember((char *)g->ob_generic, generic_memberlist, name, v);
351
352 /* Rather than calling all the various set_object_* functions,
353 we call fl_redraw_object here. This is sometimes redundant
354 but I doubt that's a big problem */
355 if (ret == 0)
356 fl_redraw_object(g->ob_generic);
357
358 return ret;
359}
360
361typeobject GenericObjecttype = {
362 OB_HEAD_INIT(&Typetype)
363 0, /*ob_size*/
364 "generic FORMS object", /*tp_name*/
365 sizeof(genericobject), /*tp_size*/
366 0, /*tp_itemsize*/
367 /* methods */
368 generic_dealloc, /*tp_dealloc*/
369 0, /*tp_print*/
370 generic_getattr, /*tp_getattr*/
371 generic_setattr, /*tp_setattr*/
372 0, /*tp_compare*/
373 0, /*tp_repr*/
374};
375
376static object *
377newgenericobject(generic, methods)
378 FL_OBJECT *generic;
379 struct methodlist *methods;
380{
381 genericobject *g;
382 g = NEWOBJ(genericobject, &GenericObjecttype);
383 if (g == NULL)
384 return NULL;
385 g-> ob_generic = generic;
386 g->ob_methods = methods;
387 g->ob_callback = NULL;
388 g->ob_callback_arg = NULL;
389 knowgeneric(g);
390 return (object *)g;
391}
392
393/**********************************************************************/
394/* Some common calling sequences */
395
396/* void func (object, float) */
397static object *
398call_forms_INf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000399 void (*func)(FL_OBJECT *, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000400 FL_OBJECT *obj;
401 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000402{
Guido van Rossum03747111991-08-08 12:10:01 +0000403 float parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000404
Guido van Rossumfc58e581992-01-27 16:45:55 +0000405 if (!getargs(args, "f", &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000406
Guido van Rossum03747111991-08-08 12:10:01 +0000407 (*func) (obj, parameter);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000408
Guido van Rossum03747111991-08-08 12:10:01 +0000409 INCREF(None);
410 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000411}
412
413/* void func (object, float) */
414static object *
415call_forms_INfINf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000416 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000417 FL_OBJECT *obj;
418 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000419{
Guido van Rossum03747111991-08-08 12:10:01 +0000420 float par1, par2;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000421
Guido van Rossumfc58e581992-01-27 16:45:55 +0000422 if (!getargs(args, "(ff)", &par1, &par2)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000423
Guido van Rossum03747111991-08-08 12:10:01 +0000424 (*func) (obj, par1, par2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000425
Guido van Rossum03747111991-08-08 12:10:01 +0000426 INCREF(None);
427 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000428}
429
430/* void func (object, int) */
431static object *
432call_forms_INi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000433 void (*func)(FL_OBJECT *, int);
Guido van Rossum03747111991-08-08 12:10:01 +0000434 FL_OBJECT *obj;
435 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000436{
Guido van Rossum03747111991-08-08 12:10:01 +0000437 int parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000438
Guido van Rossumfc58e581992-01-27 16:45:55 +0000439 if (!getintarg(args, &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000440
Guido van Rossum03747111991-08-08 12:10:01 +0000441 (*func) (obj, parameter);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000442
Guido van Rossum03747111991-08-08 12:10:01 +0000443 INCREF(None);
444 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000445}
446
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000447/* void func (object, char) */
448static object *
449call_forms_INc (func, obj, args)
450 void (*func)(FL_OBJECT *, int);
451 FL_OBJECT *obj;
452 object *args;
453{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000454 char *a;
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000455
Guido van Rossumfc58e581992-01-27 16:45:55 +0000456 if (!getstrarg(args, &a)) return NULL;
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000457
Guido van Rossumfc58e581992-01-27 16:45:55 +0000458 (*func) (obj, a[0]);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000459
460 INCREF(None);
461 return None;
462}
463
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000464/* void func (object, string) */
465static object *
466call_forms_INstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000467 void (*func)(FL_OBJECT *, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000468 FL_OBJECT *obj;
469 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000470{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000471 char *a;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000472
Guido van Rossumfc58e581992-01-27 16:45:55 +0000473 if (!getstrarg(args, &a)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000474
Guido van Rossumfc58e581992-01-27 16:45:55 +0000475 (*func) (obj, a);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000476
Guido van Rossum03747111991-08-08 12:10:01 +0000477 INCREF(None);
478 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000479}
480
481
482/* voide func (object, int, string) */
483static object *
484call_forms_INiINstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000485 void (*func)(FL_OBJECT *, int, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000486 FL_OBJECT *obj;
487 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000488{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000489 char *b;
490 int a;
Guido van Rossum03747111991-08-08 12:10:01 +0000491
Guido van Rossumfc58e581992-01-27 16:45:55 +0000492 if (!getintstrarg(args, &a, &b)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000493
Guido van Rossumfc58e581992-01-27 16:45:55 +0000494 (*func) (obj, a, b);
Guido van Rossum03747111991-08-08 12:10:01 +0000495
496 INCREF(None);
497 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000498}
499
Guido van Rossum03747111991-08-08 12:10:01 +0000500#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000501/* void func (object, float) */
502static object *
503call_forms_INiINi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000504 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000505 FL_OBJECT *obj;
506 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000507{
Guido van Rossum03747111991-08-08 12:10:01 +0000508 int par1, par2;
509
Guido van Rossumfc58e581992-01-27 16:45:55 +0000510 if (!getintintarg(args, &par1, &par2)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000511
512 (*func) (obj, par1, par2);
513
514 INCREF(None);
515 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000516}
Guido van Rossum03747111991-08-08 12:10:01 +0000517#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000518
519/* int func (object) */
520static object *
521call_forms_Ri (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000522 int (*func)(FL_OBJECT *);
523 FL_OBJECT *obj;
524 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000525{
Guido van Rossum03747111991-08-08 12:10:01 +0000526 int retval;
527
528 if (!getnoarg(args)) return NULL;
529
530 retval = (*func) (obj);
531
532 return newintobject ((long) retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000533}
534
535/* char * func (object) */
536static object *
537call_forms_Rstr (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000538 char * (*func)(FL_OBJECT *);
539 FL_OBJECT *obj;
540 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000541{
Guido van Rossum03747111991-08-08 12:10:01 +0000542 char *str;
543
Guido van Rossumfc58e581992-01-27 16:45:55 +0000544 if (!getnoarg(args)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000545
546 str = (*func) (obj);
547
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000548 if (str == NULL) {
549 INCREF(None);
550 return None;
551 }
Guido van Rossum03747111991-08-08 12:10:01 +0000552 return newstringobject (str);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000553}
554
555/* int func (object) */
556static object *
557call_forms_Rf (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000558 float (*func)(FL_OBJECT *);
559 FL_OBJECT *obj;
560 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000561{
Guido van Rossum03747111991-08-08 12:10:01 +0000562 float retval;
563
564 if (!getnoarg(args)) return NULL;
565
566 retval = (*func) (obj);
567
568 return newfloatobject (retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000569}
570
571static object *
572call_forms_OUTfOUTf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000573 void (*func)(FL_OBJECT *, float *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000574 FL_OBJECT *obj;
575 object *args;
576{
577 float f1, f2;
578 object *arg;
Guido van Rossum03747111991-08-08 12:10:01 +0000579
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000580 if (!getnoarg(args)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000581
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000582 (*func) (obj, &f1, &f2);
583
584 arg = newtupleobject (2);
585 if (arg == NULL) return NULL;
586
587 settupleitem (arg, 0, newfloatobject (f1));
588 settupleitem (arg, 1, newfloatobject (f2));
589 return arg;
590}
591
Guido van Rossum03747111991-08-08 12:10:01 +0000592#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000593static object *
594call_forms_OUTf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000595 void (*func)(FL_OBJECT *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000596 FL_OBJECT *obj;
597 object *args;
598{
599 float f;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000600
601 if (!getnoarg(args)) return NULL;
602
603 (*func) (obj, &f);
604
605 return newfloatobject (f);
606}
Guido van Rossum03747111991-08-08 12:10:01 +0000607#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000608
609/**********************************************************************/
610/* Class : browser */
611
612static object *
613set_browser_topline(g, args)
614 genericobject *g;
615 object *args;
616{
Guido van Rossum03747111991-08-08 12:10:01 +0000617 return call_forms_INi (fl_set_browser_topline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000618}
619
620static object *
621clear_browser(g, args)
622 genericobject *g;
623 object *args;
624{
Guido van Rossum03747111991-08-08 12:10:01 +0000625 return generic_call (g, args, fl_clear_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000626}
627
628static object *
629add_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000630 genericobject *g;
631 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000632{
Guido van Rossum03747111991-08-08 12:10:01 +0000633 return call_forms_INstr (fl_add_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000634}
635
636static object *
637addto_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000638 genericobject *g;
639 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000640{
Guido van Rossum03747111991-08-08 12:10:01 +0000641 return call_forms_INstr (fl_addto_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000642}
643
644static object *
645insert_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000646 genericobject *g;
647 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000648{
Guido van Rossum03747111991-08-08 12:10:01 +0000649 return call_forms_INiINstr (fl_insert_browser_line,
650 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000651}
652
653static object *
654delete_browser_line (g, args)
655 genericobject *g;
656 object *args;
657{
Guido van Rossum03747111991-08-08 12:10:01 +0000658 return call_forms_INi (fl_delete_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000659}
660
661static object *
662replace_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_INiINstr (fl_replace_browser_line,
667 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000668}
669
670static object *
671get_browser_line(g, args)
672 genericobject *g;
673 object *args;
674{
675 int i;
676 char *str;
677
678 if (!getintarg(args, &i))
679 return NULL;
680
681 str = fl_get_browser_line (g->ob_generic, i);
682
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000683 if (str == NULL) {
684 INCREF(None);
685 return None;
686 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000687 return newstringobject (str);
688}
689
690static object *
691load_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000692 genericobject *g;
693 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000694{
Guido van Rossumabe58351991-08-08 12:34:44 +0000695 /* XXX strictly speaking this is wrong since fl_load_browser
696 XXX returns int, not void */
Guido van Rossum03747111991-08-08 12:10:01 +0000697 return call_forms_INstr (fl_load_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000698}
699
700static object *
701get_browser_maxline(g, args)
702 genericobject *g;
703 object *args;
704{
Guido van Rossum03747111991-08-08 12:10:01 +0000705 return call_forms_Ri (fl_get_browser_maxline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000706}
707
708static object *
709select_browser_line (g, args)
710 genericobject *g;
711 object *args;
712{
Guido van Rossum03747111991-08-08 12:10:01 +0000713 return call_forms_INi (fl_select_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000714}
715
716static object *
717deselect_browser_line (g, args)
718 genericobject *g;
719 object *args;
720{
Guido van Rossum03747111991-08-08 12:10:01 +0000721 return call_forms_INi (fl_deselect_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000722}
723
724static object *
725deselect_browser (g, args)
726 genericobject *g;
727 object *args;
728{
Guido van Rossum03747111991-08-08 12:10:01 +0000729 return generic_call (g, args, fl_deselect_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000730}
731
732static object *
733isselected_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000734 genericobject *g;
735 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000736{
737 int i, j;
Guido van Rossum03747111991-08-08 12:10:01 +0000738
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000739 if (!getintarg(args, &i))
740 return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000741
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000742 j = fl_isselected_browser_line (g->ob_generic, i);
Guido van Rossum03747111991-08-08 12:10:01 +0000743
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000744 return newintobject (j);
745}
746
747static object *
748get_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000749 genericobject *g;
750 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000751{
Guido van Rossum03747111991-08-08 12:10:01 +0000752 return call_forms_Ri (fl_get_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000753}
754
755static object *
756set_browser_fontsize (g, args)
757 genericobject *g;
758 object *args;
759{
Guido van Rossum03747111991-08-08 12:10:01 +0000760 return call_forms_INf (fl_set_browser_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000761}
762
763static object *
764set_browser_fontstyle (g, args)
765 genericobject *g;
766 object *args;
767{
Guido van Rossum03747111991-08-08 12:10:01 +0000768 return call_forms_INi (fl_set_browser_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000769}
770
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000771static object *
772set_browser_specialkey (g, args)
773 genericobject *g;
774 object *args;
775{
776 return call_forms_INc(fl_set_browser_specialkey, g-> ob_generic, args);
777}
778
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000779static struct methodlist browser_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000780 {"set_browser_topline", set_browser_topline},
781 {"clear_browser", clear_browser},
782 {"add_browser_line", add_browser_line},
783 {"addto_browser", addto_browser},
784 {"insert_browser_line", insert_browser_line},
785 {"delete_browser_line", delete_browser_line},
786 {"replace_browser_line", replace_browser_line},
787 {"get_browser_line", get_browser_line},
788 {"load_browser", load_browser},
789 {"get_browser_maxline", get_browser_maxline},
790 {"select_browser_line", select_browser_line},
791 {"deselect_browser_line", deselect_browser_line},
792 {"deselect_browser", deselect_browser},
793 {"isselected_browser_line", isselected_browser_line},
794 {"get_browser", get_browser},
795 {"set_browser_fontsize", set_browser_fontsize},
796 {"set_browser_fontstyle", set_browser_fontstyle},
797 {"set_browser_specialkey", set_browser_specialkey},
798 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000799};
800
801/* Class: button */
802
803static object *
804set_button(g, args)
805 genericobject *g;
806 object *args;
807{
Guido van Rossum03747111991-08-08 12:10:01 +0000808 return call_forms_INi (fl_set_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000809}
810
811static object *
812get_button(g, args)
813 genericobject *g;
814 object *args;
815{
Guido van Rossum03747111991-08-08 12:10:01 +0000816 return call_forms_Ri (fl_get_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000817}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000818static object *
819set_button_shortcut(g, args)
820 genericobject *g;
821 object *args;
822{
823 return call_forms_INstr (fl_set_button_shortcut, g-> ob_generic, args);
824}
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000825
826static struct methodlist button_methods[] = {
827 {"set_button", set_button},
828 {"get_button", get_button},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000829#ifndef FL_V15
830 {"set_button_shortcut", set_button_shortcut},
831#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000832 {NULL, NULL} /* sentinel */
833};
834
835/* Class: choice */
836
837static object *
838set_choice(g, args)
839 genericobject *g;
840 object *args;
841{
Guido van Rossum03747111991-08-08 12:10:01 +0000842 return call_forms_INi (fl_set_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000843}
844
845static object *
846get_choice(g, args)
847 genericobject *g;
848 object *args;
849{
Guido van Rossum03747111991-08-08 12:10:01 +0000850 return call_forms_Ri (fl_get_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000851}
852
853static object *
854clear_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000855 genericobject *g;
856 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000857{
Guido van Rossum03747111991-08-08 12:10:01 +0000858 return generic_call (g, args, fl_clear_choice);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000859}
860
861static object *
862addto_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000863 genericobject *g;
864 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000865{
Guido van Rossum03747111991-08-08 12:10:01 +0000866 return call_forms_INstr (fl_addto_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000867}
868
869static object *
870replace_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000871 genericobject *g;
872 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000873{
Guido van Rossum03747111991-08-08 12:10:01 +0000874 return call_forms_INiINstr (fl_replace_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000875}
876
877static object *
878delete_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000879 genericobject *g;
880 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000881{
Guido van Rossum03747111991-08-08 12:10:01 +0000882 return call_forms_INi (fl_delete_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000883}
884
885static object *
886get_choice_text (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000887 genericobject *g;
888 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000889{
Guido van Rossum03747111991-08-08 12:10:01 +0000890 return call_forms_Rstr (fl_get_choice_text, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000891}
892
893static object *
894set_choice_fontsize (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000895 genericobject *g;
896 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000897{
Guido van Rossum03747111991-08-08 12:10:01 +0000898 return call_forms_INf (fl_set_choice_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000899}
900
901static object *
902set_choice_fontstyle (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000903 genericobject *g;
904 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000905{
Guido van Rossum03747111991-08-08 12:10:01 +0000906 return call_forms_INi (fl_set_choice_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000907}
908
909static struct methodlist choice_methods[] = {
910 {"set_choice", set_choice},
911 {"get_choice", get_choice},
912 {"clear_choice", clear_choice},
913 {"addto_choice", addto_choice},
914 {"replace_choice", replace_choice},
915 {"delete_choice", delete_choice},
916 {"get_choice_text", get_choice_text},
917 {"set_choice_fontsize", set_choice_fontsize},
918 {"set_choice_fontstyle",set_choice_fontstyle},
919 {NULL, NULL} /* sentinel */
920};
921
922/* Class : Clock */
923
924static object *
925get_clock(g, args)
926 genericobject *g;
927 object *args;
928{
929 int i0, i1, i2;
930 object *arg;
931
932 if (!getnoarg(args))
933 return NULL;
934
935 fl_get_clock (g->ob_generic, &i0, &i1, &i2);
936
937 arg = newtupleobject (3);
938 if (arg == NULL) return NULL;
939
940 settupleitem (arg, 0, newintobject (i0));
941 settupleitem (arg, 1, newintobject (i1));
942 settupleitem (arg, 2, newintobject (i2));
943 return arg;
944}
945
946static struct methodlist clock_methods[] = {
947 {"get_clock", get_clock},
948 {NULL, NULL} /* sentinel */
949};
950
951/* CLass : Counters */
952
953static object *
954get_counter_value(g, args)
955 genericobject *g;
956 object *args;
957{
958 return call_forms_Rf (fl_get_counter_value, g-> ob_generic, args);
959}
960
961static object *
962set_counter_value (g, args)
963 genericobject *g;
964 object *args;
965{
966 return call_forms_INf (fl_set_counter_value, g-> ob_generic, args);
967}
968
969static object *
970set_counter_precision (g, args)
971 genericobject *g;
972 object *args;
973{
974 return call_forms_INi (fl_set_counter_precision, g-> ob_generic, args);
975}
976
977static object *
978set_counter_bounds (g, args)
979 genericobject *g;
980 object *args;
981{
982 return call_forms_INfINf (fl_set_counter_bounds, g-> ob_generic, args);
983}
984
985static object *
986set_counter_step (g, args)
987 genericobject *g;
988 object *args;
989{
990 return call_forms_INfINf (fl_set_counter_step, g-> ob_generic, args);
991}
992
993static object *
994set_counter_return (g, args)
995 genericobject *g;
996 object *args;
997{
Guido van Rossum03747111991-08-08 12:10:01 +0000998 return call_forms_INi (fl_set_counter_return, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000999}
1000
1001static struct methodlist counter_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001002 {"set_counter_value", set_counter_value},
1003 {"get_counter_value", get_counter_value},
1004 {"set_counter_bounds", set_counter_bounds},
1005 {"set_counter_step", set_counter_step},
1006 {"set_counter_precision", set_counter_precision},
1007 {"set_counter_return", set_counter_return},
1008 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001009};
1010
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001011#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001012/* Class : Defaults */
1013
1014static object *
1015get_default(g, args)
1016 genericobject *g;
1017 object *args;
1018{
Guido van Rossum03747111991-08-08 12:10:01 +00001019 char c;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001020
Guido van Rossum03747111991-08-08 12:10:01 +00001021 if (!getnoarg(args)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001022
Guido van Rossum03747111991-08-08 12:10:01 +00001023 c = fl_get_default (g->ob_generic);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001024
Guido van Rossum03747111991-08-08 12:10:01 +00001025 return ((object *) mknewcharobject (c)); /* in cgensupport.c */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001026}
1027
1028static struct methodlist default_methods[] = {
1029 {"get_default", get_default},
1030 {NULL, NULL} /* sentinel */
1031};
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001032#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001033
1034
1035/* Class: Dials */
1036
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001037#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001038static object *
1039set_dial (g, args)
1040 genericobject *g;
1041 object *args;
1042{
1043 float f1, f2, f3;
1044
Guido van Rossumfc58e581992-01-27 16:45:55 +00001045 if (!getargs(args, "(fff)", &f1, &f2, &f3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001046 return NULL;
1047 fl_set_dial (g->ob_generic, f1, f2, f3);
1048 INCREF(None);
1049 return None;
1050}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001051#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001052
1053static object *
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001054get_dial_value(g, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001055 genericobject *g;
1056 object *args;
1057{
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001058 return call_forms_Rf (fl_get_dial_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001059}
1060
1061static object *
1062set_dial_value (g, args)
1063 genericobject *g;
1064 object *args;
1065{
1066 return call_forms_INf (fl_set_dial_value, g-> ob_generic, args);
1067}
1068
1069static object *
1070set_dial_bounds (g, args)
1071 genericobject *g;
1072 object *args;
1073{
1074 return call_forms_INfINf (fl_set_dial_bounds, g-> ob_generic, args);
1075}
1076
1077static object *
1078get_dial_bounds (g, args)
1079 genericobject *g;
1080 object *args;
1081{
1082 return call_forms_OUTfOUTf (fl_get_dial_bounds, g-> ob_generic, args);
1083}
1084
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001085#ifndef FL_V15
1086static object *
1087set_dial_step (g, args)
1088 genericobject *g;
1089 object *args;
1090{
1091 return call_forms_INf (fl_set_dial_step, g-> ob_generic, args);
1092}
1093#endif /* !FL_V15 */
1094
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001095static struct methodlist dial_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001096#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001097 {"set_dial", set_dial},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001098 {"get_dial", get_dial_value},
1099#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001100 {"set_dial_value", set_dial_value},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001101 {"get_dial_value", get_dial_value},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001102 {"set_dial_bounds", set_dial_bounds},
1103 {"get_dial_bounds", get_dial_bounds},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001104#ifndef FL_V15
1105 {"set_dial_step", set_dial_step},
1106#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001107 {NULL, NULL} /* sentinel */
1108};
1109
1110/* Class : Input */
1111
1112static object *
1113set_input (g, args)
1114 genericobject *g;
1115 object *args;
1116{
1117 return call_forms_INstr (fl_set_input, g-> ob_generic, args);
1118}
1119
1120static object *
1121get_input (g, args)
1122 genericobject *g;
1123 object *args;
1124{
1125 return call_forms_Rstr (fl_get_input, g-> ob_generic, args);
1126}
1127
1128static object *
1129set_input_color (g, args)
1130 genericobject *g;
1131 object *args;
1132{
1133 return call_forms_INfINf (fl_set_input_color, g-> ob_generic, args);
1134}
1135
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001136#ifndef FL_V15
1137static object *
1138set_input_return (g, args)
1139 genericobject *g;
1140 object *args;
1141{
1142 return call_forms_INi (fl_set_input_return, g-> ob_generic, args);
1143}
1144#endif /* !FL_V15 */
1145
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001146static struct methodlist input_methods[] = {
1147 {"set_input", set_input},
1148 {"get_input", get_input},
1149 {"set_input_color", set_input_color},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001150#ifndef FL_V15
1151 {"set_input_return", set_input_return},
1152#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001153 {NULL, NULL} /* sentinel */
1154};
1155
1156
1157/* Class : Menu */
1158
1159static object *
1160set_menu (g, args)
1161 genericobject *g;
1162 object *args;
1163{
Guido van Rossumabe58351991-08-08 12:34:44 +00001164 return call_forms_INstr (fl_set_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001165}
1166
1167static object *
1168get_menu (g, args)
1169 genericobject *g;
1170 object *args;
1171{
Guido van Rossumabe58351991-08-08 12:34:44 +00001172 /* XXX strictly speaking this is wrong since fl_get_menu
1173 XXX returns long, not int */
1174 return call_forms_Ri (fl_get_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001175}
1176
1177static object *
1178addto_menu (g, args)
1179 genericobject *g;
1180 object *args;
1181{
Guido van Rossumabe58351991-08-08 12:34:44 +00001182 return call_forms_INstr (fl_addto_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001183}
1184
1185static struct methodlist menu_methods[] = {
1186 {"set_menu", set_menu},
1187 {"get_menu", get_menu},
1188 {"addto_menu", addto_menu},
1189 {NULL, NULL} /* sentinel */
1190};
1191
1192
1193/* Class: Sliders */
1194
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001195#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001196static object *
1197set_slider (g, args)
1198 genericobject *g;
1199 object *args;
1200{
1201 float f1, f2, f3;
1202
Guido van Rossumfc58e581992-01-27 16:45:55 +00001203 if (!args(args, "(fff)", &f1, &f2, &f3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001204 return NULL;
1205 fl_set_slider (g->ob_generic, f1, f2, f3);
1206 INCREF(None);
1207 return None;
1208}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001209#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001210
1211static object *
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001212get_slider_value(g, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001213 genericobject *g;
1214 object *args;
1215{
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001216 return call_forms_Rf (fl_get_slider_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001217}
1218
1219static object *
1220set_slider_value (g, args)
1221 genericobject *g;
1222 object *args;
1223{
1224 return call_forms_INf (fl_set_slider_value, g-> ob_generic, args);
1225}
1226
1227static object *
1228set_slider_bounds (g, args)
1229 genericobject *g;
1230 object *args;
1231{
1232 return call_forms_INfINf (fl_set_slider_bounds, g-> ob_generic, args);
1233}
1234
1235static object *
1236get_slider_bounds (g, args)
1237 genericobject *g;
1238 object *args;
1239{
1240 return call_forms_OUTfOUTf(fl_get_slider_bounds, g-> ob_generic, args);
1241}
1242
1243static object *
1244set_slider_return (g, args)
1245 genericobject *g;
1246 object *args;
1247{
1248 return call_forms_INf (fl_set_slider_return, g-> ob_generic, args);
1249}
1250
1251static object *
1252set_slider_size (g, args)
1253 genericobject *g;
1254 object *args;
1255{
1256 return call_forms_INf (fl_set_slider_size, g-> ob_generic, args);
1257}
1258
1259static object *
1260set_slider_precision (g, args)
1261 genericobject *g;
1262 object *args;
1263{
1264 return call_forms_INi (fl_set_slider_precision, g-> ob_generic, args);
1265}
1266
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001267#ifndef FL_V15
1268static object *
1269set_slider_step (g, args)
1270 genericobject *g;
1271 object *args;
1272{
1273 return call_forms_INf (fl_set_slider_step, g-> ob_generic, args);
1274}
1275#endif /* !FL_V15 */
1276
1277
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001278static struct methodlist slider_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001279#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001280 {"set_slider", set_slider},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001281 {"get_slider", get_slider_value},
1282#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001283 {"set_slider_value", set_slider_value},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001284 {"get_slider_value", get_slider_value},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001285 {"set_slider_bounds", set_slider_bounds},
1286 {"get_slider_bounds", get_slider_bounds},
1287 {"set_slider_return", set_slider_return},
1288 {"set_slider_size", set_slider_size},
1289 {"set_slider_precision",set_slider_precision},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001290#ifndef FL_V15
1291 {"set_slider_step", set_slider_step},
1292#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001293 {NULL, NULL} /* sentinel */
1294};
1295
1296static object *
1297set_positioner_xvalue (g, args)
1298 genericobject *g;
1299 object *args;
1300{
1301 return call_forms_INf (fl_set_positioner_xvalue, g-> ob_generic, args);
1302}
1303
1304static object *
1305set_positioner_xbounds (g, args)
1306 genericobject *g;
1307 object *args;
1308{
1309 return call_forms_INfINf (fl_set_positioner_xbounds, g-> ob_generic, args);
1310}
1311
1312static object *
1313set_positioner_yvalue (g, args)
1314 genericobject *g;
1315 object *args;
1316{
1317 return call_forms_INf (fl_set_positioner_yvalue, g-> ob_generic, args);
1318}
1319
1320static object *
1321set_positioner_ybounds (g, args)
1322 genericobject *g;
1323 object *args;
1324{
1325 return call_forms_INfINf (fl_set_positioner_ybounds, g-> ob_generic, args);
1326}
1327
1328static object *
1329get_positioner_xvalue (g, args)
1330 genericobject *g;
1331 object *args;
1332{
1333 return call_forms_Rf (fl_get_positioner_xvalue, g-> ob_generic, args);
1334}
1335
1336static object *
1337get_positioner_xbounds (g, args)
1338 genericobject *g;
1339 object *args;
1340{
1341 return call_forms_OUTfOUTf (fl_get_positioner_xbounds, g-> ob_generic, args);
1342}
1343
1344static object *
1345get_positioner_yvalue (g, args)
1346 genericobject *g;
1347 object *args;
1348{
1349 return call_forms_Rf (fl_get_positioner_yvalue, g-> ob_generic, args);
1350}
1351
1352static object *
1353get_positioner_ybounds (g, args)
1354 genericobject *g;
1355 object *args;
1356{
1357 return call_forms_OUTfOUTf (fl_get_positioner_ybounds, g-> ob_generic, args);
1358}
1359
1360static struct methodlist positioner_methods[] = {
1361 {"set_positioner_xvalue", set_positioner_xvalue},
1362 {"set_positioner_yvalue", set_positioner_yvalue},
1363 {"set_positioner_xbounds", set_positioner_xbounds},
1364 {"set_positioner_ybounds", set_positioner_ybounds},
1365 {"get_positioner_xvalue", get_positioner_xvalue},
1366 {"get_positioner_yvalue", get_positioner_yvalue},
1367 {"get_positioner_xbounds", get_positioner_xbounds},
Guido van Rossum03747111991-08-08 12:10:01 +00001368 {"get_positioner_ybounds", get_positioner_ybounds},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001369 {NULL, NULL} /* sentinel */
1370};
1371
1372/* Class timer */
1373
1374static object *
1375set_timer (g, args)
1376 genericobject *g;
1377 object *args;
1378{
1379 return call_forms_INf (fl_set_timer, g-> ob_generic, args);
1380}
1381
1382static object *
1383get_timer (g, args)
1384 genericobject *g;
1385 object *args;
1386{
1387 return call_forms_Rf (fl_get_timer, g-> ob_generic, args);
1388}
1389
1390static struct methodlist timer_methods[] = {
1391 {"set_timer", set_timer},
1392 {"get_timer", get_timer},
1393 {NULL, NULL} /* sentinel */
1394};
1395
1396/* Form objects */
1397
1398typedef struct {
1399 OB_HEAD
1400 FL_FORM *ob_form;
1401} formobject;
1402
1403extern typeobject Formtype; /* Forward */
1404
1405#define is_formobject(v) ((v)->ob_type == &Formtype)
1406
1407static object *
1408form_show_form(f, args)
1409 formobject *f;
1410 object *args;
1411{
1412 int place, border;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001413 char *name;
1414 if (!getargs(args, "(iis)", &place, &border, &name))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001415 return NULL;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001416 fl_show_form(f->ob_form, place, border, name);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001417 INCREF(None);
1418 return None;
1419}
1420
1421static object *
1422form_call(func, f, args)
1423 FL_FORM *f;
1424 object *args;
1425 void (*func)(FL_FORM *);
1426{
1427 if (!getnoarg(args)) return NULL;
1428
1429 (*func)(f);
1430
1431 INCREF(None);
1432 return None;
1433}
1434
1435static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001436form_call_INiINi(func, f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001437 FL_FORM *f;
1438 object *args;
1439 void (*func)(FL_FORM *, int, int);
1440{
1441 int a, b;
1442
1443 if (!getintintarg(args, &a, &b)) return NULL;
1444
1445 (*func)(f, a, b);
1446
1447 INCREF(None);
1448 return None;
1449}
1450
1451static object *
1452form_hide_form(f, args)
1453 formobject *f;
1454 object *args;
1455{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001456 return form_call(fl_hide_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001457}
1458
1459static object *
1460form_redraw_form(f, args)
1461 formobject *f;
1462 object *args;
1463{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001464 return form_call(fl_redraw_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001465}
1466
1467static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001468form_add_object(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001469 formobject *f;
1470 object *args;
1471{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001472 if (args == NULL || !is_genericobject(args)) {
1473 err_badarg();
1474 return NULL;
1475 }
1476
1477 fl_add_object(f->ob_form, ((genericobject *)args) -> ob_generic);
1478
1479 INCREF(None);
1480 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001481}
1482
1483static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001484form_set_form_position(f, args)
1485 formobject *f;
1486 object *args;
1487{
1488 return form_call_INiINi(fl_set_form_position, f-> ob_form, args);
1489}
1490
1491static object *
1492generic_add_object(f, args, func, internal_methods)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001493 formobject *f;
1494 object *args;
1495 FL_OBJECT *(*func)(int, float, float, float, float, char*);
1496 struct methodlist *internal_methods;
1497{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001498 int type;
1499 float x, y, w, h;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001500 char *name;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001501 FL_OBJECT *obj;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001502
Guido van Rossumfc58e581992-01-27 16:45:55 +00001503 if (!getargs(args,"(iffffs)", &type,&x,&y,&w,&h,&name))
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001504 return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001505
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001506 fl_addto_form (f-> ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001507
Guido van Rossumfc58e581992-01-27 16:45:55 +00001508 obj = (*func) (type, x, y, w, h, name);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001509
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001510 fl_end_form();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001511
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001512 if (obj == NULL) {
1513 err_nomem();
1514 return NULL;
1515 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001516
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001517 return newgenericobject (obj, internal_methods);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001518}
1519
1520static object *
1521form_add_button(f, args)
1522 formobject *f;
1523 object *args;
1524{
1525 return generic_add_object(f, args, fl_add_button, button_methods);
1526}
1527
1528static object *
1529form_add_lightbutton(f, args)
1530 formobject *f;
1531 object *args;
1532{
1533 return generic_add_object(f, args, fl_add_lightbutton, button_methods);
1534}
1535
1536static object *
1537form_add_roundbutton(f, args)
1538 formobject *f;
1539 object *args;
1540{
1541 return generic_add_object(f, args, fl_add_roundbutton, button_methods);
1542}
1543
1544static object *
1545form_add_menu (f, args)
1546 formobject *f;
1547 object *args;
1548{
1549 return generic_add_object(f, args, fl_add_menu, menu_methods);
1550}
1551
1552static object *
1553form_add_slider(f, args)
1554 formobject *f;
1555 object *args;
1556{
1557 return generic_add_object(f, args, fl_add_slider, slider_methods);
1558}
1559
1560static object *
1561form_add_valslider(f, args)
1562 formobject *f;
1563 object *args;
1564{
1565 return generic_add_object(f, args, fl_add_valslider, slider_methods);
1566}
1567
1568static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001569form_add_dial(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001570 formobject *f;
1571 object *args;
1572{
1573 return generic_add_object(f, args, fl_add_dial, dial_methods);
1574}
1575
1576static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001577form_add_counter(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001578 formobject *f;
1579 object *args;
1580{
1581 return generic_add_object(f, args, fl_add_counter, counter_methods);
1582}
1583
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001584#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001585static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001586form_add_default(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001587 formobject *f;
1588 object *args;
1589{
1590 return generic_add_object(f, args, fl_add_default, default_methods);
1591}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001592#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001593
1594static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001595form_add_clock(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001596 formobject *f;
1597 object *args;
1598{
1599 return generic_add_object(f, args, fl_add_clock, clock_methods);
1600}
1601
1602static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001603form_add_box(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001604 formobject *f;
1605 object *args;
1606{
Guido van Rossum03747111991-08-08 12:10:01 +00001607 return generic_add_object(f, args, fl_add_box,
1608 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001609}
1610
1611static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001612form_add_choice(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001613 formobject *f;
1614 object *args;
1615{
1616 return generic_add_object(f, args, fl_add_choice, choice_methods);
1617}
1618
1619static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001620form_add_browser(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001621 formobject *f;
1622 object *args;
1623{
1624 return generic_add_object(f, args, fl_add_browser, browser_methods);
1625}
1626
1627static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001628form_add_positioner(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001629 formobject *f;
1630 object *args;
1631{
1632 return generic_add_object(f, args, fl_add_positioner, positioner_methods);
1633}
1634
1635static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001636form_add_input(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001637 formobject *f;
1638 object *args;
1639{
1640 return generic_add_object(f, args, fl_add_input, input_methods);
1641}
1642
1643static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001644form_add_text(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001645 formobject *f;
1646 object *args;
1647{
Guido van Rossum03747111991-08-08 12:10:01 +00001648 return generic_add_object(f, args, fl_add_text,
1649 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001650}
1651
1652static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001653form_add_timer(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001654 formobject *f;
1655 object *args;
1656{
1657 return generic_add_object(f, args, fl_add_timer, timer_methods);
1658}
1659
1660static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001661form_freeze_form(f, args)
1662 formobject *f;
1663 object *args;
1664{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001665 return form_call(fl_freeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001666}
1667
1668static object *
1669form_unfreeze_form(f, args)
1670 formobject *f;
1671 object *args;
1672{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001673 return form_call(fl_unfreeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001674}
1675
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001676#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001677static object *
1678form_remove_form(f, args)
1679 formobject *f;
1680 object *args;
1681{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001682 return form_call(fl_remove_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001683}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001684#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001685
1686static object *
1687form_activate_form(f, args)
1688 formobject *f;
1689 object *args;
1690{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001691 return form_call(fl_activate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001692}
1693
1694static object *
1695form_deactivate_form(f, args)
1696 formobject *f;
1697 object *args;
1698{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001699 return form_call(fl_deactivate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001700}
1701
Guido van Rossum75cc8981991-08-08 12:07:45 +00001702static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001703form_bgn_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001704 formobject *f;
1705 object *args;
1706{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001707 FL_OBJECT *obj;
1708
1709 fl_addto_form(f-> ob_form);
1710 obj = fl_bgn_group();
1711 fl_end_form();
1712
1713 if (obj == NULL) {
1714 err_nomem();
1715 return NULL;
1716 }
1717
1718 return newgenericobject (obj, (struct methodlist *) NULL);
Guido van Rossum03747111991-08-08 12:10:01 +00001719}
1720
1721static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001722form_end_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001723 formobject *f;
1724 object *args;
1725{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001726 fl_addto_form(f-> ob_form);
Guido van Rossum03747111991-08-08 12:10:01 +00001727 fl_end_group();
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001728 fl_end_form();
Guido van Rossum03747111991-08-08 12:10:01 +00001729 INCREF(None);
1730 return None;
1731}
1732
1733static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001734forms_find_first_or_last(func, f, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00001735 FL_OBJECT *(*func)(FL_FORM *, int, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +00001736 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001737 object *args;
1738{
1739 int type;
1740 float mx, my;
1741 FL_OBJECT *generic;
1742 genericobject *g;
1743
Guido van Rossumfc58e581992-01-27 16:45:55 +00001744 if (!getargs(args, "(iff)", &type, &mx, &my)) return NULL;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001745
Guido van Rossum03747111991-08-08 12:10:01 +00001746 generic = (*func) (f-> ob_form, type, mx, my);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001747
1748 if (generic == NULL)
1749 {
1750 INCREF(None);
1751 return None;
1752 }
1753
1754 g = findgeneric(generic);
1755 if (g == NULL) {
1756 err_setstr(RuntimeError,
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001757 "forms_find_{first|last} returns unknown object");
Guido van Rossum75cc8981991-08-08 12:07:45 +00001758 return NULL;
1759 }
1760 INCREF(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001761 return (object *) g;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001762}
1763
1764static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001765form_find_first(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001766 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001767 object *args;
1768{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001769 return forms_find_first_or_last(fl_find_first, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001770}
1771
1772static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001773form_find_last(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001774 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001775 object *args;
1776{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001777 return forms_find_first_or_last(fl_find_last, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001778}
1779
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001780static struct methodlist form_methods[] = {
1781/* adm */
1782 {"show_form", form_show_form},
1783 {"hide_form", form_hide_form},
1784 {"redraw_form", form_redraw_form},
1785 {"set_form_position", form_set_form_position},
1786 {"freeze_form", form_freeze_form},
1787 {"unfreeze_form", form_unfreeze_form},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001788#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001789 {"remove_form", form_remove_form},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001790#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001791 {"activate_form", form_activate_form},
1792 {"deactivate_form", form_deactivate_form},
Guido van Rossum03747111991-08-08 12:10:01 +00001793 {"bgn_group", form_bgn_group},
1794 {"end_group", form_end_group},
Guido van Rossum75cc8981991-08-08 12:07:45 +00001795 {"find_first", form_find_first},
1796 {"find_last", form_find_last},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001797
1798/* basic objects */
1799 {"add_button", form_add_button},
1800/* {"add_bitmap", form_add_bitmap}, */
1801 {"add_lightbutton", form_add_lightbutton},
1802 {"add_roundbutton", form_add_roundbutton},
1803 {"add_menu", form_add_menu},
1804 {"add_slider", form_add_slider},
1805 {"add_positioner", form_add_positioner},
1806 {"add_valslider", form_add_valslider},
1807 {"add_dial", form_add_dial},
1808 {"add_counter", form_add_counter},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001809#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001810 {"add_default", form_add_default},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001811#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001812 {"add_box", form_add_box},
1813 {"add_clock", form_add_clock},
1814 {"add_choice", form_add_choice},
1815 {"add_browser", form_add_browser},
1816 {"add_input", form_add_input},
1817 {"add_timer", form_add_timer},
1818 {"add_text", form_add_text},
1819 {NULL, NULL} /* sentinel */
1820};
1821
1822static void
1823form_dealloc(f)
1824 formobject *f;
1825{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001826 releaseobjects(f->ob_form);
Guido van Rossum336b5911992-04-08 11:16:25 +00001827 if (f->ob_form->visible)
1828 fl_hide_form(f->ob_form);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001829 fl_free_form(f->ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001830 DEL(f);
1831}
1832
Guido van Rossumd97f0481991-11-19 20:26:28 +00001833#define OFF(x) offsetof(FL_FORM, x)
1834
Guido van Rossum32db5e31991-11-12 15:43:18 +00001835static struct memberlist form_memberlist[] = {
1836 {"window", T_LONG, OFF(window), RO},
1837 {"w", T_FLOAT, OFF(w)},
1838 {"h", T_FLOAT, OFF(h)},
1839 {"x", T_FLOAT, OFF(x)},
1840 {"y", T_FLOAT, OFF(y)},
1841 {"deactivated", T_INT, OFF(deactivated)},
1842 {"visible", T_INT, OFF(visible)},
1843 {"frozen", T_INT, OFF(frozen)},
1844 {"doublebuf", T_INT, OFF(doublebuf)},
1845 {NULL} /* Sentinel */
1846};
1847
Guido van Rossumd97f0481991-11-19 20:26:28 +00001848#undef OFF
1849
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001850static object *
1851form_getattr(f, name)
1852 formobject *f;
1853 char *name;
1854{
Guido van Rossum32db5e31991-11-12 15:43:18 +00001855 object *meth;
1856
1857 meth = findmethod(form_methods, (object *)f, name);
1858 if (meth != NULL)
1859 return meth;
1860 err_clear();
1861 return getmember((char *)f->ob_form, form_memberlist, name);
1862}
1863
1864static int
1865form_setattr(f, name, v)
1866 formobject *f;
1867 char *name;
1868 object *v;
1869{
1870 int ret;
1871
1872 if (v == NULL) {
1873 err_setstr(TypeError, "can't delete form attributes");
1874 return NULL;
1875 }
1876
1877 return setmember((char *)f->ob_form, form_memberlist, name, v);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001878}
1879
1880typeobject Formtype = {
1881 OB_HEAD_INIT(&Typetype)
1882 0, /*ob_size*/
1883 "form", /*tp_name*/
1884 sizeof(formobject), /*tp_size*/
1885 0, /*tp_itemsize*/
1886 /* methods */
1887 form_dealloc, /*tp_dealloc*/
1888 0, /*tp_print*/
1889 form_getattr, /*tp_getattr*/
Guido van Rossum32db5e31991-11-12 15:43:18 +00001890 form_setattr, /*tp_setattr*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001891 0, /*tp_compare*/
1892 0, /*tp_repr*/
1893};
1894
1895static object *
1896newformobject(form)
1897 FL_FORM *form;
1898{
1899 formobject *f;
1900 f = NEWOBJ(formobject, &Formtype);
1901 if (f == NULL)
1902 return NULL;
1903 f->ob_form = form;
1904 return (object *)f;
1905}
1906
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001907
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001908/* The "fl" module */
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001909
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001910static object *
1911forms_make_form(dummy, args)
1912 object *dummy;
1913 object *args;
1914{
1915 int type;
1916 float w, h;
1917 FL_FORM *form;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001918 if (!getargs(args, "(iff)", &type, &w, &h))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001919 return NULL;
1920 form = fl_bgn_form(type, w, h);
1921 if (form == NULL) {
1922 /* XXX Actually, cannot happen! */
1923 err_nomem();
1924 return NULL;
1925 }
1926 fl_end_form();
1927 return newformobject(form);
1928}
1929
Guido van Rossum2bac4d31992-03-27 17:20:21 +00001930static object *
1931forms_activate_all_forms(f, args)
1932 object *f;
1933 object *args;
1934{
1935 fl_activate_all_forms();
1936 INCREF(None);
1937 return None;
1938}
1939
1940static object *
1941forms_deactivate_all_forms(f, args)
1942 object *f;
1943 object *args;
1944{
1945 fl_deactivate_all_forms();
1946 INCREF(None);
1947 return None;
1948}
1949
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001950static object *my_event_callback = NULL;
1951
1952static object *
1953forms_set_event_call_back(dummy, args)
1954 object *dummy;
1955 object *args;
1956{
1957 my_event_callback = args;
1958 XINCREF(args);
1959 INCREF(None);
1960 return None;
1961}
1962
1963static object *
1964forms_do_or_check_forms(dummy, args, func)
1965 object *dummy;
1966 object *args;
1967 FL_OBJECT *(*func)();
1968{
1969 FL_OBJECT *generic;
1970 genericobject *g;
1971 object *arg, *res;
1972
1973 if (!getnoarg(args))
1974 return NULL;
1975
1976 for (;;) {
Jack Jansen743db361992-08-13 14:13:11 +00001977 BGN_SAVE
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001978 generic = (*func)();
Jack Jansen743db361992-08-13 14:13:11 +00001979 END_SAVE
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001980 if (generic == NULL) {
1981 INCREF(None);
1982 return None;
1983 }
1984 if (generic == FL_EVENT) {
1985 int dev;
1986 short val;
1987 if (my_event_callback == NULL)
1988 return newintobject(-1);
1989 dev = fl_qread(&val);
1990 arg = newtupleobject(2);
1991 if (arg == NULL)
1992 return NULL;
1993 settupleitem(arg, 0, newintobject((long)dev));
1994 settupleitem(arg, 1, newintobject((long)val));
1995 res = call_object(my_event_callback, arg);
1996 XDECREF(res);
1997 DECREF(arg);
1998 if (res == NULL)
1999 return NULL; /* Callback raised exception */
2000 continue;
2001 }
2002 g = findgeneric(generic);
2003 if (g == NULL) {
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002004 /* XXX What kind of weird object is this? */
2005 /* XXX Maybe caused by a bug here */
2006 fprintf(stderr, "weird object: class %d, label '%s'\n",
2007 generic->objclass, generic->label);
2008 continue; /* Ignore it */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002009 }
2010 if (g->ob_callback == NULL) {
2011 INCREF(g);
2012 return ((object *) g);
2013 }
2014 arg = newtupleobject(2);
2015 INCREF(g);
Guido van Rossumabe58351991-08-08 12:34:44 +00002016 settupleitem(arg, 0, (object *)g);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002017 INCREF(g->ob_callback_arg);
2018 settupleitem(arg, 1, g->ob_callback_arg);
2019 res = call_object(g->ob_callback, arg);
2020 XDECREF(res);
2021 DECREF(arg);
2022 if (res == NULL)
2023 return NULL; /* Callback raised exception */
2024 }
2025}
2026
2027static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002028forms_do_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002029 object *dummy;
2030 object *args;
2031{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002032 return forms_do_or_check_forms(dummy, args, fl_do_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002033}
2034
2035static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002036forms_check_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002037 object *dummy;
2038 object *args;
2039{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002040 return forms_do_or_check_forms(dummy, args, fl_check_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002041}
2042
Guido van Rossum03747111991-08-08 12:10:01 +00002043#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002044static object *
2045fl_call(func, args)
2046 object *args;
2047 void (*func)();
2048{
2049 if (!getnoarg(args))
2050 return NULL;
2051 (*func)();
2052 INCREF(None);
2053 return None;
2054}
Guido van Rossum03747111991-08-08 12:10:01 +00002055#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002056
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002057#ifndef FL_V15
2058static object *
2059forms_set_graphics_mode(dummy, args)
2060 object *dummy;
2061 object *args;
2062{
2063 int rgbmode, doublebuf;
2064
2065 if (!getintintarg(args, &rgbmode, &doublebuf))
2066 return NULL;
2067 fl_set_graphics_mode(rgbmode,doublebuf);
2068 INCREF(None);
2069 return None;
2070}
2071
2072static object *
2073forms_get_rgbmode(dummy, args)
2074 object *dummy;
2075 object *args;
2076{
2077 extern fl_rgbmode;
2078
2079 if (args != NULL) {
2080 err_badarg();
2081 return NULL;
2082 }
2083 return newintobject(fl_rgbmode);
2084}
2085#endif /* !FL_V15 */
2086
2087
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002088static object *
2089forms_qdevice(self, args)
2090 object *self;
2091 object *args;
2092{
2093 short arg1 ;
2094 if (!getishortarg(args, 1, 0, &arg1))
2095 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002096 fl_qdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002097 INCREF(None);
2098 return None;
2099}
2100
2101static object *
2102forms_unqdevice(self, args)
2103 object *self;
2104 object *args;
2105{
2106 short arg1 ;
2107 if (!getishortarg(args, 1, 0, &arg1))
2108 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002109 fl_unqdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002110 INCREF(None);
2111 return None;
2112}
2113
2114static object *
2115forms_isqueued(self, args)
2116 object *self;
2117 object *args;
2118{
Guido van Rossum03747111991-08-08 12:10:01 +00002119 long retval;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002120 short arg1 ;
2121 if (!getishortarg(args, 1, 0, &arg1))
2122 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002123 retval = fl_isqueued(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002124
Guido van Rossum03747111991-08-08 12:10:01 +00002125 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002126}
2127
2128static object *
2129forms_qtest(self, args)
2130 object *self;
2131 object *args;
2132{
2133 long retval;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002134 retval = fl_qtest();
Guido van Rossum03747111991-08-08 12:10:01 +00002135 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002136}
2137
2138
2139static object *
2140forms_qread(self, args)
2141 object *self;
2142 object *args;
2143{
2144 long retval;
2145 short arg1 ;
Jack Jansen743db361992-08-13 14:13:11 +00002146 BGN_SAVE
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002147 retval = fl_qread(&arg1);
Jack Jansen743db361992-08-13 14:13:11 +00002148 END_SAVE
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002149 { object *v = newtupleobject(2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002150 if (v == NULL) return NULL;
2151 settupleitem(v, 0, newintobject(retval));
2152 settupleitem(v, 1, newintobject((long)arg1));
2153 return v;
2154 }
2155}
2156
2157static object *
2158forms_qreset(self, args)
2159 object *self;
2160 object *args;
2161{
2162 if (!getnoarg(args)) return NULL;
2163
Guido van Rossum03747111991-08-08 12:10:01 +00002164 fl_qreset();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002165 INCREF(None);
2166 return None;
2167}
2168
2169static object *
2170forms_qenter(self, args)
2171 object *self;
2172 object *args;
2173{
2174 short arg1 ;
2175 short arg2 ;
2176 if (!getishortarg(args, 2, 0, &arg1))
2177 return NULL;
2178 if (!getishortarg(args, 2, 1, &arg2))
2179 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002180 fl_qenter(arg1, arg2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002181 INCREF(None);
2182 return None;
2183}
2184
2185static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002186forms_color(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002187 object *self;
2188 object *args;
2189{
2190 int arg;
2191
2192 if (!getintarg(args, &arg)) return NULL;
2193
2194 fl_color((short) arg);
2195
2196 INCREF(None);
2197 return None;
2198}
2199
2200static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002201forms_mapcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002202 object *self;
2203 object *args;
2204{
2205 int arg0, arg1, arg2, arg3;
2206
Guido van Rossumfc58e581992-01-27 16:45:55 +00002207 if (!getargs(args, "(iiii)", &arg0, &arg1, &arg2, &arg3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002208 return NULL;
2209
2210 fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);
2211
2212 INCREF(None);
2213 return None;
2214}
2215
2216static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002217forms_getmcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002218 object *self;
2219 object *args;
2220{
Guido van Rossum03747111991-08-08 12:10:01 +00002221 int arg;
2222 short r, g, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002223 object *v;
2224
2225 if (!getintarg(args, &arg)) return NULL;
2226
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002227 fl_getmcolor(arg, &r, &g, &b);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002228
2229 v = newtupleobject(3);
2230
2231 if (v == NULL) return NULL;
2232
Guido van Rossum03747111991-08-08 12:10:01 +00002233 settupleitem(v, 0, newintobject((long)r));
2234 settupleitem(v, 1, newintobject((long)g));
2235 settupleitem(v, 2, newintobject((long)b));
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002236
2237 return v;
2238}
2239
2240static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002241forms_get_mouse(self, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00002242 object *self;
2243 object *args;
2244{
2245 float x, y ;
2246 object *v;
2247
2248 if (!getnoarg(args)) return NULL;
2249
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002250 fl_get_mouse(&x, &y);
Guido van Rossum75cc8981991-08-08 12:07:45 +00002251
2252 v = newtupleobject(2);
2253
2254 if (v == NULL) return NULL;
2255
2256 settupleitem(v, 0, newfloatobject(x));
2257 settupleitem(v, 1, newfloatobject(y));
2258
2259 return v;
2260}
2261
2262static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002263forms_tie(self, args)
2264 object *self;
2265 object *args;
2266{
2267 short arg1 ;
2268 short arg2 ;
2269 short arg3 ;
2270 if (!getishortarg(args, 3, 0, &arg1))
2271 return NULL;
2272 if (!getishortarg(args, 3, 1, &arg2))
2273 return NULL;
2274 if (!getishortarg(args, 3, 2, &arg3))
2275 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002276 fl_tie(arg1, arg2, arg3);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002277 INCREF(None);
2278 return None;
2279}
2280
Guido van Rossum03747111991-08-08 12:10:01 +00002281static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002282forms_show_message(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002283 object *f;
2284 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002285{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002286 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002287
Guido van Rossumfc58e581992-01-27 16:45:55 +00002288 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002289
Jack Jansen743db361992-08-13 14:13:11 +00002290 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002291 fl_show_message(a, b, c);
Jack Jansen743db361992-08-13 14:13:11 +00002292 END_SAVE
Guido van Rossum03747111991-08-08 12:10:01 +00002293
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002294 INCREF(None);
Guido van Rossum03747111991-08-08 12:10:01 +00002295 return None;
2296}
2297
2298static object *
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002299forms_show_choice(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002300 object *f;
2301 object *args;
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002302{
2303 char *m1, *m2, *m3, *b1, *b2, *b3;
2304 int nb;
2305 char *format;
Jack Jansen743db361992-08-13 14:13:11 +00002306 int rv;
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002307
2308 if (args == NULL || !is_tupleobject(args)) {
2309 err_badarg();
2310 return NULL;
2311 }
2312 nb = gettuplesize(args) - 3;
2313 if (nb <= 0) {
2314 err_setstr(TypeError, "need at least one button label");
2315 return NULL;
2316 }
2317 if (is_intobject(gettupleitem(args, 3))) {
2318 err_setstr(TypeError,
2319 "'number-of-buttons' argument not needed");
2320 return NULL;
2321 }
2322 switch (nb) {
2323 case 1: format = "(ssss)"; break;
2324 case 2: format = "(sssss)"; break;
2325 case 3: format = "(ssssss)"; break;
2326 default:
2327 err_setstr(TypeError, "too many button labels");
2328 return NULL;
2329 }
2330
2331 if (!getargs(args, format, &m1, &m2, &m3, &b1, &b2, &b3))
2332 return NULL;
2333
Jack Jansen743db361992-08-13 14:13:11 +00002334 BGN_SAVE
2335 rv = fl_show_choice(m1, m2, m3, nb, b1, b2, b3);
2336 END_SAVE
2337 return newintobject(rv);
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002338}
2339
2340static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002341forms_show_question(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002342 object *f;
2343 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002344{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002345 int ret;
2346 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002347
Guido van Rossumfc58e581992-01-27 16:45:55 +00002348 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002349
Jack Jansen743db361992-08-13 14:13:11 +00002350 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002351 ret = fl_show_question(a, b, c);
Jack Jansen743db361992-08-13 14:13:11 +00002352 END_SAVE
Guido van Rossum03747111991-08-08 12:10:01 +00002353
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002354 return newintobject((long) ret);
Guido van Rossum03747111991-08-08 12:10:01 +00002355}
2356
2357static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002358forms_show_input(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002359 object *f;
2360 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002361{
2362 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002363 char *a, *b;
Guido van Rossum03747111991-08-08 12:10:01 +00002364
2365 if (!getstrstrarg(args, &a, &b)) return NULL;
2366
Jack Jansen743db361992-08-13 14:13:11 +00002367 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002368 str = fl_show_input(a, b);
Jack Jansen743db361992-08-13 14:13:11 +00002369 END_SAVE
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002370
2371 if (str == NULL) {
2372 INCREF(None);
2373 return None;
2374 }
2375 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002376}
2377
2378static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002379forms_file_selector(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002380 object *f;
2381 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002382{
2383 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002384 char *a, *b, *c, *d;
Guido van Rossum03747111991-08-08 12:10:01 +00002385
Guido van Rossumfc58e581992-01-27 16:45:55 +00002386 if (!getargs(args, "(ssss)", &a, &b, &c, &d)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002387
Jack Jansen743db361992-08-13 14:13:11 +00002388 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002389 str = fl_show_file_selector(a, b, c, d);
Jack Jansen743db361992-08-13 14:13:11 +00002390 END_SAVE
Guido van Rossum03747111991-08-08 12:10:01 +00002391
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002392 if (str == NULL) {
2393 INCREF(None);
2394 return None;
2395 }
2396 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002397}
2398
2399
2400static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002401forms_file_selector_func(args, func)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002402 object *args;
2403 char *(*func)();
Guido van Rossum03747111991-08-08 12:10:01 +00002404{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002405 char *str;
Guido van Rossum03747111991-08-08 12:10:01 +00002406
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002407 str = (*func) ();
2408
2409 if (str == NULL) {
2410 INCREF(None);
2411 return None;
2412 }
2413 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002414}
2415
2416static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002417forms_get_directory(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002418 object *f;
2419 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002420{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002421 return forms_file_selector_func(args, fl_get_directory);
Guido van Rossum03747111991-08-08 12:10:01 +00002422}
2423
2424static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002425forms_get_pattern(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002426 object *f;
2427 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002428{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002429 return forms_file_selector_func(args, fl_get_pattern);
Guido van Rossum03747111991-08-08 12:10:01 +00002430}
2431
2432static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002433forms_get_filename(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002434 object *f;
2435 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002436{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002437 return forms_file_selector_func(args, fl_get_filename);
Guido van Rossum03747111991-08-08 12:10:01 +00002438}
2439
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002440static struct methodlist forms_methods[] = {
2441/* adm */
2442 {"make_form", forms_make_form},
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002443 {"activate_all_forms", forms_activate_all_forms},
2444 {"deactivate_all_forms",forms_deactivate_all_forms},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002445/* gl support wrappers */
2446 {"qdevice", forms_qdevice},
2447 {"unqdevice", forms_unqdevice},
2448 {"isqueued", forms_isqueued},
2449 {"qtest", forms_qtest},
2450 {"qread", forms_qread},
2451/* {"blkqread", forms_blkqread}, */
2452 {"qreset", forms_qreset},
2453 {"qenter", forms_qenter},
Guido van Rossum03747111991-08-08 12:10:01 +00002454 {"get_mouse", forms_get_mouse},
2455 {"tie", forms_tie},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002456/* {"new_events", forms_new_events}, */
2457 {"color", forms_color},
2458 {"mapcolor", forms_mapcolor},
2459 {"getmcolor", forms_getmcolor},
2460/* interaction */
2461 {"do_forms", forms_do_forms},
2462 {"check_forms", forms_check_forms},
2463 {"set_event_call_back", forms_set_event_call_back},
2464/* goodies */
Guido van Rossum03747111991-08-08 12:10:01 +00002465 {"show_message", forms_show_message},
2466 {"show_question", forms_show_question},
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002467 {"show_choice", forms_show_choice},
2468 {"show_input", forms_show_input},
2469 {"show_file_selector", forms_file_selector},
2470 {"file_selector", forms_file_selector}, /* BW compat */
Guido van Rossum03747111991-08-08 12:10:01 +00002471 {"get_directory", forms_get_directory},
2472 {"get_pattern", forms_get_pattern},
2473 {"get_filename", forms_get_filename},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002474#ifndef FL_V15
2475 {"set_graphics_mode", forms_set_graphics_mode},
2476 {"get_rgbmode", forms_get_rgbmode},
2477#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002478 {NULL, NULL} /* sentinel */
2479};
2480
2481void
2482initfl()
2483{
2484 initmodule("fl", forms_methods);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002485 foreground();
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002486#ifndef FL_V15
2487 fl_init();
2488#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002489}