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