blob: 00cf12c7fd4f3a6b8b055f54b49da11778a05bcf [file] [log] [blame]
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001/**********************************************************
Guido van Rossume5372401993-03-16 12:15:04 +00002Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3Amsterdam, The Netherlands.
Guido van Rossumc7df79e1991-08-07 11:32:58 +00004
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 Rossum03747111991-08-08 12:10:01 +0000617
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000618 if (!getnoarg(args)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000619
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000620 (*func) (obj, &f1, &f2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000621
Guido van Rossume5372401993-03-16 12:15:04 +0000622 return mkvalue("(ff)", f1, f2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000623}
624
Guido van Rossum03747111991-08-08 12:10:01 +0000625#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000626static object *
627call_forms_OUTf (func, obj, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000628 void (*func)(FL_OBJECT *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000629 FL_OBJECT *obj;
630 object *args;
631{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000632 float f;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000633
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000634 if (!getnoarg(args)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000635
636 (*func) (obj, &f);
637
638 return newfloatobject (f);
639}
Guido van Rossum03747111991-08-08 12:10:01 +0000640#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000641
642/**********************************************************************/
643/* Class : browser */
644
645static object *
646set_browser_topline(g, args)
647 genericobject *g;
648 object *args;
649{
Guido van Rossum03747111991-08-08 12:10:01 +0000650 return call_forms_INi (fl_set_browser_topline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000651}
652
653static object *
654clear_browser(g, args)
655 genericobject *g;
656 object *args;
657{
Guido van Rossum03747111991-08-08 12:10:01 +0000658 return generic_call (g, args, fl_clear_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000659}
660
661static object *
662add_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000663 genericobject *g;
664 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000665{
Guido van Rossum03747111991-08-08 12:10:01 +0000666 return call_forms_INstr (fl_add_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000667}
668
669static object *
670addto_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000671 genericobject *g;
672 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000673{
Guido van Rossum03747111991-08-08 12:10:01 +0000674 return call_forms_INstr (fl_addto_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000675}
676
677static object *
678insert_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000679 genericobject *g;
680 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000681{
Guido van Rossum03747111991-08-08 12:10:01 +0000682 return call_forms_INiINstr (fl_insert_browser_line,
683 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000684}
685
686static object *
687delete_browser_line (g, args)
688 genericobject *g;
689 object *args;
690{
Guido van Rossum03747111991-08-08 12:10:01 +0000691 return call_forms_INi (fl_delete_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000692}
693
694static object *
695replace_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000696 genericobject *g;
697 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000698{
Guido van Rossum03747111991-08-08 12:10:01 +0000699 return call_forms_INiINstr (fl_replace_browser_line,
700 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000701}
702
703static object *
704get_browser_line(g, args)
705 genericobject *g;
706 object *args;
707{
708 int i;
709 char *str;
710
711 if (!getintarg(args, &i))
712 return NULL;
713
714 str = fl_get_browser_line (g->ob_generic, i);
715
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000716 if (str == NULL) {
717 INCREF(None);
718 return None;
719 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000720 return newstringobject (str);
721}
722
723static object *
724load_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000725 genericobject *g;
726 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000727{
Guido van Rossumabe58351991-08-08 12:34:44 +0000728 /* XXX strictly speaking this is wrong since fl_load_browser
729 XXX returns int, not void */
Guido van Rossum03747111991-08-08 12:10:01 +0000730 return call_forms_INstr (fl_load_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000731}
732
733static object *
734get_browser_maxline(g, args)
735 genericobject *g;
736 object *args;
737{
Guido van Rossum03747111991-08-08 12:10:01 +0000738 return call_forms_Ri (fl_get_browser_maxline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000739}
740
741static object *
742select_browser_line (g, args)
743 genericobject *g;
744 object *args;
745{
Guido van Rossum03747111991-08-08 12:10:01 +0000746 return call_forms_INi (fl_select_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000747}
748
749static object *
750deselect_browser_line (g, args)
751 genericobject *g;
752 object *args;
753{
Guido van Rossum03747111991-08-08 12:10:01 +0000754 return call_forms_INi (fl_deselect_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000755}
756
757static object *
758deselect_browser (g, args)
759 genericobject *g;
760 object *args;
761{
Guido van Rossum03747111991-08-08 12:10:01 +0000762 return generic_call (g, args, fl_deselect_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000763}
764
765static object *
766isselected_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000767 genericobject *g;
768 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000769{
770 int i, j;
Guido van Rossum03747111991-08-08 12:10:01 +0000771
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000772 if (!getintarg(args, &i))
773 return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000774
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000775 j = fl_isselected_browser_line (g->ob_generic, i);
Guido van Rossum03747111991-08-08 12:10:01 +0000776
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000777 return newintobject (j);
778}
779
780static object *
781get_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000782 genericobject *g;
783 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000784{
Guido van Rossum03747111991-08-08 12:10:01 +0000785 return call_forms_Ri (fl_get_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000786}
787
788static object *
789set_browser_fontsize (g, args)
790 genericobject *g;
791 object *args;
792{
Guido van Rossum03747111991-08-08 12:10:01 +0000793 return call_forms_INf (fl_set_browser_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000794}
795
796static object *
797set_browser_fontstyle (g, args)
798 genericobject *g;
799 object *args;
800{
Guido van Rossum03747111991-08-08 12:10:01 +0000801 return call_forms_INi (fl_set_browser_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000802}
803
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000804static object *
805set_browser_specialkey (g, args)
806 genericobject *g;
807 object *args;
808{
809 return call_forms_INc(fl_set_browser_specialkey, g-> ob_generic, args);
810}
811
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000812static struct methodlist browser_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000813 {"set_browser_topline", set_browser_topline},
814 {"clear_browser", clear_browser},
815 {"add_browser_line", add_browser_line},
816 {"addto_browser", addto_browser},
817 {"insert_browser_line", insert_browser_line},
818 {"delete_browser_line", delete_browser_line},
819 {"replace_browser_line", replace_browser_line},
820 {"get_browser_line", get_browser_line},
821 {"load_browser", load_browser},
822 {"get_browser_maxline", get_browser_maxline},
823 {"select_browser_line", select_browser_line},
824 {"deselect_browser_line", deselect_browser_line},
825 {"deselect_browser", deselect_browser},
826 {"isselected_browser_line", isselected_browser_line},
827 {"get_browser", get_browser},
828 {"set_browser_fontsize", set_browser_fontsize},
829 {"set_browser_fontstyle", set_browser_fontstyle},
830 {"set_browser_specialkey", set_browser_specialkey},
831 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000832};
833
834/* Class: button */
835
836static object *
837set_button(g, args)
838 genericobject *g;
839 object *args;
840{
Guido van Rossum03747111991-08-08 12:10:01 +0000841 return call_forms_INi (fl_set_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000842}
843
844static object *
845get_button(g, args)
846 genericobject *g;
847 object *args;
848{
Guido van Rossum03747111991-08-08 12:10:01 +0000849 return call_forms_Ri (fl_get_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000850}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000851static object *
852set_button_shortcut(g, args)
853 genericobject *g;
854 object *args;
855{
856 return call_forms_INstr (fl_set_button_shortcut, g-> ob_generic, args);
857}
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000858
859static struct methodlist button_methods[] = {
860 {"set_button", set_button},
861 {"get_button", get_button},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000862#ifndef FL_V15
863 {"set_button_shortcut", set_button_shortcut},
864#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000865 {NULL, NULL} /* sentinel */
866};
867
868/* Class: choice */
869
870static object *
871set_choice(g, args)
872 genericobject *g;
873 object *args;
874{
Guido van Rossum03747111991-08-08 12:10:01 +0000875 return call_forms_INi (fl_set_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000876}
877
878static object *
879get_choice(g, args)
880 genericobject *g;
881 object *args;
882{
Guido van Rossum03747111991-08-08 12:10:01 +0000883 return call_forms_Ri (fl_get_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000884}
885
886static object *
887clear_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000888 genericobject *g;
889 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000890{
Guido van Rossum03747111991-08-08 12:10:01 +0000891 return generic_call (g, args, fl_clear_choice);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000892}
893
894static object *
895addto_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000896 genericobject *g;
897 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000898{
Guido van Rossum03747111991-08-08 12:10:01 +0000899 return call_forms_INstr (fl_addto_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000900}
901
902static object *
903replace_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000904 genericobject *g;
905 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000906{
Guido van Rossum03747111991-08-08 12:10:01 +0000907 return call_forms_INiINstr (fl_replace_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000908}
909
910static object *
911delete_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000912 genericobject *g;
913 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000914{
Guido van Rossum03747111991-08-08 12:10:01 +0000915 return call_forms_INi (fl_delete_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000916}
917
918static object *
919get_choice_text (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000920 genericobject *g;
921 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000922{
Guido van Rossum03747111991-08-08 12:10:01 +0000923 return call_forms_Rstr (fl_get_choice_text, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000924}
925
926static object *
927set_choice_fontsize (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000928 genericobject *g;
929 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000930{
Guido van Rossum03747111991-08-08 12:10:01 +0000931 return call_forms_INf (fl_set_choice_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000932}
933
934static object *
935set_choice_fontstyle (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000936 genericobject *g;
937 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000938{
Guido van Rossum03747111991-08-08 12:10:01 +0000939 return call_forms_INi (fl_set_choice_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000940}
941
942static struct methodlist choice_methods[] = {
943 {"set_choice", set_choice},
944 {"get_choice", get_choice},
945 {"clear_choice", clear_choice},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000946 {"addto_choice", addto_choice},
947 {"replace_choice", replace_choice},
948 {"delete_choice", delete_choice},
949 {"get_choice_text", get_choice_text},
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000950 {"set_choice_fontsize", set_choice_fontsize},
951 {"set_choice_fontstyle",set_choice_fontstyle},
952 {NULL, NULL} /* sentinel */
953};
954
955/* Class : Clock */
956
957static object *
958get_clock(g, args)
959 genericobject *g;
960 object *args;
961{
962 int i0, i1, i2;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000963
964 if (!getnoarg(args))
965 return NULL;
966
967 fl_get_clock (g->ob_generic, &i0, &i1, &i2);
968
Guido van Rossume5372401993-03-16 12:15:04 +0000969 return mkvalue("(iii)", i0, i1, i2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000970}
971
972static struct methodlist clock_methods[] = {
973 {"get_clock", get_clock},
974 {NULL, NULL} /* sentinel */
975};
976
977/* CLass : Counters */
978
979static object *
980get_counter_value(g, args)
981 genericobject *g;
982 object *args;
983{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000984 return call_forms_Rf (fl_get_counter_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000985}
986
987static object *
988set_counter_value (g, args)
989 genericobject *g;
990 object *args;
991{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000992 return call_forms_INf (fl_set_counter_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000993}
994
995static object *
996set_counter_precision (g, args)
997 genericobject *g;
998 object *args;
999{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001000 return call_forms_INi (fl_set_counter_precision, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001001}
1002
1003static object *
1004set_counter_bounds (g, args)
1005 genericobject *g;
1006 object *args;
1007{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001008 return call_forms_INfINf (fl_set_counter_bounds, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001009}
1010
1011static object *
1012set_counter_step (g, args)
1013 genericobject *g;
1014 object *args;
1015{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001016 return call_forms_INfINf (fl_set_counter_step, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001017}
1018
1019static object *
1020set_counter_return (g, args)
1021 genericobject *g;
1022 object *args;
1023{
Guido van Rossum03747111991-08-08 12:10:01 +00001024 return call_forms_INi (fl_set_counter_return, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001025}
1026
1027static struct methodlist counter_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001028 {"set_counter_value", set_counter_value},
1029 {"get_counter_value", get_counter_value},
1030 {"set_counter_bounds", set_counter_bounds},
1031 {"set_counter_step", set_counter_step},
1032 {"set_counter_precision", set_counter_precision},
1033 {"set_counter_return", set_counter_return},
1034 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001035};
1036
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001037#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001038/* Class : Defaults */
1039
1040static object *
1041get_default(g, args)
1042 genericobject *g;
1043 object *args;
1044{
Guido van Rossum03747111991-08-08 12:10:01 +00001045 char c;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001046
Guido van Rossum03747111991-08-08 12:10:01 +00001047 if (!getnoarg(args)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001048
Guido van Rossum03747111991-08-08 12:10:01 +00001049 c = fl_get_default (g->ob_generic);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001050
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001051 return ((object *) mknewcharobject (c)); /* in cgensupport.c */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001052}
1053
1054static struct methodlist default_methods[] = {
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001055 {"get_default", get_default},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001056 {NULL, NULL} /* sentinel */
1057};
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001058#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001059
1060
1061/* Class: Dials */
1062
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001063#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001064static object *
1065set_dial (g, args)
1066 genericobject *g;
1067 object *args;
1068{
1069 float f1, f2, f3;
1070
Guido van Rossumfc58e581992-01-27 16:45:55 +00001071 if (!getargs(args, "(fff)", &f1, &f2, &f3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001072 return NULL;
1073 fl_set_dial (g->ob_generic, f1, f2, f3);
1074 INCREF(None);
1075 return None;
1076}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001077#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001078
1079static object *
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001080get_dial_value(g, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001081 genericobject *g;
1082 object *args;
1083{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001084 return call_forms_Rf (fl_get_dial_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001085}
1086
1087static object *
1088set_dial_value (g, args)
1089 genericobject *g;
1090 object *args;
1091{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001092 return call_forms_INf (fl_set_dial_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001093}
1094
1095static object *
1096set_dial_bounds (g, args)
1097 genericobject *g;
1098 object *args;
1099{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001100 return call_forms_INfINf (fl_set_dial_bounds, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001101}
1102
1103static object *
1104get_dial_bounds (g, args)
1105 genericobject *g;
1106 object *args;
1107{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001108 return call_forms_OUTfOUTf (fl_get_dial_bounds, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001109}
1110
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001111#ifndef FL_V15
1112static object *
1113set_dial_step (g, args)
1114 genericobject *g;
1115 object *args;
1116{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001117 return call_forms_INf (fl_set_dial_step, g-> ob_generic, args);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001118}
1119#endif /* !FL_V15 */
1120
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001121static struct methodlist dial_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001122#ifdef FL_V15
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001123 {"set_dial", set_dial},
1124 {"get_dial", get_dial_value},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001125#endif /* FL_V15 */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001126 {"set_dial_value", set_dial_value},
1127 {"get_dial_value", get_dial_value},
1128 {"set_dial_bounds", set_dial_bounds},
1129 {"get_dial_bounds", get_dial_bounds},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001130#ifndef FL_V15
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001131 {"set_dial_step", set_dial_step},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001132#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001133 {NULL, NULL} /* sentinel */
1134};
1135
1136/* Class : Input */
1137
1138static object *
1139set_input (g, args)
1140 genericobject *g;
1141 object *args;
1142{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001143 return call_forms_INstr (fl_set_input, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001144}
1145
1146static object *
1147get_input (g, args)
1148 genericobject *g;
1149 object *args;
1150{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001151 return call_forms_Rstr (fl_get_input, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001152}
1153
1154static object *
1155set_input_color (g, args)
1156 genericobject *g;
1157 object *args;
1158{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001159 return call_forms_INfINf (fl_set_input_color, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001160}
1161
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001162#ifndef FL_V15
1163static object *
1164set_input_return (g, args)
1165 genericobject *g;
1166 object *args;
1167{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001168 return call_forms_INi (fl_set_input_return, g-> ob_generic, args);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001169}
1170#endif /* !FL_V15 */
1171
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001172static struct methodlist input_methods[] = {
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001173 {"set_input", set_input},
1174 {"get_input", get_input},
1175 {"set_input_color", set_input_color},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001176#ifndef FL_V15
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001177 {"set_input_return", set_input_return},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001178#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001179 {NULL, NULL} /* sentinel */
1180};
1181
1182
1183/* Class : Menu */
1184
1185static object *
1186set_menu (g, args)
1187 genericobject *g;
1188 object *args;
1189{
Guido van Rossumabe58351991-08-08 12:34:44 +00001190 return call_forms_INstr (fl_set_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001191}
1192
1193static object *
1194get_menu (g, args)
1195 genericobject *g;
1196 object *args;
1197{
Guido van Rossumabe58351991-08-08 12:34:44 +00001198 /* XXX strictly speaking this is wrong since fl_get_menu
1199 XXX returns long, not int */
1200 return call_forms_Ri (fl_get_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001201}
1202
1203static object *
1204addto_menu (g, args)
1205 genericobject *g;
1206 object *args;
1207{
Guido van Rossumabe58351991-08-08 12:34:44 +00001208 return call_forms_INstr (fl_addto_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001209}
1210
1211static struct methodlist menu_methods[] = {
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001212 {"set_menu", set_menu},
1213 {"get_menu", get_menu},
1214 {"addto_menu", addto_menu},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001215 {NULL, NULL} /* sentinel */
1216};
1217
1218
1219/* Class: Sliders */
1220
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001221#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001222static object *
1223set_slider (g, args)
1224 genericobject *g;
1225 object *args;
1226{
1227 float f1, f2, f3;
1228
Guido van Rossumfc58e581992-01-27 16:45:55 +00001229 if (!args(args, "(fff)", &f1, &f2, &f3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001230 return NULL;
1231 fl_set_slider (g->ob_generic, f1, f2, f3);
1232 INCREF(None);
1233 return None;
1234}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001235#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001236
1237static object *
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001238get_slider_value(g, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001239 genericobject *g;
1240 object *args;
1241{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001242 return call_forms_Rf (fl_get_slider_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001243}
1244
1245static object *
1246set_slider_value (g, args)
1247 genericobject *g;
1248 object *args;
1249{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001250 return call_forms_INf (fl_set_slider_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001251}
1252
1253static object *
1254set_slider_bounds (g, args)
1255 genericobject *g;
1256 object *args;
1257{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001258 return call_forms_INfINf (fl_set_slider_bounds, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001259}
1260
1261static object *
1262get_slider_bounds (g, args)
1263 genericobject *g;
1264 object *args;
1265{
1266 return call_forms_OUTfOUTf(fl_get_slider_bounds, g-> ob_generic, args);
1267}
1268
1269static object *
1270set_slider_return (g, args)
1271 genericobject *g;
1272 object *args;
1273{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001274 return call_forms_INf (fl_set_slider_return, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001275}
1276
1277static object *
1278set_slider_size (g, args)
1279 genericobject *g;
1280 object *args;
1281{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001282 return call_forms_INf (fl_set_slider_size, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001283}
1284
1285static object *
1286set_slider_precision (g, args)
1287 genericobject *g;
1288 object *args;
1289{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001290 return call_forms_INi (fl_set_slider_precision, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001291}
1292
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001293#ifndef FL_V15
1294static object *
1295set_slider_step (g, args)
1296 genericobject *g;
1297 object *args;
1298{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001299 return call_forms_INf (fl_set_slider_step, g-> ob_generic, args);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001300}
1301#endif /* !FL_V15 */
1302
1303
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001304static struct methodlist slider_methods[] = {
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001305#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001306 {"set_slider", set_slider},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001307 {"get_slider", get_slider_value},
1308#endif /* FL_V15 */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001309 {"set_slider_value", set_slider_value},
1310 {"get_slider_value", get_slider_value},
1311 {"set_slider_bounds", set_slider_bounds},
1312 {"get_slider_bounds", get_slider_bounds},
1313 {"set_slider_return", set_slider_return},
1314 {"set_slider_size", set_slider_size},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001315 {"set_slider_precision",set_slider_precision},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001316#ifndef FL_V15
1317 {"set_slider_step", set_slider_step},
1318#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001319 {NULL, NULL} /* sentinel */
1320};
1321
1322static object *
1323set_positioner_xvalue (g, args)
1324 genericobject *g;
1325 object *args;
1326{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001327 return call_forms_INf (fl_set_positioner_xvalue, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001328}
1329
1330static object *
1331set_positioner_xbounds (g, args)
1332 genericobject *g;
1333 object *args;
1334{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001335 return call_forms_INfINf (fl_set_positioner_xbounds,
1336 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001337}
1338
1339static object *
1340set_positioner_yvalue (g, args)
1341 genericobject *g;
1342 object *args;
1343{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001344 return call_forms_INf (fl_set_positioner_yvalue, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001345}
1346
1347static object *
1348set_positioner_ybounds (g, args)
1349 genericobject *g;
1350 object *args;
1351{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001352 return call_forms_INfINf (fl_set_positioner_ybounds,
1353 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001354}
1355
1356static object *
1357get_positioner_xvalue (g, args)
1358 genericobject *g;
1359 object *args;
1360{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001361 return call_forms_Rf (fl_get_positioner_xvalue, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001362}
1363
1364static object *
1365get_positioner_xbounds (g, args)
1366 genericobject *g;
1367 object *args;
1368{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001369 return call_forms_OUTfOUTf (fl_get_positioner_xbounds,
1370 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001371}
1372
1373static object *
1374get_positioner_yvalue (g, args)
1375 genericobject *g;
1376 object *args;
1377{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001378 return call_forms_Rf (fl_get_positioner_yvalue, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001379}
1380
1381static object *
1382get_positioner_ybounds (g, args)
1383 genericobject *g;
1384 object *args;
1385{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001386 return call_forms_OUTfOUTf (fl_get_positioner_ybounds,
1387 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001388}
1389
1390static struct methodlist positioner_methods[] = {
1391 {"set_positioner_xvalue", set_positioner_xvalue},
1392 {"set_positioner_yvalue", set_positioner_yvalue},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001393 {"set_positioner_xbounds", set_positioner_xbounds},
1394 {"set_positioner_ybounds", set_positioner_ybounds},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001395 {"get_positioner_xvalue", get_positioner_xvalue},
1396 {"get_positioner_yvalue", get_positioner_yvalue},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001397 {"get_positioner_xbounds", get_positioner_xbounds},
1398 {"get_positioner_ybounds", get_positioner_ybounds},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001399 {NULL, NULL} /* sentinel */
1400};
1401
1402/* Class timer */
1403
1404static object *
1405set_timer (g, args)
1406 genericobject *g;
1407 object *args;
1408{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001409 return call_forms_INf (fl_set_timer, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001410}
1411
1412static object *
1413get_timer (g, args)
1414 genericobject *g;
1415 object *args;
1416{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001417 return call_forms_Rf (fl_get_timer, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001418}
1419
1420static struct methodlist timer_methods[] = {
1421 {"set_timer", set_timer},
1422 {"get_timer", get_timer},
1423 {NULL, NULL} /* sentinel */
1424};
1425
1426/* Form objects */
1427
1428typedef struct {
1429 OB_HEAD
1430 FL_FORM *ob_form;
1431} formobject;
1432
1433extern typeobject Formtype; /* Forward */
1434
1435#define is_formobject(v) ((v)->ob_type == &Formtype)
1436
1437static object *
1438form_show_form(f, args)
1439 formobject *f;
1440 object *args;
1441{
1442 int place, border;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001443 char *name;
1444 if (!getargs(args, "(iis)", &place, &border, &name))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001445 return NULL;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001446 fl_show_form(f->ob_form, place, border, name);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001447 INCREF(None);
1448 return None;
1449}
1450
1451static object *
1452form_call(func, f, args)
1453 FL_FORM *f;
1454 object *args;
1455 void (*func)(FL_FORM *);
1456{
1457 if (!getnoarg(args)) return NULL;
1458
1459 (*func)(f);
1460
1461 INCREF(None);
1462 return None;
1463}
1464
1465static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001466form_call_INiINi(func, f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001467 FL_FORM *f;
1468 object *args;
1469 void (*func)(FL_FORM *, int, int);
1470{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001471 int a, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001472
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001473 if (!getintintarg(args, &a, &b)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001474
1475 (*func)(f, a, b);
1476
1477 INCREF(None);
1478 return None;
1479}
1480
1481static object *
1482form_hide_form(f, args)
1483 formobject *f;
1484 object *args;
1485{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001486 return form_call(fl_hide_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001487}
1488
1489static object *
1490form_redraw_form(f, args)
1491 formobject *f;
1492 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001493{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001494 return form_call(fl_redraw_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001495}
1496
1497static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001498form_add_object(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001499 formobject *f;
1500 object *args;
1501{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001502 genericobject *g;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001503 if (args == NULL || !is_genericobject(args)) {
1504 err_badarg();
1505 return NULL;
1506 }
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001507 g = (genericobject *)args;
1508 if (findgeneric(g->ob_generic) != NULL) {
1509 err_setstr(RuntimeError,
1510 "add_object of object already in a form");
1511 return NULL;
1512 }
1513 fl_add_object(f->ob_form, g->ob_generic);
1514 knowgeneric(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001515
1516 INCREF(None);
1517 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001518}
1519
1520static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001521form_set_form_position(f, args)
1522 formobject *f;
1523 object *args;
1524{
1525 return form_call_INiINi(fl_set_form_position, f-> ob_form, args);
1526}
1527
1528static object *
1529generic_add_object(f, args, func, internal_methods)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001530 formobject *f;
1531 object *args;
1532 FL_OBJECT *(*func)(int, float, float, float, float, char*);
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001533 struct methodlist *internal_methods;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001534{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001535 int type;
1536 float x, y, w, h;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001537 char *name;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001538 FL_OBJECT *obj;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001539
Guido van Rossumfc58e581992-01-27 16:45:55 +00001540 if (!getargs(args,"(iffffs)", &type,&x,&y,&w,&h,&name))
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001541 return NULL;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001542
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001543 fl_addto_form (f-> ob_form);
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001544
Guido van Rossumfc58e581992-01-27 16:45:55 +00001545 obj = (*func) (type, x, y, w, h, name);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001546
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001547 fl_end_form();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001548
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001549 if (obj == NULL) {
1550 err_nomem();
1551 return NULL;
1552 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001553
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001554 return newgenericobject (obj, internal_methods);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001555}
1556
1557static object *
1558form_add_button(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001559 formobject *f;
1560 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001561{
1562 return generic_add_object(f, args, fl_add_button, button_methods);
1563}
1564
1565static object *
1566form_add_lightbutton(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001567 formobject *f;
1568 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001569{
1570 return generic_add_object(f, args, fl_add_lightbutton, button_methods);
1571}
1572
1573static object *
1574form_add_roundbutton(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001575 formobject *f;
1576 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001577{
1578 return generic_add_object(f, args, fl_add_roundbutton, button_methods);
1579}
1580
1581static object *
1582form_add_menu (f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001583 formobject *f;
1584 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001585{
1586 return generic_add_object(f, args, fl_add_menu, menu_methods);
1587}
1588
1589static object *
1590form_add_slider(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001591 formobject *f;
1592 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001593{
1594 return generic_add_object(f, args, fl_add_slider, slider_methods);
1595}
1596
1597static object *
1598form_add_valslider(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001599 formobject *f;
1600 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001601{
1602 return generic_add_object(f, args, fl_add_valslider, slider_methods);
1603}
1604
1605static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001606form_add_dial(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001607 formobject *f;
1608 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001609{
1610 return generic_add_object(f, args, fl_add_dial, dial_methods);
1611}
1612
1613static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001614form_add_counter(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001615 formobject *f;
1616 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001617{
1618 return generic_add_object(f, args, fl_add_counter, counter_methods);
1619}
1620
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001621#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001622static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001623form_add_default(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001624 formobject *f;
1625 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001626{
1627 return generic_add_object(f, args, fl_add_default, default_methods);
1628}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001629#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001630
1631static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001632form_add_clock(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001633 formobject *f;
1634 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001635{
1636 return generic_add_object(f, args, fl_add_clock, clock_methods);
1637}
1638
1639static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001640form_add_box(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001641 formobject *f;
1642 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001643{
Guido van Rossum03747111991-08-08 12:10:01 +00001644 return generic_add_object(f, args, fl_add_box,
1645 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001646}
1647
1648static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001649form_add_choice(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001650 formobject *f;
1651 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001652{
1653 return generic_add_object(f, args, fl_add_choice, choice_methods);
1654}
1655
1656static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001657form_add_browser(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001658 formobject *f;
1659 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001660{
1661 return generic_add_object(f, args, fl_add_browser, browser_methods);
1662}
1663
1664static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001665form_add_positioner(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001666 formobject *f;
1667 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001668{
1669 return generic_add_object(f, args, fl_add_positioner, positioner_methods);
1670}
1671
1672static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001673form_add_input(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001674 formobject *f;
1675 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001676{
1677 return generic_add_object(f, args, fl_add_input, input_methods);
1678}
1679
1680static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001681form_add_text(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001682 formobject *f;
1683 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001684{
Guido van Rossum03747111991-08-08 12:10:01 +00001685 return generic_add_object(f, args, fl_add_text,
1686 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001687}
1688
1689static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001690form_add_timer(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001691 formobject *f;
1692 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001693{
1694 return generic_add_object(f, args, fl_add_timer, timer_methods);
1695}
1696
1697static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001698form_freeze_form(f, args)
1699 formobject *f;
1700 object *args;
1701{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001702 return form_call(fl_freeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001703}
1704
1705static object *
1706form_unfreeze_form(f, args)
1707 formobject *f;
1708 object *args;
1709{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001710 return form_call(fl_unfreeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001711}
1712
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001713#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001714static object *
1715form_remove_form(f, args)
1716 formobject *f;
1717 object *args;
1718{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001719 return form_call(fl_remove_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001720}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001721#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001722
1723static object *
1724form_activate_form(f, args)
1725 formobject *f;
1726 object *args;
1727{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001728 return form_call(fl_activate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001729}
1730
1731static object *
1732form_deactivate_form(f, args)
1733 formobject *f;
1734 object *args;
1735{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001736 return form_call(fl_deactivate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001737}
1738
Guido van Rossum75cc8981991-08-08 12:07:45 +00001739static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001740form_bgn_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001741 formobject *f;
1742 object *args;
1743{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001744 FL_OBJECT *obj;
1745
1746 fl_addto_form(f-> ob_form);
1747 obj = fl_bgn_group();
1748 fl_end_form();
1749
1750 if (obj == NULL) {
1751 err_nomem();
1752 return NULL;
1753 }
1754
1755 return newgenericobject (obj, (struct methodlist *) NULL);
Guido van Rossum03747111991-08-08 12:10:01 +00001756}
1757
1758static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001759form_end_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001760 formobject *f;
1761 object *args;
1762{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001763 fl_addto_form(f-> ob_form);
Guido van Rossum03747111991-08-08 12:10:01 +00001764 fl_end_group();
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001765 fl_end_form();
Guido van Rossum03747111991-08-08 12:10:01 +00001766 INCREF(None);
1767 return None;
1768}
1769
1770static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001771forms_find_first_or_last(func, f, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00001772 FL_OBJECT *(*func)(FL_FORM *, int, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +00001773 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001774 object *args;
1775{
1776 int type;
1777 float mx, my;
1778 FL_OBJECT *generic;
1779 genericobject *g;
1780
Guido van Rossumfc58e581992-01-27 16:45:55 +00001781 if (!getargs(args, "(iff)", &type, &mx, &my)) return NULL;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001782
Guido van Rossum03747111991-08-08 12:10:01 +00001783 generic = (*func) (f-> ob_form, type, mx, my);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001784
1785 if (generic == NULL)
1786 {
1787 INCREF(None);
1788 return None;
1789 }
1790
1791 g = findgeneric(generic);
1792 if (g == NULL) {
1793 err_setstr(RuntimeError,
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001794 "forms_find_{first|last} returns unknown object");
Guido van Rossum75cc8981991-08-08 12:07:45 +00001795 return NULL;
1796 }
1797 INCREF(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001798 return (object *) g;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001799}
1800
1801static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001802form_find_first(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001803 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001804 object *args;
1805{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001806 return forms_find_first_or_last(fl_find_first, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001807}
1808
1809static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001810form_find_last(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001811 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001812 object *args;
1813{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001814 return forms_find_first_or_last(fl_find_last, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001815}
1816
Guido van Rossum7066dd71992-09-17 17:54:56 +00001817static object *
1818form_set_object_focus(f, args)
1819 formobject *f;
1820 object *args;
1821{
1822 genericobject *g;
1823 if (args == NULL || !is_genericobject(args)) {
1824 err_badarg();
1825 return NULL;
1826 }
1827 g = (genericobject *)args;
1828 fl_set_object_focus(f->ob_form, g->ob_generic);
1829 INCREF(None);
1830 return None;
1831}
1832
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001833static struct methodlist form_methods[] = {
1834/* adm */
1835 {"show_form", form_show_form},
1836 {"hide_form", form_hide_form},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001837 {"redraw_form", form_redraw_form},
1838 {"set_form_position", form_set_form_position},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001839 {"freeze_form", form_freeze_form},
1840 {"unfreeze_form", form_unfreeze_form},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001841#ifdef FL_V15
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001842 {"remove_form", form_remove_form},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001843#endif /* FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001844 {"activate_form", form_activate_form},
1845 {"deactivate_form", form_deactivate_form},
Guido van Rossum03747111991-08-08 12:10:01 +00001846 {"bgn_group", form_bgn_group},
1847 {"end_group", form_end_group},
Guido van Rossum75cc8981991-08-08 12:07:45 +00001848 {"find_first", form_find_first},
1849 {"find_last", form_find_last},
Guido van Rossum7066dd71992-09-17 17:54:56 +00001850 {"set_object_focus", form_set_object_focus},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001851
1852/* basic objects */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001853 {"add_button", form_add_button},
1854/* {"add_bitmap", form_add_bitmap}, */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001855 {"add_lightbutton", form_add_lightbutton},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001856 {"add_roundbutton", form_add_roundbutton},
1857 {"add_menu", form_add_menu},
1858 {"add_slider", form_add_slider},
1859 {"add_positioner", form_add_positioner},
1860 {"add_valslider", form_add_valslider},
1861 {"add_dial", form_add_dial},
1862 {"add_counter", form_add_counter},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001863#ifdef FL_V15
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001864 {"add_default", form_add_default},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001865#endif /* FL_V15 */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001866 {"add_box", form_add_box},
1867 {"add_clock", form_add_clock},
1868 {"add_choice", form_add_choice},
1869 {"add_browser", form_add_browser},
1870 {"add_input", form_add_input},
1871 {"add_timer", form_add_timer},
1872 {"add_text", form_add_text},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001873 {NULL, NULL} /* sentinel */
1874};
1875
1876static void
1877form_dealloc(f)
1878 formobject *f;
1879{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001880 releaseobjects(f->ob_form);
Guido van Rossum336b5911992-04-08 11:16:25 +00001881 if (f->ob_form->visible)
1882 fl_hide_form(f->ob_form);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001883 fl_free_form(f->ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001884 DEL(f);
1885}
1886
Guido van Rossumd97f0481991-11-19 20:26:28 +00001887#define OFF(x) offsetof(FL_FORM, x)
1888
Guido van Rossum32db5e31991-11-12 15:43:18 +00001889static struct memberlist form_memberlist[] = {
1890 {"window", T_LONG, OFF(window), RO},
1891 {"w", T_FLOAT, OFF(w)},
1892 {"h", T_FLOAT, OFF(h)},
Guido van Rossum7066dd71992-09-17 17:54:56 +00001893 {"x", T_FLOAT, OFF(x), RO},
1894 {"y", T_FLOAT, OFF(y), RO},
Guido van Rossum32db5e31991-11-12 15:43:18 +00001895 {"deactivated", T_INT, OFF(deactivated)},
Guido van Rossum7066dd71992-09-17 17:54:56 +00001896 {"visible", T_INT, OFF(visible), RO},
1897 {"frozen", T_INT, OFF(frozen), RO},
Guido van Rossum32db5e31991-11-12 15:43:18 +00001898 {"doublebuf", T_INT, OFF(doublebuf)},
1899 {NULL} /* Sentinel */
1900};
1901
Guido van Rossumd97f0481991-11-19 20:26:28 +00001902#undef OFF
1903
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001904static object *
1905form_getattr(f, name)
1906 formobject *f;
1907 char *name;
1908{
Guido van Rossum32db5e31991-11-12 15:43:18 +00001909 object *meth;
1910
1911 meth = findmethod(form_methods, (object *)f, name);
1912 if (meth != NULL)
1913 return meth;
1914 err_clear();
1915 return getmember((char *)f->ob_form, form_memberlist, name);
1916}
1917
1918static int
1919form_setattr(f, name, v)
1920 formobject *f;
1921 char *name;
1922 object *v;
1923{
1924 int ret;
1925
1926 if (v == NULL) {
1927 err_setstr(TypeError, "can't delete form attributes");
1928 return NULL;
1929 }
1930
1931 return setmember((char *)f->ob_form, form_memberlist, name, v);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001932}
1933
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001934static object *
1935form_repr(f)
1936 formobject *f;
1937{
1938 char buf[100];
1939 sprintf(buf, "<FORMS_form at %lx, window=%ld>",
1940 (long)f, f->ob_form->window);
1941 return newstringobject(buf);
1942}
1943
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001944typeobject Formtype = {
1945 OB_HEAD_INIT(&Typetype)
1946 0, /*ob_size*/
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001947 "FORMS_form", /*tp_name*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001948 sizeof(formobject), /*tp_size*/
1949 0, /*tp_itemsize*/
1950 /* methods */
1951 form_dealloc, /*tp_dealloc*/
1952 0, /*tp_print*/
1953 form_getattr, /*tp_getattr*/
Guido van Rossum32db5e31991-11-12 15:43:18 +00001954 form_setattr, /*tp_setattr*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001955 0, /*tp_compare*/
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001956 form_repr, /*tp_repr*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001957};
1958
1959static object *
1960newformobject(form)
1961 FL_FORM *form;
1962{
1963 formobject *f;
1964 f = NEWOBJ(formobject, &Formtype);
1965 if (f == NULL)
1966 return NULL;
1967 f->ob_form = form;
1968 return (object *)f;
1969}
1970
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001971
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001972/* The "fl" module */
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001973
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001974static object *
1975forms_make_form(dummy, args)
1976 object *dummy;
1977 object *args;
1978{
1979 int type;
1980 float w, h;
1981 FL_FORM *form;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001982 if (!getargs(args, "(iff)", &type, &w, &h))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001983 return NULL;
1984 form = fl_bgn_form(type, w, h);
1985 if (form == NULL) {
1986 /* XXX Actually, cannot happen! */
1987 err_nomem();
1988 return NULL;
1989 }
1990 fl_end_form();
1991 return newformobject(form);
1992}
1993
Guido van Rossum2bac4d31992-03-27 17:20:21 +00001994static object *
1995forms_activate_all_forms(f, args)
1996 object *f;
1997 object *args;
1998{
1999 fl_activate_all_forms();
2000 INCREF(None);
2001 return None;
2002}
2003
2004static object *
2005forms_deactivate_all_forms(f, args)
2006 object *f;
2007 object *args;
2008{
2009 fl_deactivate_all_forms();
2010 INCREF(None);
2011 return None;
2012}
2013
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002014static object *my_event_callback = NULL;
2015
2016static object *
2017forms_set_event_call_back(dummy, args)
2018 object *dummy;
2019 object *args;
2020{
2021 my_event_callback = args;
2022 XINCREF(args);
2023 INCREF(None);
2024 return None;
2025}
2026
2027static object *
2028forms_do_or_check_forms(dummy, args, func)
2029 object *dummy;
2030 object *args;
2031 FL_OBJECT *(*func)();
2032{
2033 FL_OBJECT *generic;
2034 genericobject *g;
2035 object *arg, *res;
2036
2037 if (!getnoarg(args))
2038 return NULL;
2039
2040 for (;;) {
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002041 BGN_SAVE
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002042 generic = (*func)();
Jack Jansen743db361992-08-13 14:13:11 +00002043 END_SAVE
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002044 if (generic == NULL) {
2045 INCREF(None);
2046 return None;
2047 }
2048 if (generic == FL_EVENT) {
2049 int dev;
2050 short val;
2051 if (my_event_callback == NULL)
Guido van Rossum7066dd71992-09-17 17:54:56 +00002052 return newintobject(-1L);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002053 dev = fl_qread(&val);
Guido van Rossume5372401993-03-16 12:15:04 +00002054 arg = mkvalue("(ih)", dev, val);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002055 if (arg == NULL)
2056 return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002057 res = call_object(my_event_callback, arg);
2058 XDECREF(res);
2059 DECREF(arg);
2060 if (res == NULL)
2061 return NULL; /* Callback raised exception */
2062 continue;
2063 }
2064 g = findgeneric(generic);
2065 if (g == NULL) {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00002066 /* Object not known to us (some dialogs cause this) */
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002067 continue; /* Ignore it */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002068 }
2069 if (g->ob_callback == NULL) {
2070 INCREF(g);
2071 return ((object *) g);
2072 }
Guido van Rossume5372401993-03-16 12:15:04 +00002073 arg = mkvalue("(OO)", (object *)g, g->ob_callback_arg);
2074 if (arg == NULL)
2075 return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002076 res = call_object(g->ob_callback, arg);
2077 XDECREF(res);
2078 DECREF(arg);
2079 if (res == NULL)
2080 return NULL; /* Callback raised exception */
2081 }
2082}
2083
2084static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002085forms_do_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002086 object *dummy;
2087 object *args;
2088{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002089 return forms_do_or_check_forms(dummy, args, fl_do_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002090}
2091
2092static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002093forms_check_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002094 object *dummy;
2095 object *args;
2096{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002097 return forms_do_or_check_forms(dummy, args, fl_check_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002098}
2099
Guido van Rossum7066dd71992-09-17 17:54:56 +00002100static object *
2101forms_do_only_forms(dummy, args)
2102 object *dummy;
2103 object *args;
2104{
2105 return forms_do_or_check_forms(dummy, args, fl_do_only_forms);
2106}
2107
2108static object *
2109forms_check_only_forms(dummy, args)
2110 object *dummy;
2111 object *args;
2112{
2113 return forms_do_or_check_forms(dummy, args, fl_check_only_forms);
2114}
2115
Guido van Rossum03747111991-08-08 12:10:01 +00002116#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002117static object *
2118fl_call(func, args)
2119 object *args;
2120 void (*func)();
2121{
2122 if (!getnoarg(args))
2123 return NULL;
2124 (*func)();
2125 INCREF(None);
2126 return None;
2127}
Guido van Rossum03747111991-08-08 12:10:01 +00002128#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002129
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002130#ifndef FL_V15
2131static object *
2132forms_set_graphics_mode(dummy, args)
2133 object *dummy;
2134 object *args;
2135{
2136 int rgbmode, doublebuf;
2137
2138 if (!getintintarg(args, &rgbmode, &doublebuf))
2139 return NULL;
2140 fl_set_graphics_mode(rgbmode,doublebuf);
2141 INCREF(None);
2142 return None;
2143}
2144
2145static object *
2146forms_get_rgbmode(dummy, args)
2147 object *dummy;
2148 object *args;
2149{
Guido van Rossum7066dd71992-09-17 17:54:56 +00002150 extern int fl_rgbmode;
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002151
2152 if (args != NULL) {
2153 err_badarg();
2154 return NULL;
2155 }
Guido van Rossum7066dd71992-09-17 17:54:56 +00002156 return newintobject((long)fl_rgbmode);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002157}
Guido van Rossum7066dd71992-09-17 17:54:56 +00002158
2159static object *
2160forms_show_errors(dummy, args)
2161 object *dummy;
2162 object *args;
2163{
2164 int show;
2165 if (!getargs(args, "i", &show))
2166 return NULL;
2167 fl_show_errors(show);
2168 INCREF(None);
2169 return None;
2170}
2171
2172static object *
2173forms_set_font_name(dummy, args)
2174 object *dummy;
2175 object *args;
2176{
2177 int numb;
2178 char *name;
2179 if (!getargs(args, "(is)", &numb, &name))
2180 return NULL;
2181 fl_set_font_name(numb, name);
2182 INCREF(None);
2183 return None;
2184}
2185
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002186#endif /* !FL_V15 */
2187
2188
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002189static object *
2190forms_qdevice(self, args)
2191 object *self;
2192 object *args;
2193{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002194 short arg1;
2195 if (!getargs(args, "h", &arg1))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002196 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002197 fl_qdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002198 INCREF(None);
2199 return None;
2200}
2201
2202static object *
2203forms_unqdevice(self, args)
2204 object *self;
2205 object *args;
2206{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002207 short arg1;
2208 if (!getargs(args, "h", &arg1))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002209 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002210 fl_unqdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002211 INCREF(None);
2212 return None;
2213}
2214
2215static object *
2216forms_isqueued(self, args)
2217 object *self;
2218 object *args;
2219{
Guido van Rossum03747111991-08-08 12:10:01 +00002220 long retval;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002221 short arg1;
2222 if (!getargs(args, "h", &arg1))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002223 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002224 retval = fl_isqueued(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002225
Guido van Rossum03747111991-08-08 12:10:01 +00002226 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002227}
2228
2229static object *
2230forms_qtest(self, args)
2231 object *self;
2232 object *args;
2233{
2234 long retval;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002235 retval = fl_qtest();
Guido van Rossum03747111991-08-08 12:10:01 +00002236 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002237}
2238
2239
2240static object *
2241forms_qread(self, args)
2242 object *self;
2243 object *args;
2244{
Guido van Rossume5372401993-03-16 12:15:04 +00002245 int dev;
2246 short val;
Jack Jansen743db361992-08-13 14:13:11 +00002247 BGN_SAVE
Guido van Rossume5372401993-03-16 12:15:04 +00002248 dev = fl_qread(&val);
Jack Jansen743db361992-08-13 14:13:11 +00002249 END_SAVE
Guido van Rossume5372401993-03-16 12:15:04 +00002250 return mkvalue("(ih)", dev, val);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002251}
2252
2253static object *
2254forms_qreset(self, args)
2255 object *self;
2256 object *args;
2257{
2258 if (!getnoarg(args)) return NULL;
2259
Guido van Rossum03747111991-08-08 12:10:01 +00002260 fl_qreset();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002261 INCREF(None);
2262 return None;
2263}
2264
2265static object *
2266forms_qenter(self, args)
2267 object *self;
2268 object *args;
2269{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002270 short arg1, arg2;
2271 if (!getargs(args, "(hh)", &arg1, &arg2))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002272 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002273 fl_qenter(arg1, arg2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002274 INCREF(None);
2275 return None;
2276}
2277
2278static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002279forms_color(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002280 object *self;
2281 object *args;
2282{
2283 int arg;
2284
2285 if (!getintarg(args, &arg)) return NULL;
2286
2287 fl_color((short) arg);
2288
2289 INCREF(None);
2290 return None;
2291}
2292
2293static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002294forms_mapcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002295 object *self;
2296 object *args;
2297{
2298 int arg0, arg1, arg2, arg3;
2299
Guido van Rossumfc58e581992-01-27 16:45:55 +00002300 if (!getargs(args, "(iiii)", &arg0, &arg1, &arg2, &arg3))
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002301 return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002302
2303 fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);
2304
2305 INCREF(None);
2306 return None;
2307}
2308
2309static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002310forms_getmcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002311 object *self;
2312 object *args;
2313{
Guido van Rossum03747111991-08-08 12:10:01 +00002314 int arg;
2315 short r, g, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002316
2317 if (!getintarg(args, &arg)) return NULL;
2318
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002319 fl_getmcolor(arg, &r, &g, &b);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002320
Guido van Rossume5372401993-03-16 12:15:04 +00002321 return mkvalue("(hhh)", r, g, b);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002322}
2323
2324static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002325forms_get_mouse(self, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00002326 object *self;
2327 object *args;
2328{
Guido van Rossume5372401993-03-16 12:15:04 +00002329 float x, y;
Guido van Rossum75cc8981991-08-08 12:07:45 +00002330
2331 if (!getnoarg(args)) return NULL;
2332
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002333 fl_get_mouse(&x, &y);
Guido van Rossum75cc8981991-08-08 12:07:45 +00002334
Guido van Rossume5372401993-03-16 12:15:04 +00002335 return mkvalue("(ff)", x, y);
Guido van Rossum75cc8981991-08-08 12:07:45 +00002336}
2337
2338static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002339forms_tie(self, args)
2340 object *self;
2341 object *args;
2342{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002343 short arg1, arg2, arg3;
2344 if (!getargs(args, "(hhh)", &arg1, &arg2, &arg3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002345 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002346 fl_tie(arg1, arg2, arg3);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002347 INCREF(None);
2348 return None;
2349}
2350
Guido van Rossum03747111991-08-08 12:10:01 +00002351static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002352forms_show_message(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002353 object *f;
2354 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002355{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002356 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002357
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002358 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002359
Jack Jansen743db361992-08-13 14:13:11 +00002360 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002361 fl_show_message(a, b, c);
Jack Jansen743db361992-08-13 14:13:11 +00002362 END_SAVE
Guido van Rossum03747111991-08-08 12:10:01 +00002363
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002364 INCREF(None);
Guido van Rossum03747111991-08-08 12:10:01 +00002365 return None;
2366}
2367
2368static object *
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002369forms_show_choice(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002370 object *f;
2371 object *args;
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002372{
2373 char *m1, *m2, *m3, *b1, *b2, *b3;
2374 int nb;
2375 char *format;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002376 long rv;
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002377
2378 if (args == NULL || !is_tupleobject(args)) {
2379 err_badarg();
2380 return NULL;
2381 }
2382 nb = gettuplesize(args) - 3;
2383 if (nb <= 0) {
2384 err_setstr(TypeError, "need at least one button label");
2385 return NULL;
2386 }
2387 if (is_intobject(gettupleitem(args, 3))) {
2388 err_setstr(TypeError,
2389 "'number-of-buttons' argument not needed");
2390 return NULL;
2391 }
2392 switch (nb) {
2393 case 1: format = "(ssss)"; break;
2394 case 2: format = "(sssss)"; break;
2395 case 3: format = "(ssssss)"; break;
2396 default:
2397 err_setstr(TypeError, "too many button labels");
2398 return NULL;
2399 }
2400
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002401 if (!getargs(args, format, &m1, &m2, &m3, &b1, &b2, &b3))
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002402 return NULL;
2403
Jack Jansen743db361992-08-13 14:13:11 +00002404 BGN_SAVE
2405 rv = fl_show_choice(m1, m2, m3, nb, b1, b2, b3);
2406 END_SAVE
2407 return newintobject(rv);
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002408}
2409
2410static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002411forms_show_question(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002412 object *f;
2413 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002414{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002415 int ret;
2416 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002417
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002418 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002419
Jack Jansen743db361992-08-13 14:13:11 +00002420 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002421 ret = fl_show_question(a, b, c);
Jack Jansen743db361992-08-13 14:13:11 +00002422 END_SAVE
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002423
2424 return newintobject((long) ret);
Guido van Rossum03747111991-08-08 12:10:01 +00002425}
2426
2427static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002428forms_show_input(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002429 object *f;
2430 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002431{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002432 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002433 char *a, *b;
Guido van Rossum03747111991-08-08 12:10:01 +00002434
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002435 if (!getstrstrarg(args, &a, &b)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002436
Jack Jansen743db361992-08-13 14:13:11 +00002437 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002438 str = fl_show_input(a, b);
Jack Jansen743db361992-08-13 14:13:11 +00002439 END_SAVE
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002440
2441 if (str == NULL) {
2442 INCREF(None);
2443 return None;
2444 }
2445 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002446}
2447
2448static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002449forms_file_selector(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002450 object *f;
2451 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002452{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002453 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002454 char *a, *b, *c, *d;
Guido van Rossum03747111991-08-08 12:10:01 +00002455
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002456 if (!getargs(args, "(ssss)", &a, &b, &c, &d)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002457
Jack Jansen743db361992-08-13 14:13:11 +00002458 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002459 str = fl_show_file_selector(a, b, c, d);
Jack Jansen743db361992-08-13 14:13:11 +00002460 END_SAVE
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002461
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002462 if (str == NULL) {
2463 INCREF(None);
2464 return None;
2465 }
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002466 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002467}
2468
2469
2470static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002471forms_file_selector_func(args, func)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002472 object *args;
2473 char *(*func)();
Guido van Rossum03747111991-08-08 12:10:01 +00002474{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002475 char *str;
Guido van Rossum03747111991-08-08 12:10:01 +00002476
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002477 str = (*func) ();
2478
2479 if (str == NULL) {
2480 INCREF(None);
2481 return None;
2482 }
2483 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002484}
2485
2486static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002487forms_get_directory(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002488 object *f;
2489 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002490{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002491 return forms_file_selector_func(args, fl_get_directory);
Guido van Rossum03747111991-08-08 12:10:01 +00002492}
2493
2494static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002495forms_get_pattern(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002496 object *f;
2497 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002498{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002499 return forms_file_selector_func(args, fl_get_pattern);
Guido van Rossum03747111991-08-08 12:10:01 +00002500}
2501
2502static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002503forms_get_filename(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002504 object *f;
2505 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002506{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002507 return forms_file_selector_func(args, fl_get_filename);
Guido van Rossum03747111991-08-08 12:10:01 +00002508}
2509
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002510static struct methodlist forms_methods[] = {
2511/* adm */
2512 {"make_form", forms_make_form},
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002513 {"activate_all_forms", forms_activate_all_forms},
2514 {"deactivate_all_forms",forms_deactivate_all_forms},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002515/* gl support wrappers */
2516 {"qdevice", forms_qdevice},
2517 {"unqdevice", forms_unqdevice},
2518 {"isqueued", forms_isqueued},
2519 {"qtest", forms_qtest},
2520 {"qread", forms_qread},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002521/* {"blkqread", forms_blkqread}, */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002522 {"qreset", forms_qreset},
2523 {"qenter", forms_qenter},
Guido van Rossum03747111991-08-08 12:10:01 +00002524 {"get_mouse", forms_get_mouse},
2525 {"tie", forms_tie},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002526/* {"new_events", forms_new_events}, */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002527 {"color", forms_color},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002528 {"mapcolor", forms_mapcolor},
2529 {"getmcolor", forms_getmcolor},
2530/* interaction */
2531 {"do_forms", forms_do_forms},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00002532 {"do_only_forms", forms_do_only_forms},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002533 {"check_forms", forms_check_forms},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00002534 {"check_only_forms", forms_check_only_forms},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002535 {"set_event_call_back", forms_set_event_call_back},
2536/* goodies */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002537 {"show_message", forms_show_message},
2538 {"show_question", forms_show_question},
2539 {"show_choice", forms_show_choice},
2540 {"show_input", forms_show_input},
2541 {"show_file_selector", forms_file_selector},
2542 {"file_selector", forms_file_selector}, /* BW compat */
2543 {"get_directory", forms_get_directory},
2544 {"get_pattern", forms_get_pattern},
2545 {"get_filename", forms_get_filename},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002546#ifndef FL_V15
2547 {"set_graphics_mode", forms_set_graphics_mode},
2548 {"get_rgbmode", forms_get_rgbmode},
Guido van Rossum7066dd71992-09-17 17:54:56 +00002549 {"show_errors", forms_show_errors},
2550 {"set_font_name", forms_set_font_name},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002551#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002552 {NULL, NULL} /* sentinel */
2553};
2554
2555void
2556initfl()
2557{
2558 initmodule("fl", forms_methods);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002559 foreground();
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002560#ifndef FL_V15
2561 fl_init();
2562#endif /* !FL_V15 */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002563}