blob: 34f01218cdd71b27b430f92b90fb67b9d71a3450 [file] [log] [blame]
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001/**********************************************************
Guido van Rossumbab9d031992-04-05 14:26:55 +00002Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
Guido van Rossumc7df79e1991-08-07 11:32:58 +00003Netherlands.
4
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* FL module -- interface to Mark Overmars' FORMS Library. */
26
Guido van Rossumddc0d3e1991-12-10 13:56:42 +000027/* As distributed, this code works with FORMS 2.0.
28 If you #define the symbol FL_V15 it will work with FORMS 1.5 (I hope),
29 and possibly also with previous versions.
30 (You must also edit FL.py to set _v15 to 1.) */
31
Jack Jansen743db361992-08-13 14:13:11 +000032/* A half-hearted attempt has been made to allow programs using this
33 * module to exploit parallelism (through the threads module). No provisions
34 * have been made for multiple threads to use this module at the same time,
35 * though. So, a program with a forms thread and a non-forms thread will work
36 * fine but a program with two threads using forms will probably crash (unless
37 * the program takes precaution to ensure that only one thread can be in
38 * this module at any time). This will have to be fixed some time.
39 * (A fix will probably also have to synchronise with the gl module).
40 */
41
Guido van Rossumc7df79e1991-08-07 11:32:58 +000042#include "forms.h"
43
44#include "allobjects.h"
45#include "import.h"
46#include "modsupport.h"
47#include "structmember.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000048#include "ceval.h"
Guido van Rossumc7df79e1991-08-07 11:32:58 +000049
50/* Generic Forms Objects */
51
52typedef struct {
53 OB_HEAD
54 FL_OBJECT *ob_generic;
55 struct methodlist *ob_methods;
56 object *ob_callback;
57 object *ob_callback_arg;
58} genericobject;
59
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000060extern typeobject GenericObjecttype; /* Forward */
61
62#define is_genericobject(g) ((g)->ob_type == &GenericObjecttype)
63
64/* List of all objects (XXX this should be a hash table on address...) */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000065
66static object *allgenerics = NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000067static int nfreeslots = 0;
68
69/* Add an object to the list of known objects */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000070
71static void
72knowgeneric(g)
73 genericobject *g;
74{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000075 int i, n;
76 /* Create the list if it doesn't already exist */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000077 if (allgenerics == NULL) {
78 allgenerics = newlistobject(0);
79 if (allgenerics == NULL) {
80 err_clear();
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000081 return; /* Too bad, live without allgenerics... */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000082 }
83 }
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000084 if (nfreeslots > 0) {
85 /* Search the list for reusable slots (NULL items) */
86 /* XXX This can be made faster! */
87 n = getlistsize(allgenerics);
88 for (i = 0; i < n; i++) {
89 if (getlistitem(allgenerics, i) == NULL) {
90 INCREF(g);
91 setlistitem(allgenerics, i, (object *)g);
92 nfreeslots--;
93 return;
94 }
95 }
96 /* Strange... no free slots found... */
97 nfreeslots = 0;
98 }
99 /* No free entries, append new item to the end */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000100 addlistitem(allgenerics, (object *)g);
101}
102
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000103/* Find an object in the list of known objects */
104
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000105static genericobject *
106findgeneric(generic)
107 FL_OBJECT *generic;
108{
109 int i, n;
110 genericobject *g;
111
112 if (allgenerics == NULL)
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000113 return NULL; /* No objects known yet */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000114 n = getlistsize(allgenerics);
115 for (i = 0; i < n; i++) {
116 g = (genericobject *)getlistitem(allgenerics, i);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000117 if (g != NULL && g->ob_generic == generic)
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000118 return g;
119 }
120 return NULL; /* Unknown object */
121}
122
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000123/* Remove an object from the list of known objects */
124
125static void
126forgetgeneric(g)
127 genericobject *g;
128{
129 int i, n;
130
131 XDECREF(g->ob_callback);
132 g->ob_callback = NULL;
133 XDECREF(g->ob_callback_arg);
134 g->ob_callback_arg = NULL;
135 if (allgenerics == NULL)
136 return; /* No objects known yet */
137 n = getlistsize(allgenerics);
138 for (i = 0; i < n; i++) {
139 if (g == (genericobject *)getlistitem(allgenerics, i)) {
140 setlistitem(allgenerics, i, (object *)NULL);
141 nfreeslots++;
142 break;
143 }
144 }
145}
146
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000147/* Called when a form is about to be freed --
148 remove all the objects that we know about from it. */
149
150static void
151releaseobjects(form)
152 FL_FORM *form;
153{
154 int i, n;
155 genericobject *g;
156
157 if (allgenerics == NULL)
158 return; /* No objects known yet */
159 n = getlistsize(allgenerics);
160 for (i = 0; i < n; i++) {
161 g = (genericobject *)getlistitem(allgenerics, i);
162 if (g != NULL && g->ob_generic->form == form) {
163 fl_delete_object(g->ob_generic);
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000164 /* The object is now unreachable for
165 do_forms and check_forms, so
166 delete it from the list of known objects */
167 XDECREF(g->ob_callback);
168 g->ob_callback = NULL;
169 XDECREF(g->ob_callback_arg);
170 g->ob_callback_arg = NULL;
171 setlistitem(allgenerics, i, (object *)NULL);
172 nfreeslots++;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000173 }
174 }
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000175}
176
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000177
178/* Methods of generic objects */
179
180static object *
181generic_set_call_back(g, args)
182 genericobject *g;
183 object *args;
184{
185 if (args == NULL) {
186 XDECREF(g->ob_callback);
187 XDECREF(g->ob_callback_arg);
188 g->ob_callback = NULL;
189 g->ob_callback_arg = NULL;
190 }
191 else {
192 if (!is_tupleobject(args) || gettuplesize(args) != 2) {
193 err_badarg();
194 return NULL;
195 }
196 XDECREF(g->ob_callback);
197 XDECREF(g->ob_callback_arg);
198 g->ob_callback = gettupleitem(args, 0);
199 INCREF(g->ob_callback);
200 g->ob_callback_arg = gettupleitem(args, 1);
201 INCREF(g->ob_callback_arg);
202 }
203 INCREF(None);
204 return None;
205}
206
207static object *
208generic_call(g, args, func)
209 genericobject *g;
210 object *args;
211 void (*func)(FL_OBJECT *);
212{
213 if (!getnoarg(args))
214 return NULL;
215 (*func)(g->ob_generic);
216 INCREF(None);
217 return None;
218}
219
220static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000221generic_delete_object(g, args)
222 genericobject *g;
223 object *args;
224{
225 object *res;
226 res = generic_call(g, args, fl_delete_object);
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000227 if (res != NULL)
228 forgetgeneric(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000229 return res;
230}
231
232static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000233generic_show_object(g, args)
234 genericobject *g;
235 object *args;
236{
237 return generic_call(g, args, fl_show_object);
238}
239
240static object *
241generic_hide_object(g, args)
242 genericobject *g;
243 object *args;
244{
245 return generic_call(g, args, fl_hide_object);
246}
247
248static object *
249generic_redraw_object(g, args)
250 genericobject *g;
251 object *args;
252{
253 return generic_call(g, args, fl_redraw_object);
254}
255
256static object *
257generic_freeze_object(g, args)
258 genericobject *g;
259 object *args;
260{
261 return generic_call(g, args, fl_freeze_object);
262}
263
264static object *
265generic_unfreeze_object(g, args)
266 genericobject *g;
267 object *args;
268{
269 return generic_call(g, args, fl_unfreeze_object);
270}
271
272static struct methodlist generic_methods[] = {
273 {"set_call_back", generic_set_call_back},
Guido van Rossum32db5e31991-11-12 15:43:18 +0000274 {"delete_object", generic_delete_object},
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000275 {"show_object", generic_show_object},
276 {"hide_object", generic_hide_object},
277 {"redraw_object", generic_redraw_object},
278 {"freeze_object", generic_freeze_object},
279 {"unfreeze_object", generic_unfreeze_object},
280#if 0
281 {"handle_object", generic_handle_object},
282 {"handle_object_direct",generic_handle_object_direct},
283#endif
Guido van Rossum03747111991-08-08 12:10:01 +0000284 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000285};
286
287static void
288generic_dealloc(g)
289 genericobject *g;
290{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000291 fl_free_object(g->ob_generic);
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000292 XDECREF(g->ob_callback);
293 XDECREF(g->ob_callback_arg);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000294 DEL(g);
295}
296
297#define OFF(x) offsetof(FL_OBJECT, x)
298
299static struct memberlist generic_memberlist[] = {
300 {"objclass", T_INT, OFF(objclass), RO},
301 {"type", T_INT, OFF(type), RO},
302 {"boxtype", T_INT, OFF(boxtype)},
303 {"x", T_FLOAT, OFF(x)},
304 {"y", T_FLOAT, OFF(y)},
305 {"w", T_FLOAT, OFF(w)},
306 {"h", T_FLOAT, OFF(h)},
307 {"col1", T_INT, OFF(col1)},
308 {"col2", T_INT, OFF(col2)},
309 {"align", T_INT, OFF(align)},
310 {"lcol", T_INT, OFF(lcol)},
311 {"lsize", T_FLOAT, OFF(lsize)},
312 /* "label" is treated specially! */
313 {"lstyle", T_INT, OFF(lstyle)},
314 {"pushed", T_INT, OFF(pushed), RO},
315 {"focus", T_INT, OFF(focus), RO},
316 {"belowmouse", T_INT, OFF(belowmouse),RO},
317 {"frozen", T_INT, OFF(frozen), RO},
Guido van Rossum7066dd71992-09-17 17:54:56 +0000318 {"active", T_INT, OFF(active)},
319 {"input", T_INT, OFF(input)},
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000320 {"visible", T_INT, OFF(visible), RO},
Guido van Rossum7066dd71992-09-17 17:54:56 +0000321 {"radio", T_INT, OFF(radio)},
322 {"automatic", T_INT, OFF(automatic)},
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000323 {NULL} /* Sentinel */
324};
325
Guido van Rossumd97f0481991-11-19 20:26:28 +0000326#undef OFF
327
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000328static object *
329generic_getattr(g, name)
330 genericobject *g;
331 char *name;
332{
333 object *meth;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000334
335 /* XXX Ought to special-case name "__methods__" */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000336 if (g-> ob_methods) {
Guido van Rossum03747111991-08-08 12:10:01 +0000337 meth = findmethod(g->ob_methods, (object *)g, name);
338 if (meth != NULL) return meth;
339 err_clear();
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000340 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000341
342 meth = findmethod(generic_methods, (object *)g, name);
343 if (meth != NULL)
344 return meth;
345 err_clear();
346
347 /* "label" is an exception, getmember only works for char pointers,
348 not for char arrays */
349 if (strcmp(name, "label") == 0)
350 return newstringobject(g->ob_generic->label);
351
352 return getmember((char *)g->ob_generic, generic_memberlist, name);
353}
354
355static int
356generic_setattr(g, name, v)
357 genericobject *g;
358 char *name;
359 object *v;
360{
361 int ret;
362
363 if (v == NULL) {
364 err_setstr(TypeError, "can't delete forms object attributes");
Guido van Rossum3dd8c981992-06-03 17:07:49 +0000365 return -1;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000366 }
367
368 /* "label" is an exception: setmember doesn't set strings;
369 and FORMS wants you to call a function to set the label */
370 if (strcmp(name, "label") == 0) {
371 if (!is_stringobject(v)) {
372 err_setstr(TypeError, "label attr must be string");
Guido van Rossum3dd8c981992-06-03 17:07:49 +0000373 return -1;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000374 }
375 fl_set_object_label(g->ob_generic, getstringvalue(v));
376 return 0;
377 }
378
379 ret = setmember((char *)g->ob_generic, generic_memberlist, name, v);
380
381 /* Rather than calling all the various set_object_* functions,
382 we call fl_redraw_object here. This is sometimes redundant
383 but I doubt that's a big problem */
384 if (ret == 0)
385 fl_redraw_object(g->ob_generic);
386
387 return ret;
388}
389
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000390static object *
391generic_repr(g)
392 genericobject *g;
393{
394 char buf[100];
395 sprintf(buf, "<FORMS_object at %lx, objclass=%d>",
396 (long)g, g->ob_generic->objclass);
397 return newstringobject(buf);
398}
399
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000400typeobject GenericObjecttype = {
401 OB_HEAD_INIT(&Typetype)
402 0, /*ob_size*/
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000403 "FORMS_object", /*tp_name*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000404 sizeof(genericobject), /*tp_size*/
405 0, /*tp_itemsize*/
406 /* methods */
407 generic_dealloc, /*tp_dealloc*/
408 0, /*tp_print*/
409 generic_getattr, /*tp_getattr*/
410 generic_setattr, /*tp_setattr*/
411 0, /*tp_compare*/
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000412 generic_repr, /*tp_repr*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000413};
414
415static object *
416newgenericobject(generic, methods)
417 FL_OBJECT *generic;
418 struct methodlist *methods;
419{
420 genericobject *g;
421 g = NEWOBJ(genericobject, &GenericObjecttype);
422 if (g == NULL)
423 return NULL;
424 g-> ob_generic = generic;
425 g->ob_methods = methods;
426 g->ob_callback = NULL;
427 g->ob_callback_arg = NULL;
428 knowgeneric(g);
429 return (object *)g;
430}
431
432/**********************************************************************/
433/* Some common calling sequences */
434
435/* void func (object, float) */
436static object *
437call_forms_INf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000438 void (*func)(FL_OBJECT *, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000439 FL_OBJECT *obj;
440 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000441{
Guido van Rossum03747111991-08-08 12:10:01 +0000442 float parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000443
Guido van Rossumfc58e581992-01-27 16:45:55 +0000444 if (!getargs(args, "f", &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000445
Guido van Rossum03747111991-08-08 12:10:01 +0000446 (*func) (obj, parameter);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000447
Guido van Rossum03747111991-08-08 12:10:01 +0000448 INCREF(None);
449 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000450}
451
452/* void func (object, float) */
453static object *
454call_forms_INfINf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000455 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000456 FL_OBJECT *obj;
457 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000458{
Guido van Rossum03747111991-08-08 12:10:01 +0000459 float par1, par2;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000460
Guido van Rossumfc58e581992-01-27 16:45:55 +0000461 if (!getargs(args, "(ff)", &par1, &par2)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000462
Guido van Rossum03747111991-08-08 12:10:01 +0000463 (*func) (obj, par1, par2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000464
Guido van Rossum03747111991-08-08 12:10:01 +0000465 INCREF(None);
466 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000467}
468
469/* void func (object, int) */
470static object *
471call_forms_INi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000472 void (*func)(FL_OBJECT *, int);
Guido van Rossum03747111991-08-08 12:10:01 +0000473 FL_OBJECT *obj;
474 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000475{
Guido van Rossum03747111991-08-08 12:10:01 +0000476 int parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000477
Guido van Rossumfc58e581992-01-27 16:45:55 +0000478 if (!getintarg(args, &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000479
Guido van Rossum03747111991-08-08 12:10:01 +0000480 (*func) (obj, parameter);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000481
Guido van Rossum03747111991-08-08 12:10:01 +0000482 INCREF(None);
483 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000484}
485
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000486/* void func (object, char) */
487static object *
488call_forms_INc (func, obj, args)
489 void (*func)(FL_OBJECT *, int);
490 FL_OBJECT *obj;
491 object *args;
492{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000493 char *a;
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000494
Guido van Rossumfc58e581992-01-27 16:45:55 +0000495 if (!getstrarg(args, &a)) return NULL;
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000496
Guido van Rossumfc58e581992-01-27 16:45:55 +0000497 (*func) (obj, a[0]);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000498
499 INCREF(None);
500 return None;
501}
502
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000503/* void func (object, string) */
504static object *
505call_forms_INstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000506 void (*func)(FL_OBJECT *, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000507 FL_OBJECT *obj;
508 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000509{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000510 char *a;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000511
Guido van Rossumfc58e581992-01-27 16:45:55 +0000512 if (!getstrarg(args, &a)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000513
Guido van Rossumfc58e581992-01-27 16:45:55 +0000514 (*func) (obj, a);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000515
Guido van Rossum03747111991-08-08 12:10:01 +0000516 INCREF(None);
517 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000518}
519
520
521/* voide func (object, int, string) */
522static object *
523call_forms_INiINstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000524 void (*func)(FL_OBJECT *, int, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000525 FL_OBJECT *obj;
526 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000527{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000528 char *b;
529 int a;
Guido van Rossum03747111991-08-08 12:10:01 +0000530
Guido van Rossumfc58e581992-01-27 16:45:55 +0000531 if (!getintstrarg(args, &a, &b)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000532
Guido van Rossumfc58e581992-01-27 16:45:55 +0000533 (*func) (obj, a, b);
Guido van Rossum03747111991-08-08 12:10:01 +0000534
535 INCREF(None);
536 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000537}
538
Guido van Rossum03747111991-08-08 12:10:01 +0000539#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000540/* void func (object, float) */
541static object *
542call_forms_INiINi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000543 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000544 FL_OBJECT *obj;
545 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000546{
Guido van Rossum03747111991-08-08 12:10:01 +0000547 int par1, par2;
548
Guido van Rossumfc58e581992-01-27 16:45:55 +0000549 if (!getintintarg(args, &par1, &par2)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000550
551 (*func) (obj, par1, par2);
552
553 INCREF(None);
554 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000555}
Guido van Rossum03747111991-08-08 12:10:01 +0000556#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000557
558/* int func (object) */
559static object *
560call_forms_Ri (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000561 int (*func)(FL_OBJECT *);
562 FL_OBJECT *obj;
563 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000564{
Guido van Rossum03747111991-08-08 12:10:01 +0000565 int retval;
566
567 if (!getnoarg(args)) return NULL;
568
569 retval = (*func) (obj);
570
571 return newintobject ((long) retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000572}
573
574/* char * func (object) */
575static object *
576call_forms_Rstr (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000577 char * (*func)(FL_OBJECT *);
578 FL_OBJECT *obj;
579 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000580{
Guido van Rossum03747111991-08-08 12:10:01 +0000581 char *str;
582
Guido van Rossumfc58e581992-01-27 16:45:55 +0000583 if (!getnoarg(args)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000584
585 str = (*func) (obj);
586
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000587 if (str == NULL) {
588 INCREF(None);
589 return None;
590 }
Guido van Rossum03747111991-08-08 12:10:01 +0000591 return newstringobject (str);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000592}
593
594/* int func (object) */
595static object *
596call_forms_Rf (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000597 float (*func)(FL_OBJECT *);
598 FL_OBJECT *obj;
599 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000600{
Guido van Rossum03747111991-08-08 12:10:01 +0000601 float retval;
602
603 if (!getnoarg(args)) return NULL;
604
605 retval = (*func) (obj);
606
607 return newfloatobject (retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000608}
609
610static object *
611call_forms_OUTfOUTf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000612 void (*func)(FL_OBJECT *, float *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000613 FL_OBJECT *obj;
614 object *args;
615{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000616 float f1, f2;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000617 object *arg;
Guido van Rossum03747111991-08-08 12:10:01 +0000618
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000619 if (!getnoarg(args)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000620
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000621 (*func) (obj, &f1, &f2);
622
623 arg = newtupleobject (2);
624 if (arg == NULL) return NULL;
625
626 settupleitem (arg, 0, newfloatobject (f1));
627 settupleitem (arg, 1, newfloatobject (f2));
628 return arg;
629}
630
Guido van Rossum03747111991-08-08 12:10:01 +0000631#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000632static object *
633call_forms_OUTf (func, obj, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000634 void (*func)(FL_OBJECT *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000635 FL_OBJECT *obj;
636 object *args;
637{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000638 float f;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000639
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000640 if (!getnoarg(args)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000641
642 (*func) (obj, &f);
643
644 return newfloatobject (f);
645}
Guido van Rossum03747111991-08-08 12:10:01 +0000646#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000647
648/**********************************************************************/
649/* Class : browser */
650
651static object *
652set_browser_topline(g, args)
653 genericobject *g;
654 object *args;
655{
Guido van Rossum03747111991-08-08 12:10:01 +0000656 return call_forms_INi (fl_set_browser_topline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000657}
658
659static object *
660clear_browser(g, args)
661 genericobject *g;
662 object *args;
663{
Guido van Rossum03747111991-08-08 12:10:01 +0000664 return generic_call (g, args, fl_clear_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000665}
666
667static object *
668add_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000669 genericobject *g;
670 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000671{
Guido van Rossum03747111991-08-08 12:10:01 +0000672 return call_forms_INstr (fl_add_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000673}
674
675static object *
676addto_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000677 genericobject *g;
678 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000679{
Guido van Rossum03747111991-08-08 12:10:01 +0000680 return call_forms_INstr (fl_addto_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000681}
682
683static object *
684insert_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000685 genericobject *g;
686 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000687{
Guido van Rossum03747111991-08-08 12:10:01 +0000688 return call_forms_INiINstr (fl_insert_browser_line,
689 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000690}
691
692static object *
693delete_browser_line (g, args)
694 genericobject *g;
695 object *args;
696{
Guido van Rossum03747111991-08-08 12:10:01 +0000697 return call_forms_INi (fl_delete_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000698}
699
700static object *
701replace_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{
Guido van Rossum03747111991-08-08 12:10:01 +0000705 return call_forms_INiINstr (fl_replace_browser_line,
706 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000707}
708
709static object *
710get_browser_line(g, args)
711 genericobject *g;
712 object *args;
713{
714 int i;
715 char *str;
716
717 if (!getintarg(args, &i))
718 return NULL;
719
720 str = fl_get_browser_line (g->ob_generic, i);
721
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000722 if (str == NULL) {
723 INCREF(None);
724 return None;
725 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000726 return newstringobject (str);
727}
728
729static object *
730load_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000731 genericobject *g;
732 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000733{
Guido van Rossumabe58351991-08-08 12:34:44 +0000734 /* XXX strictly speaking this is wrong since fl_load_browser
735 XXX returns int, not void */
Guido van Rossum03747111991-08-08 12:10:01 +0000736 return call_forms_INstr (fl_load_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000737}
738
739static object *
740get_browser_maxline(g, args)
741 genericobject *g;
742 object *args;
743{
Guido van Rossum03747111991-08-08 12:10:01 +0000744 return call_forms_Ri (fl_get_browser_maxline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000745}
746
747static object *
748select_browser_line (g, args)
749 genericobject *g;
750 object *args;
751{
Guido van Rossum03747111991-08-08 12:10:01 +0000752 return call_forms_INi (fl_select_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000753}
754
755static object *
756deselect_browser_line (g, args)
757 genericobject *g;
758 object *args;
759{
Guido van Rossum03747111991-08-08 12:10:01 +0000760 return call_forms_INi (fl_deselect_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000761}
762
763static object *
764deselect_browser (g, args)
765 genericobject *g;
766 object *args;
767{
Guido van Rossum03747111991-08-08 12:10:01 +0000768 return generic_call (g, args, fl_deselect_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000769}
770
771static object *
772isselected_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000773 genericobject *g;
774 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000775{
776 int i, j;
Guido van Rossum03747111991-08-08 12:10:01 +0000777
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000778 if (!getintarg(args, &i))
779 return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000780
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000781 j = fl_isselected_browser_line (g->ob_generic, i);
Guido van Rossum03747111991-08-08 12:10:01 +0000782
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000783 return newintobject (j);
784}
785
786static object *
787get_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000788 genericobject *g;
789 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000790{
Guido van Rossum03747111991-08-08 12:10:01 +0000791 return call_forms_Ri (fl_get_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000792}
793
794static object *
795set_browser_fontsize (g, args)
796 genericobject *g;
797 object *args;
798{
Guido van Rossum03747111991-08-08 12:10:01 +0000799 return call_forms_INf (fl_set_browser_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000800}
801
802static object *
803set_browser_fontstyle (g, args)
804 genericobject *g;
805 object *args;
806{
Guido van Rossum03747111991-08-08 12:10:01 +0000807 return call_forms_INi (fl_set_browser_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000808}
809
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000810static object *
811set_browser_specialkey (g, args)
812 genericobject *g;
813 object *args;
814{
815 return call_forms_INc(fl_set_browser_specialkey, g-> ob_generic, args);
816}
817
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000818static struct methodlist browser_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000819 {"set_browser_topline", set_browser_topline},
820 {"clear_browser", clear_browser},
821 {"add_browser_line", add_browser_line},
822 {"addto_browser", addto_browser},
823 {"insert_browser_line", insert_browser_line},
824 {"delete_browser_line", delete_browser_line},
825 {"replace_browser_line", replace_browser_line},
826 {"get_browser_line", get_browser_line},
827 {"load_browser", load_browser},
828 {"get_browser_maxline", get_browser_maxline},
829 {"select_browser_line", select_browser_line},
830 {"deselect_browser_line", deselect_browser_line},
831 {"deselect_browser", deselect_browser},
832 {"isselected_browser_line", isselected_browser_line},
833 {"get_browser", get_browser},
834 {"set_browser_fontsize", set_browser_fontsize},
835 {"set_browser_fontstyle", set_browser_fontstyle},
836 {"set_browser_specialkey", set_browser_specialkey},
837 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000838};
839
840/* Class: button */
841
842static object *
843set_button(g, args)
844 genericobject *g;
845 object *args;
846{
Guido van Rossum03747111991-08-08 12:10:01 +0000847 return call_forms_INi (fl_set_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000848}
849
850static object *
851get_button(g, args)
852 genericobject *g;
853 object *args;
854{
Guido van Rossum03747111991-08-08 12:10:01 +0000855 return call_forms_Ri (fl_get_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000856}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000857static object *
858set_button_shortcut(g, args)
859 genericobject *g;
860 object *args;
861{
862 return call_forms_INstr (fl_set_button_shortcut, g-> ob_generic, args);
863}
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000864
865static struct methodlist button_methods[] = {
866 {"set_button", set_button},
867 {"get_button", get_button},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000868#ifndef FL_V15
869 {"set_button_shortcut", set_button_shortcut},
870#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000871 {NULL, NULL} /* sentinel */
872};
873
874/* Class: choice */
875
876static object *
877set_choice(g, args)
878 genericobject *g;
879 object *args;
880{
Guido van Rossum03747111991-08-08 12:10:01 +0000881 return call_forms_INi (fl_set_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000882}
883
884static object *
885get_choice(g, args)
886 genericobject *g;
887 object *args;
888{
Guido van Rossum03747111991-08-08 12:10:01 +0000889 return call_forms_Ri (fl_get_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000890}
891
892static object *
893clear_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000894 genericobject *g;
895 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000896{
Guido van Rossum03747111991-08-08 12:10:01 +0000897 return generic_call (g, args, fl_clear_choice);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000898}
899
900static object *
901addto_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000902 genericobject *g;
903 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000904{
Guido van Rossum03747111991-08-08 12:10:01 +0000905 return call_forms_INstr (fl_addto_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000906}
907
908static object *
909replace_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000910 genericobject *g;
911 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000912{
Guido van Rossum03747111991-08-08 12:10:01 +0000913 return call_forms_INiINstr (fl_replace_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000914}
915
916static object *
917delete_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000918 genericobject *g;
919 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000920{
Guido van Rossum03747111991-08-08 12:10:01 +0000921 return call_forms_INi (fl_delete_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000922}
923
924static object *
925get_choice_text (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000926 genericobject *g;
927 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000928{
Guido van Rossum03747111991-08-08 12:10:01 +0000929 return call_forms_Rstr (fl_get_choice_text, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000930}
931
932static object *
933set_choice_fontsize (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000934 genericobject *g;
935 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000936{
Guido van Rossum03747111991-08-08 12:10:01 +0000937 return call_forms_INf (fl_set_choice_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000938}
939
940static object *
941set_choice_fontstyle (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000942 genericobject *g;
943 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000944{
Guido van Rossum03747111991-08-08 12:10:01 +0000945 return call_forms_INi (fl_set_choice_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000946}
947
948static struct methodlist choice_methods[] = {
949 {"set_choice", set_choice},
950 {"get_choice", get_choice},
951 {"clear_choice", clear_choice},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000952 {"addto_choice", addto_choice},
953 {"replace_choice", replace_choice},
954 {"delete_choice", delete_choice},
955 {"get_choice_text", get_choice_text},
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000956 {"set_choice_fontsize", set_choice_fontsize},
957 {"set_choice_fontstyle",set_choice_fontstyle},
958 {NULL, NULL} /* sentinel */
959};
960
961/* Class : Clock */
962
963static object *
964get_clock(g, args)
965 genericobject *g;
966 object *args;
967{
968 int i0, i1, i2;
969 object *arg;
970
971 if (!getnoarg(args))
972 return NULL;
973
974 fl_get_clock (g->ob_generic, &i0, &i1, &i2);
975
976 arg = newtupleobject (3);
977 if (arg == NULL) return NULL;
978
979 settupleitem (arg, 0, newintobject (i0));
980 settupleitem (arg, 1, newintobject (i1));
981 settupleitem (arg, 2, newintobject (i2));
982 return arg;
983}
984
985static struct methodlist clock_methods[] = {
986 {"get_clock", get_clock},
987 {NULL, NULL} /* sentinel */
988};
989
990/* CLass : Counters */
991
992static object *
993get_counter_value(g, args)
994 genericobject *g;
995 object *args;
996{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000997 return call_forms_Rf (fl_get_counter_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000998}
999
1000static object *
1001set_counter_value (g, args)
1002 genericobject *g;
1003 object *args;
1004{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001005 return call_forms_INf (fl_set_counter_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001006}
1007
1008static object *
1009set_counter_precision (g, args)
1010 genericobject *g;
1011 object *args;
1012{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001013 return call_forms_INi (fl_set_counter_precision, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001014}
1015
1016static object *
1017set_counter_bounds (g, args)
1018 genericobject *g;
1019 object *args;
1020{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001021 return call_forms_INfINf (fl_set_counter_bounds, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001022}
1023
1024static object *
1025set_counter_step (g, args)
1026 genericobject *g;
1027 object *args;
1028{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001029 return call_forms_INfINf (fl_set_counter_step, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001030}
1031
1032static object *
1033set_counter_return (g, args)
1034 genericobject *g;
1035 object *args;
1036{
Guido van Rossum03747111991-08-08 12:10:01 +00001037 return call_forms_INi (fl_set_counter_return, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001038}
1039
1040static struct methodlist counter_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001041 {"set_counter_value", set_counter_value},
1042 {"get_counter_value", get_counter_value},
1043 {"set_counter_bounds", set_counter_bounds},
1044 {"set_counter_step", set_counter_step},
1045 {"set_counter_precision", set_counter_precision},
1046 {"set_counter_return", set_counter_return},
1047 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001048};
1049
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001050#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001051/* Class : Defaults */
1052
1053static object *
1054get_default(g, args)
1055 genericobject *g;
1056 object *args;
1057{
Guido van Rossum03747111991-08-08 12:10:01 +00001058 char c;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001059
Guido van Rossum03747111991-08-08 12:10:01 +00001060 if (!getnoarg(args)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001061
Guido van Rossum03747111991-08-08 12:10:01 +00001062 c = fl_get_default (g->ob_generic);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001063
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001064 return ((object *) mknewcharobject (c)); /* in cgensupport.c */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001065}
1066
1067static struct methodlist default_methods[] = {
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001068 {"get_default", get_default},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001069 {NULL, NULL} /* sentinel */
1070};
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001071#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001072
1073
1074/* Class: Dials */
1075
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001076#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001077static object *
1078set_dial (g, args)
1079 genericobject *g;
1080 object *args;
1081{
1082 float f1, f2, f3;
1083
Guido van Rossumfc58e581992-01-27 16:45:55 +00001084 if (!getargs(args, "(fff)", &f1, &f2, &f3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001085 return NULL;
1086 fl_set_dial (g->ob_generic, f1, f2, f3);
1087 INCREF(None);
1088 return None;
1089}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001090#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001091
1092static object *
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001093get_dial_value(g, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001094 genericobject *g;
1095 object *args;
1096{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001097 return call_forms_Rf (fl_get_dial_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001098}
1099
1100static object *
1101set_dial_value (g, args)
1102 genericobject *g;
1103 object *args;
1104{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001105 return call_forms_INf (fl_set_dial_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001106}
1107
1108static object *
1109set_dial_bounds (g, args)
1110 genericobject *g;
1111 object *args;
1112{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001113 return call_forms_INfINf (fl_set_dial_bounds, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001114}
1115
1116static object *
1117get_dial_bounds (g, args)
1118 genericobject *g;
1119 object *args;
1120{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001121 return call_forms_OUTfOUTf (fl_get_dial_bounds, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001122}
1123
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001124#ifndef FL_V15
1125static object *
1126set_dial_step (g, args)
1127 genericobject *g;
1128 object *args;
1129{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001130 return call_forms_INf (fl_set_dial_step, g-> ob_generic, args);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001131}
1132#endif /* !FL_V15 */
1133
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001134static struct methodlist dial_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001135#ifdef FL_V15
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001136 {"set_dial", set_dial},
1137 {"get_dial", get_dial_value},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001138#endif /* FL_V15 */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001139 {"set_dial_value", set_dial_value},
1140 {"get_dial_value", get_dial_value},
1141 {"set_dial_bounds", set_dial_bounds},
1142 {"get_dial_bounds", get_dial_bounds},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001143#ifndef FL_V15
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001144 {"set_dial_step", set_dial_step},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001145#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001146 {NULL, NULL} /* sentinel */
1147};
1148
1149/* Class : Input */
1150
1151static object *
1152set_input (g, args)
1153 genericobject *g;
1154 object *args;
1155{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001156 return call_forms_INstr (fl_set_input, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001157}
1158
1159static object *
1160get_input (g, args)
1161 genericobject *g;
1162 object *args;
1163{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001164 return call_forms_Rstr (fl_get_input, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001165}
1166
1167static object *
1168set_input_color (g, args)
1169 genericobject *g;
1170 object *args;
1171{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001172 return call_forms_INfINf (fl_set_input_color, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001173}
1174
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001175#ifndef FL_V15
1176static object *
1177set_input_return (g, args)
1178 genericobject *g;
1179 object *args;
1180{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001181 return call_forms_INi (fl_set_input_return, g-> ob_generic, args);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001182}
1183#endif /* !FL_V15 */
1184
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001185static struct methodlist input_methods[] = {
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001186 {"set_input", set_input},
1187 {"get_input", get_input},
1188 {"set_input_color", set_input_color},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001189#ifndef FL_V15
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001190 {"set_input_return", set_input_return},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001191#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001192 {NULL, NULL} /* sentinel */
1193};
1194
1195
1196/* Class : Menu */
1197
1198static object *
1199set_menu (g, args)
1200 genericobject *g;
1201 object *args;
1202{
Guido van Rossumabe58351991-08-08 12:34:44 +00001203 return call_forms_INstr (fl_set_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001204}
1205
1206static object *
1207get_menu (g, args)
1208 genericobject *g;
1209 object *args;
1210{
Guido van Rossumabe58351991-08-08 12:34:44 +00001211 /* XXX strictly speaking this is wrong since fl_get_menu
1212 XXX returns long, not int */
1213 return call_forms_Ri (fl_get_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001214}
1215
1216static object *
1217addto_menu (g, args)
1218 genericobject *g;
1219 object *args;
1220{
Guido van Rossumabe58351991-08-08 12:34:44 +00001221 return call_forms_INstr (fl_addto_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001222}
1223
1224static struct methodlist menu_methods[] = {
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001225 {"set_menu", set_menu},
1226 {"get_menu", get_menu},
1227 {"addto_menu", addto_menu},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001228 {NULL, NULL} /* sentinel */
1229};
1230
1231
1232/* Class: Sliders */
1233
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001234#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001235static object *
1236set_slider (g, args)
1237 genericobject *g;
1238 object *args;
1239{
1240 float f1, f2, f3;
1241
Guido van Rossumfc58e581992-01-27 16:45:55 +00001242 if (!args(args, "(fff)", &f1, &f2, &f3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001243 return NULL;
1244 fl_set_slider (g->ob_generic, f1, f2, f3);
1245 INCREF(None);
1246 return None;
1247}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001248#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001249
1250static object *
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001251get_slider_value(g, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001252 genericobject *g;
1253 object *args;
1254{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001255 return call_forms_Rf (fl_get_slider_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001256}
1257
1258static object *
1259set_slider_value (g, args)
1260 genericobject *g;
1261 object *args;
1262{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001263 return call_forms_INf (fl_set_slider_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001264}
1265
1266static object *
1267set_slider_bounds (g, args)
1268 genericobject *g;
1269 object *args;
1270{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001271 return call_forms_INfINf (fl_set_slider_bounds, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001272}
1273
1274static object *
1275get_slider_bounds (g, args)
1276 genericobject *g;
1277 object *args;
1278{
1279 return call_forms_OUTfOUTf(fl_get_slider_bounds, g-> ob_generic, args);
1280}
1281
1282static object *
1283set_slider_return (g, args)
1284 genericobject *g;
1285 object *args;
1286{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001287 return call_forms_INf (fl_set_slider_return, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001288}
1289
1290static object *
1291set_slider_size (g, args)
1292 genericobject *g;
1293 object *args;
1294{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001295 return call_forms_INf (fl_set_slider_size, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001296}
1297
1298static object *
1299set_slider_precision (g, args)
1300 genericobject *g;
1301 object *args;
1302{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001303 return call_forms_INi (fl_set_slider_precision, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001304}
1305
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001306#ifndef FL_V15
1307static object *
1308set_slider_step (g, args)
1309 genericobject *g;
1310 object *args;
1311{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001312 return call_forms_INf (fl_set_slider_step, g-> ob_generic, args);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001313}
1314#endif /* !FL_V15 */
1315
1316
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001317static struct methodlist slider_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001318#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001319 {"set_slider", set_slider},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001320 {"get_slider", get_slider_value},
1321#endif /* FL_V15 */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001322 {"set_slider_value", set_slider_value},
1323 {"get_slider_value", get_slider_value},
1324 {"set_slider_bounds", set_slider_bounds},
1325 {"get_slider_bounds", get_slider_bounds},
1326 {"set_slider_return", set_slider_return},
1327 {"set_slider_size", set_slider_size},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001328 {"set_slider_precision",set_slider_precision},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001329#ifndef FL_V15
1330 {"set_slider_step", set_slider_step},
1331#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001332 {NULL, NULL} /* sentinel */
1333};
1334
1335static object *
1336set_positioner_xvalue (g, args)
1337 genericobject *g;
1338 object *args;
1339{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001340 return call_forms_INf (fl_set_positioner_xvalue, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001341}
1342
1343static object *
1344set_positioner_xbounds (g, args)
1345 genericobject *g;
1346 object *args;
1347{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001348 return call_forms_INfINf (fl_set_positioner_xbounds,
1349 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001350}
1351
1352static object *
1353set_positioner_yvalue (g, args)
1354 genericobject *g;
1355 object *args;
1356{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001357 return call_forms_INf (fl_set_positioner_yvalue, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001358}
1359
1360static object *
1361set_positioner_ybounds (g, args)
1362 genericobject *g;
1363 object *args;
1364{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001365 return call_forms_INfINf (fl_set_positioner_ybounds,
1366 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001367}
1368
1369static object *
1370get_positioner_xvalue (g, args)
1371 genericobject *g;
1372 object *args;
1373{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001374 return call_forms_Rf (fl_get_positioner_xvalue, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001375}
1376
1377static object *
1378get_positioner_xbounds (g, args)
1379 genericobject *g;
1380 object *args;
1381{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001382 return call_forms_OUTfOUTf (fl_get_positioner_xbounds,
1383 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001384}
1385
1386static object *
1387get_positioner_yvalue (g, args)
1388 genericobject *g;
1389 object *args;
1390{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001391 return call_forms_Rf (fl_get_positioner_yvalue, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001392}
1393
1394static object *
1395get_positioner_ybounds (g, args)
1396 genericobject *g;
1397 object *args;
1398{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001399 return call_forms_OUTfOUTf (fl_get_positioner_ybounds,
1400 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001401}
1402
1403static struct methodlist positioner_methods[] = {
1404 {"set_positioner_xvalue", set_positioner_xvalue},
1405 {"set_positioner_yvalue", set_positioner_yvalue},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001406 {"set_positioner_xbounds", set_positioner_xbounds},
1407 {"set_positioner_ybounds", set_positioner_ybounds},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001408 {"get_positioner_xvalue", get_positioner_xvalue},
1409 {"get_positioner_yvalue", get_positioner_yvalue},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001410 {"get_positioner_xbounds", get_positioner_xbounds},
1411 {"get_positioner_ybounds", get_positioner_ybounds},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001412 {NULL, NULL} /* sentinel */
1413};
1414
1415/* Class timer */
1416
1417static object *
1418set_timer (g, args)
1419 genericobject *g;
1420 object *args;
1421{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001422 return call_forms_INf (fl_set_timer, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001423}
1424
1425static object *
1426get_timer (g, args)
1427 genericobject *g;
1428 object *args;
1429{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001430 return call_forms_Rf (fl_get_timer, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001431}
1432
1433static struct methodlist timer_methods[] = {
1434 {"set_timer", set_timer},
1435 {"get_timer", get_timer},
1436 {NULL, NULL} /* sentinel */
1437};
1438
1439/* Form objects */
1440
1441typedef struct {
1442 OB_HEAD
1443 FL_FORM *ob_form;
1444} formobject;
1445
1446extern typeobject Formtype; /* Forward */
1447
1448#define is_formobject(v) ((v)->ob_type == &Formtype)
1449
1450static object *
1451form_show_form(f, args)
1452 formobject *f;
1453 object *args;
1454{
1455 int place, border;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001456 char *name;
1457 if (!getargs(args, "(iis)", &place, &border, &name))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001458 return NULL;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001459 fl_show_form(f->ob_form, place, border, name);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001460 INCREF(None);
1461 return None;
1462}
1463
1464static object *
1465form_call(func, f, args)
1466 FL_FORM *f;
1467 object *args;
1468 void (*func)(FL_FORM *);
1469{
1470 if (!getnoarg(args)) return NULL;
1471
1472 (*func)(f);
1473
1474 INCREF(None);
1475 return None;
1476}
1477
1478static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001479form_call_INiINi(func, f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001480 FL_FORM *f;
1481 object *args;
1482 void (*func)(FL_FORM *, int, int);
1483{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001484 int a, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001485
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001486 if (!getintintarg(args, &a, &b)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001487
1488 (*func)(f, a, b);
1489
1490 INCREF(None);
1491 return None;
1492}
1493
1494static object *
1495form_hide_form(f, args)
1496 formobject *f;
1497 object *args;
1498{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001499 return form_call(fl_hide_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001500}
1501
1502static object *
1503form_redraw_form(f, args)
1504 formobject *f;
1505 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001506{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001507 return form_call(fl_redraw_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001508}
1509
1510static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001511form_add_object(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001512 formobject *f;
1513 object *args;
1514{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001515 genericobject *g;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001516 if (args == NULL || !is_genericobject(args)) {
1517 err_badarg();
1518 return NULL;
1519 }
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001520 g = (genericobject *)args;
1521 if (findgeneric(g->ob_generic) != NULL) {
1522 err_setstr(RuntimeError,
1523 "add_object of object already in a form");
1524 return NULL;
1525 }
1526 fl_add_object(f->ob_form, g->ob_generic);
1527 knowgeneric(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001528
1529 INCREF(None);
1530 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001531}
1532
1533static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001534form_set_form_position(f, args)
1535 formobject *f;
1536 object *args;
1537{
1538 return form_call_INiINi(fl_set_form_position, f-> ob_form, args);
1539}
1540
1541static object *
1542generic_add_object(f, args, func, internal_methods)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001543 formobject *f;
1544 object *args;
1545 FL_OBJECT *(*func)(int, float, float, float, float, char*);
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001546 struct methodlist *internal_methods;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001547{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001548 int type;
1549 float x, y, w, h;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001550 char *name;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001551 FL_OBJECT *obj;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001552
Guido van Rossumfc58e581992-01-27 16:45:55 +00001553 if (!getargs(args,"(iffffs)", &type,&x,&y,&w,&h,&name))
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001554 return NULL;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001555
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001556 fl_addto_form (f-> ob_form);
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001557
Guido van Rossumfc58e581992-01-27 16:45:55 +00001558 obj = (*func) (type, x, y, w, h, name);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001559
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001560 fl_end_form();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001561
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001562 if (obj == NULL) {
1563 err_nomem();
1564 return NULL;
1565 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001566
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001567 return newgenericobject (obj, internal_methods);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001568}
1569
1570static object *
1571form_add_button(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001572 formobject *f;
1573 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001574{
1575 return generic_add_object(f, args, fl_add_button, button_methods);
1576}
1577
1578static object *
1579form_add_lightbutton(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001580 formobject *f;
1581 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001582{
1583 return generic_add_object(f, args, fl_add_lightbutton, button_methods);
1584}
1585
1586static object *
1587form_add_roundbutton(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001588 formobject *f;
1589 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001590{
1591 return generic_add_object(f, args, fl_add_roundbutton, button_methods);
1592}
1593
1594static object *
1595form_add_menu (f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001596 formobject *f;
1597 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001598{
1599 return generic_add_object(f, args, fl_add_menu, menu_methods);
1600}
1601
1602static object *
1603form_add_slider(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001604 formobject *f;
1605 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001606{
1607 return generic_add_object(f, args, fl_add_slider, slider_methods);
1608}
1609
1610static object *
1611form_add_valslider(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001612 formobject *f;
1613 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001614{
1615 return generic_add_object(f, args, fl_add_valslider, slider_methods);
1616}
1617
1618static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001619form_add_dial(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001620 formobject *f;
1621 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001622{
1623 return generic_add_object(f, args, fl_add_dial, dial_methods);
1624}
1625
1626static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001627form_add_counter(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001628 formobject *f;
1629 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001630{
1631 return generic_add_object(f, args, fl_add_counter, counter_methods);
1632}
1633
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001634#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001635static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001636form_add_default(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001637 formobject *f;
1638 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001639{
1640 return generic_add_object(f, args, fl_add_default, default_methods);
1641}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001642#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001643
1644static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001645form_add_clock(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001646 formobject *f;
1647 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001648{
1649 return generic_add_object(f, args, fl_add_clock, clock_methods);
1650}
1651
1652static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001653form_add_box(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001654 formobject *f;
1655 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001656{
Guido van Rossum03747111991-08-08 12:10:01 +00001657 return generic_add_object(f, args, fl_add_box,
1658 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001659}
1660
1661static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001662form_add_choice(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001663 formobject *f;
1664 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001665{
1666 return generic_add_object(f, args, fl_add_choice, choice_methods);
1667}
1668
1669static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001670form_add_browser(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001671 formobject *f;
1672 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001673{
1674 return generic_add_object(f, args, fl_add_browser, browser_methods);
1675}
1676
1677static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001678form_add_positioner(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001679 formobject *f;
1680 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001681{
1682 return generic_add_object(f, args, fl_add_positioner, positioner_methods);
1683}
1684
1685static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001686form_add_input(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001687 formobject *f;
1688 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001689{
1690 return generic_add_object(f, args, fl_add_input, input_methods);
1691}
1692
1693static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001694form_add_text(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001695 formobject *f;
1696 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001697{
Guido van Rossum03747111991-08-08 12:10:01 +00001698 return generic_add_object(f, args, fl_add_text,
1699 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001700}
1701
1702static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001703form_add_timer(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001704 formobject *f;
1705 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001706{
1707 return generic_add_object(f, args, fl_add_timer, timer_methods);
1708}
1709
1710static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001711form_freeze_form(f, args)
1712 formobject *f;
1713 object *args;
1714{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001715 return form_call(fl_freeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001716}
1717
1718static object *
1719form_unfreeze_form(f, args)
1720 formobject *f;
1721 object *args;
1722{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001723 return form_call(fl_unfreeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001724}
1725
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001726#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001727static object *
1728form_remove_form(f, args)
1729 formobject *f;
1730 object *args;
1731{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001732 return form_call(fl_remove_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001733}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001734#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001735
1736static object *
1737form_activate_form(f, args)
1738 formobject *f;
1739 object *args;
1740{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001741 return form_call(fl_activate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001742}
1743
1744static object *
1745form_deactivate_form(f, args)
1746 formobject *f;
1747 object *args;
1748{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001749 return form_call(fl_deactivate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001750}
1751
Guido van Rossum75cc8981991-08-08 12:07:45 +00001752static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001753form_bgn_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001754 formobject *f;
1755 object *args;
1756{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001757 FL_OBJECT *obj;
1758
1759 fl_addto_form(f-> ob_form);
1760 obj = fl_bgn_group();
1761 fl_end_form();
1762
1763 if (obj == NULL) {
1764 err_nomem();
1765 return NULL;
1766 }
1767
1768 return newgenericobject (obj, (struct methodlist *) NULL);
Guido van Rossum03747111991-08-08 12:10:01 +00001769}
1770
1771static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001772form_end_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001773 formobject *f;
1774 object *args;
1775{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001776 fl_addto_form(f-> ob_form);
Guido van Rossum03747111991-08-08 12:10:01 +00001777 fl_end_group();
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001778 fl_end_form();
Guido van Rossum03747111991-08-08 12:10:01 +00001779 INCREF(None);
1780 return None;
1781}
1782
1783static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001784forms_find_first_or_last(func, f, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00001785 FL_OBJECT *(*func)(FL_FORM *, int, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +00001786 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001787 object *args;
1788{
1789 int type;
1790 float mx, my;
1791 FL_OBJECT *generic;
1792 genericobject *g;
1793
Guido van Rossumfc58e581992-01-27 16:45:55 +00001794 if (!getargs(args, "(iff)", &type, &mx, &my)) return NULL;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001795
Guido van Rossum03747111991-08-08 12:10:01 +00001796 generic = (*func) (f-> ob_form, type, mx, my);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001797
1798 if (generic == NULL)
1799 {
1800 INCREF(None);
1801 return None;
1802 }
1803
1804 g = findgeneric(generic);
1805 if (g == NULL) {
1806 err_setstr(RuntimeError,
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001807 "forms_find_{first|last} returns unknown object");
Guido van Rossum75cc8981991-08-08 12:07:45 +00001808 return NULL;
1809 }
1810 INCREF(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001811 return (object *) g;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001812}
1813
1814static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001815form_find_first(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001816 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001817 object *args;
1818{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001819 return forms_find_first_or_last(fl_find_first, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001820}
1821
1822static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001823form_find_last(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001824 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001825 object *args;
1826{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001827 return forms_find_first_or_last(fl_find_last, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001828}
1829
Guido van Rossum7066dd71992-09-17 17:54:56 +00001830static object *
1831form_set_object_focus(f, args)
1832 formobject *f;
1833 object *args;
1834{
1835 genericobject *g;
1836 if (args == NULL || !is_genericobject(args)) {
1837 err_badarg();
1838 return NULL;
1839 }
1840 g = (genericobject *)args;
1841 fl_set_object_focus(f->ob_form, g->ob_generic);
1842 INCREF(None);
1843 return None;
1844}
1845
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001846static struct methodlist form_methods[] = {
1847/* adm */
1848 {"show_form", form_show_form},
1849 {"hide_form", form_hide_form},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001850 {"redraw_form", form_redraw_form},
1851 {"set_form_position", form_set_form_position},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001852 {"freeze_form", form_freeze_form},
1853 {"unfreeze_form", form_unfreeze_form},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001854#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001855 {"remove_form", form_remove_form},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001856#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001857 {"activate_form", form_activate_form},
1858 {"deactivate_form", form_deactivate_form},
Guido van Rossum03747111991-08-08 12:10:01 +00001859 {"bgn_group", form_bgn_group},
1860 {"end_group", form_end_group},
Guido van Rossum75cc8981991-08-08 12:07:45 +00001861 {"find_first", form_find_first},
1862 {"find_last", form_find_last},
Guido van Rossum7066dd71992-09-17 17:54:56 +00001863 {"set_object_focus", form_set_object_focus},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001864
1865/* basic objects */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001866 {"add_button", form_add_button},
1867/* {"add_bitmap", form_add_bitmap}, */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001868 {"add_lightbutton", form_add_lightbutton},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001869 {"add_roundbutton", form_add_roundbutton},
1870 {"add_menu", form_add_menu},
1871 {"add_slider", form_add_slider},
1872 {"add_positioner", form_add_positioner},
1873 {"add_valslider", form_add_valslider},
1874 {"add_dial", form_add_dial},
1875 {"add_counter", form_add_counter},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001876#ifdef FL_V15
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001877 {"add_default", form_add_default},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001878#endif /* FL_V15 */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001879 {"add_box", form_add_box},
1880 {"add_clock", form_add_clock},
1881 {"add_choice", form_add_choice},
1882 {"add_browser", form_add_browser},
1883 {"add_input", form_add_input},
1884 {"add_timer", form_add_timer},
1885 {"add_text", form_add_text},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001886 {NULL, NULL} /* sentinel */
1887};
1888
1889static void
1890form_dealloc(f)
1891 formobject *f;
1892{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001893 releaseobjects(f->ob_form);
Guido van Rossum336b5911992-04-08 11:16:25 +00001894 if (f->ob_form->visible)
1895 fl_hide_form(f->ob_form);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001896 fl_free_form(f->ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001897 DEL(f);
1898}
1899
Guido van Rossumd97f0481991-11-19 20:26:28 +00001900#define OFF(x) offsetof(FL_FORM, x)
1901
Guido van Rossum32db5e31991-11-12 15:43:18 +00001902static struct memberlist form_memberlist[] = {
1903 {"window", T_LONG, OFF(window), RO},
1904 {"w", T_FLOAT, OFF(w)},
1905 {"h", T_FLOAT, OFF(h)},
Guido van Rossum7066dd71992-09-17 17:54:56 +00001906 {"x", T_FLOAT, OFF(x), RO},
1907 {"y", T_FLOAT, OFF(y), RO},
Guido van Rossum32db5e31991-11-12 15:43:18 +00001908 {"deactivated", T_INT, OFF(deactivated)},
Guido van Rossum7066dd71992-09-17 17:54:56 +00001909 {"visible", T_INT, OFF(visible), RO},
1910 {"frozen", T_INT, OFF(frozen), RO},
Guido van Rossum32db5e31991-11-12 15:43:18 +00001911 {"doublebuf", T_INT, OFF(doublebuf)},
1912 {NULL} /* Sentinel */
1913};
1914
Guido van Rossumd97f0481991-11-19 20:26:28 +00001915#undef OFF
1916
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001917static object *
1918form_getattr(f, name)
1919 formobject *f;
1920 char *name;
1921{
Guido van Rossum32db5e31991-11-12 15:43:18 +00001922 object *meth;
1923
1924 meth = findmethod(form_methods, (object *)f, name);
1925 if (meth != NULL)
1926 return meth;
1927 err_clear();
1928 return getmember((char *)f->ob_form, form_memberlist, name);
1929}
1930
1931static int
1932form_setattr(f, name, v)
1933 formobject *f;
1934 char *name;
1935 object *v;
1936{
1937 int ret;
1938
1939 if (v == NULL) {
1940 err_setstr(TypeError, "can't delete form attributes");
1941 return NULL;
1942 }
1943
1944 return setmember((char *)f->ob_form, form_memberlist, name, v);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001945}
1946
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001947static object *
1948form_repr(f)
1949 formobject *f;
1950{
1951 char buf[100];
1952 sprintf(buf, "<FORMS_form at %lx, window=%ld>",
1953 (long)f, f->ob_form->window);
1954 return newstringobject(buf);
1955}
1956
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001957typeobject Formtype = {
1958 OB_HEAD_INIT(&Typetype)
1959 0, /*ob_size*/
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001960 "FORMS_form", /*tp_name*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001961 sizeof(formobject), /*tp_size*/
1962 0, /*tp_itemsize*/
1963 /* methods */
1964 form_dealloc, /*tp_dealloc*/
1965 0, /*tp_print*/
1966 form_getattr, /*tp_getattr*/
Guido van Rossum32db5e31991-11-12 15:43:18 +00001967 form_setattr, /*tp_setattr*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001968 0, /*tp_compare*/
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001969 form_repr, /*tp_repr*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001970};
1971
1972static object *
1973newformobject(form)
1974 FL_FORM *form;
1975{
1976 formobject *f;
1977 f = NEWOBJ(formobject, &Formtype);
1978 if (f == NULL)
1979 return NULL;
1980 f->ob_form = form;
1981 return (object *)f;
1982}
1983
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001984
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001985/* The "fl" module */
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001986
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001987static object *
1988forms_make_form(dummy, args)
1989 object *dummy;
1990 object *args;
1991{
1992 int type;
1993 float w, h;
1994 FL_FORM *form;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001995 if (!getargs(args, "(iff)", &type, &w, &h))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001996 return NULL;
1997 form = fl_bgn_form(type, w, h);
1998 if (form == NULL) {
1999 /* XXX Actually, cannot happen! */
2000 err_nomem();
2001 return NULL;
2002 }
2003 fl_end_form();
2004 return newformobject(form);
2005}
2006
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002007static object *
2008forms_activate_all_forms(f, args)
2009 object *f;
2010 object *args;
2011{
2012 fl_activate_all_forms();
2013 INCREF(None);
2014 return None;
2015}
2016
2017static object *
2018forms_deactivate_all_forms(f, args)
2019 object *f;
2020 object *args;
2021{
2022 fl_deactivate_all_forms();
2023 INCREF(None);
2024 return None;
2025}
2026
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002027static object *my_event_callback = NULL;
2028
2029static object *
2030forms_set_event_call_back(dummy, args)
2031 object *dummy;
2032 object *args;
2033{
2034 my_event_callback = args;
2035 XINCREF(args);
2036 INCREF(None);
2037 return None;
2038}
2039
2040static object *
2041forms_do_or_check_forms(dummy, args, func)
2042 object *dummy;
2043 object *args;
2044 FL_OBJECT *(*func)();
2045{
2046 FL_OBJECT *generic;
2047 genericobject *g;
2048 object *arg, *res;
2049
2050 if (!getnoarg(args))
2051 return NULL;
2052
2053 for (;;) {
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002054 BGN_SAVE
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002055 generic = (*func)();
Jack Jansen743db361992-08-13 14:13:11 +00002056 END_SAVE
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002057 if (generic == NULL) {
2058 INCREF(None);
2059 return None;
2060 }
2061 if (generic == FL_EVENT) {
2062 int dev;
2063 short val;
2064 if (my_event_callback == NULL)
Guido van Rossum7066dd71992-09-17 17:54:56 +00002065 return newintobject(-1L);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002066 dev = fl_qread(&val);
2067 arg = newtupleobject(2);
2068 if (arg == NULL)
2069 return NULL;
2070 settupleitem(arg, 0, newintobject((long)dev));
2071 settupleitem(arg, 1, newintobject((long)val));
2072 res = call_object(my_event_callback, arg);
2073 XDECREF(res);
2074 DECREF(arg);
2075 if (res == NULL)
2076 return NULL; /* Callback raised exception */
2077 continue;
2078 }
2079 g = findgeneric(generic);
2080 if (g == NULL) {
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002081 /* XXX What kind of weird object is this? */
2082 /* XXX Maybe caused by a bug here */
2083 fprintf(stderr, "weird object: class %d, label '%s'\n",
2084 generic->objclass, generic->label);
2085 continue; /* Ignore it */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002086 }
2087 if (g->ob_callback == NULL) {
2088 INCREF(g);
2089 return ((object *) g);
2090 }
2091 arg = newtupleobject(2);
2092 INCREF(g);
Guido van Rossumabe58351991-08-08 12:34:44 +00002093 settupleitem(arg, 0, (object *)g);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002094 INCREF(g->ob_callback_arg);
2095 settupleitem(arg, 1, g->ob_callback_arg);
2096 res = call_object(g->ob_callback, arg);
2097 XDECREF(res);
2098 DECREF(arg);
2099 if (res == NULL)
2100 return NULL; /* Callback raised exception */
2101 }
2102}
2103
2104static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002105forms_do_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002106 object *dummy;
2107 object *args;
2108{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002109 return forms_do_or_check_forms(dummy, args, fl_do_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002110}
2111
2112static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002113forms_check_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002114 object *dummy;
2115 object *args;
2116{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002117 return forms_do_or_check_forms(dummy, args, fl_check_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002118}
2119
Guido van Rossum7066dd71992-09-17 17:54:56 +00002120static object *
2121forms_do_only_forms(dummy, args)
2122 object *dummy;
2123 object *args;
2124{
2125 return forms_do_or_check_forms(dummy, args, fl_do_only_forms);
2126}
2127
2128static object *
2129forms_check_only_forms(dummy, args)
2130 object *dummy;
2131 object *args;
2132{
2133 return forms_do_or_check_forms(dummy, args, fl_check_only_forms);
2134}
2135
Guido van Rossum03747111991-08-08 12:10:01 +00002136#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002137static object *
2138fl_call(func, args)
2139 object *args;
2140 void (*func)();
2141{
2142 if (!getnoarg(args))
2143 return NULL;
2144 (*func)();
2145 INCREF(None);
2146 return None;
2147}
Guido van Rossum03747111991-08-08 12:10:01 +00002148#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002149
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002150#ifndef FL_V15
2151static object *
2152forms_set_graphics_mode(dummy, args)
2153 object *dummy;
2154 object *args;
2155{
2156 int rgbmode, doublebuf;
2157
2158 if (!getintintarg(args, &rgbmode, &doublebuf))
2159 return NULL;
2160 fl_set_graphics_mode(rgbmode,doublebuf);
2161 INCREF(None);
2162 return None;
2163}
2164
2165static object *
2166forms_get_rgbmode(dummy, args)
2167 object *dummy;
2168 object *args;
2169{
Guido van Rossum7066dd71992-09-17 17:54:56 +00002170 extern int fl_rgbmode;
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002171
2172 if (args != NULL) {
2173 err_badarg();
2174 return NULL;
2175 }
Guido van Rossum7066dd71992-09-17 17:54:56 +00002176 return newintobject((long)fl_rgbmode);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002177}
Guido van Rossum7066dd71992-09-17 17:54:56 +00002178
2179static object *
2180forms_show_errors(dummy, args)
2181 object *dummy;
2182 object *args;
2183{
2184 int show;
2185 if (!getargs(args, "i", &show))
2186 return NULL;
2187 fl_show_errors(show);
2188 INCREF(None);
2189 return None;
2190}
2191
2192static object *
2193forms_set_font_name(dummy, args)
2194 object *dummy;
2195 object *args;
2196{
2197 int numb;
2198 char *name;
2199 if (!getargs(args, "(is)", &numb, &name))
2200 return NULL;
2201 fl_set_font_name(numb, name);
2202 INCREF(None);
2203 return None;
2204}
2205
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002206#endif /* !FL_V15 */
2207
2208
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002209static object *
2210forms_qdevice(self, args)
2211 object *self;
2212 object *args;
2213{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002214 short arg1;
2215 if (!getargs(args, "h", &arg1))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002216 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002217 fl_qdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002218 INCREF(None);
2219 return None;
2220}
2221
2222static object *
2223forms_unqdevice(self, args)
2224 object *self;
2225 object *args;
2226{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002227 short arg1;
2228 if (!getargs(args, "h", &arg1))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002229 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002230 fl_unqdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002231 INCREF(None);
2232 return None;
2233}
2234
2235static object *
2236forms_isqueued(self, args)
2237 object *self;
2238 object *args;
2239{
Guido van Rossum03747111991-08-08 12:10:01 +00002240 long retval;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002241 short arg1;
2242 if (!getargs(args, "h", &arg1))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002243 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002244 retval = fl_isqueued(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002245
Guido van Rossum03747111991-08-08 12:10:01 +00002246 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002247}
2248
2249static object *
2250forms_qtest(self, args)
2251 object *self;
2252 object *args;
2253{
2254 long retval;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002255 retval = fl_qtest();
Guido van Rossum03747111991-08-08 12:10:01 +00002256 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002257}
2258
2259
2260static object *
2261forms_qread(self, args)
2262 object *self;
2263 object *args;
2264{
2265 long retval;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002266 short arg1;
Jack Jansen743db361992-08-13 14:13:11 +00002267 BGN_SAVE
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002268 retval = fl_qread(&arg1);
Jack Jansen743db361992-08-13 14:13:11 +00002269 END_SAVE
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002270 {
2271 object *v = newtupleobject(2);
2272 if (v == NULL) return NULL;
2273 settupleitem(v, 0, newintobject(retval));
2274 settupleitem(v, 1, newintobject((long)arg1));
2275 return v;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002276 }
2277}
2278
2279static object *
2280forms_qreset(self, args)
2281 object *self;
2282 object *args;
2283{
2284 if (!getnoarg(args)) return NULL;
2285
Guido van Rossum03747111991-08-08 12:10:01 +00002286 fl_qreset();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002287 INCREF(None);
2288 return None;
2289}
2290
2291static object *
2292forms_qenter(self, args)
2293 object *self;
2294 object *args;
2295{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002296 short arg1, arg2;
2297 if (!getargs(args, "(hh)", &arg1, &arg2))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002298 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002299 fl_qenter(arg1, arg2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002300 INCREF(None);
2301 return None;
2302}
2303
2304static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002305forms_color(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002306 object *self;
2307 object *args;
2308{
2309 int arg;
2310
2311 if (!getintarg(args, &arg)) return NULL;
2312
2313 fl_color((short) arg);
2314
2315 INCREF(None);
2316 return None;
2317}
2318
2319static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002320forms_mapcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002321 object *self;
2322 object *args;
2323{
2324 int arg0, arg1, arg2, arg3;
2325
Guido van Rossumfc58e581992-01-27 16:45:55 +00002326 if (!getargs(args, "(iiii)", &arg0, &arg1, &arg2, &arg3))
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002327 return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002328
2329 fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);
2330
2331 INCREF(None);
2332 return None;
2333}
2334
2335static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002336forms_getmcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002337 object *self;
2338 object *args;
2339{
Guido van Rossum03747111991-08-08 12:10:01 +00002340 int arg;
2341 short r, g, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002342 object *v;
2343
2344 if (!getintarg(args, &arg)) return NULL;
2345
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002346 fl_getmcolor(arg, &r, &g, &b);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002347
2348 v = newtupleobject(3);
2349
2350 if (v == NULL) return NULL;
2351
Guido van Rossum03747111991-08-08 12:10:01 +00002352 settupleitem(v, 0, newintobject((long)r));
2353 settupleitem(v, 1, newintobject((long)g));
2354 settupleitem(v, 2, newintobject((long)b));
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002355
2356 return v;
2357}
2358
2359static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002360forms_get_mouse(self, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00002361 object *self;
2362 object *args;
2363{
2364 float x, y ;
2365 object *v;
2366
2367 if (!getnoarg(args)) return NULL;
2368
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002369 fl_get_mouse(&x, &y);
Guido van Rossum75cc8981991-08-08 12:07:45 +00002370
2371 v = newtupleobject(2);
2372
2373 if (v == NULL) return NULL;
2374
2375 settupleitem(v, 0, newfloatobject(x));
2376 settupleitem(v, 1, newfloatobject(y));
2377
2378 return v;
2379}
2380
2381static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002382forms_tie(self, args)
2383 object *self;
2384 object *args;
2385{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002386 short arg1, arg2, arg3;
2387 if (!getargs(args, "(hhh)", &arg1, &arg2, &arg3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002388 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002389 fl_tie(arg1, arg2, arg3);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002390 INCREF(None);
2391 return None;
2392}
2393
Guido van Rossum03747111991-08-08 12:10:01 +00002394static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002395forms_show_message(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002396 object *f;
2397 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002398{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002399 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002400
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002401 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002402
Jack Jansen743db361992-08-13 14:13:11 +00002403 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002404 fl_show_message(a, b, c);
Jack Jansen743db361992-08-13 14:13:11 +00002405 END_SAVE
Guido van Rossum03747111991-08-08 12:10:01 +00002406
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002407 INCREF(None);
Guido van Rossum03747111991-08-08 12:10:01 +00002408 return None;
2409}
2410
2411static object *
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002412forms_show_choice(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002413 object *f;
2414 object *args;
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002415{
2416 char *m1, *m2, *m3, *b1, *b2, *b3;
2417 int nb;
2418 char *format;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002419 long rv;
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002420
2421 if (args == NULL || !is_tupleobject(args)) {
2422 err_badarg();
2423 return NULL;
2424 }
2425 nb = gettuplesize(args) - 3;
2426 if (nb <= 0) {
2427 err_setstr(TypeError, "need at least one button label");
2428 return NULL;
2429 }
2430 if (is_intobject(gettupleitem(args, 3))) {
2431 err_setstr(TypeError,
2432 "'number-of-buttons' argument not needed");
2433 return NULL;
2434 }
2435 switch (nb) {
2436 case 1: format = "(ssss)"; break;
2437 case 2: format = "(sssss)"; break;
2438 case 3: format = "(ssssss)"; break;
2439 default:
2440 err_setstr(TypeError, "too many button labels");
2441 return NULL;
2442 }
2443
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002444 if (!getargs(args, format, &m1, &m2, &m3, &b1, &b2, &b3))
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002445 return NULL;
2446
Jack Jansen743db361992-08-13 14:13:11 +00002447 BGN_SAVE
2448 rv = fl_show_choice(m1, m2, m3, nb, b1, b2, b3);
2449 END_SAVE
2450 return newintobject(rv);
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002451}
2452
2453static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002454forms_show_question(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002455 object *f;
2456 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002457{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002458 int ret;
2459 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002460
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002461 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002462
Jack Jansen743db361992-08-13 14:13:11 +00002463 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002464 ret = fl_show_question(a, b, c);
Jack Jansen743db361992-08-13 14:13:11 +00002465 END_SAVE
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002466
2467 return newintobject((long) ret);
Guido van Rossum03747111991-08-08 12:10:01 +00002468}
2469
2470static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002471forms_show_input(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002472 object *f;
2473 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002474{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002475 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002476 char *a, *b;
Guido van Rossum03747111991-08-08 12:10:01 +00002477
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002478 if (!getstrstrarg(args, &a, &b)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002479
Jack Jansen743db361992-08-13 14:13:11 +00002480 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002481 str = fl_show_input(a, b);
Jack Jansen743db361992-08-13 14:13:11 +00002482 END_SAVE
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002483
2484 if (str == NULL) {
2485 INCREF(None);
2486 return None;
2487 }
2488 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002489}
2490
2491static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002492forms_file_selector(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002493 object *f;
2494 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002495{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002496 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002497 char *a, *b, *c, *d;
Guido van Rossum03747111991-08-08 12:10:01 +00002498
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002499 if (!getargs(args, "(ssss)", &a, &b, &c, &d)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002500
Jack Jansen743db361992-08-13 14:13:11 +00002501 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002502 str = fl_show_file_selector(a, b, c, d);
Jack Jansen743db361992-08-13 14:13:11 +00002503 END_SAVE
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002504
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002505 if (str == NULL) {
2506 INCREF(None);
2507 return None;
2508 }
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002509 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002510}
2511
2512
2513static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002514forms_file_selector_func(args, func)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002515 object *args;
2516 char *(*func)();
Guido van Rossum03747111991-08-08 12:10:01 +00002517{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002518 char *str;
Guido van Rossum03747111991-08-08 12:10:01 +00002519
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002520 str = (*func) ();
2521
2522 if (str == NULL) {
2523 INCREF(None);
2524 return None;
2525 }
2526 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002527}
2528
2529static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002530forms_get_directory(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002531 object *f;
2532 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002533{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002534 return forms_file_selector_func(args, fl_get_directory);
Guido van Rossum03747111991-08-08 12:10:01 +00002535}
2536
2537static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002538forms_get_pattern(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002539 object *f;
2540 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002541{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002542 return forms_file_selector_func(args, fl_get_pattern);
Guido van Rossum03747111991-08-08 12:10:01 +00002543}
2544
2545static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002546forms_get_filename(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002547 object *f;
2548 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002549{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002550 return forms_file_selector_func(args, fl_get_filename);
Guido van Rossum03747111991-08-08 12:10:01 +00002551}
2552
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002553static struct methodlist forms_methods[] = {
2554/* adm */
2555 {"make_form", forms_make_form},
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002556 {"activate_all_forms", forms_activate_all_forms},
2557 {"deactivate_all_forms",forms_deactivate_all_forms},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002558/* gl support wrappers */
2559 {"qdevice", forms_qdevice},
2560 {"unqdevice", forms_unqdevice},
2561 {"isqueued", forms_isqueued},
2562 {"qtest", forms_qtest},
2563 {"qread", forms_qread},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002564/* {"blkqread", forms_blkqread}, */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002565 {"qreset", forms_qreset},
2566 {"qenter", forms_qenter},
Guido van Rossum03747111991-08-08 12:10:01 +00002567 {"get_mouse", forms_get_mouse},
2568 {"tie", forms_tie},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002569/* {"new_events", forms_new_events}, */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002570 {"color", forms_color},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002571 {"mapcolor", forms_mapcolor},
2572 {"getmcolor", forms_getmcolor},
2573/* interaction */
2574 {"do_forms", forms_do_forms},
2575 {"check_forms", forms_check_forms},
2576 {"set_event_call_back", forms_set_event_call_back},
2577/* goodies */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002578 {"show_message", forms_show_message},
2579 {"show_question", forms_show_question},
2580 {"show_choice", forms_show_choice},
2581 {"show_input", forms_show_input},
2582 {"show_file_selector", forms_file_selector},
2583 {"file_selector", forms_file_selector}, /* BW compat */
2584 {"get_directory", forms_get_directory},
2585 {"get_pattern", forms_get_pattern},
2586 {"get_filename", forms_get_filename},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002587#ifndef FL_V15
2588 {"set_graphics_mode", forms_set_graphics_mode},
2589 {"get_rgbmode", forms_get_rgbmode},
Guido van Rossum7066dd71992-09-17 17:54:56 +00002590 {"show_errors", forms_show_errors},
2591 {"set_font_name", forms_set_font_name},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002592#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002593 {NULL, NULL} /* sentinel */
2594};
2595
2596void
2597initfl()
2598{
2599 initmodule("fl", forms_methods);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002600 foreground();
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002601#ifndef FL_V15
2602 fl_init();
2603#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002604}