blob: 143a1ee4692f84a775d3d041b006b3ecb60e7fd2 [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
284static object *
285generic_getattr(g, name)
286 genericobject *g;
287 char *name;
288{
289 object *meth;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000290
291 /* XXX Ought to special-case name "__methods__" */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000292 if (g-> ob_methods) {
Guido van Rossum03747111991-08-08 12:10:01 +0000293 meth = findmethod(g->ob_methods, (object *)g, name);
294 if (meth != NULL) return meth;
295 err_clear();
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000296 }
297
298 meth = findmethod(generic_methods, (object *)g, name);
299 if (meth != NULL)
300 return meth;
301 err_clear();
302
303 /* "label" is an exception, getmember only works for char pointers,
304 not for char arrays */
305 if (strcmp(name, "label") == 0)
306 return newstringobject(g->ob_generic->label);
307
308 return getmember((char *)g->ob_generic, generic_memberlist, name);
309}
310
311static int
312generic_setattr(g, name, v)
313 genericobject *g;
314 char *name;
315 object *v;
316{
317 int ret;
318
319 if (v == NULL) {
320 err_setstr(TypeError, "can't delete forms object attributes");
321 return NULL;
322 }
323
324 /* "label" is an exception: setmember doesn't set strings;
325 and FORMS wants you to call a function to set the label */
326 if (strcmp(name, "label") == 0) {
327 if (!is_stringobject(v)) {
328 err_setstr(TypeError, "label attr must be string");
329 return NULL;
330 }
331 fl_set_object_label(g->ob_generic, getstringvalue(v));
332 return 0;
333 }
334
335 ret = setmember((char *)g->ob_generic, generic_memberlist, name, v);
336
337 /* Rather than calling all the various set_object_* functions,
338 we call fl_redraw_object here. This is sometimes redundant
339 but I doubt that's a big problem */
340 if (ret == 0)
341 fl_redraw_object(g->ob_generic);
342
343 return ret;
344}
345
346typeobject GenericObjecttype = {
347 OB_HEAD_INIT(&Typetype)
348 0, /*ob_size*/
349 "generic FORMS object", /*tp_name*/
350 sizeof(genericobject), /*tp_size*/
351 0, /*tp_itemsize*/
352 /* methods */
353 generic_dealloc, /*tp_dealloc*/
354 0, /*tp_print*/
355 generic_getattr, /*tp_getattr*/
356 generic_setattr, /*tp_setattr*/
357 0, /*tp_compare*/
358 0, /*tp_repr*/
359};
360
361static object *
362newgenericobject(generic, methods)
363 FL_OBJECT *generic;
364 struct methodlist *methods;
365{
366 genericobject *g;
367 g = NEWOBJ(genericobject, &GenericObjecttype);
368 if (g == NULL)
369 return NULL;
370 g-> ob_generic = generic;
371 g->ob_methods = methods;
372 g->ob_callback = NULL;
373 g->ob_callback_arg = NULL;
374 knowgeneric(g);
375 return (object *)g;
376}
377
378/**********************************************************************/
379/* Some common calling sequences */
380
381/* void func (object, float) */
382static object *
383call_forms_INf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000384 void (*func)(FL_OBJECT *, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000385 FL_OBJECT *obj;
386 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000387{
Guido van Rossum03747111991-08-08 12:10:01 +0000388 float parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000389
Guido van Rossum03747111991-08-08 12:10:01 +0000390 if (!getfloatarg (args, &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000391
Guido van Rossum03747111991-08-08 12:10:01 +0000392 (*func) (obj, parameter);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000393
Guido van Rossum03747111991-08-08 12:10:01 +0000394 INCREF(None);
395 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000396}
397
398/* void func (object, float) */
399static object *
400call_forms_INfINf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000401 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000402 FL_OBJECT *obj;
403 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000404{
Guido van Rossum03747111991-08-08 12:10:01 +0000405 float par1, par2;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000406
Guido van Rossum03747111991-08-08 12:10:01 +0000407 if (!getfloatfloatarg (args, &par1, &par2)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000408
Guido van Rossum03747111991-08-08 12:10:01 +0000409 (*func) (obj, par1, par2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000410
Guido van Rossum03747111991-08-08 12:10:01 +0000411 INCREF(None);
412 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000413}
414
415/* void func (object, int) */
416static object *
417call_forms_INi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000418 void (*func)(FL_OBJECT *, int);
Guido van Rossum03747111991-08-08 12:10:01 +0000419 FL_OBJECT *obj;
420 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000421{
Guido van Rossum03747111991-08-08 12:10:01 +0000422 int parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000423
Guido van Rossum03747111991-08-08 12:10:01 +0000424 if (!getintarg (args, &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000425
Guido van Rossum03747111991-08-08 12:10:01 +0000426 (*func) (obj, parameter);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000427
Guido van Rossum03747111991-08-08 12:10:01 +0000428 INCREF(None);
429 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000430}
431
432/* void func (object, string) */
433static object *
434call_forms_INstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000435 void (*func)(FL_OBJECT *, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000436 FL_OBJECT *obj;
437 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000438{
Guido van Rossum03747111991-08-08 12:10:01 +0000439 object *a;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000440
Guido van Rossum03747111991-08-08 12:10:01 +0000441 if (!getstrarg (args, &a)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000442
Guido van Rossum03747111991-08-08 12:10:01 +0000443 (*func) (obj, getstringvalue (a));
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000444
Guido van Rossum03747111991-08-08 12:10:01 +0000445 INCREF(None);
446 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000447}
448
449
450/* voide func (object, int, string) */
451static object *
452call_forms_INiINstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000453 void (*func)(FL_OBJECT *, int, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000454 FL_OBJECT *obj;
455 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000456{
Guido van Rossum03747111991-08-08 12:10:01 +0000457 object *a;
458 int b;
459
460 if (!getintstrarg (args, &b, &a)) return NULL;
461
462 (*func) (obj, b, getstringvalue (a));
463
464 INCREF(None);
465 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000466}
467
Guido van Rossum03747111991-08-08 12:10:01 +0000468#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000469/* void func (object, float) */
470static object *
471call_forms_INiINi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000472 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000473 FL_OBJECT *obj;
474 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000475{
Guido van Rossum03747111991-08-08 12:10:01 +0000476 int par1, par2;
477
478 if (!getintintarg (args, &par1, &par2)) return NULL;
479
480 (*func) (obj, par1, par2);
481
482 INCREF(None);
483 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000484}
Guido van Rossum03747111991-08-08 12:10:01 +0000485#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000486
487/* int func (object) */
488static object *
489call_forms_Ri (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000490 int (*func)(FL_OBJECT *);
491 FL_OBJECT *obj;
492 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000493{
Guido van Rossum03747111991-08-08 12:10:01 +0000494 int retval;
495
496 if (!getnoarg(args)) return NULL;
497
498 retval = (*func) (obj);
499
500 return newintobject ((long) retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000501}
502
503/* char * func (object) */
504static object *
505call_forms_Rstr (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000506 char * (*func)(FL_OBJECT *);
507 FL_OBJECT *obj;
508 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000509{
Guido van Rossum03747111991-08-08 12:10:01 +0000510 char *str;
511
512 if (!getnoarg (args)) return NULL;
513
514 str = (*func) (obj);
515
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000516 if (str == NULL) {
517 INCREF(None);
518 return None;
519 }
Guido van Rossum03747111991-08-08 12:10:01 +0000520 return newstringobject (str);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000521}
522
523/* int func (object) */
524static object *
525call_forms_Rf (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000526 float (*func)(FL_OBJECT *);
527 FL_OBJECT *obj;
528 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000529{
Guido van Rossum03747111991-08-08 12:10:01 +0000530 float retval;
531
532 if (!getnoarg(args)) return NULL;
533
534 retval = (*func) (obj);
535
536 return newfloatobject (retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000537}
538
539static object *
540call_forms_OUTfOUTf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000541 void (*func)(FL_OBJECT *, float *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000542 FL_OBJECT *obj;
543 object *args;
544{
545 float f1, f2;
546 object *arg;
Guido van Rossum03747111991-08-08 12:10:01 +0000547
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000548 if (!getnoarg(args)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000549
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000550 (*func) (obj, &f1, &f2);
551
552 arg = newtupleobject (2);
553 if (arg == NULL) return NULL;
554
555 settupleitem (arg, 0, newfloatobject (f1));
556 settupleitem (arg, 1, newfloatobject (f2));
557 return arg;
558}
559
Guido van Rossum03747111991-08-08 12:10:01 +0000560#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000561static object *
562call_forms_OUTf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000563 void (*func)(FL_OBJECT *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000564 FL_OBJECT *obj;
565 object *args;
566{
567 float f;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000568
569 if (!getnoarg(args)) return NULL;
570
571 (*func) (obj, &f);
572
573 return newfloatobject (f);
574}
Guido van Rossum03747111991-08-08 12:10:01 +0000575#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000576
577/**********************************************************************/
578/* Class : browser */
579
580static object *
581set_browser_topline(g, args)
582 genericobject *g;
583 object *args;
584{
Guido van Rossum03747111991-08-08 12:10:01 +0000585 return call_forms_INi (fl_set_browser_topline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000586}
587
588static object *
589clear_browser(g, args)
590 genericobject *g;
591 object *args;
592{
Guido van Rossum03747111991-08-08 12:10:01 +0000593 return generic_call (g, args, fl_clear_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000594}
595
596static object *
597add_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000598 genericobject *g;
599 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000600{
Guido van Rossum03747111991-08-08 12:10:01 +0000601 return call_forms_INstr (fl_add_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000602}
603
604static object *
605addto_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000606 genericobject *g;
607 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000608{
Guido van Rossum03747111991-08-08 12:10:01 +0000609 return call_forms_INstr (fl_addto_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000610}
611
612static object *
613insert_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000614 genericobject *g;
615 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000616{
Guido van Rossum03747111991-08-08 12:10:01 +0000617 return call_forms_INiINstr (fl_insert_browser_line,
618 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000619}
620
621static object *
622delete_browser_line (g, args)
623 genericobject *g;
624 object *args;
625{
Guido van Rossum03747111991-08-08 12:10:01 +0000626 return call_forms_INi (fl_delete_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000627}
628
629static object *
630replace_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000631 genericobject *g;
632 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000633{
Guido van Rossum03747111991-08-08 12:10:01 +0000634 return call_forms_INiINstr (fl_replace_browser_line,
635 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000636}
637
638static object *
639get_browser_line(g, args)
640 genericobject *g;
641 object *args;
642{
643 int i;
644 char *str;
645
646 if (!getintarg(args, &i))
647 return NULL;
648
649 str = fl_get_browser_line (g->ob_generic, i);
650
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000651 if (str == NULL) {
652 INCREF(None);
653 return None;
654 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000655 return newstringobject (str);
656}
657
658static object *
659load_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000660 genericobject *g;
661 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000662{
Guido van Rossumabe58351991-08-08 12:34:44 +0000663 /* XXX strictly speaking this is wrong since fl_load_browser
664 XXX returns int, not void */
Guido van Rossum03747111991-08-08 12:10:01 +0000665 return call_forms_INstr (fl_load_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000666}
667
668static object *
669get_browser_maxline(g, args)
670 genericobject *g;
671 object *args;
672{
Guido van Rossum03747111991-08-08 12:10:01 +0000673 return call_forms_Ri (fl_get_browser_maxline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000674}
675
676static object *
677select_browser_line (g, args)
678 genericobject *g;
679 object *args;
680{
Guido van Rossum03747111991-08-08 12:10:01 +0000681 return call_forms_INi (fl_select_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000682}
683
684static object *
685deselect_browser_line (g, args)
686 genericobject *g;
687 object *args;
688{
Guido van Rossum03747111991-08-08 12:10:01 +0000689 return call_forms_INi (fl_deselect_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000690}
691
692static object *
693deselect_browser (g, args)
694 genericobject *g;
695 object *args;
696{
Guido van Rossum03747111991-08-08 12:10:01 +0000697 return generic_call (g, args, fl_deselect_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000698}
699
700static object *
701isselected_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000702 genericobject *g;
703 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000704{
705 int i, j;
Guido van Rossum03747111991-08-08 12:10:01 +0000706
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000707 if (!getintarg(args, &i))
708 return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000709
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000710 j = fl_isselected_browser_line (g->ob_generic, i);
Guido van Rossum03747111991-08-08 12:10:01 +0000711
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000712 return newintobject (j);
713}
714
715static object *
716get_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000717 genericobject *g;
718 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000719{
Guido van Rossum03747111991-08-08 12:10:01 +0000720 return call_forms_Ri (fl_get_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000721}
722
723static object *
724set_browser_fontsize (g, args)
725 genericobject *g;
726 object *args;
727{
Guido van Rossum03747111991-08-08 12:10:01 +0000728 return call_forms_INf (fl_set_browser_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000729}
730
731static object *
732set_browser_fontstyle (g, args)
733 genericobject *g;
734 object *args;
735{
Guido van Rossum03747111991-08-08 12:10:01 +0000736 return call_forms_INi (fl_set_browser_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000737}
738
739static struct methodlist browser_methods[] = {
740 {"set_browser_topline", set_browser_topline},
741 {"clear_browser", clear_browser},
742 {"add_browser_line", add_browser_line},
743 {"addto_browser", addto_browser},
744 {"insert_browser_line", insert_browser_line},
745 {"delete_browser_line", delete_browser_line},
746 {"replace_browser_line",replace_browser_line},
747 {"get_browser_line", get_browser_line},
748 {"load_browser", load_browser},
749 {"get_browser_maxline", get_browser_maxline},
750 {"select_browser_line", select_browser_line},
751 {"deselect_browser_line", deselect_browser_line},
752 {"deselect_browser", deselect_browser},
753 {"isselected_browser_line", isselected_browser_line},
754 {"get_browser", get_browser},
755 {"set_browser_fontsize",set_browser_fontsize},
756 {"set_browser_fontstyle", set_browser_fontstyle},
757 {NULL, NULL} /* sentinel */
758};
759
760/* Class: button */
761
762static object *
763set_button(g, args)
764 genericobject *g;
765 object *args;
766{
Guido van Rossum03747111991-08-08 12:10:01 +0000767 return call_forms_INi (fl_set_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000768}
769
770static object *
771get_button(g, args)
772 genericobject *g;
773 object *args;
774{
Guido van Rossum03747111991-08-08 12:10:01 +0000775 return call_forms_Ri (fl_get_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000776}
777
778static struct methodlist button_methods[] = {
779 {"set_button", set_button},
780 {"get_button", get_button},
781 {NULL, NULL} /* sentinel */
782};
783
784/* Class: choice */
785
786static object *
787set_choice(g, args)
788 genericobject *g;
789 object *args;
790{
Guido van Rossum03747111991-08-08 12:10:01 +0000791 return call_forms_INi (fl_set_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000792}
793
794static object *
795get_choice(g, args)
796 genericobject *g;
797 object *args;
798{
Guido van Rossum03747111991-08-08 12:10:01 +0000799 return call_forms_Ri (fl_get_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000800}
801
802static object *
803clear_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000804 genericobject *g;
805 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000806{
Guido van Rossum03747111991-08-08 12:10:01 +0000807 return generic_call (g, args, fl_clear_choice);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000808}
809
810static object *
811addto_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000812 genericobject *g;
813 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000814{
Guido van Rossum03747111991-08-08 12:10:01 +0000815 return call_forms_INstr (fl_addto_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000816}
817
818static object *
819replace_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000820 genericobject *g;
821 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000822{
Guido van Rossum03747111991-08-08 12:10:01 +0000823 return call_forms_INiINstr (fl_replace_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000824}
825
826static object *
827delete_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000828 genericobject *g;
829 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000830{
Guido van Rossum03747111991-08-08 12:10:01 +0000831 return call_forms_INi (fl_delete_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000832}
833
834static object *
835get_choice_text (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000836 genericobject *g;
837 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000838{
Guido van Rossum03747111991-08-08 12:10:01 +0000839 return call_forms_Rstr (fl_get_choice_text, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000840}
841
842static object *
843set_choice_fontsize (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000844 genericobject *g;
845 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000846{
Guido van Rossum03747111991-08-08 12:10:01 +0000847 return call_forms_INf (fl_set_choice_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000848}
849
850static object *
851set_choice_fontstyle (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000852 genericobject *g;
853 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000854{
Guido van Rossum03747111991-08-08 12:10:01 +0000855 return call_forms_INi (fl_set_choice_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000856}
857
858static struct methodlist choice_methods[] = {
859 {"set_choice", set_choice},
860 {"get_choice", get_choice},
861 {"clear_choice", clear_choice},
862 {"addto_choice", addto_choice},
863 {"replace_choice", replace_choice},
864 {"delete_choice", delete_choice},
865 {"get_choice_text", get_choice_text},
866 {"set_choice_fontsize", set_choice_fontsize},
867 {"set_choice_fontstyle",set_choice_fontstyle},
868 {NULL, NULL} /* sentinel */
869};
870
871/* Class : Clock */
872
873static object *
874get_clock(g, args)
875 genericobject *g;
876 object *args;
877{
878 int i0, i1, i2;
879 object *arg;
880
881 if (!getnoarg(args))
882 return NULL;
883
884 fl_get_clock (g->ob_generic, &i0, &i1, &i2);
885
886 arg = newtupleobject (3);
887 if (arg == NULL) return NULL;
888
889 settupleitem (arg, 0, newintobject (i0));
890 settupleitem (arg, 1, newintobject (i1));
891 settupleitem (arg, 2, newintobject (i2));
892 return arg;
893}
894
895static struct methodlist clock_methods[] = {
896 {"get_clock", get_clock},
897 {NULL, NULL} /* sentinel */
898};
899
900/* CLass : Counters */
901
902static object *
903get_counter_value(g, args)
904 genericobject *g;
905 object *args;
906{
907 return call_forms_Rf (fl_get_counter_value, g-> ob_generic, args);
908}
909
910static object *
911set_counter_value (g, args)
912 genericobject *g;
913 object *args;
914{
915 return call_forms_INf (fl_set_counter_value, g-> ob_generic, args);
916}
917
918static object *
919set_counter_precision (g, args)
920 genericobject *g;
921 object *args;
922{
923 return call_forms_INi (fl_set_counter_precision, g-> ob_generic, args);
924}
925
926static object *
927set_counter_bounds (g, args)
928 genericobject *g;
929 object *args;
930{
931 return call_forms_INfINf (fl_set_counter_bounds, g-> ob_generic, args);
932}
933
934static object *
935set_counter_step (g, args)
936 genericobject *g;
937 object *args;
938{
939 return call_forms_INfINf (fl_set_counter_step, g-> ob_generic, args);
940}
941
942static object *
943set_counter_return (g, args)
944 genericobject *g;
945 object *args;
946{
Guido van Rossum03747111991-08-08 12:10:01 +0000947 return call_forms_INi (fl_set_counter_return, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000948}
949
950static struct methodlist counter_methods[] = {
951 {"set_counter_value", set_counter_value},
952 {"get_counter_value", get_counter_value},
953 {"set_counter_bounds", set_counter_bounds},
954 {"set_counter_step", set_counter_step},
955 {"set_counter_precision", set_counter_precision},
956 {"set_counter_return", set_counter_return},
957 {NULL, NULL} /* sentinel */
958};
959
960/* Class : Defaults */
961
962static object *
963get_default(g, args)
964 genericobject *g;
965 object *args;
966{
Guido van Rossum03747111991-08-08 12:10:01 +0000967 char c;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000968
Guido van Rossum03747111991-08-08 12:10:01 +0000969 if (!getnoarg(args)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000970
Guido van Rossum03747111991-08-08 12:10:01 +0000971 c = fl_get_default (g->ob_generic);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000972
Guido van Rossum03747111991-08-08 12:10:01 +0000973 return ((object *) mknewcharobject (c)); /* in cgensupport.c */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000974}
975
976static struct methodlist default_methods[] = {
977 {"get_default", get_default},
978 {NULL, NULL} /* sentinel */
979};
980
981
982/* Class: Dials */
983
984static object *
985set_dial (g, args)
986 genericobject *g;
987 object *args;
988{
989 float f1, f2, f3;
990
991 if (!getfloatfloatfloatarg(args, &f1, &f2, &f3))
992 return NULL;
993 fl_set_dial (g->ob_generic, f1, f2, f3);
994 INCREF(None);
995 return None;
996}
997
998static object *
999get_dial(g, args)
1000 genericobject *g;
1001 object *args;
1002{
1003 return call_forms_Rf (fl_get_dial, g-> ob_generic, args);
1004}
1005
1006static object *
1007set_dial_value (g, args)
1008 genericobject *g;
1009 object *args;
1010{
1011 return call_forms_INf (fl_set_dial_value, g-> ob_generic, args);
1012}
1013
1014static object *
1015set_dial_bounds (g, args)
1016 genericobject *g;
1017 object *args;
1018{
1019 return call_forms_INfINf (fl_set_dial_bounds, g-> ob_generic, args);
1020}
1021
1022static object *
1023get_dial_bounds (g, args)
1024 genericobject *g;
1025 object *args;
1026{
1027 return call_forms_OUTfOUTf (fl_get_dial_bounds, g-> ob_generic, args);
1028}
1029
1030static struct methodlist dial_methods[] = {
1031 {"set_dial", set_dial},
1032 {"get_dial", get_dial},
1033 {"set_dial_value", set_dial_value},
1034 {"get_dial_value", get_dial},
1035 {"set_dial_bounds", set_dial_bounds},
1036 {"get_dial_bounds", get_dial_bounds},
1037 {NULL, NULL} /* sentinel */
1038};
1039
1040/* Class : Input */
1041
1042static object *
1043set_input (g, args)
1044 genericobject *g;
1045 object *args;
1046{
1047 return call_forms_INstr (fl_set_input, g-> ob_generic, args);
1048}
1049
1050static object *
1051get_input (g, args)
1052 genericobject *g;
1053 object *args;
1054{
1055 return call_forms_Rstr (fl_get_input, g-> ob_generic, args);
1056}
1057
1058static object *
1059set_input_color (g, args)
1060 genericobject *g;
1061 object *args;
1062{
1063 return call_forms_INfINf (fl_set_input_color, g-> ob_generic, args);
1064}
1065
1066static struct methodlist input_methods[] = {
1067 {"set_input", set_input},
1068 {"get_input", get_input},
1069 {"set_input_color", set_input_color},
1070 {NULL, NULL} /* sentinel */
1071};
1072
1073
1074/* Class : Menu */
1075
1076static object *
1077set_menu (g, args)
1078 genericobject *g;
1079 object *args;
1080{
Guido van Rossumabe58351991-08-08 12:34:44 +00001081 return call_forms_INstr (fl_set_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001082}
1083
1084static object *
1085get_menu (g, args)
1086 genericobject *g;
1087 object *args;
1088{
Guido van Rossumabe58351991-08-08 12:34:44 +00001089 /* XXX strictly speaking this is wrong since fl_get_menu
1090 XXX returns long, not int */
1091 return call_forms_Ri (fl_get_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001092}
1093
1094static object *
1095addto_menu (g, args)
1096 genericobject *g;
1097 object *args;
1098{
Guido van Rossumabe58351991-08-08 12:34:44 +00001099 return call_forms_INstr (fl_addto_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001100}
1101
1102static struct methodlist menu_methods[] = {
1103 {"set_menu", set_menu},
1104 {"get_menu", get_menu},
1105 {"addto_menu", addto_menu},
1106 {NULL, NULL} /* sentinel */
1107};
1108
1109
1110/* Class: Sliders */
1111
1112static object *
1113set_slider (g, args)
1114 genericobject *g;
1115 object *args;
1116{
1117 float f1, f2, f3;
1118
1119 if (!getfloatfloatfloatarg(args, &f1, &f2, &f3))
1120 return NULL;
1121 fl_set_slider (g->ob_generic, f1, f2, f3);
1122 INCREF(None);
1123 return None;
1124}
1125
1126static object *
1127get_slider(g, args)
1128 genericobject *g;
1129 object *args;
1130{
1131 return call_forms_Rf (fl_get_slider, g-> ob_generic, args);
1132}
1133
1134static object *
1135set_slider_value (g, args)
1136 genericobject *g;
1137 object *args;
1138{
1139 return call_forms_INf (fl_set_slider_value, g-> ob_generic, args);
1140}
1141
1142static object *
1143set_slider_bounds (g, args)
1144 genericobject *g;
1145 object *args;
1146{
1147 return call_forms_INfINf (fl_set_slider_bounds, g-> ob_generic, args);
1148}
1149
1150static object *
1151get_slider_bounds (g, args)
1152 genericobject *g;
1153 object *args;
1154{
1155 return call_forms_OUTfOUTf(fl_get_slider_bounds, g-> ob_generic, args);
1156}
1157
1158static object *
1159set_slider_return (g, args)
1160 genericobject *g;
1161 object *args;
1162{
1163 return call_forms_INf (fl_set_slider_return, g-> ob_generic, args);
1164}
1165
1166static object *
1167set_slider_size (g, args)
1168 genericobject *g;
1169 object *args;
1170{
1171 return call_forms_INf (fl_set_slider_size, g-> ob_generic, args);
1172}
1173
1174static object *
1175set_slider_precision (g, args)
1176 genericobject *g;
1177 object *args;
1178{
1179 return call_forms_INi (fl_set_slider_precision, g-> ob_generic, args);
1180}
1181
1182static struct methodlist slider_methods[] = {
1183 {"set_slider", set_slider},
1184 {"get_slider", get_slider},
1185 {"set_slider_value", set_slider_value},
1186 {"get_slider_value", get_slider},
1187 {"set_slider_bounds", set_slider_bounds},
1188 {"get_slider_bounds", get_slider_bounds},
1189 {"set_slider_return", set_slider_return},
1190 {"set_slider_size", set_slider_size},
1191 {"set_slider_precision",set_slider_precision},
1192 {NULL, NULL} /* sentinel */
1193};
1194
1195static object *
1196set_positioner_xvalue (g, args)
1197 genericobject *g;
1198 object *args;
1199{
1200 return call_forms_INf (fl_set_positioner_xvalue, g-> ob_generic, args);
1201}
1202
1203static object *
1204set_positioner_xbounds (g, args)
1205 genericobject *g;
1206 object *args;
1207{
1208 return call_forms_INfINf (fl_set_positioner_xbounds, g-> ob_generic, args);
1209}
1210
1211static object *
1212set_positioner_yvalue (g, args)
1213 genericobject *g;
1214 object *args;
1215{
1216 return call_forms_INf (fl_set_positioner_yvalue, g-> ob_generic, args);
1217}
1218
1219static object *
1220set_positioner_ybounds (g, args)
1221 genericobject *g;
1222 object *args;
1223{
1224 return call_forms_INfINf (fl_set_positioner_ybounds, g-> ob_generic, args);
1225}
1226
1227static object *
1228get_positioner_xvalue (g, args)
1229 genericobject *g;
1230 object *args;
1231{
1232 return call_forms_Rf (fl_get_positioner_xvalue, g-> ob_generic, args);
1233}
1234
1235static object *
1236get_positioner_xbounds (g, args)
1237 genericobject *g;
1238 object *args;
1239{
1240 return call_forms_OUTfOUTf (fl_get_positioner_xbounds, g-> ob_generic, args);
1241}
1242
1243static object *
1244get_positioner_yvalue (g, args)
1245 genericobject *g;
1246 object *args;
1247{
1248 return call_forms_Rf (fl_get_positioner_yvalue, g-> ob_generic, args);
1249}
1250
1251static object *
1252get_positioner_ybounds (g, args)
1253 genericobject *g;
1254 object *args;
1255{
1256 return call_forms_OUTfOUTf (fl_get_positioner_ybounds, g-> ob_generic, args);
1257}
1258
1259static struct methodlist positioner_methods[] = {
1260 {"set_positioner_xvalue", set_positioner_xvalue},
1261 {"set_positioner_yvalue", set_positioner_yvalue},
1262 {"set_positioner_xbounds", set_positioner_xbounds},
1263 {"set_positioner_ybounds", set_positioner_ybounds},
1264 {"get_positioner_xvalue", get_positioner_xvalue},
1265 {"get_positioner_yvalue", get_positioner_yvalue},
1266 {"get_positioner_xbounds", get_positioner_xbounds},
Guido van Rossum03747111991-08-08 12:10:01 +00001267 {"get_positioner_ybounds", get_positioner_ybounds},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001268 {NULL, NULL} /* sentinel */
1269};
1270
1271/* Class timer */
1272
1273static object *
1274set_timer (g, args)
1275 genericobject *g;
1276 object *args;
1277{
1278 return call_forms_INf (fl_set_timer, g-> ob_generic, args);
1279}
1280
1281static object *
1282get_timer (g, args)
1283 genericobject *g;
1284 object *args;
1285{
1286 return call_forms_Rf (fl_get_timer, g-> ob_generic, args);
1287}
1288
1289static struct methodlist timer_methods[] = {
1290 {"set_timer", set_timer},
1291 {"get_timer", get_timer},
1292 {NULL, NULL} /* sentinel */
1293};
1294
1295/* Form objects */
1296
1297typedef struct {
1298 OB_HEAD
1299 FL_FORM *ob_form;
1300} formobject;
1301
1302extern typeobject Formtype; /* Forward */
1303
1304#define is_formobject(v) ((v)->ob_type == &Formtype)
1305
1306static object *
1307form_show_form(f, args)
1308 formobject *f;
1309 object *args;
1310{
1311 int place, border;
1312 object *name;
1313 if (!getintintstrarg(args, &place, &border, &name))
1314 return NULL;
1315 fl_show_form(f->ob_form, place, border, getstringvalue(name));
1316 INCREF(None);
1317 return None;
1318}
1319
1320static object *
1321form_call(func, f, args)
1322 FL_FORM *f;
1323 object *args;
1324 void (*func)(FL_FORM *);
1325{
1326 if (!getnoarg(args)) return NULL;
1327
1328 (*func)(f);
1329
1330 INCREF(None);
1331 return None;
1332}
1333
1334static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001335form_call_INiINi(func, f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001336 FL_FORM *f;
1337 object *args;
1338 void (*func)(FL_FORM *, int, int);
1339{
1340 int a, b;
1341
1342 if (!getintintarg(args, &a, &b)) return NULL;
1343
1344 (*func)(f, a, b);
1345
1346 INCREF(None);
1347 return None;
1348}
1349
1350static object *
1351form_hide_form(f, args)
1352 formobject *f;
1353 object *args;
1354{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001355 return form_call(fl_hide_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001356}
1357
1358static object *
1359form_redraw_form(f, args)
1360 formobject *f;
1361 object *args;
1362{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001363 return form_call(fl_redraw_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001364}
1365
1366static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001367form_add_object(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001368 formobject *f;
1369 object *args;
1370{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001371 if (args == NULL || !is_genericobject(args)) {
1372 err_badarg();
1373 return NULL;
1374 }
1375
1376 fl_add_object(f->ob_form, ((genericobject *)args) -> ob_generic);
1377
1378 INCREF(None);
1379 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001380}
1381
1382static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001383form_set_form_position(f, args)
1384 formobject *f;
1385 object *args;
1386{
1387 return form_call_INiINi(fl_set_form_position, f-> ob_form, args);
1388}
1389
1390static object *
1391generic_add_object(f, args, func, internal_methods)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001392 formobject *f;
1393 object *args;
1394 FL_OBJECT *(*func)(int, float, float, float, float, char*);
1395 struct methodlist *internal_methods;
1396{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001397 int type;
1398 float x, y, w, h;
1399 object *name;
1400 FL_OBJECT *obj;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001401
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001402 if (!getintfloatfloatfloatfloatstrarg(args,&type,&x,&y,&w,&h,&name))
1403 return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001404
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001405 fl_addto_form (f-> ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001406
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001407 obj = (*func) (type, x, y, w, h, getstringvalue(name));
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001408
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001409 fl_end_form();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001410
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001411 if (obj == NULL) {
1412 err_nomem();
1413 return NULL;
1414 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001415
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001416 return newgenericobject (obj, internal_methods);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001417}
1418
1419static object *
1420form_add_button(f, args)
1421 formobject *f;
1422 object *args;
1423{
1424 return generic_add_object(f, args, fl_add_button, button_methods);
1425}
1426
1427static object *
1428form_add_lightbutton(f, args)
1429 formobject *f;
1430 object *args;
1431{
1432 return generic_add_object(f, args, fl_add_lightbutton, button_methods);
1433}
1434
1435static object *
1436form_add_roundbutton(f, args)
1437 formobject *f;
1438 object *args;
1439{
1440 return generic_add_object(f, args, fl_add_roundbutton, button_methods);
1441}
1442
1443static object *
1444form_add_menu (f, args)
1445 formobject *f;
1446 object *args;
1447{
1448 return generic_add_object(f, args, fl_add_menu, menu_methods);
1449}
1450
1451static object *
1452form_add_slider(f, args)
1453 formobject *f;
1454 object *args;
1455{
1456 return generic_add_object(f, args, fl_add_slider, slider_methods);
1457}
1458
1459static object *
1460form_add_valslider(f, args)
1461 formobject *f;
1462 object *args;
1463{
1464 return generic_add_object(f, args, fl_add_valslider, slider_methods);
1465}
1466
1467static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001468form_add_dial(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001469 formobject *f;
1470 object *args;
1471{
1472 return generic_add_object(f, args, fl_add_dial, dial_methods);
1473}
1474
1475static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001476form_add_counter(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001477 formobject *f;
1478 object *args;
1479{
1480 return generic_add_object(f, args, fl_add_counter, counter_methods);
1481}
1482
1483static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001484form_add_default(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001485 formobject *f;
1486 object *args;
1487{
1488 return generic_add_object(f, args, fl_add_default, default_methods);
1489}
1490
1491static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001492form_add_clock(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001493 formobject *f;
1494 object *args;
1495{
1496 return generic_add_object(f, args, fl_add_clock, clock_methods);
1497}
1498
1499static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001500form_add_box(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001501 formobject *f;
1502 object *args;
1503{
Guido van Rossum03747111991-08-08 12:10:01 +00001504 return generic_add_object(f, args, fl_add_box,
1505 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001506}
1507
1508static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001509form_add_choice(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001510 formobject *f;
1511 object *args;
1512{
1513 return generic_add_object(f, args, fl_add_choice, choice_methods);
1514}
1515
1516static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001517form_add_browser(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001518 formobject *f;
1519 object *args;
1520{
1521 return generic_add_object(f, args, fl_add_browser, browser_methods);
1522}
1523
1524static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001525form_add_positioner(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001526 formobject *f;
1527 object *args;
1528{
1529 return generic_add_object(f, args, fl_add_positioner, positioner_methods);
1530}
1531
1532static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001533form_add_input(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001534 formobject *f;
1535 object *args;
1536{
1537 return generic_add_object(f, args, fl_add_input, input_methods);
1538}
1539
1540static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001541form_add_text(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001542 formobject *f;
1543 object *args;
1544{
Guido van Rossum03747111991-08-08 12:10:01 +00001545 return generic_add_object(f, args, fl_add_text,
1546 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001547}
1548
1549static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001550form_add_timer(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001551 formobject *f;
1552 object *args;
1553{
1554 return generic_add_object(f, args, fl_add_timer, timer_methods);
1555}
1556
1557static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001558form_freeze_form(f, args)
1559 formobject *f;
1560 object *args;
1561{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001562 return form_call(fl_freeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001563}
1564
1565static object *
1566form_unfreeze_form(f, args)
1567 formobject *f;
1568 object *args;
1569{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001570 return form_call(fl_unfreeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001571}
1572
1573static object *
1574form_display_form(f, args)
1575 formobject *f;
1576 object *args;
1577{
1578 int place, border;
1579 object *name;
1580 if (!getintintstrarg(args, &place, &border, &name))
1581 return NULL;
1582 fl_show_form(f->ob_form, place, border, getstringvalue(name));
1583 INCREF(None);
1584 return None;
1585}
1586
1587static object *
1588form_remove_form(f, args)
1589 formobject *f;
1590 object *args;
1591{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001592 return form_call(fl_remove_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001593}
1594
1595static object *
1596form_activate_form(f, args)
1597 formobject *f;
1598 object *args;
1599{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001600 return form_call(fl_activate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001601}
1602
1603static object *
1604form_deactivate_form(f, args)
1605 formobject *f;
1606 object *args;
1607{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001608 return form_call(fl_deactivate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001609}
1610
Guido van Rossum75cc8981991-08-08 12:07:45 +00001611static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001612form_bgn_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001613 formobject *f;
1614 object *args;
1615{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001616 FL_OBJECT *obj;
1617
1618 fl_addto_form(f-> ob_form);
1619 obj = fl_bgn_group();
1620 fl_end_form();
1621
1622 if (obj == NULL) {
1623 err_nomem();
1624 return NULL;
1625 }
1626
1627 return newgenericobject (obj, (struct methodlist *) NULL);
Guido van Rossum03747111991-08-08 12:10:01 +00001628}
1629
1630static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001631form_end_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001632 formobject *f;
1633 object *args;
1634{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001635 fl_addto_form(f-> ob_form);
Guido van Rossum03747111991-08-08 12:10:01 +00001636 fl_end_group();
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001637 fl_end_form();
Guido van Rossum03747111991-08-08 12:10:01 +00001638 INCREF(None);
1639 return None;
1640}
1641
1642static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001643forms_find_first_or_last(func, f, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00001644 FL_OBJECT *(*func)(FL_FORM *, int, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +00001645 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001646 object *args;
1647{
1648 int type;
1649 float mx, my;
1650 FL_OBJECT *generic;
1651 genericobject *g;
1652
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001653 if (!getintfloatfloatarg(args, &type, &mx, &my)) return NULL;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001654
Guido van Rossum03747111991-08-08 12:10:01 +00001655 generic = (*func) (f-> ob_form, type, mx, my);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001656
1657 if (generic == NULL)
1658 {
1659 INCREF(None);
1660 return None;
1661 }
1662
1663 g = findgeneric(generic);
1664 if (g == NULL) {
1665 err_setstr(RuntimeError,
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001666 "forms_find_{first|last} returns unknown object");
Guido van Rossum75cc8981991-08-08 12:07:45 +00001667 return NULL;
1668 }
1669 INCREF(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001670 return (object *) g;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001671}
1672
1673static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001674form_find_first(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001675 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001676 object *args;
1677{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001678 return forms_find_first_or_last(fl_find_first, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001679}
1680
1681static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001682form_find_last(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001683 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001684 object *args;
1685{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001686 return forms_find_first_or_last(fl_find_last, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001687}
1688
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001689static struct methodlist form_methods[] = {
1690/* adm */
1691 {"show_form", form_show_form},
1692 {"hide_form", form_hide_form},
1693 {"redraw_form", form_redraw_form},
1694 {"set_form_position", form_set_form_position},
1695 {"freeze_form", form_freeze_form},
1696 {"unfreeze_form", form_unfreeze_form},
1697 {"display_form", form_display_form},
1698 {"remove_form", form_remove_form},
1699 {"activate_form", form_activate_form},
1700 {"deactivate_form", form_deactivate_form},
Guido van Rossum03747111991-08-08 12:10:01 +00001701 {"bgn_group", form_bgn_group},
1702 {"end_group", form_end_group},
Guido van Rossum75cc8981991-08-08 12:07:45 +00001703 {"find_first", form_find_first},
1704 {"find_last", form_find_last},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001705
1706/* basic objects */
1707 {"add_button", form_add_button},
1708/* {"add_bitmap", form_add_bitmap}, */
1709 {"add_lightbutton", form_add_lightbutton},
1710 {"add_roundbutton", form_add_roundbutton},
1711 {"add_menu", form_add_menu},
1712 {"add_slider", form_add_slider},
1713 {"add_positioner", form_add_positioner},
1714 {"add_valslider", form_add_valslider},
1715 {"add_dial", form_add_dial},
1716 {"add_counter", form_add_counter},
1717 {"add_default", form_add_default},
1718 {"add_box", form_add_box},
1719 {"add_clock", form_add_clock},
1720 {"add_choice", form_add_choice},
1721 {"add_browser", form_add_browser},
1722 {"add_input", form_add_input},
1723 {"add_timer", form_add_timer},
1724 {"add_text", form_add_text},
1725 {NULL, NULL} /* sentinel */
1726};
1727
1728static void
1729form_dealloc(f)
1730 formobject *f;
1731{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001732 releaseobjects(f->ob_form);
1733 fl_free_form(f->ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001734 DEL(f);
1735}
1736
Guido van Rossum32db5e31991-11-12 15:43:18 +00001737static struct memberlist form_memberlist[] = {
1738 {"window", T_LONG, OFF(window), RO},
1739 {"w", T_FLOAT, OFF(w)},
1740 {"h", T_FLOAT, OFF(h)},
1741 {"x", T_FLOAT, OFF(x)},
1742 {"y", T_FLOAT, OFF(y)},
1743 {"deactivated", T_INT, OFF(deactivated)},
1744 {"visible", T_INT, OFF(visible)},
1745 {"frozen", T_INT, OFF(frozen)},
1746 {"doublebuf", T_INT, OFF(doublebuf)},
1747 {NULL} /* Sentinel */
1748};
1749
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001750static object *
1751form_getattr(f, name)
1752 formobject *f;
1753 char *name;
1754{
Guido van Rossum32db5e31991-11-12 15:43:18 +00001755 object *meth;
1756
1757 meth = findmethod(form_methods, (object *)f, name);
1758 if (meth != NULL)
1759 return meth;
1760 err_clear();
1761 return getmember((char *)f->ob_form, form_memberlist, name);
1762}
1763
1764static int
1765form_setattr(f, name, v)
1766 formobject *f;
1767 char *name;
1768 object *v;
1769{
1770 int ret;
1771
1772 if (v == NULL) {
1773 err_setstr(TypeError, "can't delete form attributes");
1774 return NULL;
1775 }
1776
1777 return setmember((char *)f->ob_form, form_memberlist, name, v);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001778}
1779
1780typeobject Formtype = {
1781 OB_HEAD_INIT(&Typetype)
1782 0, /*ob_size*/
1783 "form", /*tp_name*/
1784 sizeof(formobject), /*tp_size*/
1785 0, /*tp_itemsize*/
1786 /* methods */
1787 form_dealloc, /*tp_dealloc*/
1788 0, /*tp_print*/
1789 form_getattr, /*tp_getattr*/
Guido van Rossum32db5e31991-11-12 15:43:18 +00001790 form_setattr, /*tp_setattr*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001791 0, /*tp_compare*/
1792 0, /*tp_repr*/
1793};
1794
1795static object *
1796newformobject(form)
1797 FL_FORM *form;
1798{
1799 formobject *f;
1800 f = NEWOBJ(formobject, &Formtype);
1801 if (f == NULL)
1802 return NULL;
1803 f->ob_form = form;
1804 return (object *)f;
1805}
1806
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001807
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001808/* The "fl" module */
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001809
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001810static object *
1811forms_make_form(dummy, args)
1812 object *dummy;
1813 object *args;
1814{
1815 int type;
1816 float w, h;
1817 FL_FORM *form;
1818 if (!getintfloatfloatarg(args, &type, &w, &h))
1819 return NULL;
1820 form = fl_bgn_form(type, w, h);
1821 if (form == NULL) {
1822 /* XXX Actually, cannot happen! */
1823 err_nomem();
1824 return NULL;
1825 }
1826 fl_end_form();
1827 return newformobject(form);
1828}
1829
1830static object *my_event_callback = NULL;
1831
1832static object *
1833forms_set_event_call_back(dummy, args)
1834 object *dummy;
1835 object *args;
1836{
1837 my_event_callback = args;
1838 XINCREF(args);
1839 INCREF(None);
1840 return None;
1841}
1842
1843static object *
1844forms_do_or_check_forms(dummy, args, func)
1845 object *dummy;
1846 object *args;
1847 FL_OBJECT *(*func)();
1848{
1849 FL_OBJECT *generic;
1850 genericobject *g;
1851 object *arg, *res;
1852
1853 if (!getnoarg(args))
1854 return NULL;
1855
1856 for (;;) {
1857 generic = (*func)();
1858 if (generic == NULL) {
1859 INCREF(None);
1860 return None;
1861 }
1862 if (generic == FL_EVENT) {
1863 int dev;
1864 short val;
1865 if (my_event_callback == NULL)
1866 return newintobject(-1);
1867 dev = fl_qread(&val);
1868 arg = newtupleobject(2);
1869 if (arg == NULL)
1870 return NULL;
1871 settupleitem(arg, 0, newintobject((long)dev));
1872 settupleitem(arg, 1, newintobject((long)val));
1873 res = call_object(my_event_callback, arg);
1874 XDECREF(res);
1875 DECREF(arg);
1876 if (res == NULL)
1877 return NULL; /* Callback raised exception */
1878 continue;
1879 }
1880 g = findgeneric(generic);
1881 if (g == NULL) {
1882 err_setstr(RuntimeError,
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001883 "{do|check}_forms returns unknown object");
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001884 return NULL;
1885 }
1886 if (g->ob_callback == NULL) {
1887 INCREF(g);
1888 return ((object *) g);
1889 }
1890 arg = newtupleobject(2);
1891 INCREF(g);
Guido van Rossumabe58351991-08-08 12:34:44 +00001892 settupleitem(arg, 0, (object *)g);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001893 INCREF(g->ob_callback_arg);
1894 settupleitem(arg, 1, g->ob_callback_arg);
1895 res = call_object(g->ob_callback, arg);
1896 XDECREF(res);
1897 DECREF(arg);
1898 if (res == NULL)
1899 return NULL; /* Callback raised exception */
1900 }
1901}
1902
1903static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001904forms_do_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001905 object *dummy;
1906 object *args;
1907{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001908 return forms_do_or_check_forms(dummy, args, fl_do_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001909}
1910
1911static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001912forms_check_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001913 object *dummy;
1914 object *args;
1915{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001916 return forms_do_or_check_forms(dummy, args, fl_check_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001917}
1918
Guido van Rossum03747111991-08-08 12:10:01 +00001919#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001920static object *
1921fl_call(func, args)
1922 object *args;
1923 void (*func)();
1924{
1925 if (!getnoarg(args))
1926 return NULL;
1927 (*func)();
1928 INCREF(None);
1929 return None;
1930}
Guido van Rossum03747111991-08-08 12:10:01 +00001931#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001932
1933static object *
1934forms_qdevice(self, args)
1935 object *self;
1936 object *args;
1937{
1938 short arg1 ;
1939 if (!getishortarg(args, 1, 0, &arg1))
1940 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001941 fl_qdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001942 INCREF(None);
1943 return None;
1944}
1945
1946static object *
1947forms_unqdevice(self, args)
1948 object *self;
1949 object *args;
1950{
1951 short arg1 ;
1952 if (!getishortarg(args, 1, 0, &arg1))
1953 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001954 fl_unqdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001955 INCREF(None);
1956 return None;
1957}
1958
1959static object *
1960forms_isqueued(self, args)
1961 object *self;
1962 object *args;
1963{
Guido van Rossum03747111991-08-08 12:10:01 +00001964 long retval;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001965 short arg1 ;
1966 if (!getishortarg(args, 1, 0, &arg1))
1967 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001968 retval = fl_isqueued(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001969
Guido van Rossum03747111991-08-08 12:10:01 +00001970 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001971}
1972
1973static object *
1974forms_qtest(self, args)
1975 object *self;
1976 object *args;
1977{
1978 long retval;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001979 retval = fl_qtest();
Guido van Rossum03747111991-08-08 12:10:01 +00001980 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001981}
1982
1983
1984static object *
1985forms_qread(self, args)
1986 object *self;
1987 object *args;
1988{
1989 long retval;
1990 short arg1 ;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001991 retval = fl_qread(&arg1);
1992 { object *v = newtupleobject(2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001993 if (v == NULL) return NULL;
1994 settupleitem(v, 0, newintobject(retval));
1995 settupleitem(v, 1, newintobject((long)arg1));
1996 return v;
1997 }
1998}
1999
2000static object *
2001forms_qreset(self, args)
2002 object *self;
2003 object *args;
2004{
2005 if (!getnoarg(args)) return NULL;
2006
Guido van Rossum03747111991-08-08 12:10:01 +00002007 fl_qreset();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002008 INCREF(None);
2009 return None;
2010}
2011
2012static object *
2013forms_qenter(self, args)
2014 object *self;
2015 object *args;
2016{
2017 short arg1 ;
2018 short arg2 ;
2019 if (!getishortarg(args, 2, 0, &arg1))
2020 return NULL;
2021 if (!getishortarg(args, 2, 1, &arg2))
2022 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002023 fl_qenter(arg1, arg2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002024 INCREF(None);
2025 return None;
2026}
2027
2028static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002029forms_color(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002030 object *self;
2031 object *args;
2032{
2033 int arg;
2034
2035 if (!getintarg(args, &arg)) return NULL;
2036
2037 fl_color((short) arg);
2038
2039 INCREF(None);
2040 return None;
2041}
2042
2043static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002044forms_mapcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002045 object *self;
2046 object *args;
2047{
2048 int arg0, arg1, arg2, arg3;
2049
2050 if (!getintintintintarg(args, &arg0, &arg1, &arg2, &arg3))
2051 return NULL;
2052
2053 fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);
2054
2055 INCREF(None);
2056 return None;
2057}
2058
2059static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002060forms_getmcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002061 object *self;
2062 object *args;
2063{
Guido van Rossum03747111991-08-08 12:10:01 +00002064 int arg;
2065 short r, g, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002066 object *v;
2067
2068 if (!getintarg(args, &arg)) return NULL;
2069
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002070 fl_getmcolor(arg, &r, &g, &b);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002071
2072 v = newtupleobject(3);
2073
2074 if (v == NULL) return NULL;
2075
Guido van Rossum03747111991-08-08 12:10:01 +00002076 settupleitem(v, 0, newintobject((long)r));
2077 settupleitem(v, 1, newintobject((long)g));
2078 settupleitem(v, 2, newintobject((long)b));
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002079
2080 return v;
2081}
2082
2083static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002084forms_get_mouse(self, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00002085 object *self;
2086 object *args;
2087{
2088 float x, y ;
2089 object *v;
2090
2091 if (!getnoarg(args)) return NULL;
2092
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002093 fl_get_mouse(&x, &y);
Guido van Rossum75cc8981991-08-08 12:07:45 +00002094
2095 v = newtupleobject(2);
2096
2097 if (v == NULL) return NULL;
2098
2099 settupleitem(v, 0, newfloatobject(x));
2100 settupleitem(v, 1, newfloatobject(y));
2101
2102 return v;
2103}
2104
2105static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002106forms_tie(self, args)
2107 object *self;
2108 object *args;
2109{
2110 short arg1 ;
2111 short arg2 ;
2112 short arg3 ;
2113 if (!getishortarg(args, 3, 0, &arg1))
2114 return NULL;
2115 if (!getishortarg(args, 3, 1, &arg2))
2116 return NULL;
2117 if (!getishortarg(args, 3, 2, &arg3))
2118 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002119 fl_tie(arg1, arg2, arg3);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002120 INCREF(None);
2121 return None;
2122}
2123
Guido van Rossum03747111991-08-08 12:10:01 +00002124static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002125forms_show_message(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002126 object *f;
2127 object *args;
2128{
2129 object *a, *b, *c;
2130
2131 if (!getstrstrstrarg(args, &a, &b, &c)) return NULL;
2132
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002133 fl_show_message(
Guido van Rossum03747111991-08-08 12:10:01 +00002134 getstringvalue(a), getstringvalue(b), getstringvalue(c));
2135
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002136 INCREF(None);
Guido van Rossum03747111991-08-08 12:10:01 +00002137 return None;
2138}
2139
2140static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002141forms_show_question(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002142 object *f;
2143 object *args;
2144{
2145 int ret;
2146 object *a, *b, *c;
2147
2148 if (!getstrstrstrarg(args, &a, &b, &c)) return NULL;
2149
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002150 ret = fl_show_question(
Guido van Rossum03747111991-08-08 12:10:01 +00002151 getstringvalue(a), getstringvalue(b), getstringvalue(c));
2152
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002153 return newintobject((long) ret);
Guido van Rossum03747111991-08-08 12:10:01 +00002154}
2155
2156static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002157forms_show_input(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002158 object *f;
2159 object *args;
2160{
2161 char *str;
2162 object *a, *b;
2163
2164 if (!getstrstrarg(args, &a, &b)) return NULL;
2165
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002166 str = fl_show_input(getstringvalue(a), getstringvalue(b));
2167
2168 if (str == NULL) {
2169 INCREF(None);
2170 return None;
2171 }
2172 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002173}
2174
2175static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002176forms_file_selector(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002177 object *f;
2178 object *args;
2179{
2180 char *str;
2181 object *a, *b, *c, *d;
2182
2183 if (!getstrstrstrstrarg(args, &a, &b, &c, &d)) return NULL;
2184
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002185 str = fl_show_file_selector(getstringvalue(a), getstringvalue(b),
2186 getstringvalue(c), getstringvalue(d));
Guido van Rossum03747111991-08-08 12:10:01 +00002187
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002188 if (str == NULL) {
2189 INCREF(None);
2190 return None;
2191 }
2192 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002193}
2194
2195
2196static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002197forms_file_selector_func(args, func)
Guido van Rossum03747111991-08-08 12:10:01 +00002198 object *args;
2199 char *(*func)();
2200{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002201 char *str;
Guido van Rossum03747111991-08-08 12:10:01 +00002202
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002203 str = (*func) ();
2204
2205 if (str == NULL) {
2206 INCREF(None);
2207 return None;
2208 }
2209 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002210}
2211
2212static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002213forms_get_directory(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002214 object *f;
2215 object *args;
2216{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002217 return forms_file_selector_func(args, fl_get_directory);
Guido van Rossum03747111991-08-08 12:10:01 +00002218}
2219
2220static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002221forms_get_pattern(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002222 object *f;
2223 object *args;
2224{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002225 return forms_file_selector_func(args, fl_get_pattern);
Guido van Rossum03747111991-08-08 12:10:01 +00002226}
2227
2228static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002229forms_get_filename(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002230 object *f;
2231 object *args;
2232{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002233 return forms_file_selector_func(args, fl_get_filename);
Guido van Rossum03747111991-08-08 12:10:01 +00002234}
2235
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002236static struct methodlist forms_methods[] = {
2237/* adm */
2238 {"make_form", forms_make_form},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002239/* gl support wrappers */
2240 {"qdevice", forms_qdevice},
2241 {"unqdevice", forms_unqdevice},
2242 {"isqueued", forms_isqueued},
2243 {"qtest", forms_qtest},
2244 {"qread", forms_qread},
2245/* {"blkqread", forms_blkqread}, */
2246 {"qreset", forms_qreset},
2247 {"qenter", forms_qenter},
Guido van Rossum03747111991-08-08 12:10:01 +00002248 {"get_mouse", forms_get_mouse},
2249 {"tie", forms_tie},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002250/* {"new_events", forms_new_events}, */
2251 {"color", forms_color},
2252 {"mapcolor", forms_mapcolor},
2253 {"getmcolor", forms_getmcolor},
2254/* interaction */
2255 {"do_forms", forms_do_forms},
2256 {"check_forms", forms_check_forms},
2257 {"set_event_call_back", forms_set_event_call_back},
2258/* goodies */
Guido van Rossum03747111991-08-08 12:10:01 +00002259 {"show_message", forms_show_message},
2260 {"show_question", forms_show_question},
2261 {"file_selector", forms_file_selector},
2262 {"get_directory", forms_get_directory},
2263 {"get_pattern", forms_get_pattern},
2264 {"get_filename", forms_get_filename},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002265/*
Guido van Rossum03747111991-08-08 12:10:01 +00002266 {"show_choice", forms_show_choice},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002267 XXX - draw.c
2268*/
Guido van Rossum03747111991-08-08 12:10:01 +00002269 {"show_input", forms_show_input},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002270 {NULL, NULL} /* sentinel */
2271};
2272
2273void
2274initfl()
2275{
2276 initmodule("fl", forms_methods);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002277 foreground();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002278}
2279
2280
2281/* Support routines */
2282
2283int
2284getintintstrarg(args, a, b, c)
2285 object *args;
2286 int *a, *b;
2287 object **c;
2288{
2289 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2290 err_badarg();
2291 return NULL;
2292 }
2293 return getintarg(gettupleitem(args, 0), a) &&
2294 getintarg(gettupleitem(args, 1), b) &&
2295 getstrarg(gettupleitem(args, 2), c);
2296}
2297
2298int
2299getintfloatfloatarg(args, a, b, c)
2300 object *args;
2301 int *a;
2302 float *b, *c;
2303{
2304 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2305 err_badarg();
2306 return NULL;
2307 }
2308 return getintarg(gettupleitem(args, 0), a) &&
2309 getfloatarg(gettupleitem(args, 1), b) &&
2310 getfloatarg(gettupleitem(args, 2), c);
2311}
2312
2313int
2314getintintintintarg(args, a, b, c, d)
2315 object *args;
2316 int *a, *b, *c, *d;
2317{
2318 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 4) {
2319 err_badarg();
2320 return NULL;
2321 }
2322 return getintarg(gettupleitem(args, 0), a) &&
2323 getintarg(gettupleitem(args, 1), b) &&
2324 getintarg(gettupleitem(args, 2), c) &&
2325 getintarg(gettupleitem(args, 3), d);
2326}
2327
2328int
2329getfloatarg(args, a)
2330 object *args;
2331 float *a;
2332{
2333 double x;
2334 if (!getdoublearg(args, &x))
2335 return 0;
2336 *a = x;
2337 return 1;
2338}
2339
2340int
Guido van Rossum03747111991-08-08 12:10:01 +00002341getintfloatfloatfloatfloatstrarg(args, type, x, y, w, h, name)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002342 object *args;
2343 int *type;
2344 float *x, *y, *w, *h;
2345 object **name;
2346{
2347 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 6) {
2348 err_badarg();
2349 return NULL;
2350 }
2351 return getintarg(gettupleitem(args, 0), type) &&
2352 getfloatarg(gettupleitem(args, 1), x) &&
2353 getfloatarg(gettupleitem(args, 2), y) &&
2354 getfloatarg(gettupleitem(args, 3), w) &&
2355 getfloatarg(gettupleitem(args, 4), h) &&
2356 getstrarg(gettupleitem(args, 5), name);
2357}
2358
2359int
2360getfloatfloatfloatarg(args, f1, f2, f3)
2361 object *args;
2362 float *f1, *f2, *f3;
2363{
2364 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2365 err_badarg();
2366 return NULL;
2367 }
2368 return getfloatarg(gettupleitem(args, 0), f1) &&
2369 getfloatarg(gettupleitem(args, 1), f2) &&
2370 getfloatarg(gettupleitem(args, 2), f3);
2371}
2372
2373int
2374getfloatfloatarg(args, f1, f2)
2375 object *args;
2376 float *f1, *f2;
2377{
2378 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
2379 err_badarg();
2380 return NULL;
2381 }
2382 return getfloatarg(gettupleitem(args, 0), f1) &&
2383 getfloatarg(gettupleitem(args, 1), f2);
2384}
2385
2386int
2387getstrstrstrarg(v, a, b, c)
2388 object *v;
2389 object **a;
2390 object **b;
2391 object **c;
2392{
2393 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3) {
2394 return err_badarg();
2395 }
2396 return getstrarg(gettupleitem(v, 0), a) &&
2397 getstrarg(gettupleitem(v, 1), b)&&
2398 getstrarg(gettupleitem(v, 2), c);
2399}
2400
2401
2402int
2403getstrstrstrstrarg(v, a, b, c, d)
2404 object *v;
2405 object **a;
2406 object **b;
2407 object **c;
2408 object **d;
2409{
2410 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 4) {
2411 return err_badarg();
2412 }
2413 return getstrarg(gettupleitem(v, 0), a) &&
2414 getstrarg(gettupleitem(v, 1), b)&&
2415 getstrarg(gettupleitem(v, 2), c) &&
2416 getstrarg(gettupleitem(v, 3),d);
2417
2418}