blob: 21066b0756d24702e06c6bf789b9ff499114be61 [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},
234 {"show_object", generic_show_object},
235 {"hide_object", generic_hide_object},
236 {"redraw_object", generic_redraw_object},
237 {"freeze_object", generic_freeze_object},
238 {"unfreeze_object", generic_unfreeze_object},
239#if 0
240 {"handle_object", generic_handle_object},
241 {"handle_object_direct",generic_handle_object_direct},
242#endif
Guido van Rossum03747111991-08-08 12:10:01 +0000243 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000244};
245
246static void
247generic_dealloc(g)
248 genericobject *g;
249{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000250 fl_free_object(g->ob_generic);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000251 DEL(g);
252}
253
254#define OFF(x) offsetof(FL_OBJECT, x)
255
256static struct memberlist generic_memberlist[] = {
257 {"objclass", T_INT, OFF(objclass), RO},
258 {"type", T_INT, OFF(type), RO},
259 {"boxtype", T_INT, OFF(boxtype)},
260 {"x", T_FLOAT, OFF(x)},
261 {"y", T_FLOAT, OFF(y)},
262 {"w", T_FLOAT, OFF(w)},
263 {"h", T_FLOAT, OFF(h)},
264 {"col1", T_INT, OFF(col1)},
265 {"col2", T_INT, OFF(col2)},
266 {"align", T_INT, OFF(align)},
267 {"lcol", T_INT, OFF(lcol)},
268 {"lsize", T_FLOAT, OFF(lsize)},
269 /* "label" is treated specially! */
270 {"lstyle", T_INT, OFF(lstyle)},
271 {"pushed", T_INT, OFF(pushed), RO},
272 {"focus", T_INT, OFF(focus), RO},
273 {"belowmouse", T_INT, OFF(belowmouse),RO},
274 {"frozen", T_INT, OFF(frozen), RO},
275 {"active", T_INT, OFF(active), RO},
276 {"input", T_INT, OFF(input), RO},
277 {"visible", T_INT, OFF(visible), RO},
278 {"radio", T_INT, OFF(radio), RO},
279 {"automatic", T_INT, OFF(automatic), RO},
280 {NULL} /* Sentinel */
281};
282
283static object *
284generic_getattr(g, name)
285 genericobject *g;
286 char *name;
287{
288 object *meth;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000289
290 /* XXX Ought to special-case name "__methods__" */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000291 if (g-> ob_methods) {
Guido van Rossum03747111991-08-08 12:10:01 +0000292 meth = findmethod(g->ob_methods, (object *)g, name);
293 if (meth != NULL) return meth;
294 err_clear();
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000295 }
296
297 meth = findmethod(generic_methods, (object *)g, name);
298 if (meth != NULL)
299 return meth;
300 err_clear();
301
302 /* "label" is an exception, getmember only works for char pointers,
303 not for char arrays */
304 if (strcmp(name, "label") == 0)
305 return newstringobject(g->ob_generic->label);
306
307 return getmember((char *)g->ob_generic, generic_memberlist, name);
308}
309
310static int
311generic_setattr(g, name, v)
312 genericobject *g;
313 char *name;
314 object *v;
315{
316 int ret;
317
318 if (v == NULL) {
319 err_setstr(TypeError, "can't delete forms object attributes");
320 return NULL;
321 }
322
323 /* "label" is an exception: setmember doesn't set strings;
324 and FORMS wants you to call a function to set the label */
325 if (strcmp(name, "label") == 0) {
326 if (!is_stringobject(v)) {
327 err_setstr(TypeError, "label attr must be string");
328 return NULL;
329 }
330 fl_set_object_label(g->ob_generic, getstringvalue(v));
331 return 0;
332 }
333
334 ret = setmember((char *)g->ob_generic, generic_memberlist, name, v);
335
336 /* Rather than calling all the various set_object_* functions,
337 we call fl_redraw_object here. This is sometimes redundant
338 but I doubt that's a big problem */
339 if (ret == 0)
340 fl_redraw_object(g->ob_generic);
341
342 return ret;
343}
344
345typeobject GenericObjecttype = {
346 OB_HEAD_INIT(&Typetype)
347 0, /*ob_size*/
348 "generic FORMS object", /*tp_name*/
349 sizeof(genericobject), /*tp_size*/
350 0, /*tp_itemsize*/
351 /* methods */
352 generic_dealloc, /*tp_dealloc*/
353 0, /*tp_print*/
354 generic_getattr, /*tp_getattr*/
355 generic_setattr, /*tp_setattr*/
356 0, /*tp_compare*/
357 0, /*tp_repr*/
358};
359
360static object *
361newgenericobject(generic, methods)
362 FL_OBJECT *generic;
363 struct methodlist *methods;
364{
365 genericobject *g;
366 g = NEWOBJ(genericobject, &GenericObjecttype);
367 if (g == NULL)
368 return NULL;
369 g-> ob_generic = generic;
370 g->ob_methods = methods;
371 g->ob_callback = NULL;
372 g->ob_callback_arg = NULL;
373 knowgeneric(g);
374 return (object *)g;
375}
376
377/**********************************************************************/
378/* Some common calling sequences */
379
380/* void func (object, float) */
381static object *
382call_forms_INf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000383 void (*func)(FL_OBJECT *, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000384 FL_OBJECT *obj;
385 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000386{
Guido van Rossum03747111991-08-08 12:10:01 +0000387 float parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000388
Guido van Rossum03747111991-08-08 12:10:01 +0000389 if (!getfloatarg (args, &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000390
Guido van Rossum03747111991-08-08 12:10:01 +0000391 (*func) (obj, parameter);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000392
Guido van Rossum03747111991-08-08 12:10:01 +0000393 INCREF(None);
394 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000395}
396
397/* void func (object, float) */
398static object *
399call_forms_INfINf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000400 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000401 FL_OBJECT *obj;
402 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000403{
Guido van Rossum03747111991-08-08 12:10:01 +0000404 float par1, par2;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000405
Guido van Rossum03747111991-08-08 12:10:01 +0000406 if (!getfloatfloatarg (args, &par1, &par2)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000407
Guido van Rossum03747111991-08-08 12:10:01 +0000408 (*func) (obj, par1, par2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000409
Guido van Rossum03747111991-08-08 12:10:01 +0000410 INCREF(None);
411 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000412}
413
414/* void func (object, int) */
415static object *
416call_forms_INi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000417 void (*func)(FL_OBJECT *, int);
Guido van Rossum03747111991-08-08 12:10:01 +0000418 FL_OBJECT *obj;
419 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000420{
Guido van Rossum03747111991-08-08 12:10:01 +0000421 int parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000422
Guido van Rossum03747111991-08-08 12:10:01 +0000423 if (!getintarg (args, &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000424
Guido van Rossum03747111991-08-08 12:10:01 +0000425 (*func) (obj, parameter);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000426
Guido van Rossum03747111991-08-08 12:10:01 +0000427 INCREF(None);
428 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000429}
430
431/* void func (object, string) */
432static object *
433call_forms_INstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000434 void (*func)(FL_OBJECT *, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000435 FL_OBJECT *obj;
436 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000437{
Guido van Rossum03747111991-08-08 12:10:01 +0000438 object *a;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000439
Guido van Rossum03747111991-08-08 12:10:01 +0000440 if (!getstrarg (args, &a)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000441
Guido van Rossum03747111991-08-08 12:10:01 +0000442 (*func) (obj, getstringvalue (a));
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000443
Guido van Rossum03747111991-08-08 12:10:01 +0000444 INCREF(None);
445 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000446}
447
448
449/* voide func (object, int, string) */
450static object *
451call_forms_INiINstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000452 void (*func)(FL_OBJECT *, int, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000453 FL_OBJECT *obj;
454 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000455{
Guido van Rossum03747111991-08-08 12:10:01 +0000456 object *a;
457 int b;
458
459 if (!getintstrarg (args, &b, &a)) return NULL;
460
461 (*func) (obj, b, getstringvalue (a));
462
463 INCREF(None);
464 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000465}
466
Guido van Rossum03747111991-08-08 12:10:01 +0000467#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000468/* void func (object, float) */
469static object *
470call_forms_INiINi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000471 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000472 FL_OBJECT *obj;
473 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000474{
Guido van Rossum03747111991-08-08 12:10:01 +0000475 int par1, par2;
476
477 if (!getintintarg (args, &par1, &par2)) return NULL;
478
479 (*func) (obj, par1, par2);
480
481 INCREF(None);
482 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000483}
Guido van Rossum03747111991-08-08 12:10:01 +0000484#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000485
486/* int func (object) */
487static object *
488call_forms_Ri (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000489 int (*func)(FL_OBJECT *);
490 FL_OBJECT *obj;
491 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000492{
Guido van Rossum03747111991-08-08 12:10:01 +0000493 int retval;
494
495 if (!getnoarg(args)) return NULL;
496
497 retval = (*func) (obj);
498
499 return newintobject ((long) retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000500}
501
502/* char * func (object) */
503static object *
504call_forms_Rstr (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000505 char * (*func)(FL_OBJECT *);
506 FL_OBJECT *obj;
507 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000508{
Guido van Rossum03747111991-08-08 12:10:01 +0000509 char *str;
510
511 if (!getnoarg (args)) return NULL;
512
513 str = (*func) (obj);
514
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000515 if (str == NULL) {
516 INCREF(None);
517 return None;
518 }
Guido van Rossum03747111991-08-08 12:10:01 +0000519 return newstringobject (str);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000520}
521
522/* int func (object) */
523static object *
524call_forms_Rf (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000525 float (*func)(FL_OBJECT *);
526 FL_OBJECT *obj;
527 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000528{
Guido van Rossum03747111991-08-08 12:10:01 +0000529 float retval;
530
531 if (!getnoarg(args)) return NULL;
532
533 retval = (*func) (obj);
534
535 return newfloatobject (retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000536}
537
538static object *
539call_forms_OUTfOUTf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000540 void (*func)(FL_OBJECT *, float *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000541 FL_OBJECT *obj;
542 object *args;
543{
544 float f1, f2;
545 object *arg;
Guido van Rossum03747111991-08-08 12:10:01 +0000546
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000547 if (!getnoarg(args)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000548
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000549 (*func) (obj, &f1, &f2);
550
551 arg = newtupleobject (2);
552 if (arg == NULL) return NULL;
553
554 settupleitem (arg, 0, newfloatobject (f1));
555 settupleitem (arg, 1, newfloatobject (f2));
556 return arg;
557}
558
Guido van Rossum03747111991-08-08 12:10:01 +0000559#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000560static object *
561call_forms_OUTf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000562 void (*func)(FL_OBJECT *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000563 FL_OBJECT *obj;
564 object *args;
565{
566 float f;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000567
568 if (!getnoarg(args)) return NULL;
569
570 (*func) (obj, &f);
571
572 return newfloatobject (f);
573}
Guido van Rossum03747111991-08-08 12:10:01 +0000574#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000575
576/**********************************************************************/
577/* Class : browser */
578
579static object *
580set_browser_topline(g, args)
581 genericobject *g;
582 object *args;
583{
Guido van Rossum03747111991-08-08 12:10:01 +0000584 return call_forms_INi (fl_set_browser_topline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000585}
586
587static object *
588clear_browser(g, args)
589 genericobject *g;
590 object *args;
591{
Guido van Rossum03747111991-08-08 12:10:01 +0000592 return generic_call (g, args, fl_clear_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000593}
594
595static object *
596add_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000597 genericobject *g;
598 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000599{
Guido van Rossum03747111991-08-08 12:10:01 +0000600 return call_forms_INstr (fl_add_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000601}
602
603static object *
604addto_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000605 genericobject *g;
606 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000607{
Guido van Rossum03747111991-08-08 12:10:01 +0000608 return call_forms_INstr (fl_addto_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000609}
610
611static object *
612insert_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000613 genericobject *g;
614 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000615{
Guido van Rossum03747111991-08-08 12:10:01 +0000616 return call_forms_INiINstr (fl_insert_browser_line,
617 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000618}
619
620static object *
621delete_browser_line (g, args)
622 genericobject *g;
623 object *args;
624{
Guido van Rossum03747111991-08-08 12:10:01 +0000625 return call_forms_INi (fl_delete_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000626}
627
628static object *
629replace_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000630 genericobject *g;
631 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000632{
Guido van Rossum03747111991-08-08 12:10:01 +0000633 return call_forms_INiINstr (fl_replace_browser_line,
634 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000635}
636
637static object *
638get_browser_line(g, args)
639 genericobject *g;
640 object *args;
641{
642 int i;
643 char *str;
644
645 if (!getintarg(args, &i))
646 return NULL;
647
648 str = fl_get_browser_line (g->ob_generic, i);
649
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000650 if (str == NULL) {
651 INCREF(None);
652 return None;
653 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000654 return newstringobject (str);
655}
656
657static object *
658load_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000659 genericobject *g;
660 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000661{
Guido van Rossumabe58351991-08-08 12:34:44 +0000662 /* XXX strictly speaking this is wrong since fl_load_browser
663 XXX returns int, not void */
Guido van Rossum03747111991-08-08 12:10:01 +0000664 return call_forms_INstr (fl_load_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000665}
666
667static object *
668get_browser_maxline(g, args)
669 genericobject *g;
670 object *args;
671{
Guido van Rossum03747111991-08-08 12:10:01 +0000672 return call_forms_Ri (fl_get_browser_maxline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000673}
674
675static object *
676select_browser_line (g, args)
677 genericobject *g;
678 object *args;
679{
Guido van Rossum03747111991-08-08 12:10:01 +0000680 return call_forms_INi (fl_select_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000681}
682
683static object *
684deselect_browser_line (g, args)
685 genericobject *g;
686 object *args;
687{
Guido van Rossum03747111991-08-08 12:10:01 +0000688 return call_forms_INi (fl_deselect_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000689}
690
691static object *
692deselect_browser (g, args)
693 genericobject *g;
694 object *args;
695{
Guido van Rossum03747111991-08-08 12:10:01 +0000696 return generic_call (g, args, fl_deselect_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000697}
698
699static object *
700isselected_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000701 genericobject *g;
702 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000703{
704 int i, j;
Guido van Rossum03747111991-08-08 12:10:01 +0000705
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000706 if (!getintarg(args, &i))
707 return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000708
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000709 j = fl_isselected_browser_line (g->ob_generic, i);
Guido van Rossum03747111991-08-08 12:10:01 +0000710
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000711 return newintobject (j);
712}
713
714static object *
715get_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000716 genericobject *g;
717 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000718{
Guido van Rossum03747111991-08-08 12:10:01 +0000719 return call_forms_Ri (fl_get_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000720}
721
722static object *
723set_browser_fontsize (g, args)
724 genericobject *g;
725 object *args;
726{
Guido van Rossum03747111991-08-08 12:10:01 +0000727 return call_forms_INf (fl_set_browser_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000728}
729
730static object *
731set_browser_fontstyle (g, args)
732 genericobject *g;
733 object *args;
734{
Guido van Rossum03747111991-08-08 12:10:01 +0000735 return call_forms_INi (fl_set_browser_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000736}
737
738static struct methodlist browser_methods[] = {
739 {"set_browser_topline", set_browser_topline},
740 {"clear_browser", clear_browser},
741 {"add_browser_line", add_browser_line},
742 {"addto_browser", addto_browser},
743 {"insert_browser_line", insert_browser_line},
744 {"delete_browser_line", delete_browser_line},
745 {"replace_browser_line",replace_browser_line},
746 {"get_browser_line", get_browser_line},
747 {"load_browser", load_browser},
748 {"get_browser_maxline", get_browser_maxline},
749 {"select_browser_line", select_browser_line},
750 {"deselect_browser_line", deselect_browser_line},
751 {"deselect_browser", deselect_browser},
752 {"isselected_browser_line", isselected_browser_line},
753 {"get_browser", get_browser},
754 {"set_browser_fontsize",set_browser_fontsize},
755 {"set_browser_fontstyle", set_browser_fontstyle},
756 {NULL, NULL} /* sentinel */
757};
758
759/* Class: button */
760
761static object *
762set_button(g, args)
763 genericobject *g;
764 object *args;
765{
Guido van Rossum03747111991-08-08 12:10:01 +0000766 return call_forms_INi (fl_set_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000767}
768
769static object *
770get_button(g, args)
771 genericobject *g;
772 object *args;
773{
Guido van Rossum03747111991-08-08 12:10:01 +0000774 return call_forms_Ri (fl_get_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000775}
776
777static struct methodlist button_methods[] = {
778 {"set_button", set_button},
779 {"get_button", get_button},
780 {NULL, NULL} /* sentinel */
781};
782
783/* Class: choice */
784
785static object *
786set_choice(g, args)
787 genericobject *g;
788 object *args;
789{
Guido van Rossum03747111991-08-08 12:10:01 +0000790 return call_forms_INi (fl_set_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000791}
792
793static object *
794get_choice(g, args)
795 genericobject *g;
796 object *args;
797{
Guido van Rossum03747111991-08-08 12:10:01 +0000798 return call_forms_Ri (fl_get_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000799}
800
801static object *
802clear_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000803 genericobject *g;
804 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000805{
Guido van Rossum03747111991-08-08 12:10:01 +0000806 return generic_call (g, args, fl_clear_choice);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000807}
808
809static object *
810addto_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000811 genericobject *g;
812 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000813{
Guido van Rossum03747111991-08-08 12:10:01 +0000814 return call_forms_INstr (fl_addto_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000815}
816
817static object *
818replace_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000819 genericobject *g;
820 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000821{
Guido van Rossum03747111991-08-08 12:10:01 +0000822 return call_forms_INiINstr (fl_replace_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000823}
824
825static object *
826delete_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000827 genericobject *g;
828 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000829{
Guido van Rossum03747111991-08-08 12:10:01 +0000830 return call_forms_INi (fl_delete_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000831}
832
833static object *
834get_choice_text (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000835 genericobject *g;
836 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000837{
Guido van Rossum03747111991-08-08 12:10:01 +0000838 return call_forms_Rstr (fl_get_choice_text, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000839}
840
841static object *
842set_choice_fontsize (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000843 genericobject *g;
844 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000845{
Guido van Rossum03747111991-08-08 12:10:01 +0000846 return call_forms_INf (fl_set_choice_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000847}
848
849static object *
850set_choice_fontstyle (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000851 genericobject *g;
852 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000853{
Guido van Rossum03747111991-08-08 12:10:01 +0000854 return call_forms_INi (fl_set_choice_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000855}
856
857static struct methodlist choice_methods[] = {
858 {"set_choice", set_choice},
859 {"get_choice", get_choice},
860 {"clear_choice", clear_choice},
861 {"addto_choice", addto_choice},
862 {"replace_choice", replace_choice},
863 {"delete_choice", delete_choice},
864 {"get_choice_text", get_choice_text},
865 {"set_choice_fontsize", set_choice_fontsize},
866 {"set_choice_fontstyle",set_choice_fontstyle},
867 {NULL, NULL} /* sentinel */
868};
869
870/* Class : Clock */
871
872static object *
873get_clock(g, args)
874 genericobject *g;
875 object *args;
876{
877 int i0, i1, i2;
878 object *arg;
879
880 if (!getnoarg(args))
881 return NULL;
882
883 fl_get_clock (g->ob_generic, &i0, &i1, &i2);
884
885 arg = newtupleobject (3);
886 if (arg == NULL) return NULL;
887
888 settupleitem (arg, 0, newintobject (i0));
889 settupleitem (arg, 1, newintobject (i1));
890 settupleitem (arg, 2, newintobject (i2));
891 return arg;
892}
893
894static struct methodlist clock_methods[] = {
895 {"get_clock", get_clock},
896 {NULL, NULL} /* sentinel */
897};
898
899/* CLass : Counters */
900
901static object *
902get_counter_value(g, args)
903 genericobject *g;
904 object *args;
905{
906 return call_forms_Rf (fl_get_counter_value, g-> ob_generic, args);
907}
908
909static object *
910set_counter_value (g, args)
911 genericobject *g;
912 object *args;
913{
914 return call_forms_INf (fl_set_counter_value, g-> ob_generic, args);
915}
916
917static object *
918set_counter_precision (g, args)
919 genericobject *g;
920 object *args;
921{
922 return call_forms_INi (fl_set_counter_precision, g-> ob_generic, args);
923}
924
925static object *
926set_counter_bounds (g, args)
927 genericobject *g;
928 object *args;
929{
930 return call_forms_INfINf (fl_set_counter_bounds, g-> ob_generic, args);
931}
932
933static object *
934set_counter_step (g, args)
935 genericobject *g;
936 object *args;
937{
938 return call_forms_INfINf (fl_set_counter_step, g-> ob_generic, args);
939}
940
941static object *
942set_counter_return (g, args)
943 genericobject *g;
944 object *args;
945{
Guido van Rossum03747111991-08-08 12:10:01 +0000946 return call_forms_INi (fl_set_counter_return, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000947}
948
949static struct methodlist counter_methods[] = {
950 {"set_counter_value", set_counter_value},
951 {"get_counter_value", get_counter_value},
952 {"set_counter_bounds", set_counter_bounds},
953 {"set_counter_step", set_counter_step},
954 {"set_counter_precision", set_counter_precision},
955 {"set_counter_return", set_counter_return},
956 {NULL, NULL} /* sentinel */
957};
958
959/* Class : Defaults */
960
961static object *
962get_default(g, args)
963 genericobject *g;
964 object *args;
965{
Guido van Rossum03747111991-08-08 12:10:01 +0000966 char c;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000967
Guido van Rossum03747111991-08-08 12:10:01 +0000968 if (!getnoarg(args)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000969
Guido van Rossum03747111991-08-08 12:10:01 +0000970 c = fl_get_default (g->ob_generic);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000971
Guido van Rossum03747111991-08-08 12:10:01 +0000972 return ((object *) mknewcharobject (c)); /* in cgensupport.c */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000973}
974
975static struct methodlist default_methods[] = {
976 {"get_default", get_default},
977 {NULL, NULL} /* sentinel */
978};
979
980
981/* Class: Dials */
982
983static object *
984set_dial (g, args)
985 genericobject *g;
986 object *args;
987{
988 float f1, f2, f3;
989
990 if (!getfloatfloatfloatarg(args, &f1, &f2, &f3))
991 return NULL;
992 fl_set_dial (g->ob_generic, f1, f2, f3);
993 INCREF(None);
994 return None;
995}
996
997static object *
998get_dial(g, args)
999 genericobject *g;
1000 object *args;
1001{
1002 return call_forms_Rf (fl_get_dial, g-> ob_generic, args);
1003}
1004
1005static object *
1006set_dial_value (g, args)
1007 genericobject *g;
1008 object *args;
1009{
1010 return call_forms_INf (fl_set_dial_value, g-> ob_generic, args);
1011}
1012
1013static object *
1014set_dial_bounds (g, args)
1015 genericobject *g;
1016 object *args;
1017{
1018 return call_forms_INfINf (fl_set_dial_bounds, g-> ob_generic, args);
1019}
1020
1021static object *
1022get_dial_bounds (g, args)
1023 genericobject *g;
1024 object *args;
1025{
1026 return call_forms_OUTfOUTf (fl_get_dial_bounds, g-> ob_generic, args);
1027}
1028
1029static struct methodlist dial_methods[] = {
1030 {"set_dial", set_dial},
1031 {"get_dial", get_dial},
1032 {"set_dial_value", set_dial_value},
1033 {"get_dial_value", get_dial},
1034 {"set_dial_bounds", set_dial_bounds},
1035 {"get_dial_bounds", get_dial_bounds},
1036 {NULL, NULL} /* sentinel */
1037};
1038
1039/* Class : Input */
1040
1041static object *
1042set_input (g, args)
1043 genericobject *g;
1044 object *args;
1045{
1046 return call_forms_INstr (fl_set_input, g-> ob_generic, args);
1047}
1048
1049static object *
1050get_input (g, args)
1051 genericobject *g;
1052 object *args;
1053{
1054 return call_forms_Rstr (fl_get_input, g-> ob_generic, args);
1055}
1056
1057static object *
1058set_input_color (g, args)
1059 genericobject *g;
1060 object *args;
1061{
1062 return call_forms_INfINf (fl_set_input_color, g-> ob_generic, args);
1063}
1064
1065static struct methodlist input_methods[] = {
1066 {"set_input", set_input},
1067 {"get_input", get_input},
1068 {"set_input_color", set_input_color},
1069 {NULL, NULL} /* sentinel */
1070};
1071
1072
1073/* Class : Menu */
1074
1075static object *
1076set_menu (g, args)
1077 genericobject *g;
1078 object *args;
1079{
Guido van Rossumabe58351991-08-08 12:34:44 +00001080 return call_forms_INstr (fl_set_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001081}
1082
1083static object *
1084get_menu (g, args)
1085 genericobject *g;
1086 object *args;
1087{
Guido van Rossumabe58351991-08-08 12:34:44 +00001088 /* XXX strictly speaking this is wrong since fl_get_menu
1089 XXX returns long, not int */
1090 return call_forms_Ri (fl_get_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001091}
1092
1093static object *
1094addto_menu (g, args)
1095 genericobject *g;
1096 object *args;
1097{
Guido van Rossumabe58351991-08-08 12:34:44 +00001098 return call_forms_INstr (fl_addto_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001099}
1100
1101static struct methodlist menu_methods[] = {
1102 {"set_menu", set_menu},
1103 {"get_menu", get_menu},
1104 {"addto_menu", addto_menu},
1105 {NULL, NULL} /* sentinel */
1106};
1107
1108
1109/* Class: Sliders */
1110
1111static object *
1112set_slider (g, args)
1113 genericobject *g;
1114 object *args;
1115{
1116 float f1, f2, f3;
1117
1118 if (!getfloatfloatfloatarg(args, &f1, &f2, &f3))
1119 return NULL;
1120 fl_set_slider (g->ob_generic, f1, f2, f3);
1121 INCREF(None);
1122 return None;
1123}
1124
1125static object *
1126get_slider(g, args)
1127 genericobject *g;
1128 object *args;
1129{
1130 return call_forms_Rf (fl_get_slider, g-> ob_generic, args);
1131}
1132
1133static object *
1134set_slider_value (g, args)
1135 genericobject *g;
1136 object *args;
1137{
1138 return call_forms_INf (fl_set_slider_value, g-> ob_generic, args);
1139}
1140
1141static object *
1142set_slider_bounds (g, args)
1143 genericobject *g;
1144 object *args;
1145{
1146 return call_forms_INfINf (fl_set_slider_bounds, g-> ob_generic, args);
1147}
1148
1149static object *
1150get_slider_bounds (g, args)
1151 genericobject *g;
1152 object *args;
1153{
1154 return call_forms_OUTfOUTf(fl_get_slider_bounds, g-> ob_generic, args);
1155}
1156
1157static object *
1158set_slider_return (g, args)
1159 genericobject *g;
1160 object *args;
1161{
1162 return call_forms_INf (fl_set_slider_return, g-> ob_generic, args);
1163}
1164
1165static object *
1166set_slider_size (g, args)
1167 genericobject *g;
1168 object *args;
1169{
1170 return call_forms_INf (fl_set_slider_size, g-> ob_generic, args);
1171}
1172
1173static object *
1174set_slider_precision (g, args)
1175 genericobject *g;
1176 object *args;
1177{
1178 return call_forms_INi (fl_set_slider_precision, g-> ob_generic, args);
1179}
1180
1181static struct methodlist slider_methods[] = {
1182 {"set_slider", set_slider},
1183 {"get_slider", get_slider},
1184 {"set_slider_value", set_slider_value},
1185 {"get_slider_value", get_slider},
1186 {"set_slider_bounds", set_slider_bounds},
1187 {"get_slider_bounds", get_slider_bounds},
1188 {"set_slider_return", set_slider_return},
1189 {"set_slider_size", set_slider_size},
1190 {"set_slider_precision",set_slider_precision},
1191 {NULL, NULL} /* sentinel */
1192};
1193
1194static object *
1195set_positioner_xvalue (g, args)
1196 genericobject *g;
1197 object *args;
1198{
1199 return call_forms_INf (fl_set_positioner_xvalue, g-> ob_generic, args);
1200}
1201
1202static object *
1203set_positioner_xbounds (g, args)
1204 genericobject *g;
1205 object *args;
1206{
1207 return call_forms_INfINf (fl_set_positioner_xbounds, g-> ob_generic, args);
1208}
1209
1210static object *
1211set_positioner_yvalue (g, args)
1212 genericobject *g;
1213 object *args;
1214{
1215 return call_forms_INf (fl_set_positioner_yvalue, g-> ob_generic, args);
1216}
1217
1218static object *
1219set_positioner_ybounds (g, args)
1220 genericobject *g;
1221 object *args;
1222{
1223 return call_forms_INfINf (fl_set_positioner_ybounds, g-> ob_generic, args);
1224}
1225
1226static object *
1227get_positioner_xvalue (g, args)
1228 genericobject *g;
1229 object *args;
1230{
1231 return call_forms_Rf (fl_get_positioner_xvalue, g-> ob_generic, args);
1232}
1233
1234static object *
1235get_positioner_xbounds (g, args)
1236 genericobject *g;
1237 object *args;
1238{
1239 return call_forms_OUTfOUTf (fl_get_positioner_xbounds, g-> ob_generic, args);
1240}
1241
1242static object *
1243get_positioner_yvalue (g, args)
1244 genericobject *g;
1245 object *args;
1246{
1247 return call_forms_Rf (fl_get_positioner_yvalue, g-> ob_generic, args);
1248}
1249
1250static object *
1251get_positioner_ybounds (g, args)
1252 genericobject *g;
1253 object *args;
1254{
1255 return call_forms_OUTfOUTf (fl_get_positioner_ybounds, g-> ob_generic, args);
1256}
1257
1258static struct methodlist positioner_methods[] = {
1259 {"set_positioner_xvalue", set_positioner_xvalue},
1260 {"set_positioner_yvalue", set_positioner_yvalue},
1261 {"set_positioner_xbounds", set_positioner_xbounds},
1262 {"set_positioner_ybounds", set_positioner_ybounds},
1263 {"get_positioner_xvalue", get_positioner_xvalue},
1264 {"get_positioner_yvalue", get_positioner_yvalue},
1265 {"get_positioner_xbounds", get_positioner_xbounds},
Guido van Rossum03747111991-08-08 12:10:01 +00001266 {"get_positioner_ybounds", get_positioner_ybounds},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001267 {NULL, NULL} /* sentinel */
1268};
1269
1270/* Class timer */
1271
1272static object *
1273set_timer (g, args)
1274 genericobject *g;
1275 object *args;
1276{
1277 return call_forms_INf (fl_set_timer, g-> ob_generic, args);
1278}
1279
1280static object *
1281get_timer (g, args)
1282 genericobject *g;
1283 object *args;
1284{
1285 return call_forms_Rf (fl_get_timer, g-> ob_generic, args);
1286}
1287
1288static struct methodlist timer_methods[] = {
1289 {"set_timer", set_timer},
1290 {"get_timer", get_timer},
1291 {NULL, NULL} /* sentinel */
1292};
1293
1294/* Form objects */
1295
1296typedef struct {
1297 OB_HEAD
1298 FL_FORM *ob_form;
1299} formobject;
1300
1301extern typeobject Formtype; /* Forward */
1302
1303#define is_formobject(v) ((v)->ob_type == &Formtype)
1304
1305static object *
1306form_show_form(f, args)
1307 formobject *f;
1308 object *args;
1309{
1310 int place, border;
1311 object *name;
1312 if (!getintintstrarg(args, &place, &border, &name))
1313 return NULL;
1314 fl_show_form(f->ob_form, place, border, getstringvalue(name));
1315 INCREF(None);
1316 return None;
1317}
1318
1319static object *
1320form_call(func, f, args)
1321 FL_FORM *f;
1322 object *args;
1323 void (*func)(FL_FORM *);
1324{
1325 if (!getnoarg(args)) return NULL;
1326
1327 (*func)(f);
1328
1329 INCREF(None);
1330 return None;
1331}
1332
1333static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001334form_call_INiINi(func, f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001335 FL_FORM *f;
1336 object *args;
1337 void (*func)(FL_FORM *, int, int);
1338{
1339 int a, b;
1340
1341 if (!getintintarg(args, &a, &b)) return NULL;
1342
1343 (*func)(f, a, b);
1344
1345 INCREF(None);
1346 return None;
1347}
1348
1349static object *
1350form_hide_form(f, args)
1351 formobject *f;
1352 object *args;
1353{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001354 return form_call(fl_hide_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001355}
1356
1357static object *
1358form_redraw_form(f, args)
1359 formobject *f;
1360 object *args;
1361{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001362 return form_call(fl_redraw_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001363}
1364
1365static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001366form_add_object(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001367 formobject *f;
1368 object *args;
1369{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001370 if (args == NULL || !is_genericobject(args)) {
1371 err_badarg();
1372 return NULL;
1373 }
1374
1375 fl_add_object(f->ob_form, ((genericobject *)args) -> ob_generic);
1376
1377 INCREF(None);
1378 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001379}
1380
1381static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001382form_set_form_position(f, args)
1383 formobject *f;
1384 object *args;
1385{
1386 return form_call_INiINi(fl_set_form_position, f-> ob_form, args);
1387}
1388
1389static object *
1390generic_add_object(f, args, func, internal_methods)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001391 formobject *f;
1392 object *args;
1393 FL_OBJECT *(*func)(int, float, float, float, float, char*);
1394 struct methodlist *internal_methods;
1395{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001396 int type;
1397 float x, y, w, h;
1398 object *name;
1399 FL_OBJECT *obj;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001400
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001401 if (!getintfloatfloatfloatfloatstrarg(args,&type,&x,&y,&w,&h,&name))
1402 return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001403
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001404 fl_addto_form (f-> ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001405
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001406 obj = (*func) (type, x, y, w, h, getstringvalue(name));
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001407
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001408 fl_end_form();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001409
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001410 if (obj == NULL) {
1411 err_nomem();
1412 return NULL;
1413 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001414
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001415 return newgenericobject (obj, internal_methods);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001416}
1417
1418static object *
1419form_add_button(f, args)
1420 formobject *f;
1421 object *args;
1422{
1423 return generic_add_object(f, args, fl_add_button, button_methods);
1424}
1425
1426static object *
1427form_add_lightbutton(f, args)
1428 formobject *f;
1429 object *args;
1430{
1431 return generic_add_object(f, args, fl_add_lightbutton, button_methods);
1432}
1433
1434static object *
1435form_add_roundbutton(f, args)
1436 formobject *f;
1437 object *args;
1438{
1439 return generic_add_object(f, args, fl_add_roundbutton, button_methods);
1440}
1441
1442static object *
1443form_add_menu (f, args)
1444 formobject *f;
1445 object *args;
1446{
1447 return generic_add_object(f, args, fl_add_menu, menu_methods);
1448}
1449
1450static object *
1451form_add_slider(f, args)
1452 formobject *f;
1453 object *args;
1454{
1455 return generic_add_object(f, args, fl_add_slider, slider_methods);
1456}
1457
1458static object *
1459form_add_valslider(f, args)
1460 formobject *f;
1461 object *args;
1462{
1463 return generic_add_object(f, args, fl_add_valslider, slider_methods);
1464}
1465
1466static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001467form_add_dial(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001468 formobject *f;
1469 object *args;
1470{
1471 return generic_add_object(f, args, fl_add_dial, dial_methods);
1472}
1473
1474static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001475form_add_counter(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001476 formobject *f;
1477 object *args;
1478{
1479 return generic_add_object(f, args, fl_add_counter, counter_methods);
1480}
1481
1482static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001483form_add_default(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001484 formobject *f;
1485 object *args;
1486{
1487 return generic_add_object(f, args, fl_add_default, default_methods);
1488}
1489
1490static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001491form_add_clock(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001492 formobject *f;
1493 object *args;
1494{
1495 return generic_add_object(f, args, fl_add_clock, clock_methods);
1496}
1497
1498static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001499form_add_box(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001500 formobject *f;
1501 object *args;
1502{
Guido van Rossum03747111991-08-08 12:10:01 +00001503 return generic_add_object(f, args, fl_add_box,
1504 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001505}
1506
1507static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001508form_add_choice(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001509 formobject *f;
1510 object *args;
1511{
1512 return generic_add_object(f, args, fl_add_choice, choice_methods);
1513}
1514
1515static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001516form_add_browser(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001517 formobject *f;
1518 object *args;
1519{
1520 return generic_add_object(f, args, fl_add_browser, browser_methods);
1521}
1522
1523static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001524form_add_positioner(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001525 formobject *f;
1526 object *args;
1527{
1528 return generic_add_object(f, args, fl_add_positioner, positioner_methods);
1529}
1530
1531static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001532form_add_input(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001533 formobject *f;
1534 object *args;
1535{
1536 return generic_add_object(f, args, fl_add_input, input_methods);
1537}
1538
1539static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001540form_add_text(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001541 formobject *f;
1542 object *args;
1543{
Guido van Rossum03747111991-08-08 12:10:01 +00001544 return generic_add_object(f, args, fl_add_text,
1545 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001546}
1547
1548static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001549form_add_timer(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001550 formobject *f;
1551 object *args;
1552{
1553 return generic_add_object(f, args, fl_add_timer, timer_methods);
1554}
1555
1556static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001557form_freeze_form(f, args)
1558 formobject *f;
1559 object *args;
1560{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001561 return form_call(fl_freeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001562}
1563
1564static object *
1565form_unfreeze_form(f, args)
1566 formobject *f;
1567 object *args;
1568{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001569 return form_call(fl_unfreeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001570}
1571
1572static object *
1573form_display_form(f, args)
1574 formobject *f;
1575 object *args;
1576{
1577 int place, border;
1578 object *name;
1579 if (!getintintstrarg(args, &place, &border, &name))
1580 return NULL;
1581 fl_show_form(f->ob_form, place, border, getstringvalue(name));
1582 INCREF(None);
1583 return None;
1584}
1585
1586static object *
1587form_remove_form(f, args)
1588 formobject *f;
1589 object *args;
1590{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001591 return form_call(fl_remove_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001592}
1593
1594static object *
1595form_activate_form(f, args)
1596 formobject *f;
1597 object *args;
1598{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001599 return form_call(fl_activate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001600}
1601
1602static object *
1603form_deactivate_form(f, args)
1604 formobject *f;
1605 object *args;
1606{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001607 return form_call(fl_deactivate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001608}
1609
Guido van Rossum75cc8981991-08-08 12:07:45 +00001610static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001611form_bgn_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001612 formobject *f;
1613 object *args;
1614{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001615 FL_OBJECT *obj;
1616
1617 fl_addto_form(f-> ob_form);
1618 obj = fl_bgn_group();
1619 fl_end_form();
1620
1621 if (obj == NULL) {
1622 err_nomem();
1623 return NULL;
1624 }
1625
1626 return newgenericobject (obj, (struct methodlist *) NULL);
Guido van Rossum03747111991-08-08 12:10:01 +00001627}
1628
1629static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001630form_end_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001631 formobject *f;
1632 object *args;
1633{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001634 fl_addto_form(f-> ob_form);
Guido van Rossum03747111991-08-08 12:10:01 +00001635 fl_end_group();
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001636 fl_end_form();
Guido van Rossum03747111991-08-08 12:10:01 +00001637 INCREF(None);
1638 return None;
1639}
1640
1641static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001642forms_find_first_or_last(func, f, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00001643 FL_OBJECT *(*func)(FL_FORM *, int, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +00001644 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001645 object *args;
1646{
1647 int type;
1648 float mx, my;
1649 FL_OBJECT *generic;
1650 genericobject *g;
1651
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001652 if (!getintfloatfloatarg(args, &type, &mx, &my)) return NULL;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001653
Guido van Rossum03747111991-08-08 12:10:01 +00001654 generic = (*func) (f-> ob_form, type, mx, my);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001655
1656 if (generic == NULL)
1657 {
1658 INCREF(None);
1659 return None;
1660 }
1661
1662 g = findgeneric(generic);
1663 if (g == NULL) {
1664 err_setstr(RuntimeError,
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001665 "forms_find_{first|last} returns unknown object");
Guido van Rossum75cc8981991-08-08 12:07:45 +00001666 return NULL;
1667 }
1668 INCREF(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001669 return (object *) g;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001670}
1671
1672static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001673form_find_first(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001674 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001675 object *args;
1676{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001677 return forms_find_first_or_last(fl_find_first, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001678}
1679
1680static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001681form_find_last(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001682 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001683 object *args;
1684{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001685 return forms_find_first_or_last(fl_find_last, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001686}
1687
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001688static struct methodlist form_methods[] = {
1689/* adm */
1690 {"show_form", form_show_form},
1691 {"hide_form", form_hide_form},
1692 {"redraw_form", form_redraw_form},
1693 {"set_form_position", form_set_form_position},
1694 {"freeze_form", form_freeze_form},
1695 {"unfreeze_form", form_unfreeze_form},
1696 {"display_form", form_display_form},
1697 {"remove_form", form_remove_form},
1698 {"activate_form", form_activate_form},
1699 {"deactivate_form", form_deactivate_form},
Guido van Rossum03747111991-08-08 12:10:01 +00001700 {"bgn_group", form_bgn_group},
1701 {"end_group", form_end_group},
Guido van Rossum75cc8981991-08-08 12:07:45 +00001702 {"find_first", form_find_first},
1703 {"find_last", form_find_last},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001704
1705/* basic objects */
1706 {"add_button", form_add_button},
1707/* {"add_bitmap", form_add_bitmap}, */
1708 {"add_lightbutton", form_add_lightbutton},
1709 {"add_roundbutton", form_add_roundbutton},
1710 {"add_menu", form_add_menu},
1711 {"add_slider", form_add_slider},
1712 {"add_positioner", form_add_positioner},
1713 {"add_valslider", form_add_valslider},
1714 {"add_dial", form_add_dial},
1715 {"add_counter", form_add_counter},
1716 {"add_default", form_add_default},
1717 {"add_box", form_add_box},
1718 {"add_clock", form_add_clock},
1719 {"add_choice", form_add_choice},
1720 {"add_browser", form_add_browser},
1721 {"add_input", form_add_input},
1722 {"add_timer", form_add_timer},
1723 {"add_text", form_add_text},
1724 {NULL, NULL} /* sentinel */
1725};
1726
1727static void
1728form_dealloc(f)
1729 formobject *f;
1730{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001731 releaseobjects(f->ob_form);
1732 fl_free_form(f->ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001733 DEL(f);
1734}
1735
1736static object *
1737form_getattr(f, name)
1738 formobject *f;
1739 char *name;
1740{
Guido van Rossum4f5eafb1991-09-13 15:32:37 +00001741 if (strcmp(name, "window") == 0)
1742 return newintobject(f->ob_form->window);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001743 /* XXX check for data attr's: x, y etc. */
1744 return findmethod(form_methods, (object *)f, name);
1745}
1746
1747typeobject Formtype = {
1748 OB_HEAD_INIT(&Typetype)
1749 0, /*ob_size*/
1750 "form", /*tp_name*/
1751 sizeof(formobject), /*tp_size*/
1752 0, /*tp_itemsize*/
1753 /* methods */
1754 form_dealloc, /*tp_dealloc*/
1755 0, /*tp_print*/
1756 form_getattr, /*tp_getattr*/
1757 0, /*tp_setattr*/
1758 0, /*tp_compare*/
1759 0, /*tp_repr*/
1760};
1761
1762static object *
1763newformobject(form)
1764 FL_FORM *form;
1765{
1766 formobject *f;
1767 f = NEWOBJ(formobject, &Formtype);
1768 if (f == NULL)
1769 return NULL;
1770 f->ob_form = form;
1771 return (object *)f;
1772}
1773
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001774
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001775/* The "fl" module */
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001776
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001777static object *
1778forms_make_form(dummy, args)
1779 object *dummy;
1780 object *args;
1781{
1782 int type;
1783 float w, h;
1784 FL_FORM *form;
1785 if (!getintfloatfloatarg(args, &type, &w, &h))
1786 return NULL;
1787 form = fl_bgn_form(type, w, h);
1788 if (form == NULL) {
1789 /* XXX Actually, cannot happen! */
1790 err_nomem();
1791 return NULL;
1792 }
1793 fl_end_form();
1794 return newformobject(form);
1795}
1796
1797static object *my_event_callback = NULL;
1798
1799static object *
1800forms_set_event_call_back(dummy, args)
1801 object *dummy;
1802 object *args;
1803{
1804 my_event_callback = args;
1805 XINCREF(args);
1806 INCREF(None);
1807 return None;
1808}
1809
1810static object *
1811forms_do_or_check_forms(dummy, args, func)
1812 object *dummy;
1813 object *args;
1814 FL_OBJECT *(*func)();
1815{
1816 FL_OBJECT *generic;
1817 genericobject *g;
1818 object *arg, *res;
1819
1820 if (!getnoarg(args))
1821 return NULL;
1822
1823 for (;;) {
1824 generic = (*func)();
1825 if (generic == NULL) {
1826 INCREF(None);
1827 return None;
1828 }
1829 if (generic == FL_EVENT) {
1830 int dev;
1831 short val;
1832 if (my_event_callback == NULL)
1833 return newintobject(-1);
1834 dev = fl_qread(&val);
1835 arg = newtupleobject(2);
1836 if (arg == NULL)
1837 return NULL;
1838 settupleitem(arg, 0, newintobject((long)dev));
1839 settupleitem(arg, 1, newintobject((long)val));
1840 res = call_object(my_event_callback, arg);
1841 XDECREF(res);
1842 DECREF(arg);
1843 if (res == NULL)
1844 return NULL; /* Callback raised exception */
1845 continue;
1846 }
1847 g = findgeneric(generic);
1848 if (g == NULL) {
1849 err_setstr(RuntimeError,
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001850 "{do|check}_forms returns unknown object");
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001851 return NULL;
1852 }
1853 if (g->ob_callback == NULL) {
1854 INCREF(g);
1855 return ((object *) g);
1856 }
1857 arg = newtupleobject(2);
1858 INCREF(g);
Guido van Rossumabe58351991-08-08 12:34:44 +00001859 settupleitem(arg, 0, (object *)g);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001860 INCREF(g->ob_callback_arg);
1861 settupleitem(arg, 1, g->ob_callback_arg);
1862 res = call_object(g->ob_callback, arg);
1863 XDECREF(res);
1864 DECREF(arg);
1865 if (res == NULL)
1866 return NULL; /* Callback raised exception */
1867 }
1868}
1869
1870static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001871forms_do_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001872 object *dummy;
1873 object *args;
1874{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001875 return forms_do_or_check_forms(dummy, args, fl_do_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001876}
1877
1878static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001879forms_check_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001880 object *dummy;
1881 object *args;
1882{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001883 return forms_do_or_check_forms(dummy, args, fl_check_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001884}
1885
Guido van Rossum03747111991-08-08 12:10:01 +00001886#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001887static object *
1888fl_call(func, args)
1889 object *args;
1890 void (*func)();
1891{
1892 if (!getnoarg(args))
1893 return NULL;
1894 (*func)();
1895 INCREF(None);
1896 return None;
1897}
Guido van Rossum03747111991-08-08 12:10:01 +00001898#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001899
1900static object *
1901forms_qdevice(self, args)
1902 object *self;
1903 object *args;
1904{
1905 short arg1 ;
1906 if (!getishortarg(args, 1, 0, &arg1))
1907 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001908 fl_qdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001909 INCREF(None);
1910 return None;
1911}
1912
1913static object *
1914forms_unqdevice(self, args)
1915 object *self;
1916 object *args;
1917{
1918 short arg1 ;
1919 if (!getishortarg(args, 1, 0, &arg1))
1920 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001921 fl_unqdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001922 INCREF(None);
1923 return None;
1924}
1925
1926static object *
1927forms_isqueued(self, args)
1928 object *self;
1929 object *args;
1930{
Guido van Rossum03747111991-08-08 12:10:01 +00001931 long retval;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001932 short arg1 ;
1933 if (!getishortarg(args, 1, 0, &arg1))
1934 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001935 retval = fl_isqueued(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001936
Guido van Rossum03747111991-08-08 12:10:01 +00001937 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001938}
1939
1940static object *
1941forms_qtest(self, args)
1942 object *self;
1943 object *args;
1944{
1945 long retval;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001946 retval = fl_qtest();
Guido van Rossum03747111991-08-08 12:10:01 +00001947 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001948}
1949
1950
1951static object *
1952forms_qread(self, args)
1953 object *self;
1954 object *args;
1955{
1956 long retval;
1957 short arg1 ;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001958 retval = fl_qread(&arg1);
1959 { object *v = newtupleobject(2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001960 if (v == NULL) return NULL;
1961 settupleitem(v, 0, newintobject(retval));
1962 settupleitem(v, 1, newintobject((long)arg1));
1963 return v;
1964 }
1965}
1966
1967static object *
1968forms_qreset(self, args)
1969 object *self;
1970 object *args;
1971{
1972 if (!getnoarg(args)) return NULL;
1973
Guido van Rossum03747111991-08-08 12:10:01 +00001974 fl_qreset();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001975 INCREF(None);
1976 return None;
1977}
1978
1979static object *
1980forms_qenter(self, args)
1981 object *self;
1982 object *args;
1983{
1984 short arg1 ;
1985 short arg2 ;
1986 if (!getishortarg(args, 2, 0, &arg1))
1987 return NULL;
1988 if (!getishortarg(args, 2, 1, &arg2))
1989 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001990 fl_qenter(arg1, arg2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001991 INCREF(None);
1992 return None;
1993}
1994
1995static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001996forms_color(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001997 object *self;
1998 object *args;
1999{
2000 int arg;
2001
2002 if (!getintarg(args, &arg)) return NULL;
2003
2004 fl_color((short) arg);
2005
2006 INCREF(None);
2007 return None;
2008}
2009
2010static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002011forms_mapcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002012 object *self;
2013 object *args;
2014{
2015 int arg0, arg1, arg2, arg3;
2016
2017 if (!getintintintintarg(args, &arg0, &arg1, &arg2, &arg3))
2018 return NULL;
2019
2020 fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);
2021
2022 INCREF(None);
2023 return None;
2024}
2025
2026static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002027forms_getmcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002028 object *self;
2029 object *args;
2030{
Guido van Rossum03747111991-08-08 12:10:01 +00002031 int arg;
2032 short r, g, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002033 object *v;
2034
2035 if (!getintarg(args, &arg)) return NULL;
2036
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002037 fl_getmcolor(arg, &r, &g, &b);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002038
2039 v = newtupleobject(3);
2040
2041 if (v == NULL) return NULL;
2042
Guido van Rossum03747111991-08-08 12:10:01 +00002043 settupleitem(v, 0, newintobject((long)r));
2044 settupleitem(v, 1, newintobject((long)g));
2045 settupleitem(v, 2, newintobject((long)b));
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002046
2047 return v;
2048}
2049
2050static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002051forms_get_mouse(self, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00002052 object *self;
2053 object *args;
2054{
2055 float x, y ;
2056 object *v;
2057
2058 if (!getnoarg(args)) return NULL;
2059
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002060 fl_get_mouse(&x, &y);
Guido van Rossum75cc8981991-08-08 12:07:45 +00002061
2062 v = newtupleobject(2);
2063
2064 if (v == NULL) return NULL;
2065
2066 settupleitem(v, 0, newfloatobject(x));
2067 settupleitem(v, 1, newfloatobject(y));
2068
2069 return v;
2070}
2071
2072static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002073forms_tie(self, args)
2074 object *self;
2075 object *args;
2076{
2077 short arg1 ;
2078 short arg2 ;
2079 short arg3 ;
2080 if (!getishortarg(args, 3, 0, &arg1))
2081 return NULL;
2082 if (!getishortarg(args, 3, 1, &arg2))
2083 return NULL;
2084 if (!getishortarg(args, 3, 2, &arg3))
2085 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002086 fl_tie(arg1, arg2, arg3);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002087 INCREF(None);
2088 return None;
2089}
2090
Guido van Rossum03747111991-08-08 12:10:01 +00002091static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002092forms_show_message(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002093 object *f;
2094 object *args;
2095{
2096 object *a, *b, *c;
2097
2098 if (!getstrstrstrarg(args, &a, &b, &c)) return NULL;
2099
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002100 fl_show_message(
Guido van Rossum03747111991-08-08 12:10:01 +00002101 getstringvalue(a), getstringvalue(b), getstringvalue(c));
2102
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002103 INCREF(None);
Guido van Rossum03747111991-08-08 12:10:01 +00002104 return None;
2105}
2106
2107static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002108forms_show_question(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002109 object *f;
2110 object *args;
2111{
2112 int ret;
2113 object *a, *b, *c;
2114
2115 if (!getstrstrstrarg(args, &a, &b, &c)) return NULL;
2116
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002117 ret = fl_show_question(
Guido van Rossum03747111991-08-08 12:10:01 +00002118 getstringvalue(a), getstringvalue(b), getstringvalue(c));
2119
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002120 return newintobject((long) ret);
Guido van Rossum03747111991-08-08 12:10:01 +00002121}
2122
2123static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002124forms_show_input(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002125 object *f;
2126 object *args;
2127{
2128 char *str;
2129 object *a, *b;
2130
2131 if (!getstrstrarg(args, &a, &b)) return NULL;
2132
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002133 str = fl_show_input(getstringvalue(a), getstringvalue(b));
2134
2135 if (str == NULL) {
2136 INCREF(None);
2137 return None;
2138 }
2139 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002140}
2141
2142static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002143forms_file_selector(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002144 object *f;
2145 object *args;
2146{
2147 char *str;
2148 object *a, *b, *c, *d;
2149
2150 if (!getstrstrstrstrarg(args, &a, &b, &c, &d)) return NULL;
2151
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002152 str = fl_show_file_selector(getstringvalue(a), getstringvalue(b),
2153 getstringvalue(c), getstringvalue(d));
Guido van Rossum03747111991-08-08 12:10:01 +00002154
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002155 if (str == NULL) {
2156 INCREF(None);
2157 return None;
2158 }
2159 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002160}
2161
2162
2163static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002164forms_file_selector_func(args, func)
Guido van Rossum03747111991-08-08 12:10:01 +00002165 object *args;
2166 char *(*func)();
2167{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002168 char *str;
Guido van Rossum03747111991-08-08 12:10:01 +00002169
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002170 str = (*func) ();
2171
2172 if (str == NULL) {
2173 INCREF(None);
2174 return None;
2175 }
2176 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002177}
2178
2179static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002180forms_get_directory(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002181 object *f;
2182 object *args;
2183{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002184 return forms_file_selector_func(args, fl_get_directory);
Guido van Rossum03747111991-08-08 12:10:01 +00002185}
2186
2187static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002188forms_get_pattern(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002189 object *f;
2190 object *args;
2191{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002192 return forms_file_selector_func(args, fl_get_pattern);
Guido van Rossum03747111991-08-08 12:10:01 +00002193}
2194
2195static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002196forms_get_filename(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00002197 object *f;
2198 object *args;
2199{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002200 return forms_file_selector_func(args, fl_get_filename);
Guido van Rossum03747111991-08-08 12:10:01 +00002201}
2202
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002203static struct methodlist forms_methods[] = {
2204/* adm */
2205 {"make_form", forms_make_form},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002206/* gl support wrappers */
2207 {"qdevice", forms_qdevice},
2208 {"unqdevice", forms_unqdevice},
2209 {"isqueued", forms_isqueued},
2210 {"qtest", forms_qtest},
2211 {"qread", forms_qread},
2212/* {"blkqread", forms_blkqread}, */
2213 {"qreset", forms_qreset},
2214 {"qenter", forms_qenter},
Guido van Rossum03747111991-08-08 12:10:01 +00002215 {"get_mouse", forms_get_mouse},
2216 {"tie", forms_tie},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002217/* {"new_events", forms_new_events}, */
2218 {"color", forms_color},
2219 {"mapcolor", forms_mapcolor},
2220 {"getmcolor", forms_getmcolor},
2221/* interaction */
2222 {"do_forms", forms_do_forms},
2223 {"check_forms", forms_check_forms},
2224 {"set_event_call_back", forms_set_event_call_back},
2225/* goodies */
Guido van Rossum03747111991-08-08 12:10:01 +00002226 {"show_message", forms_show_message},
2227 {"show_question", forms_show_question},
2228 {"file_selector", forms_file_selector},
2229 {"get_directory", forms_get_directory},
2230 {"get_pattern", forms_get_pattern},
2231 {"get_filename", forms_get_filename},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002232/*
Guido van Rossum03747111991-08-08 12:10:01 +00002233 {"show_choice", forms_show_choice},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002234 XXX - draw.c
2235*/
Guido van Rossum03747111991-08-08 12:10:01 +00002236 {"show_input", forms_show_input},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002237 {NULL, NULL} /* sentinel */
2238};
2239
2240void
2241initfl()
2242{
2243 initmodule("fl", forms_methods);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002244 foreground();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002245}
2246
2247
2248/* Support routines */
2249
2250int
2251getintintstrarg(args, a, b, c)
2252 object *args;
2253 int *a, *b;
2254 object **c;
2255{
2256 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2257 err_badarg();
2258 return NULL;
2259 }
2260 return getintarg(gettupleitem(args, 0), a) &&
2261 getintarg(gettupleitem(args, 1), b) &&
2262 getstrarg(gettupleitem(args, 2), c);
2263}
2264
2265int
2266getintfloatfloatarg(args, a, b, c)
2267 object *args;
2268 int *a;
2269 float *b, *c;
2270{
2271 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2272 err_badarg();
2273 return NULL;
2274 }
2275 return getintarg(gettupleitem(args, 0), a) &&
2276 getfloatarg(gettupleitem(args, 1), b) &&
2277 getfloatarg(gettupleitem(args, 2), c);
2278}
2279
2280int
2281getintintintintarg(args, a, b, c, d)
2282 object *args;
2283 int *a, *b, *c, *d;
2284{
2285 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 4) {
2286 err_badarg();
2287 return NULL;
2288 }
2289 return getintarg(gettupleitem(args, 0), a) &&
2290 getintarg(gettupleitem(args, 1), b) &&
2291 getintarg(gettupleitem(args, 2), c) &&
2292 getintarg(gettupleitem(args, 3), d);
2293}
2294
2295int
2296getfloatarg(args, a)
2297 object *args;
2298 float *a;
2299{
2300 double x;
2301 if (!getdoublearg(args, &x))
2302 return 0;
2303 *a = x;
2304 return 1;
2305}
2306
2307int
Guido van Rossum03747111991-08-08 12:10:01 +00002308getintfloatfloatfloatfloatstrarg(args, type, x, y, w, h, name)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002309 object *args;
2310 int *type;
2311 float *x, *y, *w, *h;
2312 object **name;
2313{
2314 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 6) {
2315 err_badarg();
2316 return NULL;
2317 }
2318 return getintarg(gettupleitem(args, 0), type) &&
2319 getfloatarg(gettupleitem(args, 1), x) &&
2320 getfloatarg(gettupleitem(args, 2), y) &&
2321 getfloatarg(gettupleitem(args, 3), w) &&
2322 getfloatarg(gettupleitem(args, 4), h) &&
2323 getstrarg(gettupleitem(args, 5), name);
2324}
2325
2326int
2327getfloatfloatfloatarg(args, f1, f2, f3)
2328 object *args;
2329 float *f1, *f2, *f3;
2330{
2331 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 3) {
2332 err_badarg();
2333 return NULL;
2334 }
2335 return getfloatarg(gettupleitem(args, 0), f1) &&
2336 getfloatarg(gettupleitem(args, 1), f2) &&
2337 getfloatarg(gettupleitem(args, 2), f3);
2338}
2339
2340int
2341getfloatfloatarg(args, f1, f2)
2342 object *args;
2343 float *f1, *f2;
2344{
2345 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
2346 err_badarg();
2347 return NULL;
2348 }
2349 return getfloatarg(gettupleitem(args, 0), f1) &&
2350 getfloatarg(gettupleitem(args, 1), f2);
2351}
2352
2353int
2354getstrstrstrarg(v, a, b, c)
2355 object *v;
2356 object **a;
2357 object **b;
2358 object **c;
2359{
2360 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3) {
2361 return err_badarg();
2362 }
2363 return getstrarg(gettupleitem(v, 0), a) &&
2364 getstrarg(gettupleitem(v, 1), b)&&
2365 getstrarg(gettupleitem(v, 2), c);
2366}
2367
2368
2369int
2370getstrstrstrstrarg(v, a, b, c, d)
2371 object *v;
2372 object **a;
2373 object **b;
2374 object **c;
2375 object **d;
2376{
2377 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 4) {
2378 return err_badarg();
2379 }
2380 return getstrarg(gettupleitem(v, 0), a) &&
2381 getstrarg(gettupleitem(v, 1), b)&&
2382 getstrarg(gettupleitem(v, 2), c) &&
2383 getstrarg(gettupleitem(v, 3),d);
2384
2385}