blob: 277b1fa9f12570398d65ceffe1b27a168740d1e2 [file] [log] [blame]
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001/**********************************************************
2Copyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
3Netherlands.
4
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* FL module -- interface to Mark Overmars' FORMS Library. */
26
27#include "forms.h"
28
29#include "allobjects.h"
30#include "import.h"
31#include "modsupport.h"
32#include "structmember.h"
33
34/* #include "ceval.h" */
35extern object *call_object(object *, object *);
36
37/* Generic Forms Objects */
38
39typedef struct {
40 OB_HEAD
41 FL_OBJECT *ob_generic;
42 struct methodlist *ob_methods;
43 object *ob_callback;
44 object *ob_callback_arg;
45} genericobject;
46
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000047extern typeobject GenericObjecttype; /* Forward */
48
49#define is_genericobject(g) ((g)->ob_type == &GenericObjecttype)
50
51/* List of all objects (XXX this should be a hash table on address...) */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000052
53static object *allgenerics = NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000054static int nfreeslots = 0;
55
56/* Add an object to the list of known objects */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000057
58static void
59knowgeneric(g)
60 genericobject *g;
61{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000062 int i, n;
63 /* Create the list if it doesn't already exist */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000064 if (allgenerics == NULL) {
65 allgenerics = newlistobject(0);
66 if (allgenerics == NULL) {
67 err_clear();
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000068 return; /* Too bad, live without allgenerics... */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000069 }
70 }
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000071 if (nfreeslots > 0) {
72 /* Search the list for reusable slots (NULL items) */
73 /* XXX This can be made faster! */
74 n = getlistsize(allgenerics);
75 for (i = 0; i < n; i++) {
76 if (getlistitem(allgenerics, i) == NULL) {
77 INCREF(g);
78 setlistitem(allgenerics, i, (object *)g);
79 nfreeslots--;
80 return;
81 }
82 }
83 /* Strange... no free slots found... */
84 nfreeslots = 0;
85 }
86 /* No free entries, append new item to the end */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000087 addlistitem(allgenerics, (object *)g);
88}
89
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000090/* Find an object in the list of known objects */
91
Guido van Rossumc7df79e1991-08-07 11:32:58 +000092static genericobject *
93findgeneric(generic)
94 FL_OBJECT *generic;
95{
96 int i, n;
97 genericobject *g;
98
99 if (allgenerics == NULL)
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000100 return NULL; /* No objects known yet */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000101 n = getlistsize(allgenerics);
102 for (i = 0; i < n; i++) {
103 g = (genericobject *)getlistitem(allgenerics, i);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000104 if (g != NULL && g->ob_generic == generic)
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000105 return g;
106 }
107 return NULL; /* Unknown object */
108}
109
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000110/* Called when a form is about to be freed --
111 remove all the objects that we know about from it. */
112
113static void
114releaseobjects(form)
115 FL_FORM *form;
116{
117 int i, n;
118 genericobject *g;
119
120 if (allgenerics == NULL)
121 return; /* No objects known yet */
122 n = getlistsize(allgenerics);
123 for (i = 0; i < n; i++) {
124 g = (genericobject *)getlistitem(allgenerics, i);
125 if (g != NULL && g->ob_generic->form == form) {
126 fl_delete_object(g->ob_generic);
127 if (g->ob_refcnt == 1) {
128 /* The object is now unreachable:
129 delete it from the list of known objects */
130 setlistitem(allgenerics, i, (object *)NULL);
131 nfreeslots++;
132 }
133 }
134 }
135 /* XXX Should also get rid of objects with refcnt==1 */
136}
137
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000138
139/* Methods of generic objects */
140
141static object *
142generic_set_call_back(g, args)
143 genericobject *g;
144 object *args;
145{
146 if (args == NULL) {
147 XDECREF(g->ob_callback);
148 XDECREF(g->ob_callback_arg);
149 g->ob_callback = NULL;
150 g->ob_callback_arg = NULL;
151 }
152 else {
153 if (!is_tupleobject(args) || gettuplesize(args) != 2) {
154 err_badarg();
155 return NULL;
156 }
157 XDECREF(g->ob_callback);
158 XDECREF(g->ob_callback_arg);
159 g->ob_callback = gettupleitem(args, 0);
160 INCREF(g->ob_callback);
161 g->ob_callback_arg = gettupleitem(args, 1);
162 INCREF(g->ob_callback_arg);
163 }
164 INCREF(None);
165 return None;
166}
167
168static object *
169generic_call(g, args, func)
170 genericobject *g;
171 object *args;
172 void (*func)(FL_OBJECT *);
173{
174 if (!getnoarg(args))
175 return NULL;
176 (*func)(g->ob_generic);
177 INCREF(None);
178 return None;
179}
180
181static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000182generic_delete_object(g, args)
183 genericobject *g;
184 object *args;
185{
186 object *res;
187 res = generic_call(g, args, fl_delete_object);
188 /* XXX Should remove it from the list of known objects */
189 return res;
190}
191
192static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000193generic_show_object(g, args)
194 genericobject *g;
195 object *args;
196{
197 return generic_call(g, args, fl_show_object);
198}
199
200static object *
201generic_hide_object(g, args)
202 genericobject *g;
203 object *args;
204{
205 return generic_call(g, args, fl_hide_object);
206}
207
208static object *
209generic_redraw_object(g, args)
210 genericobject *g;
211 object *args;
212{
213 return generic_call(g, args, fl_redraw_object);
214}
215
216static object *
217generic_freeze_object(g, args)
218 genericobject *g;
219 object *args;
220{
221 return generic_call(g, args, fl_freeze_object);
222}
223
224static object *
225generic_unfreeze_object(g, args)
226 genericobject *g;
227 object *args;
228{
229 return generic_call(g, args, fl_unfreeze_object);
230}
231
232static struct methodlist generic_methods[] = {
233 {"set_call_back", generic_set_call_back},
Guido van Rossum32db5e31991-11-12 15:43:18 +0000234 {"delete_object", generic_delete_object},
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000235 {"show_object", generic_show_object},
236 {"hide_object", generic_hide_object},
237 {"redraw_object", generic_redraw_object},
238 {"freeze_object", generic_freeze_object},
239 {"unfreeze_object", generic_unfreeze_object},
240#if 0
241 {"handle_object", generic_handle_object},
242 {"handle_object_direct",generic_handle_object_direct},
243#endif
Guido van Rossum03747111991-08-08 12:10:01 +0000244 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000245};
246
247static void
248generic_dealloc(g)
249 genericobject *g;
250{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000251 fl_free_object(g->ob_generic);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000252 DEL(g);
253}
254
255#define OFF(x) offsetof(FL_OBJECT, x)
256
257static struct memberlist generic_memberlist[] = {
258 {"objclass", T_INT, OFF(objclass), RO},
259 {"type", T_INT, OFF(type), RO},
260 {"boxtype", T_INT, OFF(boxtype)},
261 {"x", T_FLOAT, OFF(x)},
262 {"y", T_FLOAT, OFF(y)},
263 {"w", T_FLOAT, OFF(w)},
264 {"h", T_FLOAT, OFF(h)},
265 {"col1", T_INT, OFF(col1)},
266 {"col2", T_INT, OFF(col2)},
267 {"align", T_INT, OFF(align)},
268 {"lcol", T_INT, OFF(lcol)},
269 {"lsize", T_FLOAT, OFF(lsize)},
270 /* "label" is treated specially! */
271 {"lstyle", T_INT, OFF(lstyle)},
272 {"pushed", T_INT, OFF(pushed), RO},
273 {"focus", T_INT, OFF(focus), RO},
274 {"belowmouse", T_INT, OFF(belowmouse),RO},
275 {"frozen", T_INT, OFF(frozen), RO},
276 {"active", T_INT, OFF(active), RO},
277 {"input", T_INT, OFF(input), RO},
278 {"visible", T_INT, OFF(visible), RO},
279 {"radio", T_INT, OFF(radio), RO},
280 {"automatic", T_INT, OFF(automatic), RO},
281 {NULL} /* Sentinel */
282};
283
Guido van Rossumd97f0481991-11-19 20:26:28 +0000284#undef OFF
285
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000286static object *
287generic_getattr(g, name)
288 genericobject *g;
289 char *name;
290{
291 object *meth;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000292
293 /* XXX Ought to special-case name "__methods__" */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000294 if (g-> ob_methods) {
Guido van Rossum03747111991-08-08 12:10:01 +0000295 meth = findmethod(g->ob_methods, (object *)g, name);
296 if (meth != NULL) return meth;
297 err_clear();
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000298 }
299
300 meth = findmethod(generic_methods, (object *)g, name);
301 if (meth != NULL)
302 return meth;
303 err_clear();
304
305 /* "label" is an exception, getmember only works for char pointers,
306 not for char arrays */
307 if (strcmp(name, "label") == 0)
308 return newstringobject(g->ob_generic->label);
309
310 return getmember((char *)g->ob_generic, generic_memberlist, name);
311}
312
313static int
314generic_setattr(g, name, v)
315 genericobject *g;
316 char *name;
317 object *v;
318{
319 int ret;
320
321 if (v == NULL) {
322 err_setstr(TypeError, "can't delete forms object attributes");
323 return NULL;
324 }
325
326 /* "label" is an exception: setmember doesn't set strings;
327 and FORMS wants you to call a function to set the label */
328 if (strcmp(name, "label") == 0) {
329 if (!is_stringobject(v)) {
330 err_setstr(TypeError, "label attr must be string");
331 return NULL;
332 }
333 fl_set_object_label(g->ob_generic, getstringvalue(v));
334 return 0;
335 }
336
337 ret = setmember((char *)g->ob_generic, generic_memberlist, name, v);
338
339 /* Rather than calling all the various set_object_* functions,
340 we call fl_redraw_object here. This is sometimes redundant
341 but I doubt that's a big problem */
342 if (ret == 0)
343 fl_redraw_object(g->ob_generic);
344
345 return ret;
346}
347
348typeobject GenericObjecttype = {
349 OB_HEAD_INIT(&Typetype)
350 0, /*ob_size*/
351 "generic FORMS object", /*tp_name*/
352 sizeof(genericobject), /*tp_size*/
353 0, /*tp_itemsize*/
354 /* methods */
355 generic_dealloc, /*tp_dealloc*/
356 0, /*tp_print*/
357 generic_getattr, /*tp_getattr*/
358 generic_setattr, /*tp_setattr*/
359 0, /*tp_compare*/
360 0, /*tp_repr*/
361};
362
363static object *
364newgenericobject(generic, methods)
365 FL_OBJECT *generic;
366 struct methodlist *methods;
367{
368 genericobject *g;
369 g = NEWOBJ(genericobject, &GenericObjecttype);
370 if (g == NULL)
371 return NULL;
372 g-> ob_generic = generic;
373 g->ob_methods = methods;
374 g->ob_callback = NULL;
375 g->ob_callback_arg = NULL;
376 knowgeneric(g);
377 return (object *)g;
378}
379
380/**********************************************************************/
381/* Some common calling sequences */
382
383/* void func (object, float) */
384static object *
385call_forms_INf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000386 void (*func)(FL_OBJECT *, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000387 FL_OBJECT *obj;
388 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000389{
Guido van Rossum03747111991-08-08 12:10:01 +0000390 float parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000391
Guido van Rossum03747111991-08-08 12:10:01 +0000392 if (!getfloatarg (args, &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000393
Guido van Rossum03747111991-08-08 12:10:01 +0000394 (*func) (obj, parameter);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000395
Guido van Rossum03747111991-08-08 12:10:01 +0000396 INCREF(None);
397 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000398}
399
400/* void func (object, float) */
401static object *
402call_forms_INfINf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000403 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000404 FL_OBJECT *obj;
405 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000406{
Guido van Rossum03747111991-08-08 12:10:01 +0000407 float par1, par2;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000408
Guido van Rossum03747111991-08-08 12:10:01 +0000409 if (!getfloatfloatarg (args, &par1, &par2)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000410
Guido van Rossum03747111991-08-08 12:10:01 +0000411 (*func) (obj, par1, par2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000412
Guido van Rossum03747111991-08-08 12:10:01 +0000413 INCREF(None);
414 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000415}
416
417/* void func (object, int) */
418static object *
419call_forms_INi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000420 void (*func)(FL_OBJECT *, int);
Guido van Rossum03747111991-08-08 12:10:01 +0000421 FL_OBJECT *obj;
422 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000423{
Guido van Rossum03747111991-08-08 12:10:01 +0000424 int parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000425
Guido van Rossum03747111991-08-08 12:10:01 +0000426 if (!getintarg (args, &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000427
Guido van Rossum03747111991-08-08 12:10:01 +0000428 (*func) (obj, parameter);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000429
Guido van Rossum03747111991-08-08 12:10:01 +0000430 INCREF(None);
431 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000432}
433
434/* void func (object, string) */
435static object *
436call_forms_INstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000437 void (*func)(FL_OBJECT *, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000438 FL_OBJECT *obj;
439 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000440{
Guido van Rossum03747111991-08-08 12:10:01 +0000441 object *a;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000442
Guido van Rossum03747111991-08-08 12:10:01 +0000443 if (!getstrarg (args, &a)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000444
Guido van Rossum03747111991-08-08 12:10:01 +0000445 (*func) (obj, getstringvalue (a));
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000446
Guido van Rossum03747111991-08-08 12:10:01 +0000447 INCREF(None);
448 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000449}
450
451
452/* voide func (object, int, string) */
453static object *
454call_forms_INiINstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000455 void (*func)(FL_OBJECT *, int, char *);
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 object *a;
460 int b;
461
462 if (!getintstrarg (args, &b, &a)) return NULL;
463
464 (*func) (obj, b, getstringvalue (a));
465
466 INCREF(None);
467 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000468}
469
Guido van Rossum03747111991-08-08 12:10:01 +0000470#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000471/* void func (object, float) */
472static object *
473call_forms_INiINi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000474 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000475 FL_OBJECT *obj;
476 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000477{
Guido van Rossum03747111991-08-08 12:10:01 +0000478 int par1, par2;
479
480 if (!getintintarg (args, &par1, &par2)) return NULL;
481
482 (*func) (obj, par1, par2);
483
484 INCREF(None);
485 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000486}
Guido van Rossum03747111991-08-08 12:10:01 +0000487#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000488
489/* int func (object) */
490static object *
491call_forms_Ri (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000492 int (*func)(FL_OBJECT *);
493 FL_OBJECT *obj;
494 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000495{
Guido van Rossum03747111991-08-08 12:10:01 +0000496 int retval;
497
498 if (!getnoarg(args)) return NULL;
499
500 retval = (*func) (obj);
501
502 return newintobject ((long) retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000503}
504
505/* char * func (object) */
506static object *
507call_forms_Rstr (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000508 char * (*func)(FL_OBJECT *);
509 FL_OBJECT *obj;
510 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000511{
Guido van Rossum03747111991-08-08 12:10:01 +0000512 char *str;
513
514 if (!getnoarg (args)) return NULL;
515
516 str = (*func) (obj);
517
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000518 if (str == NULL) {
519 INCREF(None);
520 return None;
521 }
Guido van Rossum03747111991-08-08 12:10:01 +0000522 return newstringobject (str);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000523}
524
525/* int func (object) */
526static object *
527call_forms_Rf (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000528 float (*func)(FL_OBJECT *);
529 FL_OBJECT *obj;
530 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000531{
Guido van Rossum03747111991-08-08 12:10:01 +0000532 float retval;
533
534 if (!getnoarg(args)) return NULL;
535
536 retval = (*func) (obj);
537
538 return newfloatobject (retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000539}
540
541static object *
542call_forms_OUTfOUTf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000543 void (*func)(FL_OBJECT *, float *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000544 FL_OBJECT *obj;
545 object *args;
546{
547 float f1, f2;
548 object *arg;
Guido van Rossum03747111991-08-08 12:10:01 +0000549
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000550 if (!getnoarg(args)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000551
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000552 (*func) (obj, &f1, &f2);
553
554 arg = newtupleobject (2);
555 if (arg == NULL) return NULL;
556
557 settupleitem (arg, 0, newfloatobject (f1));
558 settupleitem (arg, 1, newfloatobject (f2));
559 return arg;
560}
561
Guido van Rossum03747111991-08-08 12:10:01 +0000562#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000563static object *
564call_forms_OUTf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000565 void (*func)(FL_OBJECT *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000566 FL_OBJECT *obj;
567 object *args;
568{
569 float f;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000570
571 if (!getnoarg(args)) return NULL;
572
573 (*func) (obj, &f);
574
575 return newfloatobject (f);
576}
Guido van Rossum03747111991-08-08 12:10:01 +0000577#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000578
579/**********************************************************************/
580/* Class : browser */
581
582static object *
583set_browser_topline(g, args)
584 genericobject *g;
585 object *args;
586{
Guido van Rossum03747111991-08-08 12:10:01 +0000587 return call_forms_INi (fl_set_browser_topline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000588}
589
590static object *
591clear_browser(g, args)
592 genericobject *g;
593 object *args;
594{
Guido van Rossum03747111991-08-08 12:10:01 +0000595 return generic_call (g, args, fl_clear_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000596}
597
598static object *
599add_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000600 genericobject *g;
601 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000602{
Guido van Rossum03747111991-08-08 12:10:01 +0000603 return call_forms_INstr (fl_add_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000604}
605
606static object *
607addto_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000608 genericobject *g;
609 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000610{
Guido van Rossum03747111991-08-08 12:10:01 +0000611 return call_forms_INstr (fl_addto_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000612}
613
614static object *
615insert_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000616 genericobject *g;
617 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000618{
Guido van Rossum03747111991-08-08 12:10:01 +0000619 return call_forms_INiINstr (fl_insert_browser_line,
620 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000621}
622
623static object *
624delete_browser_line (g, args)
625 genericobject *g;
626 object *args;
627{
Guido van Rossum03747111991-08-08 12:10:01 +0000628 return call_forms_INi (fl_delete_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000629}
630
631static object *
632replace_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000633 genericobject *g;
634 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000635{
Guido van Rossum03747111991-08-08 12:10:01 +0000636 return call_forms_INiINstr (fl_replace_browser_line,
637 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000638}
639
640static object *
641get_browser_line(g, args)
642 genericobject *g;
643 object *args;
644{
645 int i;
646 char *str;
647
648 if (!getintarg(args, &i))
649 return NULL;
650
651 str = fl_get_browser_line (g->ob_generic, i);
652
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000653 if (str == NULL) {
654 INCREF(None);
655 return None;
656 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000657 return newstringobject (str);
658}
659
660static object *
661load_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000662 genericobject *g;
663 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000664{
Guido van Rossumabe58351991-08-08 12:34:44 +0000665 /* XXX strictly speaking this is wrong since fl_load_browser
666 XXX returns int, not void */
Guido van Rossum03747111991-08-08 12:10:01 +0000667 return call_forms_INstr (fl_load_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000668}
669
670static object *
671get_browser_maxline(g, args)
672 genericobject *g;
673 object *args;
674{
Guido van Rossum03747111991-08-08 12:10:01 +0000675 return call_forms_Ri (fl_get_browser_maxline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000676}
677
678static object *
679select_browser_line (g, args)
680 genericobject *g;
681 object *args;
682{
Guido van Rossum03747111991-08-08 12:10:01 +0000683 return call_forms_INi (fl_select_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000684}
685
686static object *
687deselect_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_deselect_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000692}
693
694static object *
695deselect_browser (g, args)
696 genericobject *g;
697 object *args;
698{
Guido van Rossum03747111991-08-08 12:10:01 +0000699 return generic_call (g, args, fl_deselect_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000700}
701
702static object *
703isselected_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000704 genericobject *g;
705 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000706{
707 int i, j;
Guido van Rossum03747111991-08-08 12:10:01 +0000708
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000709 if (!getintarg(args, &i))
710 return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000711
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000712 j = fl_isselected_browser_line (g->ob_generic, i);
Guido van Rossum03747111991-08-08 12:10:01 +0000713
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000714 return newintobject (j);
715}
716
717static object *
718get_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000719 genericobject *g;
720 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000721{
Guido van Rossum03747111991-08-08 12:10:01 +0000722 return call_forms_Ri (fl_get_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000723}
724
725static object *
726set_browser_fontsize (g, args)
727 genericobject *g;
728 object *args;
729{
Guido van Rossum03747111991-08-08 12:10:01 +0000730 return call_forms_INf (fl_set_browser_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000731}
732
733static object *
734set_browser_fontstyle (g, args)
735 genericobject *g;
736 object *args;
737{
Guido van Rossum03747111991-08-08 12:10:01 +0000738 return call_forms_INi (fl_set_browser_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000739}
740
741static struct methodlist browser_methods[] = {
742 {"set_browser_topline", set_browser_topline},
743 {"clear_browser", clear_browser},
744 {"add_browser_line", add_browser_line},
745 {"addto_browser", addto_browser},
746 {"insert_browser_line", insert_browser_line},
747 {"delete_browser_line", delete_browser_line},
748 {"replace_browser_line",replace_browser_line},
749 {"get_browser_line", get_browser_line},
750 {"load_browser", load_browser},
751 {"get_browser_maxline", get_browser_maxline},
752 {"select_browser_line", select_browser_line},
753 {"deselect_browser_line", deselect_browser_line},
754 {"deselect_browser", deselect_browser},
755 {"isselected_browser_line", isselected_browser_line},
756 {"get_browser", get_browser},
757 {"set_browser_fontsize",set_browser_fontsize},
758 {"set_browser_fontstyle", set_browser_fontstyle},
759 {NULL, NULL} /* sentinel */
760};
761
762/* Class: button */
763
764static object *
765set_button(g, args)
766 genericobject *g;
767 object *args;
768{
Guido van Rossum03747111991-08-08 12:10:01 +0000769 return call_forms_INi (fl_set_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000770}
771
772static object *
773get_button(g, args)
774 genericobject *g;
775 object *args;
776{
Guido van Rossum03747111991-08-08 12:10:01 +0000777 return call_forms_Ri (fl_get_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000778}
779
780static struct methodlist button_methods[] = {
781 {"set_button", set_button},
782 {"get_button", get_button},
783 {NULL, NULL} /* sentinel */
784};
785
786/* Class: choice */
787
788static object *
789set_choice(g, args)
790 genericobject *g;
791 object *args;
792{
Guido van Rossum03747111991-08-08 12:10:01 +0000793 return call_forms_INi (fl_set_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000794}
795
796static object *
797get_choice(g, args)
798 genericobject *g;
799 object *args;
800{
Guido van Rossum03747111991-08-08 12:10:01 +0000801 return call_forms_Ri (fl_get_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000802}
803
804static object *
805clear_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000806 genericobject *g;
807 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000808{
Guido van Rossum03747111991-08-08 12:10:01 +0000809 return generic_call (g, args, fl_clear_choice);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000810}
811
812static object *
813addto_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000814 genericobject *g;
815 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000816{
Guido van Rossum03747111991-08-08 12:10:01 +0000817 return call_forms_INstr (fl_addto_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000818}
819
820static object *
821replace_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000822 genericobject *g;
823 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000824{
Guido van Rossum03747111991-08-08 12:10:01 +0000825 return call_forms_INiINstr (fl_replace_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000826}
827
828static object *
829delete_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000830 genericobject *g;
831 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000832{
Guido van Rossum03747111991-08-08 12:10:01 +0000833 return call_forms_INi (fl_delete_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000834}
835
836static object *
837get_choice_text (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000838 genericobject *g;
839 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000840{
Guido van Rossum03747111991-08-08 12:10:01 +0000841 return call_forms_Rstr (fl_get_choice_text, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000842}
843
844static object *
845set_choice_fontsize (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000846 genericobject *g;
847 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000848{
Guido van Rossum03747111991-08-08 12:10:01 +0000849 return call_forms_INf (fl_set_choice_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000850}
851
852static object *
853set_choice_fontstyle (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000854 genericobject *g;
855 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000856{
Guido van Rossum03747111991-08-08 12:10:01 +0000857 return call_forms_INi (fl_set_choice_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000858}
859
860static struct methodlist choice_methods[] = {
861 {"set_choice", set_choice},
862 {"get_choice", get_choice},
863 {"clear_choice", clear_choice},
864 {"addto_choice", addto_choice},
865 {"replace_choice", replace_choice},
866 {"delete_choice", delete_choice},
867 {"get_choice_text", get_choice_text},
868 {"set_choice_fontsize", set_choice_fontsize},
869 {"set_choice_fontstyle",set_choice_fontstyle},
870 {NULL, NULL} /* sentinel */
871};
872
873/* Class : Clock */
874
875static object *
876get_clock(g, args)
877 genericobject *g;
878 object *args;
879{
880 int i0, i1, i2;
881 object *arg;
882
883 if (!getnoarg(args))
884 return NULL;
885
886 fl_get_clock (g->ob_generic, &i0, &i1, &i2);
887
888 arg = newtupleobject (3);
889 if (arg == NULL) return NULL;
890
891 settupleitem (arg, 0, newintobject (i0));
892 settupleitem (arg, 1, newintobject (i1));
893 settupleitem (arg, 2, newintobject (i2));
894 return arg;
895}
896
897static struct methodlist clock_methods[] = {
898 {"get_clock", get_clock},
899 {NULL, NULL} /* sentinel */
900};
901
902/* CLass : Counters */
903
904static object *
905get_counter_value(g, args)
906 genericobject *g;
907 object *args;
908{
909 return call_forms_Rf (fl_get_counter_value, g-> ob_generic, args);
910}
911
912static object *
913set_counter_value (g, args)
914 genericobject *g;
915 object *args;
916{
917 return call_forms_INf (fl_set_counter_value, g-> ob_generic, args);
918}
919
920static object *
921set_counter_precision (g, args)
922 genericobject *g;
923 object *args;
924{
925 return call_forms_INi (fl_set_counter_precision, g-> ob_generic, args);
926}
927
928static object *
929set_counter_bounds (g, args)
930 genericobject *g;
931 object *args;
932{
933 return call_forms_INfINf (fl_set_counter_bounds, g-> ob_generic, args);
934}
935
936static object *
937set_counter_step (g, args)
938 genericobject *g;
939 object *args;
940{
941 return call_forms_INfINf (fl_set_counter_step, g-> ob_generic, args);
942}
943
944static object *
945set_counter_return (g, args)
946 genericobject *g;
947 object *args;
948{
Guido van Rossum03747111991-08-08 12:10:01 +0000949 return call_forms_INi (fl_set_counter_return, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000950}
951
952static struct methodlist counter_methods[] = {
953 {"set_counter_value", set_counter_value},
954 {"get_counter_value", get_counter_value},
955 {"set_counter_bounds", set_counter_bounds},
956 {"set_counter_step", set_counter_step},
957 {"set_counter_precision", set_counter_precision},
958 {"set_counter_return", set_counter_return},
959 {NULL, NULL} /* sentinel */
960};
961
962/* Class : Defaults */
963
964static object *
965get_default(g, args)
966 genericobject *g;
967 object *args;
968{
Guido van Rossum03747111991-08-08 12:10:01 +0000969 char c;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000970
Guido van Rossum03747111991-08-08 12:10:01 +0000971 if (!getnoarg(args)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000972
Guido van Rossum03747111991-08-08 12:10:01 +0000973 c = fl_get_default (g->ob_generic);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000974
Guido van Rossum03747111991-08-08 12:10:01 +0000975 return ((object *) mknewcharobject (c)); /* in cgensupport.c */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000976}
977
978static struct methodlist default_methods[] = {
979 {"get_default", get_default},
980 {NULL, NULL} /* sentinel */
981};
982
983
984/* Class: Dials */
985
986static object *
987set_dial (g, args)
988 genericobject *g;
989 object *args;
990{
991 float f1, f2, f3;
992
993 if (!getfloatfloatfloatarg(args, &f1, &f2, &f3))
994 return NULL;
995 fl_set_dial (g->ob_generic, f1, f2, f3);
996 INCREF(None);
997 return None;
998}
999
1000static object *
1001get_dial(g, args)
1002 genericobject *g;
1003 object *args;
1004{
1005 return call_forms_Rf (fl_get_dial, g-> ob_generic, args);
1006}
1007
1008static object *
1009set_dial_value (g, args)
1010 genericobject *g;
1011 object *args;
1012{
1013 return call_forms_INf (fl_set_dial_value, g-> ob_generic, args);
1014}
1015
1016static object *
1017set_dial_bounds (g, args)
1018 genericobject *g;
1019 object *args;
1020{
1021 return call_forms_INfINf (fl_set_dial_bounds, g-> ob_generic, args);
1022}
1023
1024static object *
1025get_dial_bounds (g, args)
1026 genericobject *g;
1027 object *args;
1028{
1029 return call_forms_OUTfOUTf (fl_get_dial_bounds, g-> ob_generic, args);
1030}
1031
1032static struct methodlist dial_methods[] = {
1033 {"set_dial", set_dial},
1034 {"get_dial", get_dial},
1035 {"set_dial_value", set_dial_value},
1036 {"get_dial_value", get_dial},
1037 {"set_dial_bounds", set_dial_bounds},
1038 {"get_dial_bounds", get_dial_bounds},
1039 {NULL, NULL} /* sentinel */
1040};
1041
1042/* Class : Input */
1043
1044static object *
1045set_input (g, args)
1046 genericobject *g;
1047 object *args;
1048{
1049 return call_forms_INstr (fl_set_input, g-> ob_generic, args);
1050}
1051
1052static object *
1053get_input (g, args)
1054 genericobject *g;
1055 object *args;
1056{
1057 return call_forms_Rstr (fl_get_input, g-> ob_generic, args);
1058}
1059
1060static object *
1061set_input_color (g, args)
1062 genericobject *g;
1063 object *args;
1064{
1065 return call_forms_INfINf (fl_set_input_color, g-> ob_generic, args);
1066}
1067
1068static struct methodlist input_methods[] = {
1069 {"set_input", set_input},
1070 {"get_input", get_input},
1071 {"set_input_color", set_input_color},
1072 {NULL, NULL} /* sentinel */
1073};
1074
1075
1076/* Class : Menu */
1077
1078static object *
1079set_menu (g, args)
1080 genericobject *g;
1081 object *args;
1082{
Guido van Rossumabe58351991-08-08 12:34:44 +00001083 return call_forms_INstr (fl_set_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001084}
1085
1086static object *
1087get_menu (g, args)
1088 genericobject *g;
1089 object *args;
1090{
Guido van Rossumabe58351991-08-08 12:34:44 +00001091 /* XXX strictly speaking this is wrong since fl_get_menu
1092 XXX returns long, not int */
1093 return call_forms_Ri (fl_get_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001094}
1095
1096static object *
1097addto_menu (g, args)
1098 genericobject *g;
1099 object *args;
1100{
Guido van Rossumabe58351991-08-08 12:34:44 +00001101 return call_forms_INstr (fl_addto_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001102}
1103
1104static struct methodlist menu_methods[] = {
1105 {"set_menu", set_menu},
1106 {"get_menu", get_menu},
1107 {"addto_menu", addto_menu},
1108 {NULL, NULL} /* sentinel */
1109};
1110
1111
1112/* Class: Sliders */
1113
1114static object *
1115set_slider (g, args)
1116 genericobject *g;
1117 object *args;
1118{
1119 float f1, f2, f3;
1120
1121 if (!getfloatfloatfloatarg(args, &f1, &f2, &f3))
1122 return NULL;
1123 fl_set_slider (g->ob_generic, f1, f2, f3);
1124 INCREF(None);
1125 return None;
1126}
1127
1128static object *
1129get_slider(g, args)
1130 genericobject *g;
1131 object *args;
1132{
1133 return call_forms_Rf (fl_get_slider, g-> ob_generic, args);
1134}
1135
1136static object *
1137set_slider_value (g, args)
1138 genericobject *g;
1139 object *args;
1140{
1141 return call_forms_INf (fl_set_slider_value, g-> ob_generic, args);
1142}
1143
1144static object *
1145set_slider_bounds (g, args)
1146 genericobject *g;
1147 object *args;
1148{
1149 return call_forms_INfINf (fl_set_slider_bounds, g-> ob_generic, args);
1150}
1151
1152static object *
1153get_slider_bounds (g, args)
1154 genericobject *g;
1155 object *args;
1156{
1157 return call_forms_OUTfOUTf(fl_get_slider_bounds, g-> ob_generic, args);
1158}
1159
1160static object *
1161set_slider_return (g, args)
1162 genericobject *g;
1163 object *args;
1164{
1165 return call_forms_INf (fl_set_slider_return, g-> ob_generic, args);
1166}
1167
1168static object *
1169set_slider_size (g, args)
1170 genericobject *g;
1171 object *args;
1172{
1173 return call_forms_INf (fl_set_slider_size, g-> ob_generic, args);
1174}
1175
1176static object *
1177set_slider_precision (g, args)
1178 genericobject *g;
1179 object *args;
1180{
1181 return call_forms_INi (fl_set_slider_precision, g-> ob_generic, args);
1182}
1183
1184static struct methodlist slider_methods[] = {
1185 {"set_slider", set_slider},
1186 {"get_slider", get_slider},
1187 {"set_slider_value", set_slider_value},
1188 {"get_slider_value", get_slider},
1189 {"set_slider_bounds", set_slider_bounds},
1190 {"get_slider_bounds", get_slider_bounds},
1191 {"set_slider_return", set_slider_return},
1192 {"set_slider_size", set_slider_size},
1193 {"set_slider_precision",set_slider_precision},
1194 {NULL, NULL} /* sentinel */
1195};
1196
1197static object *
1198set_positioner_xvalue (g, args)
1199 genericobject *g;
1200 object *args;
1201{
1202 return call_forms_INf (fl_set_positioner_xvalue, g-> ob_generic, args);
1203}
1204
1205static object *
1206set_positioner_xbounds (g, args)
1207 genericobject *g;
1208 object *args;
1209{
1210 return call_forms_INfINf (fl_set_positioner_xbounds, g-> ob_generic, args);
1211}
1212
1213static object *
1214set_positioner_yvalue (g, args)
1215 genericobject *g;
1216 object *args;
1217{
1218 return call_forms_INf (fl_set_positioner_yvalue, g-> ob_generic, args);
1219}
1220
1221static object *
1222set_positioner_ybounds (g, args)
1223 genericobject *g;
1224 object *args;
1225{
1226 return call_forms_INfINf (fl_set_positioner_ybounds, g-> ob_generic, args);
1227}
1228
1229static object *
1230get_positioner_xvalue (g, args)
1231 genericobject *g;
1232 object *args;
1233{
1234 return call_forms_Rf (fl_get_positioner_xvalue, g-> ob_generic, args);
1235}
1236
1237static object *
1238get_positioner_xbounds (g, args)
1239 genericobject *g;
1240 object *args;
1241{
1242 return call_forms_OUTfOUTf (fl_get_positioner_xbounds, g-> ob_generic, args);
1243}
1244
1245static object *
1246get_positioner_yvalue (g, args)
1247 genericobject *g;
1248 object *args;
1249{
1250 return call_forms_Rf (fl_get_positioner_yvalue, g-> ob_generic, args);
1251}
1252
1253static object *
1254get_positioner_ybounds (g, args)
1255 genericobject *g;
1256 object *args;
1257{
1258 return call_forms_OUTfOUTf (fl_get_positioner_ybounds, g-> ob_generic, args);
1259}
1260
1261static struct methodlist positioner_methods[] = {
1262 {"set_positioner_xvalue", set_positioner_xvalue},
1263 {"set_positioner_yvalue", set_positioner_yvalue},
1264 {"set_positioner_xbounds", set_positioner_xbounds},
1265 {"set_positioner_ybounds", set_positioner_ybounds},
1266 {"get_positioner_xvalue", get_positioner_xvalue},
1267 {"get_positioner_yvalue", get_positioner_yvalue},
1268 {"get_positioner_xbounds", get_positioner_xbounds},
Guido van Rossum03747111991-08-08 12:10:01 +00001269 {"get_positioner_ybounds", get_positioner_ybounds},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001270 {NULL, NULL} /* sentinel */
1271};
1272
1273/* Class timer */
1274
1275static object *
1276set_timer (g, args)
1277 genericobject *g;
1278 object *args;
1279{
1280 return call_forms_INf (fl_set_timer, g-> ob_generic, args);
1281}
1282
1283static object *
1284get_timer (g, args)
1285 genericobject *g;
1286 object *args;
1287{
1288 return call_forms_Rf (fl_get_timer, g-> ob_generic, args);
1289}
1290
1291static struct methodlist timer_methods[] = {
1292 {"set_timer", set_timer},
1293 {"get_timer", get_timer},
1294 {NULL, NULL} /* sentinel */
1295};
1296
1297/* Form objects */
1298
1299typedef struct {
1300 OB_HEAD
1301 FL_FORM *ob_form;
1302} formobject;
1303
1304extern typeobject Formtype; /* Forward */
1305
1306#define is_formobject(v) ((v)->ob_type == &Formtype)
1307
1308static object *
1309form_show_form(f, args)
1310 formobject *f;
1311 object *args;
1312{
1313 int place, border;
1314 object *name;
1315 if (!getintintstrarg(args, &place, &border, &name))
1316 return NULL;
1317 fl_show_form(f->ob_form, place, border, getstringvalue(name));
1318 INCREF(None);
1319 return None;
1320}
1321
1322static object *
1323form_call(func, f, args)
1324 FL_FORM *f;
1325 object *args;
1326 void (*func)(FL_FORM *);
1327{
1328 if (!getnoarg(args)) return NULL;
1329
1330 (*func)(f);
1331
1332 INCREF(None);
1333 return None;
1334}
1335
1336static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001337form_call_INiINi(func, f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001338 FL_FORM *f;
1339 object *args;
1340 void (*func)(FL_FORM *, int, int);
1341{
1342 int a, b;
1343
1344 if (!getintintarg(args, &a, &b)) return NULL;
1345
1346 (*func)(f, a, b);
1347
1348 INCREF(None);
1349 return None;
1350}
1351
1352static object *
1353form_hide_form(f, args)
1354 formobject *f;
1355 object *args;
1356{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001357 return form_call(fl_hide_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001358}
1359
1360static object *
1361form_redraw_form(f, args)
1362 formobject *f;
1363 object *args;
1364{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001365 return form_call(fl_redraw_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001366}
1367
1368static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001369form_add_object(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001370 formobject *f;
1371 object *args;
1372{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001373 if (args == NULL || !is_genericobject(args)) {
1374 err_badarg();
1375 return NULL;
1376 }
1377
1378 fl_add_object(f->ob_form, ((genericobject *)args) -> ob_generic);
1379
1380 INCREF(None);
1381 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001382}
1383
1384static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001385form_set_form_position(f, args)
1386 formobject *f;
1387 object *args;
1388{
1389 return form_call_INiINi(fl_set_form_position, f-> ob_form, args);
1390}
1391
1392static object *
1393generic_add_object(f, args, func, internal_methods)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001394 formobject *f;
1395 object *args;
1396 FL_OBJECT *(*func)(int, float, float, float, float, char*);
1397 struct methodlist *internal_methods;
1398{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001399 int type;
1400 float x, y, w, h;
1401 object *name;
1402 FL_OBJECT *obj;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001403
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001404 if (!getintfloatfloatfloatfloatstrarg(args,&type,&x,&y,&w,&h,&name))
1405 return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001406
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001407 fl_addto_form (f-> ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001408
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001409 obj = (*func) (type, x, y, w, h, getstringvalue(name));
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001410
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001411 fl_end_form();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001412
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001413 if (obj == NULL) {
1414 err_nomem();
1415 return NULL;
1416 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001417
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001418 return newgenericobject (obj, internal_methods);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001419}
1420
1421static object *
1422form_add_button(f, args)
1423 formobject *f;
1424 object *args;
1425{
1426 return generic_add_object(f, args, fl_add_button, button_methods);
1427}
1428
1429static object *
1430form_add_lightbutton(f, args)
1431 formobject *f;
1432 object *args;
1433{
1434 return generic_add_object(f, args, fl_add_lightbutton, button_methods);
1435}
1436
1437static object *
1438form_add_roundbutton(f, args)
1439 formobject *f;
1440 object *args;
1441{
1442 return generic_add_object(f, args, fl_add_roundbutton, button_methods);
1443}
1444
1445static object *
1446form_add_menu (f, args)
1447 formobject *f;
1448 object *args;
1449{
1450 return generic_add_object(f, args, fl_add_menu, menu_methods);
1451}
1452
1453static object *
1454form_add_slider(f, args)
1455 formobject *f;
1456 object *args;
1457{
1458 return generic_add_object(f, args, fl_add_slider, slider_methods);
1459}
1460
1461static object *
1462form_add_valslider(f, args)
1463 formobject *f;
1464 object *args;
1465{
1466 return generic_add_object(f, args, fl_add_valslider, slider_methods);
1467}
1468
1469static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001470form_add_dial(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001471 formobject *f;
1472 object *args;
1473{
1474 return generic_add_object(f, args, fl_add_dial, dial_methods);
1475}
1476
1477static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001478form_add_counter(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001479 formobject *f;
1480 object *args;
1481{
1482 return generic_add_object(f, args, fl_add_counter, counter_methods);
1483}
1484
1485static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001486form_add_default(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001487 formobject *f;
1488 object *args;
1489{
1490 return generic_add_object(f, args, fl_add_default, default_methods);
1491}
1492
1493static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001494form_add_clock(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001495 formobject *f;
1496 object *args;
1497{
1498 return generic_add_object(f, args, fl_add_clock, clock_methods);
1499}
1500
1501static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001502form_add_box(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001503 formobject *f;
1504 object *args;
1505{
Guido van Rossum03747111991-08-08 12:10:01 +00001506 return generic_add_object(f, args, fl_add_box,
1507 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001508}
1509
1510static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001511form_add_choice(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001512 formobject *f;
1513 object *args;
1514{
1515 return generic_add_object(f, args, fl_add_choice, choice_methods);
1516}
1517
1518static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001519form_add_browser(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001520 formobject *f;
1521 object *args;
1522{
1523 return generic_add_object(f, args, fl_add_browser, browser_methods);
1524}
1525
1526static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001527form_add_positioner(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001528 formobject *f;
1529 object *args;
1530{
1531 return generic_add_object(f, args, fl_add_positioner, positioner_methods);
1532}
1533
1534static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001535form_add_input(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001536 formobject *f;
1537 object *args;
1538{
1539 return generic_add_object(f, args, fl_add_input, input_methods);
1540}
1541
1542static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001543form_add_text(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001544 formobject *f;
1545 object *args;
1546{
Guido van Rossum03747111991-08-08 12:10:01 +00001547 return generic_add_object(f, args, fl_add_text,
1548 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001549}
1550
1551static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001552form_add_timer(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001553 formobject *f;
1554 object *args;
1555{
1556 return generic_add_object(f, args, fl_add_timer, timer_methods);
1557}
1558
1559static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001560form_freeze_form(f, args)
1561 formobject *f;
1562 object *args;
1563{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001564 return form_call(fl_freeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001565}
1566
1567static object *
1568form_unfreeze_form(f, args)
1569 formobject *f;
1570 object *args;
1571{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001572 return form_call(fl_unfreeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001573}
1574
1575static object *
1576form_display_form(f, args)
1577 formobject *f;
1578 object *args;
1579{
1580 int place, border;
1581 object *name;
1582 if (!getintintstrarg(args, &place, &border, &name))
1583 return NULL;
1584 fl_show_form(f->ob_form, place, border, getstringvalue(name));
1585 INCREF(None);
1586 return None;
1587}
1588
1589static object *
1590form_remove_form(f, args)
1591 formobject *f;
1592 object *args;
1593{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001594 return form_call(fl_remove_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001595}
1596
1597static object *
1598form_activate_form(f, args)
1599 formobject *f;
1600 object *args;
1601{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001602 return form_call(fl_activate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001603}
1604
1605static object *
1606form_deactivate_form(f, args)
1607 formobject *f;
1608 object *args;
1609{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001610 return form_call(fl_deactivate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001611}
1612
Guido van Rossum75cc8981991-08-08 12:07:45 +00001613static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001614form_bgn_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001615 formobject *f;
1616 object *args;
1617{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001618 FL_OBJECT *obj;
1619
1620 fl_addto_form(f-> ob_form);
1621 obj = fl_bgn_group();
1622 fl_end_form();
1623
1624 if (obj == NULL) {
1625 err_nomem();
1626 return NULL;
1627 }
1628
1629 return newgenericobject (obj, (struct methodlist *) NULL);
Guido van Rossum03747111991-08-08 12:10:01 +00001630}
1631
1632static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001633form_end_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001634 formobject *f;
1635 object *args;
1636{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001637 fl_addto_form(f-> ob_form);
Guido van Rossum03747111991-08-08 12:10:01 +00001638 fl_end_group();
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001639 fl_end_form();
Guido van Rossum03747111991-08-08 12:10:01 +00001640 INCREF(None);
1641 return None;
1642}
1643
1644static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001645forms_find_first_or_last(func, f, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00001646 FL_OBJECT *(*func)(FL_FORM *, int, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +00001647 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001648 object *args;
1649{
1650 int type;
1651 float mx, my;
1652 FL_OBJECT *generic;
1653 genericobject *g;
1654
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001655 if (!getintfloatfloatarg(args, &type, &mx, &my)) return NULL;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001656
Guido van Rossum03747111991-08-08 12:10:01 +00001657 generic = (*func) (f-> ob_form, type, mx, my);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001658
1659 if (generic == NULL)
1660 {
1661 INCREF(None);
1662 return None;
1663 }
1664
1665 g = findgeneric(generic);
1666 if (g == NULL) {
1667 err_setstr(RuntimeError,
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001668 "forms_find_{first|last} returns unknown object");
Guido van Rossum75cc8981991-08-08 12:07:45 +00001669 return NULL;
1670 }
1671 INCREF(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001672 return (object *) g;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001673}
1674
1675static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001676form_find_first(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001677 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001678 object *args;
1679{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001680 return forms_find_first_or_last(fl_find_first, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001681}
1682
1683static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001684form_find_last(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001685 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001686 object *args;
1687{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001688 return forms_find_first_or_last(fl_find_last, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001689}
1690
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001691static struct methodlist form_methods[] = {
1692/* adm */
1693 {"show_form", form_show_form},
1694 {"hide_form", form_hide_form},
1695 {"redraw_form", form_redraw_form},
1696 {"set_form_position", form_set_form_position},
1697 {"freeze_form", form_freeze_form},
1698 {"unfreeze_form", form_unfreeze_form},
1699 {"display_form", form_display_form},
1700 {"remove_form", form_remove_form},
1701 {"activate_form", form_activate_form},
1702 {"deactivate_form", form_deactivate_form},
Guido van Rossum03747111991-08-08 12:10:01 +00001703 {"bgn_group", form_bgn_group},
1704 {"end_group", form_end_group},
Guido van Rossum75cc8981991-08-08 12:07:45 +00001705 {"find_first", form_find_first},
1706 {"find_last", form_find_last},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001707
1708/* basic objects */
1709 {"add_button", form_add_button},
1710/* {"add_bitmap", form_add_bitmap}, */
1711 {"add_lightbutton", form_add_lightbutton},
1712 {"add_roundbutton", form_add_roundbutton},
1713 {"add_menu", form_add_menu},
1714 {"add_slider", form_add_slider},
1715 {"add_positioner", form_add_positioner},
1716 {"add_valslider", form_add_valslider},
1717 {"add_dial", form_add_dial},
1718 {"add_counter", form_add_counter},
1719 {"add_default", form_add_default},
1720 {"add_box", form_add_box},
1721 {"add_clock", form_add_clock},
1722 {"add_choice", form_add_choice},
1723 {"add_browser", form_add_browser},
1724 {"add_input", form_add_input},
1725 {"add_timer", form_add_timer},
1726 {"add_text", form_add_text},
1727 {NULL, NULL} /* sentinel */
1728};
1729
1730static void
1731form_dealloc(f)
1732 formobject *f;
1733{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001734 releaseobjects(f->ob_form);
1735 fl_free_form(f->ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001736 DEL(f);
1737}
1738
Guido van Rossumd97f0481991-11-19 20:26:28 +00001739#define OFF(x) offsetof(FL_FORM, x)
1740
Guido van Rossum32db5e31991-11-12 15:43:18 +00001741static struct memberlist form_memberlist[] = {
1742 {"window", T_LONG, OFF(window), RO},
1743 {"w", T_FLOAT, OFF(w)},
1744 {"h", T_FLOAT, OFF(h)},
1745 {"x", T_FLOAT, OFF(x)},
1746 {"y", T_FLOAT, OFF(y)},
1747 {"deactivated", T_INT, OFF(deactivated)},
1748 {"visible", T_INT, OFF(visible)},
1749 {"frozen", T_INT, OFF(frozen)},
1750 {"doublebuf", T_INT, OFF(doublebuf)},
1751 {NULL} /* Sentinel */
1752};
1753
Guido van Rossumd97f0481991-11-19 20:26:28 +00001754#undef OFF
1755
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001756static object *
1757form_getattr(f, name)
1758 formobject *f;
1759 char *name;
1760{
Guido van Rossum32db5e31991-11-12 15:43:18 +00001761 object *meth;
1762
1763 meth = findmethod(form_methods, (object *)f, name);
1764 if (meth != NULL)
1765 return meth;
1766 err_clear();
1767 return getmember((char *)f->ob_form, form_memberlist, name);
1768}
1769
1770static int
1771form_setattr(f, name, v)
1772 formobject *f;
1773 char *name;
1774 object *v;
1775{
1776 int ret;
1777
1778 if (v == NULL) {
1779 err_setstr(TypeError, "can't delete form attributes");
1780 return NULL;
1781 }
1782
1783 return setmember((char *)f->ob_form, form_memberlist, name, v);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001784}
1785
1786typeobject Formtype = {
1787 OB_HEAD_INIT(&Typetype)
1788 0, /*ob_size*/
1789 "form", /*tp_name*/
1790 sizeof(formobject), /*tp_size*/
1791 0, /*tp_itemsize*/
1792 /* methods */
1793 form_dealloc, /*tp_dealloc*/
1794 0, /*tp_print*/
1795 form_getattr, /*tp_getattr*/
Guido van Rossum32db5e31991-11-12 15:43:18 +00001796 form_setattr, /*tp_setattr*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001797 0, /*tp_compare*/
1798 0, /*tp_repr*/
1799};
1800
1801static object *
1802newformobject(form)
1803 FL_FORM *form;
1804{
1805 formobject *f;
1806 f = NEWOBJ(formobject, &Formtype);
1807 if (f == NULL)
1808 return NULL;
1809 f->ob_form = form;
1810 return (object *)f;
1811}
1812
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001813
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001814/* The "fl" module */
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001815
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001816static object *
1817forms_make_form(dummy, args)
1818 object *dummy;
1819 object *args;
1820{
1821 int type;
1822 float w, h;
1823 FL_FORM *form;
1824 if (!getintfloatfloatarg(args, &type, &w, &h))
1825 return NULL;
1826 form = fl_bgn_form(type, w, h);
1827 if (form == NULL) {
1828 /* XXX Actually, cannot happen! */
1829 err_nomem();
1830 return NULL;
1831 }
1832 fl_end_form();
1833 return newformobject(form);
1834}
1835
1836static object *my_event_callback = NULL;
1837
1838static object *
1839forms_set_event_call_back(dummy, args)
1840 object *dummy;
1841 object *args;
1842{
1843 my_event_callback = args;
1844 XINCREF(args);
1845 INCREF(None);
1846 return None;
1847}
1848
1849static object *
1850forms_do_or_check_forms(dummy, args, func)
1851 object *dummy;
1852 object *args;
1853 FL_OBJECT *(*func)();
1854{
1855 FL_OBJECT *generic;
1856 genericobject *g;
1857 object *arg, *res;
1858
1859 if (!getnoarg(args))
1860 return NULL;
1861
1862 for (;;) {
1863 generic = (*func)();
1864 if (generic == NULL) {
1865 INCREF(None);
1866 return None;
1867 }
1868 if (generic == FL_EVENT) {
1869 int dev;
1870 short val;
1871 if (my_event_callback == NULL)
1872 return newintobject(-1);
1873 dev = fl_qread(&val);
1874 arg = newtupleobject(2);
1875 if (arg == NULL)
1876 return NULL;
1877 settupleitem(arg, 0, newintobject((long)dev));
1878 settupleitem(arg, 1, newintobject((long)val));
1879 res = call_object(my_event_callback, arg);
1880 XDECREF(res);
1881 DECREF(arg);
1882 if (res == NULL)
1883 return NULL; /* Callback raised exception */
1884 continue;
1885 }
1886 g = findgeneric(generic);
1887 if (g == NULL) {
1888 err_setstr(RuntimeError,
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001889 "{do|check}_forms returns unknown object");
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001890 return NULL;
1891 }
1892 if (g->ob_callback == NULL) {
1893 INCREF(g);
1894 return ((object *) g);
1895 }
1896 arg = newtupleobject(2);
1897 INCREF(g);
Guido van Rossumabe58351991-08-08 12:34:44 +00001898 settupleitem(arg, 0, (object *)g);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001899 INCREF(g->ob_callback_arg);
1900 settupleitem(arg, 1, g->ob_callback_arg);
1901 res = call_object(g->ob_callback, arg);
1902 XDECREF(res);
1903 DECREF(arg);
1904 if (res == NULL)
1905 return NULL; /* Callback raised exception */
1906 }
1907}
1908
1909static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001910forms_do_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001911 object *dummy;
1912 object *args;
1913{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001914 return forms_do_or_check_forms(dummy, args, fl_do_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001915}
1916
1917static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001918forms_check_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001919 object *dummy;
1920 object *args;
1921{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001922 return forms_do_or_check_forms(dummy, args, fl_check_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001923}
1924
Guido van Rossum03747111991-08-08 12:10:01 +00001925#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001926static object *
1927fl_call(func, args)
1928 object *args;
1929 void (*func)();
1930{
1931 if (!getnoarg(args))
1932 return NULL;
1933 (*func)();
1934 INCREF(None);
1935 return None;
1936}
Guido van Rossum03747111991-08-08 12:10:01 +00001937#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001938
1939static object *
1940forms_qdevice(self, args)
1941 object *self;
1942 object *args;
1943{
1944 short arg1 ;
1945 if (!getishortarg(args, 1, 0, &arg1))
1946 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001947 fl_qdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001948 INCREF(None);
1949 return None;
1950}
1951
1952static object *
1953forms_unqdevice(self, args)
1954 object *self;
1955 object *args;
1956{
1957 short arg1 ;
1958 if (!getishortarg(args, 1, 0, &arg1))
1959 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001960 fl_unqdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001961 INCREF(None);
1962 return None;
1963}
1964
1965static object *
1966forms_isqueued(self, args)
1967 object *self;
1968 object *args;
1969{
Guido van Rossum03747111991-08-08 12:10:01 +00001970 long retval;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001971 short arg1 ;
1972 if (!getishortarg(args, 1, 0, &arg1))
1973 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001974 retval = fl_isqueued(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001975
Guido van Rossum03747111991-08-08 12:10:01 +00001976 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001977}
1978
1979static object *
1980forms_qtest(self, args)
1981 object *self;
1982 object *args;
1983{
1984 long retval;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001985 retval = fl_qtest();
Guido van Rossum03747111991-08-08 12:10:01 +00001986 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001987}
1988
1989
1990static object *
1991forms_qread(self, args)
1992 object *self;
1993 object *args;
1994{
1995 long retval;
1996 short arg1 ;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001997 retval = fl_qread(&arg1);
1998 { object *v = newtupleobject(2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001999 if (v == NULL) return NULL;
2000 settupleitem(v, 0, newintobject(retval));
2001 settupleitem(v, 1, newintobject((long)arg1));
2002 return v;
2003 }
2004}
2005
2006static object *
2007forms_qreset(self, args)
2008 object *self;
2009 object *args;
2010{
2011 if (!getnoarg(args)) return NULL;
2012
Guido van Rossum03747111991-08-08 12:10:01 +00002013 fl_qreset();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002014 INCREF(None);
2015 return None;
2016}
2017
2018static object *
2019forms_qenter(self, args)
2020 object *self;
2021 object *args;
2022{
2023 short arg1 ;
2024 short arg2 ;
2025 if (!getishortarg(args, 2, 0, &arg1))
2026 return NULL;
2027 if (!getishortarg(args, 2, 1, &arg2))
2028 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002029 fl_qenter(arg1, arg2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002030 INCREF(None);
2031 return None;
2032}
2033
2034static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002035forms_color(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002036 object *self;
2037 object *args;
2038{
2039 int arg;
2040
2041 if (!getintarg(args, &arg)) return NULL;
2042
2043 fl_color((short) arg);
2044
2045 INCREF(None);
2046 return None;
2047}
2048
2049static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002050forms_mapcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002051 object *self;
2052 object *args;
2053{
2054 int arg0, arg1, arg2, arg3;
2055
2056 if (!getintintintintarg(args, &arg0, &arg1, &arg2, &arg3))
2057 return NULL;
2058
2059 fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);
2060
2061 INCREF(None);
2062 return None;
2063}
2064
2065static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002066forms_getmcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002067 object *self;
2068 object *args;
2069{
Guido van Rossum03747111991-08-08 12:10:01 +00002070 int arg;
2071 short r, g, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002072 object *v;
2073
2074 if (!getintarg(args, &arg)) return NULL;
2075
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002076 fl_getmcolor(arg, &r, &g, &b);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002077
2078 v = newtupleobject(3);
2079
2080 if (v == NULL) return NULL;
2081
Guido van Rossum03747111991-08-08 12:10:01 +00002082 settupleitem(v, 0, newintobject((long)r));
2083 settupleitem(v, 1, newintobject((long)g));
2084 settupleitem(v, 2, newintobject((long)b));
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002085
2086 return v;
2087}
2088
2089static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002090forms_get_mouse(self, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00002091 object *self;
2092 object *args;
2093{
2094 float x, y ;
2095 object *v;
2096
2097 if (!getnoarg(args)) return NULL;
2098
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002099 fl_get_mouse(&x, &y);
Guido van Rossum75cc8981991-08-08 12:07:45 +00002100
2101 v = newtupleobject(2);
2102
2103 if (v == NULL) return NULL;
2104
2105 settupleitem(v, 0, newfloatobject(x));
2106 settupleitem(v, 1, newfloatobject(y));
2107
2108 return v;
2109}
2110
2111static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002112forms_tie(self, args)
2113 object *self;
2114 object *args;
2115{
2116 short arg1 ;
2117 short arg2 ;
2118 short arg3 ;
2119 if (!getishortarg(args, 3, 0, &arg1))
2120 return NULL;
2121 if (!getishortarg(args, 3, 1, &arg2))
2122 return NULL;
2123 if (!getishortarg(args, 3, 2, &arg3))
2124 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002125 fl_tie(arg1, arg2, arg3);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002126 INCREF(None);
2127 return None;
2128}
2129
Guido van Rossum03747111991-08-08 12:10:01 +00002130static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002131forms_show_message(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002132 object *f;
2133 object *args;
2134{
2135 object *a, *b, *c;
2136
2137 if (!getstrstrstrarg(args, &a, &b, &c)) return NULL;
2138
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002139 fl_show_message(
Guido van Rossum03747111991-08-08 12:10:01 +00002140 getstringvalue(a), getstringvalue(b), getstringvalue(c));
2141
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002142 INCREF(None);
Guido van Rossum03747111991-08-08 12:10:01 +00002143 return None;
2144}
2145
2146static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002147forms_show_question(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002148 object *f;
2149 object *args;
2150{
2151 int ret;
2152 object *a, *b, *c;
2153
2154 if (!getstrstrstrarg(args, &a, &b, &c)) return NULL;
2155
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002156 ret = fl_show_question(
Guido van Rossum03747111991-08-08 12:10:01 +00002157 getstringvalue(a), getstringvalue(b), getstringvalue(c));
2158
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002159 return newintobject((long) ret);
Guido van Rossum03747111991-08-08 12:10:01 +00002160}
2161
2162static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002163forms_show_input(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002164 object *f;
2165 object *args;
2166{
2167 char *str;
2168 object *a, *b;
2169
2170 if (!getstrstrarg(args, &a, &b)) return NULL;
2171
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002172 str = fl_show_input(getstringvalue(a), getstringvalue(b));
2173
2174 if (str == NULL) {
2175 INCREF(None);
2176 return None;
2177 }
2178 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002179}
2180
2181static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002182forms_file_selector(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002183 object *f;
2184 object *args;
2185{
2186 char *str;
2187 object *a, *b, *c, *d;
2188
2189 if (!getstrstrstrstrarg(args, &a, &b, &c, &d)) return NULL;
2190
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002191 str = fl_show_file_selector(getstringvalue(a), getstringvalue(b),
2192 getstringvalue(c), getstringvalue(d));
Guido van Rossum03747111991-08-08 12:10:01 +00002193
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002194 if (str == NULL) {
2195 INCREF(None);
2196 return None;
2197 }
2198 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002199}
2200
2201
2202static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002203forms_file_selector_func(args, func)
Guido van Rossum03747111991-08-08 12:10:01 +00002204 object *args;
2205 char *(*func)();
2206{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002207 char *str;
Guido van Rossum03747111991-08-08 12:10:01 +00002208
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002209 str = (*func) ();
2210
2211 if (str == NULL) {
2212 INCREF(None);
2213 return None;
2214 }
2215 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002216}
2217
2218static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002219forms_get_directory(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002220 object *f;
2221 object *args;
2222{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002223 return forms_file_selector_func(args, fl_get_directory);
Guido van Rossum03747111991-08-08 12:10:01 +00002224}
2225
2226static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002227forms_get_pattern(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002228 object *f;
2229 object *args;
2230{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002231 return forms_file_selector_func(args, fl_get_pattern);
Guido van Rossum03747111991-08-08 12:10:01 +00002232}
2233
2234static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002235forms_get_filename(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002236 object *f;
2237 object *args;
2238{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002239 return forms_file_selector_func(args, fl_get_filename);
Guido van Rossum03747111991-08-08 12:10:01 +00002240}
2241
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002242static struct methodlist forms_methods[] = {
2243/* adm */
2244 {"make_form", forms_make_form},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002245/* gl support wrappers */
2246 {"qdevice", forms_qdevice},
2247 {"unqdevice", forms_unqdevice},
2248 {"isqueued", forms_isqueued},
2249 {"qtest", forms_qtest},
2250 {"qread", forms_qread},
2251/* {"blkqread", forms_blkqread}, */
2252 {"qreset", forms_qreset},
2253 {"qenter", forms_qenter},
Guido van Rossum03747111991-08-08 12:10:01 +00002254 {"get_mouse", forms_get_mouse},
2255 {"tie", forms_tie},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002256/* {"new_events", forms_new_events}, */
2257 {"color", forms_color},
2258 {"mapcolor", forms_mapcolor},
2259 {"getmcolor", forms_getmcolor},
2260/* interaction */
2261 {"do_forms", forms_do_forms},
2262 {"check_forms", forms_check_forms},
2263 {"set_event_call_back", forms_set_event_call_back},
2264/* goodies */
Guido van Rossum03747111991-08-08 12:10:01 +00002265 {"show_message", forms_show_message},
2266 {"show_question", forms_show_question},
2267 {"file_selector", forms_file_selector},
2268 {"get_directory", forms_get_directory},
2269 {"get_pattern", forms_get_pattern},
2270 {"get_filename", forms_get_filename},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002271/*
Guido van Rossum03747111991-08-08 12:10:01 +00002272 {"show_choice", forms_show_choice},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002273 XXX - draw.c
2274*/
Guido van Rossum03747111991-08-08 12:10:01 +00002275 {"show_input", forms_show_input},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002276 {NULL, NULL} /* sentinel */
2277};
2278
2279void
2280initfl()
2281{
2282 initmodule("fl", forms_methods);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002283 foreground();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002284}
2285
2286
2287/* Support routines */
2288
2289int
2290getintintstrarg(args, a, b, c)
2291 object *args;
2292 int *a, *b;
2293 object **c;
2294{
2295 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2296 err_badarg();
2297 return NULL;
2298 }
2299 return getintarg(gettupleitem(args, 0), a) &&
2300 getintarg(gettupleitem(args, 1), b) &&
2301 getstrarg(gettupleitem(args, 2), c);
2302}
2303
2304int
2305getintfloatfloatarg(args, a, b, c)
2306 object *args;
2307 int *a;
2308 float *b, *c;
2309{
2310 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2311 err_badarg();
2312 return NULL;
2313 }
2314 return getintarg(gettupleitem(args, 0), a) &&
2315 getfloatarg(gettupleitem(args, 1), b) &&
2316 getfloatarg(gettupleitem(args, 2), c);
2317}
2318
2319int
2320getintintintintarg(args, a, b, c, d)
2321 object *args;
2322 int *a, *b, *c, *d;
2323{
2324 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 4) {
2325 err_badarg();
2326 return NULL;
2327 }
2328 return getintarg(gettupleitem(args, 0), a) &&
2329 getintarg(gettupleitem(args, 1), b) &&
2330 getintarg(gettupleitem(args, 2), c) &&
2331 getintarg(gettupleitem(args, 3), d);
2332}
2333
2334int
2335getfloatarg(args, a)
2336 object *args;
2337 float *a;
2338{
2339 double x;
2340 if (!getdoublearg(args, &x))
2341 return 0;
2342 *a = x;
2343 return 1;
2344}
2345
2346int
Guido van Rossum03747111991-08-08 12:10:01 +00002347getintfloatfloatfloatfloatstrarg(args, type, x, y, w, h, name)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002348 object *args;
2349 int *type;
2350 float *x, *y, *w, *h;
2351 object **name;
2352{
2353 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 6) {
2354 err_badarg();
2355 return NULL;
2356 }
2357 return getintarg(gettupleitem(args, 0), type) &&
2358 getfloatarg(gettupleitem(args, 1), x) &&
2359 getfloatarg(gettupleitem(args, 2), y) &&
2360 getfloatarg(gettupleitem(args, 3), w) &&
2361 getfloatarg(gettupleitem(args, 4), h) &&
2362 getstrarg(gettupleitem(args, 5), name);
2363}
2364
2365int
2366getfloatfloatfloatarg(args, f1, f2, f3)
2367 object *args;
2368 float *f1, *f2, *f3;
2369{
2370 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2371 err_badarg();
2372 return NULL;
2373 }
2374 return getfloatarg(gettupleitem(args, 0), f1) &&
2375 getfloatarg(gettupleitem(args, 1), f2) &&
2376 getfloatarg(gettupleitem(args, 2), f3);
2377}
2378
2379int
2380getfloatfloatarg(args, f1, f2)
2381 object *args;
2382 float *f1, *f2;
2383{
2384 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
2385 err_badarg();
2386 return NULL;
2387 }
2388 return getfloatarg(gettupleitem(args, 0), f1) &&
2389 getfloatarg(gettupleitem(args, 1), f2);
2390}
2391
2392int
2393getstrstrstrarg(v, a, b, c)
2394 object *v;
2395 object **a;
2396 object **b;
2397 object **c;
2398{
2399 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3) {
2400 return err_badarg();
2401 }
2402 return getstrarg(gettupleitem(v, 0), a) &&
2403 getstrarg(gettupleitem(v, 1), b)&&
2404 getstrarg(gettupleitem(v, 2), c);
2405}
2406
2407
2408int
2409getstrstrstrstrarg(v, a, b, c, d)
2410 object *v;
2411 object **a;
2412 object **b;
2413 object **c;
2414 object **d;
2415{
2416 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 4) {
2417 return err_badarg();
2418 }
2419 return getstrarg(gettupleitem(v, 0), a) &&
2420 getstrarg(gettupleitem(v, 1), b)&&
2421 getstrarg(gettupleitem(v, 2), c) &&
2422 getstrarg(gettupleitem(v, 3),d);
2423
2424}