blob: bed40df9b6b45735241e854ae71c703f9e797e8a [file] [log] [blame]
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001/**********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumc7df79e1991-08-07 11:32:58 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumc7df79e1991-08-07 11:32:58 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumc7df79e1991-08-07 11:32:58 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumc7df79e1991-08-07 11:32:58 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumc7df79e1991-08-07 11:32:58 +000029
30******************************************************************/
31
32/* FL module -- interface to Mark Overmars' FORMS Library. */
33
Guido van Rossumf1dc5661993-07-05 10:31:29 +000034/* This code works with FORMS version 2.2a.
35 FORMS can be ftp'ed from ftp.cs.ruu.nl (131.211.80.17), directory
36 /pub/SGI/FORMS. */
Guido van Rossumddc0d3e1991-12-10 13:56:42 +000037
Jack Jansen743db361992-08-13 14:13:11 +000038/* A half-hearted attempt has been made to allow programs using this
39 * module to exploit parallelism (through the threads module). No provisions
40 * have been made for multiple threads to use this module at the same time,
41 * though. So, a program with a forms thread and a non-forms thread will work
42 * fine but a program with two threads using forms will probably crash (unless
43 * the program takes precaution to ensure that only one thread can be in
44 * this module at any time). This will have to be fixed some time.
45 * (A fix will probably also have to synchronise with the gl module).
46 */
47
Guido van Rossumc7df79e1991-08-07 11:32:58 +000048#include "forms.h"
49
50#include "allobjects.h"
51#include "import.h"
52#include "modsupport.h"
53#include "structmember.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000054#include "ceval.h"
Guido van Rossumc7df79e1991-08-07 11:32:58 +000055
56/* Generic Forms Objects */
57
58typedef struct {
59 OB_HEAD
60 FL_OBJECT *ob_generic;
61 struct methodlist *ob_methods;
62 object *ob_callback;
63 object *ob_callback_arg;
64} genericobject;
65
Guido van Rossumb6775db1994-08-01 11:34:53 +000066staticforward typeobject GenericObjecttype;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000067
68#define is_genericobject(g) ((g)->ob_type == &GenericObjecttype)
69
70/* List of all objects (XXX this should be a hash table on address...) */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000071
72static object *allgenerics = NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000073static int nfreeslots = 0;
74
75/* Add an object to the list of known objects */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000076
77static void
78knowgeneric(g)
79 genericobject *g;
80{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000081 int i, n;
82 /* Create the list if it doesn't already exist */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000083 if (allgenerics == NULL) {
84 allgenerics = newlistobject(0);
85 if (allgenerics == NULL) {
86 err_clear();
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000087 return; /* Too bad, live without allgenerics... */
Guido van Rossumc7df79e1991-08-07 11:32:58 +000088 }
89 }
Guido van Rossum2df7bcc1991-10-20 20:18:26 +000090 if (nfreeslots > 0) {
91 /* Search the list for reusable slots (NULL items) */
92 /* XXX This can be made faster! */
93 n = getlistsize(allgenerics);
94 for (i = 0; i < n; i++) {
95 if (getlistitem(allgenerics, i) == NULL) {
96 INCREF(g);
97 setlistitem(allgenerics, i, (object *)g);
98 nfreeslots--;
99 return;
100 }
101 }
102 /* Strange... no free slots found... */
103 nfreeslots = 0;
104 }
105 /* No free entries, append new item to the end */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000106 addlistitem(allgenerics, (object *)g);
107}
108
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000109/* Find an object in the list of known objects */
110
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000111static genericobject *
112findgeneric(generic)
113 FL_OBJECT *generic;
114{
115 int i, n;
116 genericobject *g;
117
118 if (allgenerics == NULL)
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000119 return NULL; /* No objects known yet */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000120 n = getlistsize(allgenerics);
121 for (i = 0; i < n; i++) {
122 g = (genericobject *)getlistitem(allgenerics, i);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000123 if (g != NULL && g->ob_generic == generic)
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000124 return g;
125 }
126 return NULL; /* Unknown object */
127}
128
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000129/* Remove an object from the list of known objects */
130
131static void
132forgetgeneric(g)
133 genericobject *g;
134{
135 int i, n;
136
137 XDECREF(g->ob_callback);
138 g->ob_callback = NULL;
139 XDECREF(g->ob_callback_arg);
140 g->ob_callback_arg = NULL;
141 if (allgenerics == NULL)
142 return; /* No objects known yet */
143 n = getlistsize(allgenerics);
144 for (i = 0; i < n; i++) {
145 if (g == (genericobject *)getlistitem(allgenerics, i)) {
146 setlistitem(allgenerics, i, (object *)NULL);
147 nfreeslots++;
148 break;
149 }
150 }
151}
152
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000153/* Called when a form is about to be freed --
154 remove all the objects that we know about from it. */
155
156static void
157releaseobjects(form)
158 FL_FORM *form;
159{
160 int i, n;
161 genericobject *g;
162
163 if (allgenerics == NULL)
164 return; /* No objects known yet */
165 n = getlistsize(allgenerics);
166 for (i = 0; i < n; i++) {
167 g = (genericobject *)getlistitem(allgenerics, i);
168 if (g != NULL && g->ob_generic->form == form) {
169 fl_delete_object(g->ob_generic);
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000170 /* The object is now unreachable for
171 do_forms and check_forms, so
172 delete it from the list of known objects */
173 XDECREF(g->ob_callback);
174 g->ob_callback = NULL;
175 XDECREF(g->ob_callback_arg);
176 g->ob_callback_arg = NULL;
177 setlistitem(allgenerics, i, (object *)NULL);
178 nfreeslots++;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000179 }
180 }
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000181}
182
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000183
184/* Methods of generic objects */
185
186static object *
187generic_set_call_back(g, args)
188 genericobject *g;
189 object *args;
190{
191 if (args == NULL) {
192 XDECREF(g->ob_callback);
193 XDECREF(g->ob_callback_arg);
194 g->ob_callback = NULL;
195 g->ob_callback_arg = NULL;
196 }
197 else {
198 if (!is_tupleobject(args) || gettuplesize(args) != 2) {
199 err_badarg();
200 return NULL;
201 }
202 XDECREF(g->ob_callback);
203 XDECREF(g->ob_callback_arg);
204 g->ob_callback = gettupleitem(args, 0);
205 INCREF(g->ob_callback);
206 g->ob_callback_arg = gettupleitem(args, 1);
207 INCREF(g->ob_callback_arg);
208 }
209 INCREF(None);
210 return None;
211}
212
213static object *
214generic_call(g, args, func)
215 genericobject *g;
216 object *args;
217 void (*func)(FL_OBJECT *);
218{
219 if (!getnoarg(args))
220 return NULL;
221 (*func)(g->ob_generic);
222 INCREF(None);
223 return None;
224}
225
226static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000227generic_delete_object(g, args)
228 genericobject *g;
229 object *args;
230{
231 object *res;
232 res = generic_call(g, args, fl_delete_object);
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000233 if (res != NULL)
234 forgetgeneric(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000235 return res;
236}
237
238static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000239generic_show_object(g, args)
240 genericobject *g;
241 object *args;
242{
243 return generic_call(g, args, fl_show_object);
244}
245
246static object *
247generic_hide_object(g, args)
248 genericobject *g;
249 object *args;
250{
251 return generic_call(g, args, fl_hide_object);
252}
253
254static object *
255generic_redraw_object(g, args)
256 genericobject *g;
257 object *args;
258{
259 return generic_call(g, args, fl_redraw_object);
260}
261
262static object *
263generic_freeze_object(g, args)
264 genericobject *g;
265 object *args;
266{
267 return generic_call(g, args, fl_freeze_object);
268}
269
270static object *
271generic_unfreeze_object(g, args)
272 genericobject *g;
273 object *args;
274{
275 return generic_call(g, args, fl_unfreeze_object);
276}
277
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000278static object *
279generic_activate_object(g, args)
280 genericobject *g;
281 object *args;
282{
283 return generic_call(g, args, fl_activate_object);
284}
285
286static object *
287generic_deactivate_object(g, args)
288 genericobject *g;
289 object *args;
290{
291 return generic_call(g, args, fl_deactivate_object);
292}
293
294static object *
295generic_set_object_shortcut(g, args)
296 genericobject *g;
297 object *args;
298{
299 char *str;
300 if (!getargs(args, "s", &str))
301 return NULL;
302 fl_set_object_shortcut(g->ob_generic, str);
303 INCREF(None);
304 return None;
305}
306
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000307static struct methodlist generic_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000308 {"set_call_back", (method)generic_set_call_back},
309 {"delete_object", (method)generic_delete_object},
310 {"show_object", (method)generic_show_object},
311 {"hide_object", (method)generic_hide_object},
312 {"redraw_object", (method)generic_redraw_object},
313 {"freeze_object", (method)generic_freeze_object},
314 {"unfreeze_object", (method)generic_unfreeze_object},
315 {"activate_object", (method)generic_activate_object},
316 {"deactivate_object", (method)generic_deactivate_object},
317 {"set_object_shortcut", (method)generic_set_object_shortcut},
Guido van Rossum03747111991-08-08 12:10:01 +0000318 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000319};
320
321static void
322generic_dealloc(g)
323 genericobject *g;
324{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000325 fl_free_object(g->ob_generic);
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000326 XDECREF(g->ob_callback);
327 XDECREF(g->ob_callback_arg);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000328 DEL(g);
329}
330
331#define OFF(x) offsetof(FL_OBJECT, x)
332
333static struct memberlist generic_memberlist[] = {
334 {"objclass", T_INT, OFF(objclass), RO},
335 {"type", T_INT, OFF(type), RO},
336 {"boxtype", T_INT, OFF(boxtype)},
337 {"x", T_FLOAT, OFF(x)},
338 {"y", T_FLOAT, OFF(y)},
339 {"w", T_FLOAT, OFF(w)},
340 {"h", T_FLOAT, OFF(h)},
341 {"col1", T_INT, OFF(col1)},
342 {"col2", T_INT, OFF(col2)},
343 {"align", T_INT, OFF(align)},
344 {"lcol", T_INT, OFF(lcol)},
345 {"lsize", T_FLOAT, OFF(lsize)},
346 /* "label" is treated specially! */
347 {"lstyle", T_INT, OFF(lstyle)},
348 {"pushed", T_INT, OFF(pushed), RO},
349 {"focus", T_INT, OFF(focus), RO},
350 {"belowmouse", T_INT, OFF(belowmouse),RO},
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000351/* {"frozen", T_INT, OFF(frozen), RO}, */
Guido van Rossum7066dd71992-09-17 17:54:56 +0000352 {"active", T_INT, OFF(active)},
353 {"input", T_INT, OFF(input)},
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000354 {"visible", T_INT, OFF(visible), RO},
Guido van Rossum7066dd71992-09-17 17:54:56 +0000355 {"radio", T_INT, OFF(radio)},
356 {"automatic", T_INT, OFF(automatic)},
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000357 {NULL} /* Sentinel */
358};
359
Guido van Rossumd97f0481991-11-19 20:26:28 +0000360#undef OFF
361
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000362static object *
363generic_getattr(g, name)
364 genericobject *g;
365 char *name;
366{
367 object *meth;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000368
369 /* XXX Ought to special-case name "__methods__" */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000370 if (g-> ob_methods) {
Guido van Rossum03747111991-08-08 12:10:01 +0000371 meth = findmethod(g->ob_methods, (object *)g, name);
372 if (meth != NULL) return meth;
373 err_clear();
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000374 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000375
376 meth = findmethod(generic_methods, (object *)g, name);
377 if (meth != NULL)
378 return meth;
379 err_clear();
380
381 /* "label" is an exception, getmember only works for char pointers,
382 not for char arrays */
383 if (strcmp(name, "label") == 0)
384 return newstringobject(g->ob_generic->label);
385
386 return getmember((char *)g->ob_generic, generic_memberlist, name);
387}
388
389static int
390generic_setattr(g, name, v)
391 genericobject *g;
392 char *name;
393 object *v;
394{
395 int ret;
396
397 if (v == NULL) {
398 err_setstr(TypeError, "can't delete forms object attributes");
Guido van Rossum3dd8c981992-06-03 17:07:49 +0000399 return -1;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000400 }
401
402 /* "label" is an exception: setmember doesn't set strings;
403 and FORMS wants you to call a function to set the label */
404 if (strcmp(name, "label") == 0) {
405 if (!is_stringobject(v)) {
406 err_setstr(TypeError, "label attr must be string");
Guido van Rossum3dd8c981992-06-03 17:07:49 +0000407 return -1;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000408 }
409 fl_set_object_label(g->ob_generic, getstringvalue(v));
410 return 0;
411 }
412
413 ret = setmember((char *)g->ob_generic, generic_memberlist, name, v);
414
415 /* Rather than calling all the various set_object_* functions,
416 we call fl_redraw_object here. This is sometimes redundant
417 but I doubt that's a big problem */
418 if (ret == 0)
419 fl_redraw_object(g->ob_generic);
420
421 return ret;
422}
423
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000424static object *
425generic_repr(g)
426 genericobject *g;
427{
428 char buf[100];
429 sprintf(buf, "<FORMS_object at %lx, objclass=%d>",
430 (long)g, g->ob_generic->objclass);
431 return newstringobject(buf);
432}
433
Guido van Rossumb6775db1994-08-01 11:34:53 +0000434static typeobject GenericObjecttype = {
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000435 OB_HEAD_INIT(&Typetype)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000436 0, /*ob_size*/
437 "FORMS_object", /*tp_name*/
438 sizeof(genericobject), /*tp_size*/
439 0, /*tp_itemsize*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000440 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000441 (destructor)generic_dealloc, /*tp_dealloc*/
442 0, /*tp_print*/
443 (getattrfunc)generic_getattr, /*tp_getattr*/
444 (setattrfunc)generic_setattr, /*tp_setattr*/
445 0, /*tp_compare*/
446 (reprfunc)generic_repr, /*tp_repr*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000447};
448
449static object *
450newgenericobject(generic, methods)
451 FL_OBJECT *generic;
452 struct methodlist *methods;
453{
454 genericobject *g;
455 g = NEWOBJ(genericobject, &GenericObjecttype);
456 if (g == NULL)
457 return NULL;
458 g-> ob_generic = generic;
459 g->ob_methods = methods;
460 g->ob_callback = NULL;
461 g->ob_callback_arg = NULL;
462 knowgeneric(g);
463 return (object *)g;
464}
465
466/**********************************************************************/
467/* Some common calling sequences */
468
469/* void func (object, float) */
470static object *
471call_forms_INf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000472 void (*func)(FL_OBJECT *, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000473 FL_OBJECT *obj;
474 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000475{
Guido van Rossum03747111991-08-08 12:10:01 +0000476 float parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000477
Guido van Rossumfc58e581992-01-27 16:45:55 +0000478 if (!getargs(args, "f", &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
486/* void func (object, float) */
487static object *
488call_forms_INfINf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000489 void (*func)(FL_OBJECT *, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +0000490 FL_OBJECT *obj;
491 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000492{
Guido van Rossum03747111991-08-08 12:10:01 +0000493 float par1, par2;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000494
Guido van Rossumfc58e581992-01-27 16:45:55 +0000495 if (!getargs(args, "(ff)", &par1, &par2)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000496
Guido van Rossum03747111991-08-08 12:10:01 +0000497 (*func) (obj, par1, par2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000498
Guido van Rossum03747111991-08-08 12:10:01 +0000499 INCREF(None);
500 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000501}
502
503/* void func (object, int) */
504static object *
505call_forms_INi (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000506 void (*func)(FL_OBJECT *, int);
Guido van Rossum03747111991-08-08 12:10:01 +0000507 FL_OBJECT *obj;
508 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000509{
Guido van Rossum03747111991-08-08 12:10:01 +0000510 int parameter;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000511
Guido van Rossumfc58e581992-01-27 16:45:55 +0000512 if (!getintarg(args, &parameter)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000513
Guido van Rossum03747111991-08-08 12:10:01 +0000514 (*func) (obj, parameter);
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
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000520/* void func (object, char) */
521static object *
522call_forms_INc (func, obj, args)
523 void (*func)(FL_OBJECT *, int);
524 FL_OBJECT *obj;
525 object *args;
526{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000527 char *a;
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000528
Guido van Rossumfc58e581992-01-27 16:45:55 +0000529 if (!getstrarg(args, &a)) return NULL;
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000530
Guido van Rossumfc58e581992-01-27 16:45:55 +0000531 (*func) (obj, a[0]);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000532
533 INCREF(None);
534 return None;
535}
536
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000537/* void func (object, string) */
538static object *
539call_forms_INstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000540 void (*func)(FL_OBJECT *, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000541 FL_OBJECT *obj;
542 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000543{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000544 char *a;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000545
Guido van Rossumfc58e581992-01-27 16:45:55 +0000546 if (!getstrarg(args, &a)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000547
Guido van Rossumfc58e581992-01-27 16:45:55 +0000548 (*func) (obj, a);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000549
Guido van Rossum03747111991-08-08 12:10:01 +0000550 INCREF(None);
551 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000552}
553
554
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000555/* void func (object, int, string) */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000556static object *
557call_forms_INiINstr (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000558 void (*func)(FL_OBJECT *, int, char *);
Guido van Rossum03747111991-08-08 12:10:01 +0000559 FL_OBJECT *obj;
560 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000561{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000562 char *b;
563 int a;
Guido van Rossum03747111991-08-08 12:10:01 +0000564
Guido van Rossum234f9421993-06-17 12:35:49 +0000565 if (!getargs(args, "(is)", &a, &b)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000566
Guido van Rossumfc58e581992-01-27 16:45:55 +0000567 (*func) (obj, a, b);
Guido van Rossum03747111991-08-08 12:10:01 +0000568
569 INCREF(None);
570 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000571}
572
Guido van Rossum03747111991-08-08 12:10:01 +0000573#ifdef UNUSED
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000574/* void func (object, int, int) */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000575static object *
576call_forms_INiINi (func, obj, args)
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000577 void (*func)(FL_OBJECT *, int, int);
Guido van Rossum03747111991-08-08 12:10:01 +0000578 FL_OBJECT *obj;
579 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000580{
Guido van Rossum03747111991-08-08 12:10:01 +0000581 int par1, par2;
582
Guido van Rossum234f9421993-06-17 12:35:49 +0000583 if (!getargs(args, "(ii)", &par1, &par2)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000584
585 (*func) (obj, par1, par2);
586
587 INCREF(None);
588 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000589}
Guido van Rossum03747111991-08-08 12:10:01 +0000590#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000591
592/* int func (object) */
593static object *
594call_forms_Ri (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000595 int (*func)(FL_OBJECT *);
596 FL_OBJECT *obj;
597 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000598{
Guido van Rossum03747111991-08-08 12:10:01 +0000599 int retval;
600
601 if (!getnoarg(args)) return NULL;
602
603 retval = (*func) (obj);
604
605 return newintobject ((long) retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000606}
607
608/* char * func (object) */
609static object *
610call_forms_Rstr (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000611 char * (*func)(FL_OBJECT *);
612 FL_OBJECT *obj;
613 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000614{
Guido van Rossum03747111991-08-08 12:10:01 +0000615 char *str;
616
Guido van Rossumfc58e581992-01-27 16:45:55 +0000617 if (!getnoarg(args)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000618
619 str = (*func) (obj);
620
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000621 if (str == NULL) {
622 INCREF(None);
623 return None;
624 }
Guido van Rossum03747111991-08-08 12:10:01 +0000625 return newstringobject (str);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000626}
627
628/* int func (object) */
629static object *
630call_forms_Rf (func, obj, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000631 float (*func)(FL_OBJECT *);
632 FL_OBJECT *obj;
633 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000634{
Guido van Rossum03747111991-08-08 12:10:01 +0000635 float retval;
636
637 if (!getnoarg(args)) return NULL;
638
639 retval = (*func) (obj);
640
641 return newfloatobject (retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000642}
643
644static object *
645call_forms_OUTfOUTf (func, obj, args)
Guido van Rossumabe58351991-08-08 12:34:44 +0000646 void (*func)(FL_OBJECT *, float *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000647 FL_OBJECT *obj;
648 object *args;
649{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000650 float f1, f2;
Guido van Rossum03747111991-08-08 12:10:01 +0000651
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000652 if (!getnoarg(args)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000653
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000654 (*func) (obj, &f1, &f2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000655
Guido van Rossume5372401993-03-16 12:15:04 +0000656 return mkvalue("(ff)", f1, f2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000657}
658
Guido van Rossum03747111991-08-08 12:10:01 +0000659#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000660static object *
661call_forms_OUTf (func, obj, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000662 void (*func)(FL_OBJECT *, float *);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000663 FL_OBJECT *obj;
664 object *args;
665{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000666 float f;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000667
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000668 if (!getnoarg(args)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000669
670 (*func) (obj, &f);
671
672 return newfloatobject (f);
673}
Guido van Rossum03747111991-08-08 12:10:01 +0000674#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000675
676/**********************************************************************/
677/* Class : browser */
678
679static object *
680set_browser_topline(g, args)
681 genericobject *g;
682 object *args;
683{
Guido van Rossum03747111991-08-08 12:10:01 +0000684 return call_forms_INi (fl_set_browser_topline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000685}
686
687static object *
688clear_browser(g, args)
689 genericobject *g;
690 object *args;
691{
Guido van Rossum03747111991-08-08 12:10:01 +0000692 return generic_call (g, args, fl_clear_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000693}
694
695static object *
696add_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000697 genericobject *g;
698 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000699{
Guido van Rossum03747111991-08-08 12:10:01 +0000700 return call_forms_INstr (fl_add_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000701}
702
703static object *
704addto_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000705 genericobject *g;
706 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000707{
Guido van Rossum03747111991-08-08 12:10:01 +0000708 return call_forms_INstr (fl_addto_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000709}
710
711static object *
712insert_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000713 genericobject *g;
714 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000715{
Guido van Rossum03747111991-08-08 12:10:01 +0000716 return call_forms_INiINstr (fl_insert_browser_line,
717 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000718}
719
720static object *
721delete_browser_line (g, args)
722 genericobject *g;
723 object *args;
724{
Guido van Rossum03747111991-08-08 12:10:01 +0000725 return call_forms_INi (fl_delete_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000726}
727
728static object *
729replace_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000730 genericobject *g;
731 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000732{
Guido van Rossum03747111991-08-08 12:10:01 +0000733 return call_forms_INiINstr (fl_replace_browser_line,
734 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000735}
736
737static object *
738get_browser_line(g, args)
739 genericobject *g;
740 object *args;
741{
742 int i;
743 char *str;
744
745 if (!getintarg(args, &i))
746 return NULL;
747
748 str = fl_get_browser_line (g->ob_generic, i);
749
Guido van Rossum2df7bcc1991-10-20 20:18:26 +0000750 if (str == NULL) {
751 INCREF(None);
752 return None;
753 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000754 return newstringobject (str);
755}
756
757static object *
758load_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000759 genericobject *g;
760 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000761{
Guido van Rossumabe58351991-08-08 12:34:44 +0000762 /* XXX strictly speaking this is wrong since fl_load_browser
763 XXX returns int, not void */
Guido van Rossum03747111991-08-08 12:10:01 +0000764 return call_forms_INstr (fl_load_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000765}
766
767static object *
768get_browser_maxline(g, args)
769 genericobject *g;
770 object *args;
771{
Guido van Rossum03747111991-08-08 12:10:01 +0000772 return call_forms_Ri (fl_get_browser_maxline, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000773}
774
775static object *
776select_browser_line (g, args)
777 genericobject *g;
778 object *args;
779{
Guido van Rossum03747111991-08-08 12:10:01 +0000780 return call_forms_INi (fl_select_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000781}
782
783static object *
784deselect_browser_line (g, args)
785 genericobject *g;
786 object *args;
787{
Guido van Rossum03747111991-08-08 12:10:01 +0000788 return call_forms_INi (fl_deselect_browser_line, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000789}
790
791static object *
792deselect_browser (g, args)
793 genericobject *g;
794 object *args;
795{
Guido van Rossum03747111991-08-08 12:10:01 +0000796 return generic_call (g, args, fl_deselect_browser);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000797}
798
799static object *
800isselected_browser_line (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000801 genericobject *g;
802 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000803{
804 int i, j;
Guido van Rossum03747111991-08-08 12:10:01 +0000805
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000806 if (!getintarg(args, &i))
807 return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +0000808
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000809 j = fl_isselected_browser_line (g->ob_generic, i);
Guido van Rossum03747111991-08-08 12:10:01 +0000810
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000811 return newintobject (j);
812}
813
814static object *
815get_browser (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000816 genericobject *g;
817 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000818{
Guido van Rossum03747111991-08-08 12:10:01 +0000819 return call_forms_Ri (fl_get_browser, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000820}
821
822static object *
823set_browser_fontsize (g, args)
824 genericobject *g;
825 object *args;
826{
Guido van Rossum03747111991-08-08 12:10:01 +0000827 return call_forms_INf (fl_set_browser_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000828}
829
830static object *
831set_browser_fontstyle (g, args)
832 genericobject *g;
833 object *args;
834{
Guido van Rossum03747111991-08-08 12:10:01 +0000835 return call_forms_INi (fl_set_browser_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000836}
837
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000838static object *
839set_browser_specialkey (g, args)
840 genericobject *g;
841 object *args;
842{
843 return call_forms_INc(fl_set_browser_specialkey, g-> ob_generic, args);
844}
845
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000846static struct methodlist browser_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000847 {"set_browser_topline", (method)set_browser_topline},
848 {"clear_browser", (method)clear_browser},
849 {"add_browser_line", (method)add_browser_line},
850 {"addto_browser", (method)addto_browser},
851 {"insert_browser_line", (method)insert_browser_line},
852 {"delete_browser_line", (method)delete_browser_line},
853 {"replace_browser_line", (method)replace_browser_line},
854 {"get_browser_line", (method)get_browser_line},
855 {"load_browser", (method)load_browser},
856 {"get_browser_maxline", (method)get_browser_maxline},
857 {"select_browser_line", (method)select_browser_line},
858 {"deselect_browser_line", (method)deselect_browser_line},
859 {"deselect_browser", (method)deselect_browser},
860 {"isselected_browser_line", (method)isselected_browser_line},
861 {"get_browser", (method)get_browser},
862 {"set_browser_fontsize", (method)set_browser_fontsize},
863 {"set_browser_fontstyle", (method)set_browser_fontstyle},
864 {"set_browser_specialkey", (method)set_browser_specialkey},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000865 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000866};
867
868/* Class: button */
869
870static object *
871set_button(g, args)
872 genericobject *g;
873 object *args;
874{
Guido van Rossum03747111991-08-08 12:10:01 +0000875 return call_forms_INi (fl_set_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000876}
877
878static object *
879get_button(g, args)
880 genericobject *g;
881 object *args;
882{
Guido van Rossum03747111991-08-08 12:10:01 +0000883 return call_forms_Ri (fl_get_button, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000884}
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000885
886static object *
887get_button_numb(g, args)
888 genericobject *g;
889 object *args;
890{
891 return call_forms_Ri (fl_get_button_numb, g-> ob_generic, args);
892}
893
Guido van Rossumddc0d3e1991-12-10 13:56:42 +0000894static object *
895set_button_shortcut(g, args)
896 genericobject *g;
897 object *args;
898{
899 return call_forms_INstr (fl_set_button_shortcut, g-> ob_generic, args);
900}
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000901
902static struct methodlist button_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000903 {"set_button", (method)set_button},
904 {"get_button", (method)get_button},
905 {"get_button_numb", (method)get_button_numb},
906 {"set_button_shortcut", (method)set_button_shortcut},
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000907 {NULL, NULL} /* sentinel */
908};
909
910/* Class: choice */
911
912static object *
913set_choice(g, args)
914 genericobject *g;
915 object *args;
916{
Guido van Rossum03747111991-08-08 12:10:01 +0000917 return call_forms_INi (fl_set_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000918}
919
920static object *
921get_choice(g, args)
922 genericobject *g;
923 object *args;
924{
Guido van Rossum03747111991-08-08 12:10:01 +0000925 return call_forms_Ri (fl_get_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000926}
927
928static object *
929clear_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000930 genericobject *g;
931 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000932{
Guido van Rossum03747111991-08-08 12:10:01 +0000933 return generic_call (g, args, fl_clear_choice);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000934}
935
936static object *
937addto_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000938 genericobject *g;
939 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000940{
Guido van Rossum03747111991-08-08 12:10:01 +0000941 return call_forms_INstr (fl_addto_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000942}
943
944static object *
945replace_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000946 genericobject *g;
947 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000948{
Guido van Rossum03747111991-08-08 12:10:01 +0000949 return call_forms_INiINstr (fl_replace_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000950}
951
952static object *
953delete_choice (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000954 genericobject *g;
955 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000956{
Guido van Rossum03747111991-08-08 12:10:01 +0000957 return call_forms_INi (fl_delete_choice, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000958}
959
960static object *
961get_choice_text (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000962 genericobject *g;
963 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +0000964{
Guido van Rossum03747111991-08-08 12:10:01 +0000965 return call_forms_Rstr (fl_get_choice_text, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000966}
967
968static object *
969set_choice_fontsize (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000970 genericobject *g;
971 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000972{
Guido van Rossum03747111991-08-08 12:10:01 +0000973 return call_forms_INf (fl_set_choice_fontsize, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000974}
975
976static object *
977set_choice_fontstyle (g, args)
Guido van Rossum03747111991-08-08 12:10:01 +0000978 genericobject *g;
979 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000980{
Guido van Rossum03747111991-08-08 12:10:01 +0000981 return call_forms_INi (fl_set_choice_fontstyle, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000982}
983
984static struct methodlist choice_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000985 {"set_choice", (method)set_choice},
986 {"get_choice", (method)get_choice},
987 {"clear_choice", (method)clear_choice},
988 {"addto_choice", (method)addto_choice},
989 {"replace_choice", (method)replace_choice},
990 {"delete_choice", (method)delete_choice},
991 {"get_choice_text", (method)get_choice_text},
992 {"set_choice_fontsize", (method)set_choice_fontsize},
993 {"set_choice_fontstyle",(method)set_choice_fontstyle},
Guido van Rossumc7df79e1991-08-07 11:32:58 +0000994 {NULL, NULL} /* sentinel */
995};
996
997/* Class : Clock */
998
999static object *
1000get_clock(g, args)
1001 genericobject *g;
1002 object *args;
1003{
1004 int i0, i1, i2;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001005
1006 if (!getnoarg(args))
1007 return NULL;
1008
1009 fl_get_clock (g->ob_generic, &i0, &i1, &i2);
1010
Guido van Rossume5372401993-03-16 12:15:04 +00001011 return mkvalue("(iii)", i0, i1, i2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001012}
1013
1014static struct methodlist clock_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001015 {"get_clock", (method)get_clock},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001016 {NULL, NULL} /* sentinel */
1017};
1018
1019/* CLass : Counters */
1020
1021static object *
1022get_counter_value(g, args)
1023 genericobject *g;
1024 object *args;
1025{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001026 return call_forms_Rf (fl_get_counter_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001027}
1028
1029static object *
1030set_counter_value (g, args)
1031 genericobject *g;
1032 object *args;
1033{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001034 return call_forms_INf (fl_set_counter_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001035}
1036
1037static object *
1038set_counter_precision (g, args)
1039 genericobject *g;
1040 object *args;
1041{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001042 return call_forms_INi (fl_set_counter_precision, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001043}
1044
1045static object *
1046set_counter_bounds (g, args)
1047 genericobject *g;
1048 object *args;
1049{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001050 return call_forms_INfINf (fl_set_counter_bounds, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001051}
1052
1053static object *
1054set_counter_step (g, args)
1055 genericobject *g;
1056 object *args;
1057{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001058 return call_forms_INfINf (fl_set_counter_step, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001059}
1060
1061static object *
1062set_counter_return (g, args)
1063 genericobject *g;
1064 object *args;
1065{
Guido van Rossum03747111991-08-08 12:10:01 +00001066 return call_forms_INi (fl_set_counter_return, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001067}
1068
1069static struct methodlist counter_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001070 {"set_counter_value", (method)set_counter_value},
1071 {"get_counter_value", (method)get_counter_value},
1072 {"set_counter_bounds", (method)set_counter_bounds},
1073 {"set_counter_step", (method)set_counter_step},
1074 {"set_counter_precision", (method)set_counter_precision},
1075 {"set_counter_return", (method)set_counter_return},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001076 {NULL, NULL} /* sentinel */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001077};
1078
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001079
1080/* Class: Dials */
1081
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001082static object *
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001083get_dial_value(g, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001084 genericobject *g;
1085 object *args;
1086{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001087 return call_forms_Rf (fl_get_dial_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001088}
1089
1090static object *
1091set_dial_value (g, args)
1092 genericobject *g;
1093 object *args;
1094{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001095 return call_forms_INf (fl_set_dial_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001096}
1097
1098static object *
1099set_dial_bounds (g, args)
1100 genericobject *g;
1101 object *args;
1102{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001103 return call_forms_INfINf (fl_set_dial_bounds, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001104}
1105
1106static object *
1107get_dial_bounds (g, args)
1108 genericobject *g;
1109 object *args;
1110{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001111 return call_forms_OUTfOUTf (fl_get_dial_bounds, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001112}
1113
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001114static object *
1115set_dial_step (g, args)
1116 genericobject *g;
1117 object *args;
1118{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001119 return call_forms_INf (fl_set_dial_step, g-> ob_generic, args);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001120}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001121
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001122static struct methodlist dial_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001123 {"set_dial_value", (method)set_dial_value},
1124 {"get_dial_value", (method)get_dial_value},
1125 {"set_dial_bounds", (method)set_dial_bounds},
1126 {"get_dial_bounds", (method)get_dial_bounds},
1127 {"set_dial_step", (method)set_dial_step},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001128 {NULL, NULL} /* sentinel */
1129};
1130
1131/* Class : Input */
1132
1133static object *
1134set_input (g, args)
1135 genericobject *g;
1136 object *args;
1137{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001138 return call_forms_INstr (fl_set_input, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001139}
1140
1141static object *
1142get_input (g, args)
1143 genericobject *g;
1144 object *args;
1145{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001146 return call_forms_Rstr (fl_get_input, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001147}
1148
1149static object *
1150set_input_color (g, args)
1151 genericobject *g;
1152 object *args;
1153{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001154 return call_forms_INfINf (fl_set_input_color, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001155}
1156
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001157static object *
1158set_input_return (g, args)
1159 genericobject *g;
1160 object *args;
1161{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001162 return call_forms_INi (fl_set_input_return, g-> ob_generic, args);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001163}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001164
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001165static struct methodlist input_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001166 {"set_input", (method)set_input},
1167 {"get_input", (method)get_input},
1168 {"set_input_color", (method)set_input_color},
1169 {"set_input_return", (method)set_input_return},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001170 {NULL, NULL} /* sentinel */
1171};
1172
1173
1174/* Class : Menu */
1175
1176static object *
1177set_menu (g, args)
1178 genericobject *g;
1179 object *args;
1180{
Guido van Rossumabe58351991-08-08 12:34:44 +00001181 return call_forms_INstr (fl_set_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001182}
1183
1184static object *
1185get_menu (g, args)
1186 genericobject *g;
1187 object *args;
1188{
Guido van Rossumabe58351991-08-08 12:34:44 +00001189 /* XXX strictly speaking this is wrong since fl_get_menu
1190 XXX returns long, not int */
1191 return call_forms_Ri (fl_get_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001192}
1193
1194static object *
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001195get_menu_text (g, args)
1196 genericobject *g;
1197 object *args;
1198{
1199 return call_forms_Rstr (fl_get_menu_text, g-> ob_generic, args);
1200}
1201
1202static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001203addto_menu (g, args)
1204 genericobject *g;
1205 object *args;
1206{
Guido van Rossumabe58351991-08-08 12:34:44 +00001207 return call_forms_INstr (fl_addto_menu, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001208}
1209
1210static struct methodlist menu_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001211 {"set_menu", (method)set_menu},
1212 {"get_menu", (method)get_menu},
1213 {"get_menu_text", (method)get_menu_text},
1214 {"addto_menu", (method)addto_menu},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001215 {NULL, NULL} /* sentinel */
1216};
1217
1218
1219/* Class: Sliders */
1220
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001221static object *
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001222get_slider_value(g, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001223 genericobject *g;
1224 object *args;
1225{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001226 return call_forms_Rf (fl_get_slider_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001227}
1228
1229static object *
1230set_slider_value (g, args)
1231 genericobject *g;
1232 object *args;
1233{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001234 return call_forms_INf (fl_set_slider_value, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001235}
1236
1237static object *
1238set_slider_bounds (g, args)
1239 genericobject *g;
1240 object *args;
1241{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001242 return call_forms_INfINf (fl_set_slider_bounds, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001243}
1244
1245static object *
1246get_slider_bounds (g, args)
1247 genericobject *g;
1248 object *args;
1249{
1250 return call_forms_OUTfOUTf(fl_get_slider_bounds, g-> ob_generic, args);
1251}
1252
1253static object *
1254set_slider_return (g, args)
1255 genericobject *g;
1256 object *args;
1257{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001258 return call_forms_INf (fl_set_slider_return, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001259}
1260
1261static object *
1262set_slider_size (g, args)
1263 genericobject *g;
1264 object *args;
1265{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001266 return call_forms_INf (fl_set_slider_size, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001267}
1268
1269static object *
1270set_slider_precision (g, args)
1271 genericobject *g;
1272 object *args;
1273{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001274 return call_forms_INi (fl_set_slider_precision, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001275}
1276
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001277static object *
1278set_slider_step (g, args)
1279 genericobject *g;
1280 object *args;
1281{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001282 return call_forms_INf (fl_set_slider_step, g-> ob_generic, args);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001283}
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00001284
1285
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001286static struct methodlist slider_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001287 {"set_slider_value", (method)set_slider_value},
1288 {"get_slider_value", (method)get_slider_value},
1289 {"set_slider_bounds", (method)set_slider_bounds},
1290 {"get_slider_bounds", (method)get_slider_bounds},
1291 {"set_slider_return", (method)set_slider_return},
1292 {"set_slider_size", (method)set_slider_size},
1293 {"set_slider_precision",(method)set_slider_precision},
1294 {"set_slider_step", (method)set_slider_step},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001295 {NULL, NULL} /* sentinel */
1296};
1297
1298static object *
1299set_positioner_xvalue (g, args)
1300 genericobject *g;
1301 object *args;
1302{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001303 return call_forms_INf (fl_set_positioner_xvalue, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001304}
1305
1306static object *
1307set_positioner_xbounds (g, args)
1308 genericobject *g;
1309 object *args;
1310{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001311 return call_forms_INfINf (fl_set_positioner_xbounds,
1312 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001313}
1314
1315static object *
1316set_positioner_yvalue (g, args)
1317 genericobject *g;
1318 object *args;
1319{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001320 return call_forms_INf (fl_set_positioner_yvalue, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001321}
1322
1323static object *
1324set_positioner_ybounds (g, args)
1325 genericobject *g;
1326 object *args;
1327{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001328 return call_forms_INfINf (fl_set_positioner_ybounds,
1329 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001330}
1331
1332static object *
1333get_positioner_xvalue (g, args)
1334 genericobject *g;
1335 object *args;
1336{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001337 return call_forms_Rf (fl_get_positioner_xvalue, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001338}
1339
1340static object *
1341get_positioner_xbounds (g, args)
1342 genericobject *g;
1343 object *args;
1344{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001345 return call_forms_OUTfOUTf (fl_get_positioner_xbounds,
1346 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001347}
1348
1349static object *
1350get_positioner_yvalue (g, args)
1351 genericobject *g;
1352 object *args;
1353{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001354 return call_forms_Rf (fl_get_positioner_yvalue, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001355}
1356
1357static object *
1358get_positioner_ybounds (g, args)
1359 genericobject *g;
1360 object *args;
1361{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001362 return call_forms_OUTfOUTf (fl_get_positioner_ybounds,
1363 g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001364}
1365
1366static struct methodlist positioner_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001367 {"set_positioner_xvalue", (method)set_positioner_xvalue},
1368 {"set_positioner_yvalue", (method)set_positioner_yvalue},
1369 {"set_positioner_xbounds", (method)set_positioner_xbounds},
1370 {"set_positioner_ybounds", (method)set_positioner_ybounds},
1371 {"get_positioner_xvalue", (method)get_positioner_xvalue},
1372 {"get_positioner_yvalue", (method)get_positioner_yvalue},
1373 {"get_positioner_xbounds", (method)get_positioner_xbounds},
1374 {"get_positioner_ybounds", (method)get_positioner_ybounds},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001375 {NULL, NULL} /* sentinel */
1376};
1377
1378/* Class timer */
1379
1380static object *
1381set_timer (g, args)
1382 genericobject *g;
1383 object *args;
1384{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001385 return call_forms_INf (fl_set_timer, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001386}
1387
1388static object *
1389get_timer (g, args)
1390 genericobject *g;
1391 object *args;
1392{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001393 return call_forms_Rf (fl_get_timer, g-> ob_generic, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001394}
1395
1396static struct methodlist timer_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001397 {"set_timer", (method)set_timer},
1398 {"get_timer", (method)get_timer},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001399 {NULL, NULL} /* sentinel */
1400};
1401
1402/* Form objects */
1403
1404typedef struct {
1405 OB_HEAD
1406 FL_FORM *ob_form;
1407} formobject;
1408
Guido van Rossumb6775db1994-08-01 11:34:53 +00001409staticforward typeobject Formtype;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001410
1411#define is_formobject(v) ((v)->ob_type == &Formtype)
1412
1413static object *
1414form_show_form(f, args)
1415 formobject *f;
1416 object *args;
1417{
1418 int place, border;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001419 char *name;
1420 if (!getargs(args, "(iis)", &place, &border, &name))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001421 return NULL;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001422 fl_show_form(f->ob_form, place, border, name);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001423 INCREF(None);
1424 return None;
1425}
1426
1427static object *
1428form_call(func, f, args)
1429 FL_FORM *f;
1430 object *args;
1431 void (*func)(FL_FORM *);
1432{
1433 if (!getnoarg(args)) return NULL;
1434
1435 (*func)(f);
1436
1437 INCREF(None);
1438 return None;
1439}
1440
1441static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001442form_call_INiINi(func, f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001443 FL_FORM *f;
1444 object *args;
1445 void (*func)(FL_FORM *, int, int);
1446{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001447 int a, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001448
Guido van Rossum234f9421993-06-17 12:35:49 +00001449 if (!getargs(args, "(ii)", &a, &b)) return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001450
1451 (*func)(f, a, b);
1452
1453 INCREF(None);
1454 return None;
1455}
1456
1457static object *
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001458form_call_INfINf(func, f, args)
1459 FL_FORM *f;
1460 object *args;
1461 void (*func)(FL_FORM *, float, float);
1462{
1463 float a, b;
1464
1465 if (!getargs(args, "(ff)", &a, &b)) return NULL;
1466
1467 (*func)(f, a, b);
1468
1469 INCREF(None);
1470 return None;
1471}
1472
1473static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001474form_hide_form(f, args)
1475 formobject *f;
1476 object *args;
1477{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001478 return form_call(fl_hide_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001479}
1480
1481static object *
1482form_redraw_form(f, args)
1483 formobject *f;
1484 object *args;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001485{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001486 return form_call(fl_redraw_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001487}
1488
1489static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001490form_add_object(f, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001491 formobject *f;
1492 object *args;
1493{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001494 genericobject *g;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001495 if (args == NULL || !is_genericobject(args)) {
1496 err_badarg();
1497 return NULL;
1498 }
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001499 g = (genericobject *)args;
1500 if (findgeneric(g->ob_generic) != NULL) {
1501 err_setstr(RuntimeError,
1502 "add_object of object already in a form");
1503 return NULL;
1504 }
1505 fl_add_object(f->ob_form, g->ob_generic);
1506 knowgeneric(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001507
1508 INCREF(None);
1509 return None;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001510}
1511
1512static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001513form_set_form_position(f, args)
1514 formobject *f;
1515 object *args;
1516{
1517 return form_call_INiINi(fl_set_form_position, f-> ob_form, args);
1518}
1519
1520static object *
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001521form_set_form_size(f, args)
1522 formobject *f;
1523 object *args;
1524{
1525 return form_call_INiINi(fl_set_form_size, f-> ob_form, args);
1526}
1527
1528static object *
1529form_scale_form(f, args)
1530 formobject *f;
1531 object *args;
1532{
1533 return form_call_INfINf(fl_scale_form, f-> ob_form, args);
1534}
1535
1536static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001537generic_add_object(f, args, func, internal_methods)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001538 formobject *f;
1539 object *args;
1540 FL_OBJECT *(*func)(int, float, float, float, float, char*);
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001541 struct methodlist *internal_methods;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001542{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001543 int type;
1544 float x, y, w, h;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001545 char *name;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001546 FL_OBJECT *obj;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001547
Guido van Rossumfc58e581992-01-27 16:45:55 +00001548 if (!getargs(args,"(iffffs)", &type,&x,&y,&w,&h,&name))
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001549 return NULL;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001550
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001551 fl_addto_form (f-> ob_form);
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001552
Guido van Rossumfc58e581992-01-27 16:45:55 +00001553 obj = (*func) (type, x, y, w, h, name);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001554
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001555 fl_end_form();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001556
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001557 if (obj == NULL) {
1558 err_nomem();
1559 return NULL;
1560 }
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001561
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001562 return newgenericobject (obj, internal_methods);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001563}
1564
1565static object *
1566form_add_button(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001567 formobject *f;
1568 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001569{
1570 return generic_add_object(f, args, fl_add_button, button_methods);
1571}
1572
1573static object *
1574form_add_lightbutton(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001575 formobject *f;
1576 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001577{
1578 return generic_add_object(f, args, fl_add_lightbutton, button_methods);
1579}
1580
1581static object *
1582form_add_roundbutton(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001583 formobject *f;
1584 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001585{
1586 return generic_add_object(f, args, fl_add_roundbutton, button_methods);
1587}
1588
1589static object *
1590form_add_menu (f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001591 formobject *f;
1592 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001593{
1594 return generic_add_object(f, args, fl_add_menu, menu_methods);
1595}
1596
1597static object *
1598form_add_slider(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001599 formobject *f;
1600 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001601{
1602 return generic_add_object(f, args, fl_add_slider, slider_methods);
1603}
1604
1605static object *
1606form_add_valslider(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001607 formobject *f;
1608 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001609{
1610 return generic_add_object(f, args, fl_add_valslider, slider_methods);
1611}
1612
1613static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001614form_add_dial(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001615 formobject *f;
1616 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001617{
1618 return generic_add_object(f, args, fl_add_dial, dial_methods);
1619}
1620
1621static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001622form_add_counter(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001623 formobject *f;
1624 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001625{
1626 return generic_add_object(f, args, fl_add_counter, counter_methods);
1627}
1628
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001629static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001630form_add_clock(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001631 formobject *f;
1632 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001633{
1634 return generic_add_object(f, args, fl_add_clock, clock_methods);
1635}
1636
1637static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001638form_add_box(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001639 formobject *f;
1640 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001641{
Guido van Rossum03747111991-08-08 12:10:01 +00001642 return generic_add_object(f, args, fl_add_box,
1643 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001644}
1645
1646static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001647form_add_choice(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001648 formobject *f;
1649 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001650{
1651 return generic_add_object(f, args, fl_add_choice, choice_methods);
1652}
1653
1654static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001655form_add_browser(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001656 formobject *f;
1657 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001658{
1659 return generic_add_object(f, args, fl_add_browser, browser_methods);
1660}
1661
1662static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001663form_add_positioner(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001664 formobject *f;
1665 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001666{
1667 return generic_add_object(f, args, fl_add_positioner, positioner_methods);
1668}
1669
1670static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001671form_add_input(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001672 formobject *f;
1673 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001674{
1675 return generic_add_object(f, args, fl_add_input, input_methods);
1676}
1677
1678static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001679form_add_text(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001680 formobject *f;
1681 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001682{
Guido van Rossum03747111991-08-08 12:10:01 +00001683 return generic_add_object(f, args, fl_add_text,
1684 (struct methodlist *)NULL);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001685}
1686
1687static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001688form_add_timer(f, args)
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001689 formobject *f;
1690 object *args;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001691{
1692 return generic_add_object(f, args, fl_add_timer, timer_methods);
1693}
1694
1695static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001696form_freeze_form(f, args)
1697 formobject *f;
1698 object *args;
1699{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001700 return form_call(fl_freeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001701}
1702
1703static object *
1704form_unfreeze_form(f, args)
1705 formobject *f;
1706 object *args;
1707{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001708 return form_call(fl_unfreeze_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001709}
1710
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001711static object *
1712form_activate_form(f, args)
1713 formobject *f;
1714 object *args;
1715{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001716 return form_call(fl_activate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001717}
1718
1719static object *
1720form_deactivate_form(f, args)
1721 formobject *f;
1722 object *args;
1723{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001724 return form_call(fl_deactivate_form, f-> ob_form, args);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001725}
1726
Guido van Rossum75cc8981991-08-08 12:07:45 +00001727static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001728form_bgn_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001729 formobject *f;
1730 object *args;
1731{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001732 FL_OBJECT *obj;
1733
1734 fl_addto_form(f-> ob_form);
1735 obj = fl_bgn_group();
1736 fl_end_form();
1737
1738 if (obj == NULL) {
1739 err_nomem();
1740 return NULL;
1741 }
1742
1743 return newgenericobject (obj, (struct methodlist *) NULL);
Guido van Rossum03747111991-08-08 12:10:01 +00001744}
1745
1746static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001747form_end_group(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001748 formobject *f;
1749 object *args;
1750{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001751 fl_addto_form(f-> ob_form);
Guido van Rossum03747111991-08-08 12:10:01 +00001752 fl_end_group();
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001753 fl_end_form();
Guido van Rossum03747111991-08-08 12:10:01 +00001754 INCREF(None);
1755 return None;
1756}
1757
1758static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001759forms_find_first_or_last(func, f, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00001760 FL_OBJECT *(*func)(FL_FORM *, int, float, float);
Guido van Rossum03747111991-08-08 12:10:01 +00001761 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001762 object *args;
1763{
1764 int type;
1765 float mx, my;
1766 FL_OBJECT *generic;
1767 genericobject *g;
1768
Guido van Rossumfc58e581992-01-27 16:45:55 +00001769 if (!getargs(args, "(iff)", &type, &mx, &my)) return NULL;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001770
Guido van Rossum03747111991-08-08 12:10:01 +00001771 generic = (*func) (f-> ob_form, type, mx, my);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001772
1773 if (generic == NULL)
1774 {
1775 INCREF(None);
1776 return None;
1777 }
1778
1779 g = findgeneric(generic);
1780 if (g == NULL) {
1781 err_setstr(RuntimeError,
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001782 "forms_find_{first|last} returns unknown object");
Guido van Rossum75cc8981991-08-08 12:07:45 +00001783 return NULL;
1784 }
1785 INCREF(g);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001786 return (object *) g;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001787}
1788
1789static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001790form_find_first(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001791 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001792 object *args;
1793{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001794 return forms_find_first_or_last(fl_find_first, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001795}
1796
1797static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001798form_find_last(f, args)
Guido van Rossum03747111991-08-08 12:10:01 +00001799 formobject *f;
Guido van Rossum75cc8981991-08-08 12:07:45 +00001800 object *args;
1801{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001802 return forms_find_first_or_last(fl_find_last, f, args);
Guido van Rossum75cc8981991-08-08 12:07:45 +00001803}
1804
Guido van Rossum7066dd71992-09-17 17:54:56 +00001805static object *
1806form_set_object_focus(f, args)
1807 formobject *f;
1808 object *args;
1809{
1810 genericobject *g;
1811 if (args == NULL || !is_genericobject(args)) {
1812 err_badarg();
1813 return NULL;
1814 }
1815 g = (genericobject *)args;
1816 fl_set_object_focus(f->ob_form, g->ob_generic);
1817 INCREF(None);
1818 return None;
1819}
1820
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001821static struct methodlist form_methods[] = {
1822/* adm */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001823 {"show_form", (method)form_show_form},
1824 {"hide_form", (method)form_hide_form},
1825 {"redraw_form", (method)form_redraw_form},
1826 {"set_form_position", (method)form_set_form_position},
1827 {"set_form_size", (method)form_set_form_size},
1828 {"scale_form", (method)form_scale_form},
1829 {"freeze_form", (method)form_freeze_form},
1830 {"unfreeze_form", (method)form_unfreeze_form},
1831 {"activate_form", (method)form_activate_form},
1832 {"deactivate_form", (method)form_deactivate_form},
1833 {"bgn_group", (method)form_bgn_group},
1834 {"end_group", (method)form_end_group},
1835 {"find_first", (method)form_find_first},
1836 {"find_last", (method)form_find_last},
1837 {"set_object_focus", (method)form_set_object_focus},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001838
1839/* basic objects */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001840 {"add_button", (method)form_add_button},
1841/* {"add_bitmap", (method)form_add_bitmap}, */
1842 {"add_lightbutton", (method)form_add_lightbutton},
1843 {"add_roundbutton", (method)form_add_roundbutton},
1844 {"add_menu", (method)form_add_menu},
1845 {"add_slider", (method)form_add_slider},
1846 {"add_positioner", (method)form_add_positioner},
1847 {"add_valslider", (method)form_add_valslider},
1848 {"add_dial", (method)form_add_dial},
1849 {"add_counter", (method)form_add_counter},
1850 {"add_box", (method)form_add_box},
1851 {"add_clock", (method)form_add_clock},
1852 {"add_choice", (method)form_add_choice},
1853 {"add_browser", (method)form_add_browser},
1854 {"add_input", (method)form_add_input},
1855 {"add_timer", (method)form_add_timer},
1856 {"add_text", (method)form_add_text},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001857 {NULL, NULL} /* sentinel */
1858};
1859
1860static void
1861form_dealloc(f)
1862 formobject *f;
1863{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001864 releaseobjects(f->ob_form);
Guido van Rossum336b5911992-04-08 11:16:25 +00001865 if (f->ob_form->visible)
1866 fl_hide_form(f->ob_form);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001867 fl_free_form(f->ob_form);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001868 DEL(f);
1869}
1870
Guido van Rossumd97f0481991-11-19 20:26:28 +00001871#define OFF(x) offsetof(FL_FORM, x)
1872
Guido van Rossum32db5e31991-11-12 15:43:18 +00001873static struct memberlist form_memberlist[] = {
1874 {"window", T_LONG, OFF(window), RO},
1875 {"w", T_FLOAT, OFF(w)},
1876 {"h", T_FLOAT, OFF(h)},
Guido van Rossum7066dd71992-09-17 17:54:56 +00001877 {"x", T_FLOAT, OFF(x), RO},
1878 {"y", T_FLOAT, OFF(y), RO},
Guido van Rossum32db5e31991-11-12 15:43:18 +00001879 {"deactivated", T_INT, OFF(deactivated)},
Guido van Rossum7066dd71992-09-17 17:54:56 +00001880 {"visible", T_INT, OFF(visible), RO},
1881 {"frozen", T_INT, OFF(frozen), RO},
Guido van Rossum32db5e31991-11-12 15:43:18 +00001882 {"doublebuf", T_INT, OFF(doublebuf)},
1883 {NULL} /* Sentinel */
1884};
1885
Guido van Rossumd97f0481991-11-19 20:26:28 +00001886#undef OFF
1887
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001888static object *
1889form_getattr(f, name)
1890 formobject *f;
1891 char *name;
1892{
Guido van Rossum32db5e31991-11-12 15:43:18 +00001893 object *meth;
1894
1895 meth = findmethod(form_methods, (object *)f, name);
1896 if (meth != NULL)
1897 return meth;
1898 err_clear();
1899 return getmember((char *)f->ob_form, form_memberlist, name);
1900}
1901
1902static int
1903form_setattr(f, name, v)
1904 formobject *f;
1905 char *name;
1906 object *v;
1907{
1908 int ret;
1909
1910 if (v == NULL) {
1911 err_setstr(TypeError, "can't delete form attributes");
Guido van Rossum3863abb1996-09-11 23:31:07 +00001912 return -1;
Guido van Rossum32db5e31991-11-12 15:43:18 +00001913 }
1914
1915 return setmember((char *)f->ob_form, form_memberlist, name, v);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001916}
1917
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00001918static object *
1919form_repr(f)
1920 formobject *f;
1921{
1922 char buf[100];
1923 sprintf(buf, "<FORMS_form at %lx, window=%ld>",
1924 (long)f, f->ob_form->window);
1925 return newstringobject(buf);
1926}
1927
Guido van Rossumb6775db1994-08-01 11:34:53 +00001928static typeobject Formtype = {
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001929 OB_HEAD_INIT(&Typetype)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001930 0, /*ob_size*/
1931 "FORMS_form", /*tp_name*/
1932 sizeof(formobject), /*tp_size*/
1933 0, /*tp_itemsize*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001934 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001935 (destructor)form_dealloc, /*tp_dealloc*/
1936 0, /*tp_print*/
1937 (getattrfunc)form_getattr, /*tp_getattr*/
1938 (setattrfunc)form_setattr, /*tp_setattr*/
1939 0, /*tp_compare*/
1940 (reprfunc)form_repr, /*tp_repr*/
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001941};
1942
1943static object *
1944newformobject(form)
1945 FL_FORM *form;
1946{
1947 formobject *f;
1948 f = NEWOBJ(formobject, &Formtype);
1949 if (f == NULL)
1950 return NULL;
1951 f->ob_form = form;
1952 return (object *)f;
1953}
1954
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001955
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001956/* The "fl" module */
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00001957
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001958static object *
1959forms_make_form(dummy, args)
1960 object *dummy;
1961 object *args;
1962{
1963 int type;
1964 float w, h;
1965 FL_FORM *form;
Guido van Rossumfc58e581992-01-27 16:45:55 +00001966 if (!getargs(args, "(iff)", &type, &w, &h))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001967 return NULL;
1968 form = fl_bgn_form(type, w, h);
1969 if (form == NULL) {
1970 /* XXX Actually, cannot happen! */
1971 err_nomem();
1972 return NULL;
1973 }
1974 fl_end_form();
1975 return newformobject(form);
1976}
1977
Guido van Rossum2bac4d31992-03-27 17:20:21 +00001978static object *
1979forms_activate_all_forms(f, args)
1980 object *f;
1981 object *args;
1982{
1983 fl_activate_all_forms();
1984 INCREF(None);
1985 return None;
1986}
1987
1988static object *
1989forms_deactivate_all_forms(f, args)
1990 object *f;
1991 object *args;
1992{
1993 fl_deactivate_all_forms();
1994 INCREF(None);
1995 return None;
1996}
1997
Guido van Rossumc7df79e1991-08-07 11:32:58 +00001998static object *my_event_callback = NULL;
1999
2000static object *
2001forms_set_event_call_back(dummy, args)
2002 object *dummy;
2003 object *args;
2004{
Guido van Rossumf6da4f61993-07-26 15:24:57 +00002005 if (args == None)
2006 args = NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002007 my_event_callback = args;
2008 XINCREF(args);
2009 INCREF(None);
2010 return None;
2011}
2012
2013static object *
2014forms_do_or_check_forms(dummy, args, func)
2015 object *dummy;
2016 object *args;
2017 FL_OBJECT *(*func)();
2018{
2019 FL_OBJECT *generic;
2020 genericobject *g;
2021 object *arg, *res;
2022
2023 if (!getnoarg(args))
2024 return NULL;
2025
2026 for (;;) {
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002027 BGN_SAVE
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002028 generic = (*func)();
Jack Jansen743db361992-08-13 14:13:11 +00002029 END_SAVE
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002030 if (generic == NULL) {
2031 INCREF(None);
2032 return None;
2033 }
2034 if (generic == FL_EVENT) {
2035 int dev;
2036 short val;
2037 if (my_event_callback == NULL)
Guido van Rossum7066dd71992-09-17 17:54:56 +00002038 return newintobject(-1L);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002039 dev = fl_qread(&val);
Guido van Rossume5372401993-03-16 12:15:04 +00002040 arg = mkvalue("(ih)", dev, val);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002041 if (arg == NULL)
2042 return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002043 res = call_object(my_event_callback, arg);
2044 XDECREF(res);
2045 DECREF(arg);
2046 if (res == NULL)
2047 return NULL; /* Callback raised exception */
2048 continue;
2049 }
2050 g = findgeneric(generic);
2051 if (g == NULL) {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00002052 /* Object not known to us (some dialogs cause this) */
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002053 continue; /* Ignore it */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002054 }
2055 if (g->ob_callback == NULL) {
2056 INCREF(g);
2057 return ((object *) g);
2058 }
Guido van Rossume5372401993-03-16 12:15:04 +00002059 arg = mkvalue("(OO)", (object *)g, g->ob_callback_arg);
2060 if (arg == NULL)
2061 return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002062 res = call_object(g->ob_callback, arg);
2063 XDECREF(res);
2064 DECREF(arg);
2065 if (res == NULL)
2066 return NULL; /* Callback raised exception */
2067 }
2068}
2069
2070static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002071forms_do_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002072 object *dummy;
2073 object *args;
2074{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002075 return forms_do_or_check_forms(dummy, args, fl_do_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002076}
2077
2078static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002079forms_check_forms(dummy, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002080 object *dummy;
2081 object *args;
2082{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002083 return forms_do_or_check_forms(dummy, args, fl_check_forms);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002084}
2085
Guido van Rossum7066dd71992-09-17 17:54:56 +00002086static object *
2087forms_do_only_forms(dummy, args)
2088 object *dummy;
2089 object *args;
2090{
2091 return forms_do_or_check_forms(dummy, args, fl_do_only_forms);
2092}
2093
2094static object *
2095forms_check_only_forms(dummy, args)
2096 object *dummy;
2097 object *args;
2098{
2099 return forms_do_or_check_forms(dummy, args, fl_check_only_forms);
2100}
2101
Guido van Rossum03747111991-08-08 12:10:01 +00002102#ifdef UNUSED
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002103static object *
2104fl_call(func, args)
2105 object *args;
2106 void (*func)();
2107{
2108 if (!getnoarg(args))
2109 return NULL;
2110 (*func)();
2111 INCREF(None);
2112 return None;
2113}
Guido van Rossum03747111991-08-08 12:10:01 +00002114#endif
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002115
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002116static object *
2117forms_set_graphics_mode(dummy, args)
2118 object *dummy;
2119 object *args;
2120{
2121 int rgbmode, doublebuf;
2122
Guido van Rossum234f9421993-06-17 12:35:49 +00002123 if (!getargs(args, "(ii)", &rgbmode, &doublebuf))
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002124 return NULL;
2125 fl_set_graphics_mode(rgbmode,doublebuf);
2126 INCREF(None);
2127 return None;
2128}
2129
2130static object *
2131forms_get_rgbmode(dummy, args)
2132 object *dummy;
2133 object *args;
2134{
Guido van Rossum7066dd71992-09-17 17:54:56 +00002135 extern int fl_rgbmode;
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002136
2137 if (args != NULL) {
2138 err_badarg();
2139 return NULL;
2140 }
Guido van Rossum7066dd71992-09-17 17:54:56 +00002141 return newintobject((long)fl_rgbmode);
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002142}
Guido van Rossum7066dd71992-09-17 17:54:56 +00002143
2144static object *
2145forms_show_errors(dummy, args)
2146 object *dummy;
2147 object *args;
2148{
2149 int show;
2150 if (!getargs(args, "i", &show))
2151 return NULL;
2152 fl_show_errors(show);
2153 INCREF(None);
2154 return None;
2155}
2156
2157static object *
2158forms_set_font_name(dummy, args)
2159 object *dummy;
2160 object *args;
2161{
2162 int numb;
2163 char *name;
2164 if (!getargs(args, "(is)", &numb, &name))
2165 return NULL;
2166 fl_set_font_name(numb, name);
2167 INCREF(None);
2168 return None;
2169}
2170
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002171
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002172static object *
2173forms_qdevice(self, args)
2174 object *self;
2175 object *args;
2176{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002177 short arg1;
2178 if (!getargs(args, "h", &arg1))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002179 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002180 fl_qdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002181 INCREF(None);
2182 return None;
2183}
2184
2185static object *
2186forms_unqdevice(self, args)
2187 object *self;
2188 object *args;
2189{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002190 short arg1;
2191 if (!getargs(args, "h", &arg1))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002192 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002193 fl_unqdevice(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002194 INCREF(None);
2195 return None;
2196}
2197
2198static object *
2199forms_isqueued(self, args)
2200 object *self;
2201 object *args;
2202{
Guido van Rossum03747111991-08-08 12:10:01 +00002203 long retval;
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002204 short arg1;
2205 if (!getargs(args, "h", &arg1))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002206 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002207 retval = fl_isqueued(arg1);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002208
Guido van Rossum03747111991-08-08 12:10:01 +00002209 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002210}
2211
2212static object *
2213forms_qtest(self, args)
2214 object *self;
2215 object *args;
2216{
2217 long retval;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002218 retval = fl_qtest();
Guido van Rossum03747111991-08-08 12:10:01 +00002219 return newintobject(retval);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002220}
2221
2222
2223static object *
2224forms_qread(self, args)
2225 object *self;
2226 object *args;
2227{
Guido van Rossume5372401993-03-16 12:15:04 +00002228 int dev;
2229 short val;
Jack Jansen743db361992-08-13 14:13:11 +00002230 BGN_SAVE
Guido van Rossume5372401993-03-16 12:15:04 +00002231 dev = fl_qread(&val);
Jack Jansen743db361992-08-13 14:13:11 +00002232 END_SAVE
Guido van Rossume5372401993-03-16 12:15:04 +00002233 return mkvalue("(ih)", dev, val);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002234}
2235
2236static object *
2237forms_qreset(self, args)
2238 object *self;
2239 object *args;
2240{
2241 if (!getnoarg(args)) return NULL;
2242
Guido van Rossum03747111991-08-08 12:10:01 +00002243 fl_qreset();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002244 INCREF(None);
2245 return None;
2246}
2247
2248static object *
2249forms_qenter(self, args)
2250 object *self;
2251 object *args;
2252{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002253 short arg1, arg2;
2254 if (!getargs(args, "(hh)", &arg1, &arg2))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002255 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002256 fl_qenter(arg1, arg2);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002257 INCREF(None);
2258 return None;
2259}
2260
2261static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002262forms_color(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002263 object *self;
2264 object *args;
2265{
2266 int arg;
2267
2268 if (!getintarg(args, &arg)) return NULL;
2269
2270 fl_color((short) arg);
2271
2272 INCREF(None);
2273 return None;
2274}
2275
2276static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002277forms_mapcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002278 object *self;
2279 object *args;
2280{
2281 int arg0, arg1, arg2, arg3;
2282
Guido van Rossumfc58e581992-01-27 16:45:55 +00002283 if (!getargs(args, "(iiii)", &arg0, &arg1, &arg2, &arg3))
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002284 return NULL;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002285
2286 fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);
2287
2288 INCREF(None);
2289 return None;
2290}
2291
2292static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002293forms_getmcolor(self, args)
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002294 object *self;
2295 object *args;
2296{
Guido van Rossum03747111991-08-08 12:10:01 +00002297 int arg;
2298 short r, g, b;
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002299
2300 if (!getintarg(args, &arg)) return NULL;
2301
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002302 fl_getmcolor(arg, &r, &g, &b);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002303
Guido van Rossume5372401993-03-16 12:15:04 +00002304 return mkvalue("(hhh)", r, g, b);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002305}
2306
2307static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002308forms_get_mouse(self, args)
Guido van Rossum75cc8981991-08-08 12:07:45 +00002309 object *self;
2310 object *args;
2311{
Guido van Rossume5372401993-03-16 12:15:04 +00002312 float x, y;
Guido van Rossum75cc8981991-08-08 12:07:45 +00002313
2314 if (!getnoarg(args)) return NULL;
2315
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002316 fl_get_mouse(&x, &y);
Guido van Rossum75cc8981991-08-08 12:07:45 +00002317
Guido van Rossume5372401993-03-16 12:15:04 +00002318 return mkvalue("(ff)", x, y);
Guido van Rossum75cc8981991-08-08 12:07:45 +00002319}
2320
2321static object *
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002322forms_tie(self, args)
2323 object *self;
2324 object *args;
2325{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002326 short arg1, arg2, arg3;
2327 if (!getargs(args, "(hhh)", &arg1, &arg2, &arg3))
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002328 return NULL;
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002329 fl_tie(arg1, arg2, arg3);
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002330 INCREF(None);
2331 return None;
2332}
2333
Guido van Rossum03747111991-08-08 12:10:01 +00002334static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002335forms_show_message(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002336 object *f;
2337 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002338{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002339 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002340
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002341 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002342
Jack Jansen743db361992-08-13 14:13:11 +00002343 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002344 fl_show_message(a, b, c);
Jack Jansen743db361992-08-13 14:13:11 +00002345 END_SAVE
Guido van Rossum03747111991-08-08 12:10:01 +00002346
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002347 INCREF(None);
Guido van Rossum03747111991-08-08 12:10:01 +00002348 return None;
2349}
2350
2351static object *
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002352forms_show_choice(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002353 object *f;
2354 object *args;
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002355{
2356 char *m1, *m2, *m3, *b1, *b2, *b3;
2357 int nb;
2358 char *format;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002359 long rv;
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002360
2361 if (args == NULL || !is_tupleobject(args)) {
2362 err_badarg();
2363 return NULL;
2364 }
2365 nb = gettuplesize(args) - 3;
2366 if (nb <= 0) {
2367 err_setstr(TypeError, "need at least one button label");
2368 return NULL;
2369 }
2370 if (is_intobject(gettupleitem(args, 3))) {
2371 err_setstr(TypeError,
2372 "'number-of-buttons' argument not needed");
2373 return NULL;
2374 }
2375 switch (nb) {
2376 case 1: format = "(ssss)"; break;
2377 case 2: format = "(sssss)"; break;
2378 case 3: format = "(ssssss)"; break;
2379 default:
2380 err_setstr(TypeError, "too many button labels");
2381 return NULL;
2382 }
2383
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002384 if (!getargs(args, format, &m1, &m2, &m3, &b1, &b2, &b3))
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002385 return NULL;
2386
Jack Jansen743db361992-08-13 14:13:11 +00002387 BGN_SAVE
2388 rv = fl_show_choice(m1, m2, m3, nb, b1, b2, b3);
2389 END_SAVE
2390 return newintobject(rv);
Guido van Rossumb3a0e4c1992-03-23 18:20:54 +00002391}
2392
2393static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002394forms_show_question(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002395 object *f;
2396 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002397{
Guido van Rossumfc58e581992-01-27 16:45:55 +00002398 int ret;
2399 char *a, *b, *c;
Guido van Rossum03747111991-08-08 12:10:01 +00002400
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002401 if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002402
Jack Jansen743db361992-08-13 14:13:11 +00002403 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002404 ret = fl_show_question(a, b, c);
Jack Jansen743db361992-08-13 14:13:11 +00002405 END_SAVE
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002406
2407 return newintobject((long) ret);
Guido van Rossum03747111991-08-08 12:10:01 +00002408}
2409
2410static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002411forms_show_input(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002412 object *f;
2413 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002414{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002415 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002416 char *a, *b;
Guido van Rossum03747111991-08-08 12:10:01 +00002417
Guido van Rossum234f9421993-06-17 12:35:49 +00002418 if (!getargs(args, "(ss)", &a, &b)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002419
Jack Jansen743db361992-08-13 14:13:11 +00002420 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002421 str = fl_show_input(a, b);
Jack Jansen743db361992-08-13 14:13:11 +00002422 END_SAVE
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002423
2424 if (str == NULL) {
2425 INCREF(None);
2426 return None;
2427 }
2428 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002429}
2430
2431static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002432forms_file_selector(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002433 object *f;
2434 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002435{
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002436 char *str;
Guido van Rossumfc58e581992-01-27 16:45:55 +00002437 char *a, *b, *c, *d;
Guido van Rossum03747111991-08-08 12:10:01 +00002438
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002439 if (!getargs(args, "(ssss)", &a, &b, &c, &d)) return NULL;
Guido van Rossum03747111991-08-08 12:10:01 +00002440
Jack Jansen743db361992-08-13 14:13:11 +00002441 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +00002442 str = fl_show_file_selector(a, b, c, d);
Jack Jansen743db361992-08-13 14:13:11 +00002443 END_SAVE
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002444
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002445 if (str == NULL) {
2446 INCREF(None);
2447 return None;
2448 }
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002449 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002450}
2451
2452
2453static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002454forms_file_selector_func(args, func)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002455 object *args;
2456 char *(*func)();
Guido van Rossum03747111991-08-08 12:10:01 +00002457{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002458 char *str;
Guido van Rossum03747111991-08-08 12:10:01 +00002459
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002460 str = (*func) ();
2461
2462 if (str == NULL) {
2463 INCREF(None);
2464 return None;
2465 }
2466 return newstringobject(str);
Guido van Rossum03747111991-08-08 12:10:01 +00002467}
2468
2469static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002470forms_get_directory(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002471 object *f;
2472 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002473{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002474 return forms_file_selector_func(args, fl_get_directory);
Guido van Rossum03747111991-08-08 12:10:01 +00002475}
2476
2477static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002478forms_get_pattern(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002479 object *f;
2480 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002481{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002482 return forms_file_selector_func(args, fl_get_pattern);
Guido van Rossum03747111991-08-08 12:10:01 +00002483}
2484
2485static object *
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002486forms_get_filename(f, args)
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002487 object *f;
2488 object *args;
Guido van Rossum03747111991-08-08 12:10:01 +00002489{
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002490 return forms_file_selector_func(args, fl_get_filename);
Guido van Rossum03747111991-08-08 12:10:01 +00002491}
2492
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002493static struct methodlist forms_methods[] = {
2494/* adm */
2495 {"make_form", forms_make_form},
Guido van Rossum2bac4d31992-03-27 17:20:21 +00002496 {"activate_all_forms", forms_activate_all_forms},
2497 {"deactivate_all_forms",forms_deactivate_all_forms},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002498/* gl support wrappers */
2499 {"qdevice", forms_qdevice},
2500 {"unqdevice", forms_unqdevice},
2501 {"isqueued", forms_isqueued},
2502 {"qtest", forms_qtest},
2503 {"qread", forms_qread},
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002504/* {"blkqread", forms_blkqread}, */
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002505 {"qreset", forms_qreset},
2506 {"qenter", forms_qenter},
Guido van Rossum03747111991-08-08 12:10:01 +00002507 {"get_mouse", forms_get_mouse},
2508 {"tie", forms_tie},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002509/* {"new_events", forms_new_events}, */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002510 {"color", forms_color},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002511 {"mapcolor", forms_mapcolor},
2512 {"getmcolor", forms_getmcolor},
2513/* interaction */
2514 {"do_forms", forms_do_forms},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00002515 {"do_only_forms", forms_do_only_forms},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002516 {"check_forms", forms_check_forms},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00002517 {"check_only_forms", forms_check_only_forms},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002518 {"set_event_call_back", forms_set_event_call_back},
2519/* goodies */
Guido van Rossumaa7ca2d1992-09-03 20:37:02 +00002520 {"show_message", forms_show_message},
2521 {"show_question", forms_show_question},
2522 {"show_choice", forms_show_choice},
2523 {"show_input", forms_show_input},
2524 {"show_file_selector", forms_file_selector},
2525 {"file_selector", forms_file_selector}, /* BW compat */
2526 {"get_directory", forms_get_directory},
2527 {"get_pattern", forms_get_pattern},
2528 {"get_filename", forms_get_filename},
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002529 {"set_graphics_mode", forms_set_graphics_mode},
2530 {"get_rgbmode", forms_get_rgbmode},
Guido van Rossum7066dd71992-09-17 17:54:56 +00002531 {"show_errors", forms_show_errors},
2532 {"set_font_name", forms_set_font_name},
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002533 {NULL, NULL} /* sentinel */
2534};
2535
2536void
2537initfl()
2538{
2539 initmodule("fl", forms_methods);
Guido van Rossum2df7bcc1991-10-20 20:18:26 +00002540 foreground();
Guido van Rossumddc0d3e1991-12-10 13:56:42 +00002541 fl_init();
Guido van Rossumc7df79e1991-08-07 11:32:58 +00002542}