]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Python/Python-2.7.2/Modules/flmodule.c
EmbeddedPkg: Extend NvVarStoreFormattedLib LIBRARY_CLASS
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Modules / flmodule.c
CommitLineData
4710c53d 1/* FL module -- interface to Mark Overmars' FORMS Library. */\r
2\r
3/* This code works with FORMS version 2.2 (if you defined\r
4 OBSOLETE_FORMS_CALLS), and 2.3.\r
5 FORMS can be ftp'ed from ftp.cs.ruu.nl (131.211.80.17), directory\r
6 /pub/SGI/FORMS. */\r
7\r
8/* A half-hearted attempt has been made to allow programs using this\r
9 * module to exploit parallelism (through the threads module). No provisions\r
10 * have been made for multiple threads to use this module at the same time,\r
11 * though. So, a program with a forms thread and a non-forms thread will work\r
12 * fine but a program with two threads using forms will probably crash (unless\r
13 * the program takes precaution to ensure that only one thread can be in\r
14 * this module at any time). This will have to be fixed some time.\r
15 * (A fix will probably also have to synchronize with the gl module).\r
16 */\r
17\r
18#include "Python.h"\r
19#include "forms.h"\r
20#include "structmember.h"\r
21\r
22/* Generic Forms Objects */\r
23\r
24typedef struct {\r
25 PyObject_HEAD\r
26 FL_OBJECT *ob_generic;\r
27 PyMethodDef *ob_methods;\r
28 PyObject *ob_callback;\r
29 PyObject *ob_callback_arg;\r
30} genericobject;\r
31\r
32static PyTypeObject GenericObjecttype;\r
33\r
34#define is_genericobject(g) ((g)->ob_type == &GenericObjecttype)\r
35\r
36/* List of all objects (XXX this should be a hash table on address...) */\r
37\r
38static PyObject *allgenerics = NULL;\r
39static int nfreeslots = 0;\r
40\r
41/* Add an object to the list of known objects */\r
42\r
43static void\r
44knowgeneric(genericobject *g)\r
45{\r
46 int i, n;\r
47 /* Create the list if it doesn't already exist */\r
48 if (allgenerics == NULL) {\r
49 allgenerics = PyList_New(0);\r
50 if (allgenerics == NULL) {\r
51 PyErr_Clear();\r
52 return; /* Too bad, live without allgenerics... */\r
53 }\r
54 }\r
55 if (nfreeslots > 0) {\r
56 /* Search the list for reusable slots (NULL items) */\r
57 /* XXX This can be made faster! */\r
58 n = PyList_Size(allgenerics);\r
59 for (i = 0; i < n; i++) {\r
60 if (PyList_GetItem(allgenerics, i) == NULL) {\r
61 Py_INCREF(g);\r
62 PyList_SetItem(allgenerics, i, (PyObject *)g);\r
63 nfreeslots--;\r
64 return;\r
65 }\r
66 }\r
67 /* Strange... no free slots found... */\r
68 nfreeslots = 0;\r
69 }\r
70 /* No free entries, append new item to the end */\r
71 PyList_Append(allgenerics, (PyObject *)g);\r
72}\r
73\r
74/* Find an object in the list of known objects */\r
75\r
76static genericobject *\r
77findgeneric(FL_OBJECT *generic)\r
78{\r
79 int i, n;\r
80 genericobject *g;\r
81\r
82 if (allgenerics == NULL)\r
83 return NULL; /* No objects known yet */\r
84 n = PyList_Size(allgenerics);\r
85 for (i = 0; i < n; i++) {\r
86 g = (genericobject *)PyList_GetItem(allgenerics, i);\r
87 if (g != NULL && g->ob_generic == generic)\r
88 return g;\r
89 }\r
90 return NULL; /* Unknown object */\r
91}\r
92\r
93/* Remove an object from the list of known objects */\r
94\r
95static void\r
96forgetgeneric(genericobject *g)\r
97{\r
98 int i, n;\r
99\r
100 Py_XDECREF(g->ob_callback);\r
101 g->ob_callback = NULL;\r
102 Py_XDECREF(g->ob_callback_arg);\r
103 g->ob_callback_arg = NULL;\r
104 if (allgenerics == NULL)\r
105 return; /* No objects known yet */\r
106 n = PyList_Size(allgenerics);\r
107 for (i = 0; i < n; i++) {\r
108 if (g == (genericobject *)PyList_GetItem(allgenerics, i)) {\r
109 PyList_SetItem(allgenerics, i, (PyObject *)NULL);\r
110 nfreeslots++;\r
111 break;\r
112 }\r
113 }\r
114}\r
115\r
116/* Called when a form is about to be freed --\r
117 remove all the objects that we know about from it. */\r
118\r
119static void\r
120releaseobjects(FL_FORM *form)\r
121{\r
122 int i, n;\r
123 genericobject *g;\r
124\r
125 if (allgenerics == NULL)\r
126 return; /* No objects known yet */\r
127 n = PyList_Size(allgenerics);\r
128 for (i = 0; i < n; i++) {\r
129 g = (genericobject *)PyList_GetItem(allgenerics, i);\r
130 if (g != NULL && g->ob_generic->form == form) {\r
131 fl_delete_object(g->ob_generic);\r
132 /* The object is now unreachable for\r
133 do_forms and check_forms, so\r
134 delete it from the list of known objects */\r
135 Py_XDECREF(g->ob_callback);\r
136 g->ob_callback = NULL;\r
137 Py_XDECREF(g->ob_callback_arg);\r
138 g->ob_callback_arg = NULL;\r
139 PyList_SetItem(allgenerics, i, (PyObject *)NULL);\r
140 nfreeslots++;\r
141 }\r
142 }\r
143}\r
144\r
145\r
146/* Methods of generic objects */\r
147\r
148static PyObject *\r
149generic_set_call_back(genericobject *g, PyObject *args)\r
150{\r
151 if (PyTuple_GET_SIZE(args) == 0) {\r
152 Py_XDECREF(g->ob_callback);\r
153 Py_XDECREF(g->ob_callback_arg);\r
154 g->ob_callback = NULL;\r
155 g->ob_callback_arg = NULL;\r
156 }\r
157 else {\r
158 PyObject *a, *b;\r
159 if (!PyArg_UnpackTuple(args, "set_call_back", 2, 2, &a, &b))\r
160 return NULL;\r
161 Py_XDECREF(g->ob_callback);\r
162 Py_XDECREF(g->ob_callback_arg);\r
163 g->ob_callback = a;\r
164 Py_INCREF(g->ob_callback);\r
165 g->ob_callback_arg = b;\r
166 Py_INCREF(g->ob_callback_arg);\r
167 }\r
168 Py_INCREF(Py_None);\r
169 return Py_None;\r
170}\r
171\r
172static PyObject *\r
173generic_call(genericobject *g, void (*func)(FL_OBJECT *))\r
174{\r
175 (*func)(g->ob_generic);\r
176 Py_INCREF(Py_None);\r
177 return Py_None;\r
178}\r
179\r
180static PyObject *\r
181generic_delete_object(genericobject *g)\r
182{\r
183 PyObject *res;\r
184 res = generic_call(g, fl_delete_object);\r
185 if (res != NULL)\r
186 forgetgeneric(g);\r
187 return res;\r
188}\r
189\r
190static PyObject *\r
191generic_show_object(genericobject *g)\r
192{\r
193 return generic_call(g, fl_show_object);\r
194}\r
195\r
196static PyObject *\r
197generic_hide_object(genericobject *g)\r
198{\r
199 return generic_call(g, fl_hide_object);\r
200}\r
201\r
202static PyObject *\r
203generic_redraw_object(genericobject *g)\r
204{\r
205 return generic_call(g, fl_redraw_object);\r
206}\r
207\r
208#ifdef OBSOLETE_FORMS_CALLS\r
209\r
210 /* (un)freeze_object() are obsolete in FORMS 2.2 and unsupported\r
211 in 2.3. Since there's no foolproof way to tell which version we're\r
212 using, we omit them unconditionally. */\r
213\r
214static PyObject *\r
215generic_freeze_object(genericobject *g)\r
216{\r
217 return generic_call(g, fl_freeze_object);\r
218}\r
219\r
220static PyObject *\r
221generic_unfreeze_object(genericobject *g)\r
222{\r
223 return generic_call(g, fl_unfreeze_object);\r
224}\r
225\r
226#endif /* OBSOLETE_FORMS_CALLS */\r
227\r
228static PyObject *\r
229generic_activate_object(genericobject *g)\r
230{\r
231 return generic_call(g, fl_activate_object);\r
232}\r
233\r
234static PyObject *\r
235generic_deactivate_object(genericobject *g)\r
236{\r
237 return generic_call(g, fl_deactivate_object);\r
238}\r
239\r
240static PyObject *\r
241generic_set_object_shortcut(genericobject *g, PyObject *args)\r
242{\r
243 char *str;\r
244 if (!PyArg_ParseTuple(args, "s:set_object_shortcut", &str))\r
245 return NULL;\r
246 fl_set_object_shortcut(g->ob_generic, str);\r
247 Py_INCREF(Py_None);\r
248 return Py_None;\r
249}\r
250\r
251static PyMethodDef generic_methods[] = {\r
252 {"set_call_back", (PyCFunction)generic_set_call_back, METH_VARARGS},\r
253 {"delete_object", (PyCFunction)generic_delete_object, METH_NOARGS},\r
254 {"show_object", (PyCFunction)generic_show_object, METH_NOARGS},\r
255 {"hide_object", (PyCFunction)generic_hide_object, METH_NOARGS},\r
256 {"redraw_object", (PyCFunction)generic_redraw_object, METH_NOARGS},\r
257#ifdef OBSOLETE_FORMS_CALLS\r
258 {"freeze_object", (PyCFunction)generic_freeze_object, METH_NOARGS},\r
259 {"unfreeze_object", (PyCFunction)generic_unfreeze_object, METH_NOARGS},\r
260#endif\r
261 {"activate_object", (PyCFunction)generic_activate_object, METH_NOARGS},\r
262 {"deactivate_object", (PyCFunction)generic_deactivate_object, METH_NOARGS},\r
263 {"set_object_shortcut", (PyCFunction)generic_set_object_shortcut, METH_VARARGS},\r
264 {NULL, NULL} /* sentinel */\r
265};\r
266\r
267static void\r
268generic_dealloc(genericobject *g)\r
269{\r
270 fl_free_object(g->ob_generic);\r
271 Py_XDECREF(g->ob_callback);\r
272 Py_XDECREF(g->ob_callback_arg);\r
273 PyObject_Del(g);\r
274}\r
275\r
276#define OFF(x) offsetof(FL_OBJECT, x)\r
277\r
278static struct memberlist generic_memberlist[] = {\r
279 {"objclass", T_INT, OFF(objclass), RO},\r
280 {"type", T_INT, OFF(type), RO},\r
281 {"boxtype", T_INT, OFF(boxtype)},\r
282 {"x", T_FLOAT, OFF(x)},\r
283 {"y", T_FLOAT, OFF(y)},\r
284 {"w", T_FLOAT, OFF(w)},\r
285 {"h", T_FLOAT, OFF(h)},\r
286 {"col1", T_INT, OFF(col1)},\r
287 {"col2", T_INT, OFF(col2)},\r
288 {"align", T_INT, OFF(align)},\r
289 {"lcol", T_INT, OFF(lcol)},\r
290 {"lsize", T_FLOAT, OFF(lsize)},\r
291 /* "label" is treated specially! */\r
292 {"lstyle", T_INT, OFF(lstyle)},\r
293 {"pushed", T_INT, OFF(pushed), RO},\r
294 {"focus", T_INT, OFF(focus), RO},\r
295 {"belowmouse", T_INT, OFF(belowmouse),RO},\r
296/* {"frozen", T_INT, OFF(frozen), RO}, */\r
297 {"active", T_INT, OFF(active)},\r
298 {"input", T_INT, OFF(input)},\r
299 {"visible", T_INT, OFF(visible), RO},\r
300 {"radio", T_INT, OFF(radio)},\r
301 {"automatic", T_INT, OFF(automatic)},\r
302 {NULL} /* Sentinel */\r
303};\r
304\r
305#undef OFF\r
306\r
307static PyObject *\r
308generic_getattr(genericobject *g, char *name)\r
309{\r
310 PyObject *meth;\r
311\r
312 /* XXX Ought to special-case name "__methods__" */\r
313 if (g-> ob_methods) {\r
314 meth = Py_FindMethod(g->ob_methods, (PyObject *)g, name);\r
315 if (meth != NULL) return meth;\r
316 PyErr_Clear();\r
317 }\r
318\r
319 meth = Py_FindMethod(generic_methods, (PyObject *)g, name);\r
320 if (meth != NULL)\r
321 return meth;\r
322 PyErr_Clear();\r
323\r
324 /* "label" is an exception, getmember only works for char pointers,\r
325 not for char arrays */\r
326 if (strcmp(name, "label") == 0)\r
327 return PyString_FromString(g->ob_generic->label);\r
328\r
329 return PyMember_Get((char *)g->ob_generic, generic_memberlist, name);\r
330}\r
331\r
332static int\r
333generic_setattr(genericobject *g, char *name, PyObject *v)\r
334{\r
335 int ret;\r
336\r
337 if (v == NULL) {\r
338 PyErr_SetString(PyExc_TypeError,\r
339 "can't delete forms object attributes");\r
340 return -1;\r
341 }\r
342\r
343 /* "label" is an exception: setmember doesn't set strings;\r
344 and FORMS wants you to call a function to set the label */\r
345 if (strcmp(name, "label") == 0) {\r
346 if (!PyString_Check(v)) {\r
347 PyErr_SetString(PyExc_TypeError,\r
348 "label attr must be string");\r
349 return -1;\r
350 }\r
351 fl_set_object_label(g->ob_generic, PyString_AsString(v));\r
352 return 0;\r
353 }\r
354\r
355 ret = PyMember_Set((char *)g->ob_generic, generic_memberlist, name, v);\r
356\r
357 /* Rather than calling all the various set_object_* functions,\r
358 we call fl_redraw_object here. This is sometimes redundant\r
359 but I doubt that's a big problem */\r
360 if (ret == 0)\r
361 fl_redraw_object(g->ob_generic);\r
362\r
363 return ret;\r
364}\r
365\r
366static PyObject *\r
367generic_repr(genericobject *g)\r
368{\r
369 char buf[100];\r
370 PyOS_snprintf(buf, sizeof(buf), "<FORMS_object at %p, objclass=%d>",\r
371 g, g->ob_generic->objclass);\r
372 return PyString_FromString(buf);\r
373}\r
374\r
375static PyTypeObject GenericObjecttype = {\r
376 PyObject_HEAD_INIT(&PyType_Type)\r
377 0, /*ob_size*/\r
378 "fl.FORMS_object", /*tp_name*/\r
379 sizeof(genericobject), /*tp_size*/\r
380 0, /*tp_itemsize*/\r
381 /* methods */\r
382 (destructor)generic_dealloc, /*tp_dealloc*/\r
383 0, /*tp_print*/\r
384 (getattrfunc)generic_getattr, /*tp_getattr*/\r
385 (setattrfunc)generic_setattr, /*tp_setattr*/\r
386 0, /*tp_compare*/\r
387 (reprfunc)generic_repr, /*tp_repr*/\r
388};\r
389\r
390static PyObject *\r
391newgenericobject(FL_OBJECT *generic, PyMethodDef *methods)\r
392{\r
393 genericobject *g;\r
394 g = PyObject_New(genericobject, &GenericObjecttype);\r
395 if (g == NULL)\r
396 return NULL;\r
397 g-> ob_generic = generic;\r
398 g->ob_methods = methods;\r
399 g->ob_callback = NULL;\r
400 g->ob_callback_arg = NULL;\r
401 knowgeneric(g);\r
402 return (PyObject *)g;\r
403}\r
404\r
405/**********************************************************************/\r
406/* Some common calling sequences */\r
407\r
408/* void func (object, float) */\r
409static PyObject *\r
410call_forms_INf (void (*func)(FL_OBJECT *, float), FL_OBJECT *obj, PyObject *args)\r
411{\r
412 float parameter;\r
413\r
414 if (!PyArg_Parse(args, "f", &parameter)) return NULL;\r
415\r
416 (*func) (obj, parameter);\r
417\r
418 Py_INCREF(Py_None);\r
419 return Py_None;\r
420}\r
421\r
422/* void func (object, float) */\r
423static PyObject *\r
424call_forms_INfINf (void (*func)(FL_OBJECT *, float, float), FL_OBJECT *obj, PyObject *args)\r
425{\r
426 float par1, par2;\r
427\r
428 if (!PyArg_Parse(args, "(ff)", &par1, &par2)) return NULL;\r
429\r
430 (*func) (obj, par1, par2);\r
431\r
432 Py_INCREF(Py_None);\r
433 return Py_None;\r
434}\r
435\r
436/* void func (object, int) */\r
437static PyObject *\r
438call_forms_INi (void (*func)(FL_OBJECT *, int), FL_OBJECT *obj, PyObject *args)\r
439{\r
440 int parameter;\r
441\r
442 if (!PyArg_Parse(args, "i", &parameter)) return NULL;\r
443\r
444 (*func) (obj, parameter);\r
445\r
446 Py_INCREF(Py_None);\r
447 return Py_None;\r
448}\r
449\r
450/* void func (object, char) */\r
451static PyObject *\r
452call_forms_INc (void (*func)(FL_OBJECT *, int), FL_OBJECT *obj, PyObject *args)\r
453{\r
454 char *a;\r
455\r
456 if (!PyArg_Parse(args, "s", &a)) return NULL;\r
457\r
458 (*func) (obj, a[0]);\r
459\r
460 Py_INCREF(Py_None);\r
461 return Py_None;\r
462}\r
463\r
464/* void func (object, string) */\r
465static PyObject *\r
466call_forms_INstr (void (*func)(FL_OBJECT *, char *), FL_OBJECT *obj, PyObject *args)\r
467{\r
468 char *a;\r
469\r
470 if (!PyArg_Parse(args, "s", &a)) return NULL;\r
471\r
472 (*func) (obj, a);\r
473\r
474 Py_INCREF(Py_None);\r
475 return Py_None;\r
476}\r
477\r
478\r
479/* void func (object, int, string) */\r
480static PyObject *\r
481call_forms_INiINstr (void (*func)(FL_OBJECT *, int, char *), FL_OBJECT *obj, PyObject *args)\r
482{\r
483 char *b;\r
484 int a;\r
485\r
486 if (!PyArg_Parse(args, "(is)", &a, &b)) return NULL;\r
487\r
488 (*func) (obj, a, b);\r
489\r
490 Py_INCREF(Py_None);\r
491 return Py_None;\r
492}\r
493\r
494#ifdef UNUSED\r
495/* void func (object, int, int) */\r
496static PyObject *\r
497call_forms_INiINi (void (*func)(FL_OBJECT *, int, int), FL_OBJECT *obj, PyObject *args)\r
498{\r
499 int par1, par2;\r
500\r
501 if (!PyArg_Parse(args, "(ii)", &par1, &par2)) return NULL;\r
502\r
503 (*func) (obj, par1, par2);\r
504\r
505 Py_INCREF(Py_None);\r
506 return Py_None;\r
507}\r
508#endif\r
509\r
510/* int func (object) */\r
511static PyObject *\r
512call_forms_Ri (int (*func)(FL_OBJECT *), FL_OBJECT *obj)\r
513{\r
514 int retval;\r
515\r
516 retval = (*func) (obj);\r
517\r
518 return PyInt_FromLong ((long) retval);\r
519}\r
520\r
521/* char * func (object) */\r
522static PyObject *\r
523call_forms_Rstr (char * (*func)(FL_OBJECT *), FL_OBJECT *obj)\r
524{\r
525 char *str;\r
526\r
527 str = (*func) (obj);\r
528\r
529 if (str == NULL) {\r
530 Py_INCREF(Py_None);\r
531 return Py_None;\r
532 }\r
533 return PyString_FromString (str);\r
534}\r
535\r
536/* int func (object) */\r
537static PyObject *\r
538call_forms_Rf (float (*func)(FL_OBJECT *), FL_OBJECT *obj)\r
539{\r
540 float retval;\r
541\r
542 retval = (*func) (obj);\r
543\r
544 return PyFloat_FromDouble (retval);\r
545}\r
546\r
547static PyObject *\r
548call_forms_OUTfOUTf (void (*func)(FL_OBJECT *, float *, float *), FL_OBJECT *obj)\r
549{\r
550 float f1, f2;\r
551\r
552 (*func) (obj, &f1, &f2);\r
553\r
554 return Py_BuildValue("(ff)", f1, f2);\r
555}\r
556\r
557#ifdef UNUSED\r
558static PyObject *\r
559call_forms_OUTf (void (*func)(FL_OBJECT *, float *), FL_OBJECT *obj)\r
560{\r
561 float f;\r
562\r
563 (*func) (obj, &f);\r
564\r
565 return PyFloat_FromDouble (f);\r
566}\r
567#endif\r
568\r
569/**********************************************************************/\r
570/* Class : browser */\r
571\r
572static PyObject *\r
573set_browser_topline(genericobject *g, PyObject *args)\r
574{\r
575 return call_forms_INi (fl_set_browser_topline, g-> ob_generic, args);\r
576}\r
577\r
578static PyObject *\r
579clear_browser(genericobject *g)\r
580{\r
581 return generic_call (g, fl_clear_browser);\r
582}\r
583\r
584static PyObject *\r
585add_browser_line (genericobject *g, PyObject *args)\r
586{\r
587 return call_forms_INstr (fl_add_browser_line, g-> ob_generic, args);\r
588}\r
589\r
590static PyObject *\r
591addto_browser (genericobject *g, PyObject *args)\r
592{\r
593 return call_forms_INstr (fl_addto_browser, g-> ob_generic, args);\r
594}\r
595\r
596static PyObject *\r
597insert_browser_line (genericobject *g, PyObject *args)\r
598{\r
599 return call_forms_INiINstr (fl_insert_browser_line,\r
600 g-> ob_generic, args);\r
601}\r
602\r
603static PyObject *\r
604delete_browser_line (genericobject *g, PyObject *args)\r
605{\r
606 return call_forms_INi (fl_delete_browser_line, g-> ob_generic, args);\r
607}\r
608\r
609static PyObject *\r
610replace_browser_line (genericobject *g, PyObject *args)\r
611{\r
612 return call_forms_INiINstr (fl_replace_browser_line,\r
613 g-> ob_generic, args);\r
614}\r
615\r
616static PyObject *\r
617get_browser_line(genericobject *g, PyObject *args)\r
618{\r
619 int i;\r
620 char *str;\r
621\r
622 if (!PyArg_Parse(args, "i", &i))\r
623 return NULL;\r
624\r
625 str = fl_get_browser_line (g->ob_generic, i);\r
626\r
627 if (str == NULL) {\r
628 Py_INCREF(Py_None);\r
629 return Py_None;\r
630 }\r
631 return PyString_FromString (str);\r
632}\r
633\r
634static PyObject *\r
635load_browser (genericobject *g, PyObject *args)\r
636{\r
637 /* XXX strictly speaking this is wrong since fl_load_browser\r
638 XXX returns int, not void */\r
639 return call_forms_INstr (fl_load_browser, g-> ob_generic, args);\r
640}\r
641\r
642static PyObject *\r
643get_browser_maxline(genericobject *g)\r
644{\r
645 return call_forms_Ri (fl_get_browser_maxline, g-> ob_generic);\r
646}\r
647\r
648static PyObject *\r
649select_browser_line (genericobject *g, PyObject *args)\r
650{\r
651 return call_forms_INi (fl_select_browser_line, g-> ob_generic, args);\r
652}\r
653\r
654static PyObject *\r
655deselect_browser_line (genericobject *g, PyObject *args)\r
656{\r
657 return call_forms_INi (fl_deselect_browser_line, g-> ob_generic, args);\r
658}\r
659\r
660static PyObject *\r
661deselect_browser (genericobject *g)\r
662{\r
663 return generic_call (g, fl_deselect_browser);\r
664}\r
665\r
666static PyObject *\r
667isselected_browser_line (genericobject *g, PyObject *args)\r
668{\r
669 int i, j;\r
670\r
671 if (!PyArg_Parse(args, "i", &i))\r
672 return NULL;\r
673\r
674 j = fl_isselected_browser_line (g->ob_generic, i);\r
675\r
676 return PyInt_FromLong (j);\r
677}\r
678\r
679static PyObject *\r
680get_browser (genericobject *g)\r
681{\r
682 return call_forms_Ri (fl_get_browser, g-> ob_generic);\r
683}\r
684\r
685static PyObject *\r
686set_browser_fontsize (genericobject *g, PyObject *args)\r
687{\r
688 return call_forms_INf (fl_set_browser_fontsize, g-> ob_generic, args);\r
689}\r
690\r
691static PyObject *\r
692set_browser_fontstyle (genericobject *g, PyObject *args)\r
693{\r
694 return call_forms_INi (fl_set_browser_fontstyle, g-> ob_generic, args);\r
695}\r
696\r
697static PyObject *\r
698set_browser_specialkey (genericobject *g, PyObject *args)\r
699{\r
700 return call_forms_INc(fl_set_browser_specialkey, g-> ob_generic, args);\r
701}\r
702\r
703static PyMethodDef browser_methods[] = {\r
704 {"set_browser_topline", (PyCFunction)set_browser_topline,\r
705 METH_OLDARGS},\r
706 {"clear_browser", (PyCFunction)clear_browser,\r
707 METH_NOARGS},\r
708 {"add_browser_line", (PyCFunction)add_browser_line,\r
709 METH_OLDARGS},\r
710 {"addto_browser", (PyCFunction)addto_browser,\r
711 METH_OLDARGS},\r
712 {"insert_browser_line", (PyCFunction)insert_browser_line,\r
713 METH_OLDARGS},\r
714 {"delete_browser_line", (PyCFunction)delete_browser_line,\r
715 METH_OLDARGS},\r
716 {"replace_browser_line", (PyCFunction)replace_browser_line,\r
717 METH_OLDARGS},\r
718 {"get_browser_line", (PyCFunction)get_browser_line,\r
719 METH_OLDARGS},\r
720 {"load_browser", (PyCFunction)load_browser,\r
721 METH_OLDARGS},\r
722 {"get_browser_maxline", (PyCFunction)get_browser_maxline,\r
723 METH_NOARGS,}\r
724 {"select_browser_line", (PyCFunction)select_browser_line,\r
725 METH_OLDARGS},\r
726 {"deselect_browser_line", (PyCFunction)deselect_browser_line,\r
727 METH_OLDARGS},\r
728 {"deselect_browser", (PyCFunction)deselect_browser,\r
729 METH_NOARGS,}\r
730 {"isselected_browser_line", (PyCFunction)isselected_browser_line,\r
731 METH_OLDARGS},\r
732 {"get_browser", (PyCFunction)get_browser,\r
733 METH_NOARGS,}\r
734 {"set_browser_fontsize", (PyCFunction)set_browser_fontsize,\r
735 METH_OLDARGS},\r
736 {"set_browser_fontstyle", (PyCFunction)set_browser_fontstyle,\r
737 METH_OLDARGS},\r
738 {"set_browser_specialkey", (PyCFunction)set_browser_specialkey,\r
739 METH_OLDARGS},\r
740 {NULL, NULL} /* sentinel */\r
741};\r
742\r
743/* Class: button */\r
744\r
745static PyObject *\r
746set_button(genericobject *g, PyObject *args)\r
747{\r
748 return call_forms_INi (fl_set_button, g-> ob_generic, args);\r
749}\r
750\r
751static PyObject *\r
752get_button(genericobject *g)\r
753{\r
754 return call_forms_Ri (fl_get_button, g-> ob_generic);\r
755}\r
756\r
757static PyObject *\r
758get_button_numb(genericobject *g)\r
759{\r
760 return call_forms_Ri (fl_get_button_numb, g-> ob_generic);\r
761}\r
762\r
763static PyObject *\r
764set_button_shortcut(genericobject *g, PyObject *args)\r
765{\r
766 return call_forms_INstr (fl_set_button_shortcut, g-> ob_generic, args);\r
767}\r
768\r
769static PyMethodDef button_methods[] = {\r
770 {"set_button", (PyCFunction)set_button, METH_OLDARGS},\r
771 {"get_button", (PyCFunction)get_button, METH_NOARGS},\r
772 {"get_button_numb", (PyCFunction)get_button_numb, METH_NOARGS},\r
773 {"set_button_shortcut", (PyCFunction)set_button_shortcut, METH_OLDARGS},\r
774 {NULL, NULL} /* sentinel */\r
775};\r
776\r
777/* Class: choice */\r
778\r
779static PyObject *\r
780set_choice(genericobject *g, PyObject *args)\r
781{\r
782 return call_forms_INi (fl_set_choice, g-> ob_generic, args);\r
783}\r
784\r
785static PyObject *\r
786get_choice(genericobject *g)\r
787{\r
788 return call_forms_Ri (fl_get_choice, g-> ob_generic);\r
789}\r
790\r
791static PyObject *\r
792clear_choice (genericobject *g)\r
793{\r
794 return generic_call (g, fl_clear_choice);\r
795}\r
796\r
797static PyObject *\r
798addto_choice (genericobject *g, PyObject *args)\r
799{\r
800 return call_forms_INstr (fl_addto_choice, g-> ob_generic, args);\r
801}\r
802\r
803static PyObject *\r
804replace_choice (genericobject *g, PyObject *args)\r
805{\r
806 return call_forms_INiINstr (fl_replace_choice, g-> ob_generic, args);\r
807}\r
808\r
809static PyObject *\r
810delete_choice (genericobject *g, PyObject *args)\r
811{\r
812 return call_forms_INi (fl_delete_choice, g-> ob_generic, args);\r
813}\r
814\r
815static PyObject *\r
816get_choice_text (genericobject *g)\r
817{\r
818 return call_forms_Rstr (fl_get_choice_text, g-> ob_generic);\r
819}\r
820\r
821static PyObject *\r
822set_choice_fontsize (genericobject *g, PyObject *args)\r
823{\r
824 return call_forms_INf (fl_set_choice_fontsize, g-> ob_generic, args);\r
825}\r
826\r
827static PyObject *\r
828set_choice_fontstyle (genericobject *g, PyObject *args)\r
829{\r
830 return call_forms_INi (fl_set_choice_fontstyle, g-> ob_generic, args);\r
831}\r
832\r
833static PyMethodDef choice_methods[] = {\r
834 {"set_choice", (PyCFunction)set_choice, METH_OLDARGS},\r
835 {"get_choice", (PyCFunction)get_choice, METH_NOARGS},\r
836 {"clear_choice", (PyCFunction)clear_choice, METH_NOARGS},\r
837 {"addto_choice", (PyCFunction)addto_choice, METH_OLDARGS},\r
838 {"replace_choice", (PyCFunction)replace_choice, METH_OLDARGS},\r
839 {"delete_choice", (PyCFunction)delete_choice, METH_OLDARGS},\r
840 {"get_choice_text", (PyCFunction)get_choice_text, METH_NOARGS},\r
841 {"set_choice_fontsize", (PyCFunction)set_choice_fontsize, METH_OLDARGS},\r
842 {"set_choice_fontstyle",(PyCFunction)set_choice_fontstyle, METH_OLDARGS},\r
843 {NULL, NULL} /* sentinel */\r
844};\r
845\r
846/* Class : Clock */\r
847\r
848static PyObject *\r
849get_clock(genericobject *g)\r
850{\r
851 int i0, i1, i2;\r
852\r
853 fl_get_clock (g->ob_generic, &i0, &i1, &i2);\r
854\r
855 return Py_BuildValue("(iii)", i0, i1, i2);\r
856}\r
857\r
858static PyMethodDef clock_methods[] = {\r
859 {"get_clock", (PyCFunction)get_clock, METH_NOARGS},\r
860 {NULL, NULL} /* sentinel */\r
861};\r
862\r
863/* CLass : Counters */\r
864\r
865static PyObject *\r
866get_counter_value(genericobject *g)\r
867{\r
868 return call_forms_Rf (fl_get_counter_value, g-> ob_generic);\r
869}\r
870\r
871static PyObject *\r
872set_counter_value (genericobject *g, PyObject *args)\r
873{\r
874 return call_forms_INf (fl_set_counter_value, g-> ob_generic, args);\r
875}\r
876\r
877static PyObject *\r
878set_counter_precision (genericobject *g, PyObject *args)\r
879{\r
880 return call_forms_INi (fl_set_counter_precision, g-> ob_generic, args);\r
881}\r
882\r
883static PyObject *\r
884set_counter_bounds (genericobject *g, PyObject *args)\r
885{\r
886 return call_forms_INfINf (fl_set_counter_bounds, g-> ob_generic, args);\r
887}\r
888\r
889static PyObject *\r
890set_counter_step (genericobject *g, PyObject *args)\r
891{\r
892 return call_forms_INfINf (fl_set_counter_step, g-> ob_generic, args);\r
893}\r
894\r
895static PyObject *\r
896set_counter_return (genericobject *g, PyObject *args)\r
897{\r
898 return call_forms_INi (fl_set_counter_return, g-> ob_generic, args);\r
899}\r
900\r
901static PyMethodDef counter_methods[] = {\r
902 {"set_counter_value", (PyCFunction)set_counter_value,\r
903 METH_OLDARGS},\r
904 {"get_counter_value", (PyCFunction)get_counter_value,\r
905 METH_NOARGS},\r
906 {"set_counter_bounds", (PyCFunction)set_counter_bounds,\r
907 METH_OLDARGS},\r
908 {"set_counter_step", (PyCFunction)set_counter_step,\r
909 METH_OLDARGS},\r
910 {"set_counter_precision", (PyCFunction)set_counter_precision,\r
911 METH_OLDARGS},\r
912 {"set_counter_return", (PyCFunction)set_counter_return,\r
913 METH_OLDARGS},\r
914 {NULL, NULL} /* sentinel */\r
915};\r
916\r
917\r
918/* Class: Dials */\r
919\r
920static PyObject *\r
921get_dial_value(genericobject *g)\r
922{\r
923 return call_forms_Rf (fl_get_dial_value, g-> ob_generic);\r
924}\r
925\r
926static PyObject *\r
927set_dial_value (genericobject *g, PyObject *args)\r
928{\r
929 return call_forms_INf (fl_set_dial_value, g-> ob_generic, args);\r
930}\r
931\r
932static PyObject *\r
933set_dial_bounds (genericobject *g, PyObject *args)\r
934{\r
935 return call_forms_INfINf (fl_set_dial_bounds, g-> ob_generic, args);\r
936}\r
937\r
938static PyObject *\r
939get_dial_bounds (genericobject *g)\r
940{\r
941 return call_forms_OUTfOUTf (fl_get_dial_bounds, g-> ob_generic);\r
942}\r
943\r
944static PyObject *\r
945set_dial_step (genericobject *g, PyObject *args)\r
946{\r
947 return call_forms_INf (fl_set_dial_step, g-> ob_generic, args);\r
948}\r
949\r
950static PyMethodDef dial_methods[] = {\r
951 {"set_dial_value", (PyCFunction)set_dial_value, METH_OLDARGS},\r
952 {"get_dial_value", (PyCFunction)get_dial_value, METH_NOARGS},\r
953 {"set_dial_bounds", (PyCFunction)set_dial_bounds, METH_OLDARGS},\r
954 {"get_dial_bounds", (PyCFunction)get_dial_bounds, METH_NOARGS},\r
955 {"set_dial_step", (PyCFunction)set_dial_step, METH_OLDARGS},\r
956 {NULL, NULL} /* sentinel */\r
957};\r
958\r
959/* Class : Input */\r
960\r
961static PyObject *\r
962set_input (genericobject *g, PyObject *args)\r
963{\r
964 return call_forms_INstr (fl_set_input, g-> ob_generic, args);\r
965}\r
966\r
967static PyObject *\r
968get_input (genericobject *g)\r
969{\r
970 return call_forms_Rstr (fl_get_input, g-> ob_generic);\r
971}\r
972\r
973static PyObject *\r
974set_input_color (genericobject *g, PyObject *args)\r
975{\r
976 return call_forms_INfINf (fl_set_input_color, g-> ob_generic, args);\r
977}\r
978\r
979static PyObject *\r
980set_input_return (genericobject *g, PyObject *args)\r
981{\r
982 return call_forms_INi (fl_set_input_return, g-> ob_generic, args);\r
983}\r
984\r
985static PyMethodDef input_methods[] = {\r
986 {"set_input", (PyCFunction)set_input, METH_OLDARGS},\r
987 {"get_input", (PyCFunction)get_input, METH_NOARGS},\r
988 {"set_input_color", (PyCFunction)set_input_color, METH_OLDARGS},\r
989 {"set_input_return", (PyCFunction)set_input_return, METH_OLDARGS},\r
990 {NULL, NULL} /* sentinel */\r
991};\r
992\r
993\r
994/* Class : Menu */\r
995\r
996static PyObject *\r
997set_menu (genericobject *g, PyObject *args)\r
998{\r
999 return call_forms_INstr (fl_set_menu, g-> ob_generic, args);\r
1000}\r
1001\r
1002static PyObject *\r
1003get_menu (genericobject *g)\r
1004{\r
1005 /* XXX strictly speaking this is wrong since fl_get_menu\r
1006 XXX returns long, not int */\r
1007 return call_forms_Ri (fl_get_menu, g-> ob_generic);\r
1008}\r
1009\r
1010static PyObject *\r
1011get_menu_text (genericobject *g)\r
1012{\r
1013 return call_forms_Rstr (fl_get_menu_text, g-> ob_generic);\r
1014}\r
1015\r
1016static PyObject *\r
1017addto_menu (genericobject *g, PyObject *args)\r
1018{\r
1019 return call_forms_INstr (fl_addto_menu, g-> ob_generic, args);\r
1020}\r
1021\r
1022static PyMethodDef menu_methods[] = {\r
1023 {"set_menu", (PyCFunction)set_menu, METH_OLDARGS},\r
1024 {"get_menu", (PyCFunction)get_menu, METH_NOARGS},\r
1025 {"get_menu_text", (PyCFunction)get_menu_text, METH_NOARGS},\r
1026 {"addto_menu", (PyCFunction)addto_menu, METH_OLDARGS},\r
1027 {NULL, NULL} /* sentinel */\r
1028};\r
1029\r
1030\r
1031/* Class: Sliders */\r
1032\r
1033static PyObject *\r
1034get_slider_value(genericobject *g)\r
1035{\r
1036 return call_forms_Rf (fl_get_slider_value, g-> ob_generic);\r
1037}\r
1038\r
1039static PyObject *\r
1040set_slider_value (genericobject *g, PyObject *args)\r
1041{\r
1042 return call_forms_INf (fl_set_slider_value, g-> ob_generic, args);\r
1043}\r
1044\r
1045static PyObject *\r
1046set_slider_bounds (genericobject *g, PyObject *args)\r
1047{\r
1048 return call_forms_INfINf (fl_set_slider_bounds, g-> ob_generic, args);\r
1049}\r
1050\r
1051static PyObject *\r
1052get_slider_bounds (genericobject *g)\r
1053{\r
1054 return call_forms_OUTfOUTf(fl_get_slider_bounds, g-> ob_generic);\r
1055}\r
1056\r
1057static PyObject *\r
1058set_slider_return (genericobject *g, PyObject *args)\r
1059{\r
1060 return call_forms_INf (fl_set_slider_return, g-> ob_generic, args);\r
1061}\r
1062\r
1063static PyObject *\r
1064set_slider_size (genericobject *g, PyObject *args)\r
1065{\r
1066 return call_forms_INf (fl_set_slider_size, g-> ob_generic, args);\r
1067}\r
1068\r
1069static PyObject *\r
1070set_slider_precision (genericobject *g, PyObject *args)\r
1071{\r
1072 return call_forms_INi (fl_set_slider_precision, g-> ob_generic, args);\r
1073}\r
1074\r
1075static PyObject *\r
1076set_slider_step (genericobject *g, PyObject *args)\r
1077{\r
1078 return call_forms_INf (fl_set_slider_step, g-> ob_generic, args);\r
1079}\r
1080\r
1081\r
1082static PyMethodDef slider_methods[] = {\r
1083 {"set_slider_value", (PyCFunction)set_slider_value, METH_OLDARGS},\r
1084 {"get_slider_value", (PyCFunction)get_slider_value, METH_NOARGS},\r
1085 {"set_slider_bounds", (PyCFunction)set_slider_bounds, METH_OLDARGS},\r
1086 {"get_slider_bounds", (PyCFunction)get_slider_bounds, METH_NOARGS},\r
1087 {"set_slider_return", (PyCFunction)set_slider_return, METH_OLDARGS},\r
1088 {"set_slider_size", (PyCFunction)set_slider_size, METH_OLDARGS},\r
1089 {"set_slider_precision",(PyCFunction)set_slider_precision, METH_OLDARGS},\r
1090 {"set_slider_step", (PyCFunction)set_slider_step, METH_OLDARGS},\r
1091 {NULL, NULL} /* sentinel */\r
1092};\r
1093\r
1094static PyObject *\r
1095set_positioner_xvalue (genericobject *g, PyObject *args)\r
1096{\r
1097 return call_forms_INf (fl_set_positioner_xvalue, g-> ob_generic, args);\r
1098}\r
1099\r
1100static PyObject *\r
1101set_positioner_xbounds (genericobject *g, PyObject *args)\r
1102{\r
1103 return call_forms_INfINf (fl_set_positioner_xbounds,\r
1104 g-> ob_generic, args);\r
1105}\r
1106\r
1107static PyObject *\r
1108set_positioner_yvalue (genericobject *g, PyObject *args)\r
1109{\r
1110 return call_forms_INf (fl_set_positioner_yvalue, g-> ob_generic, args);\r
1111}\r
1112\r
1113static PyObject *\r
1114set_positioner_ybounds (genericobject *g, PyObject *args)\r
1115{\r
1116 return call_forms_INfINf (fl_set_positioner_ybounds,\r
1117 g-> ob_generic, args);\r
1118}\r
1119\r
1120static PyObject *\r
1121get_positioner_xvalue (genericobject *g)\r
1122{\r
1123 return call_forms_Rf (fl_get_positioner_xvalue, g-> ob_generic);\r
1124}\r
1125\r
1126static PyObject *\r
1127get_positioner_xbounds (genericobject *g)\r
1128{\r
1129 return call_forms_OUTfOUTf (fl_get_positioner_xbounds, g-> ob_generic);\r
1130}\r
1131\r
1132static PyObject *\r
1133get_positioner_yvalue (genericobject *g)\r
1134{\r
1135 return call_forms_Rf (fl_get_positioner_yvalue, g-> ob_generic);\r
1136}\r
1137\r
1138static PyObject *\r
1139get_positioner_ybounds (genericobject *g)\r
1140{\r
1141 return call_forms_OUTfOUTf (fl_get_positioner_ybounds, g-> ob_generic);\r
1142}\r
1143\r
1144static PyMethodDef positioner_methods[] = {\r
1145 {"set_positioner_xvalue", (PyCFunction)set_positioner_xvalue,\r
1146 METH_OLDARGS},\r
1147 {"set_positioner_yvalue", (PyCFunction)set_positioner_yvalue,\r
1148 METH_OLDARGS},\r
1149 {"set_positioner_xbounds", (PyCFunction)set_positioner_xbounds,\r
1150 METH_OLDARGS},\r
1151 {"set_positioner_ybounds", (PyCFunction)set_positioner_ybounds,\r
1152 METH_OLDARGS},\r
1153 {"get_positioner_xvalue", (PyCFunction)get_positioner_xvalue,\r
1154 METH_NOARGS},\r
1155 {"get_positioner_yvalue", (PyCFunction)get_positioner_yvalue,\r
1156 METH_NOARGS},\r
1157 {"get_positioner_xbounds", (PyCFunction)get_positioner_xbounds,\r
1158 METH_NOARGS},\r
1159 {"get_positioner_ybounds", (PyCFunction)get_positioner_ybounds,\r
1160 METH_NOARGS},\r
1161 {NULL, NULL} /* sentinel */\r
1162};\r
1163\r
1164/* Class timer */\r
1165\r
1166static PyObject *\r
1167set_timer (genericobject *g, PyObject *args)\r
1168{\r
1169 return call_forms_INf (fl_set_timer, g-> ob_generic, args);\r
1170}\r
1171\r
1172static PyObject *\r
1173get_timer (genericobject *g)\r
1174{\r
1175 return call_forms_Rf (fl_get_timer, g-> ob_generic);\r
1176}\r
1177\r
1178static PyMethodDef timer_methods[] = {\r
1179 {"set_timer", (PyCFunction)set_timer, METH_OLDARGS},\r
1180 {"get_timer", (PyCFunction)get_timer, METH_NOARGS},\r
1181 {NULL, NULL} /* sentinel */\r
1182};\r
1183\r
1184/* Form objects */\r
1185\r
1186typedef struct {\r
1187 PyObject_HEAD\r
1188 FL_FORM *ob_form;\r
1189} formobject;\r
1190\r
1191static PyTypeObject Formtype;\r
1192\r
1193#define is_formobject(v) ((v)->ob_type == &Formtype)\r
1194\r
1195static PyObject *\r
1196form_show_form(formobject *f, PyObject *args)\r
1197{\r
1198 int place, border;\r
1199 char *name;\r
1200 if (!PyArg_Parse(args, "(iis)", &place, &border, &name))\r
1201 return NULL;\r
1202 fl_show_form(f->ob_form, place, border, name);\r
1203 Py_INCREF(Py_None);\r
1204 return Py_None;\r
1205}\r
1206\r
1207static PyObject *\r
1208form_call(void (*func)(FL_FORM *), FL_FORM *f)\r
1209{\r
1210 (*func)(f);\r
1211\r
1212 Py_INCREF(Py_None);\r
1213 return Py_None;\r
1214}\r
1215\r
1216static PyObject *\r
1217form_call_INiINi(void (*func)(FL_FORM *, int, int), FL_FORM *f, PyObject *args)\r
1218{\r
1219 int a, b;\r
1220\r
1221 if (!PyArg_Parse(args, "(ii)", &a, &b)) return NULL;\r
1222\r
1223 (*func)(f, a, b);\r
1224\r
1225 Py_INCREF(Py_None);\r
1226 return Py_None;\r
1227}\r
1228\r
1229static PyObject *\r
1230form_call_INfINf(void (*func)(FL_FORM *, float, float), FL_FORM *f, PyObject *args)\r
1231{\r
1232 float a, b;\r
1233\r
1234 if (!PyArg_Parse(args, "(ff)", &a, &b)) return NULL;\r
1235\r
1236 (*func)(f, a, b);\r
1237\r
1238 Py_INCREF(Py_None);\r
1239 return Py_None;\r
1240}\r
1241\r
1242static PyObject *\r
1243form_hide_form(formobject *f)\r
1244{\r
1245 return form_call(fl_hide_form, f-> ob_form);\r
1246}\r
1247\r
1248static PyObject *\r
1249form_redraw_form(formobject *f)\r
1250{\r
1251 return form_call(fl_redraw_form, f-> ob_form);\r
1252}\r
1253\r
1254static PyObject *\r
1255form_set_form_position(formobject *f, PyObject *args)\r
1256{\r
1257 return form_call_INiINi(fl_set_form_position, f-> ob_form, args);\r
1258}\r
1259\r
1260static PyObject *\r
1261form_set_form_size(formobject *f, PyObject *args)\r
1262{\r
1263 return form_call_INiINi(fl_set_form_size, f-> ob_form, args);\r
1264}\r
1265\r
1266static PyObject *\r
1267form_scale_form(formobject *f, PyObject *args)\r
1268{\r
1269 return form_call_INfINf(fl_scale_form, f-> ob_form, args);\r
1270}\r
1271\r
1272static PyObject *\r
1273generic_add_object(formobject *f, PyObject *args, FL_OBJECT *(*func)(int, float, float, float, float, char*), PyMethodDef *internal_methods)\r
1274{\r
1275 int type;\r
1276 float x, y, w, h;\r
1277 char *name;\r
1278 FL_OBJECT *obj;\r
1279\r
1280 if (!PyArg_Parse(args,"(iffffs)", &type,&x,&y,&w,&h,&name))\r
1281 return NULL;\r
1282\r
1283 fl_addto_form (f-> ob_form);\r
1284\r
1285 obj = (*func) (type, x, y, w, h, name);\r
1286\r
1287 fl_end_form();\r
1288\r
1289 if (obj == NULL) {\r
1290 PyErr_NoMemory();\r
1291 return NULL;\r
1292 }\r
1293\r
1294 return newgenericobject (obj, internal_methods);\r
1295}\r
1296\r
1297static PyObject *\r
1298form_add_button(formobject *f, PyObject *args)\r
1299{\r
1300 return generic_add_object(f, args, fl_add_button, button_methods);\r
1301}\r
1302\r
1303static PyObject *\r
1304form_add_lightbutton(formobject *f, PyObject *args)\r
1305{\r
1306 return generic_add_object(f, args, fl_add_lightbutton, button_methods);\r
1307}\r
1308\r
1309static PyObject *\r
1310form_add_roundbutton(formobject *f, PyObject *args)\r
1311{\r
1312 return generic_add_object(f, args, fl_add_roundbutton, button_methods);\r
1313}\r
1314\r
1315static PyObject *\r
1316form_add_menu (formobject *f, PyObject *args)\r
1317{\r
1318 return generic_add_object(f, args, fl_add_menu, menu_methods);\r
1319}\r
1320\r
1321static PyObject *\r
1322form_add_slider(formobject *f, PyObject *args)\r
1323{\r
1324 return generic_add_object(f, args, fl_add_slider, slider_methods);\r
1325}\r
1326\r
1327static PyObject *\r
1328form_add_valslider(formobject *f, PyObject *args)\r
1329{\r
1330 return generic_add_object(f, args, fl_add_valslider, slider_methods);\r
1331}\r
1332\r
1333static PyObject *\r
1334form_add_dial(formobject *f, PyObject *args)\r
1335{\r
1336 return generic_add_object(f, args, fl_add_dial, dial_methods);\r
1337}\r
1338\r
1339static PyObject *\r
1340form_add_counter(formobject *f, PyObject *args)\r
1341{\r
1342 return generic_add_object(f, args, fl_add_counter, counter_methods);\r
1343}\r
1344\r
1345static PyObject *\r
1346form_add_clock(formobject *f, PyObject *args)\r
1347{\r
1348 return generic_add_object(f, args, fl_add_clock, clock_methods);\r
1349}\r
1350\r
1351static PyObject *\r
1352form_add_box(formobject *f, PyObject *args)\r
1353{\r
1354 return generic_add_object(f, args, fl_add_box,\r
1355 (PyMethodDef *)NULL);\r
1356}\r
1357\r
1358static PyObject *\r
1359form_add_choice(formobject *f, PyObject *args)\r
1360{\r
1361 return generic_add_object(f, args, fl_add_choice, choice_methods);\r
1362}\r
1363\r
1364static PyObject *\r
1365form_add_browser(formobject *f, PyObject *args)\r
1366{\r
1367 return generic_add_object(f, args, fl_add_browser, browser_methods);\r
1368}\r
1369\r
1370static PyObject *\r
1371form_add_positioner(formobject *f, PyObject *args)\r
1372{\r
1373 return generic_add_object(f, args, fl_add_positioner,\r
1374 positioner_methods);\r
1375}\r
1376\r
1377static PyObject *\r
1378form_add_input(formobject *f, PyObject *args)\r
1379{\r
1380 return generic_add_object(f, args, fl_add_input, input_methods);\r
1381}\r
1382\r
1383static PyObject *\r
1384form_add_text(formobject *f, PyObject *args)\r
1385{\r
1386 return generic_add_object(f, args, fl_add_text,\r
1387 (PyMethodDef *)NULL);\r
1388}\r
1389\r
1390static PyObject *\r
1391form_add_timer(formobject *f, PyObject *args)\r
1392{\r
1393 return generic_add_object(f, args, fl_add_timer, timer_methods);\r
1394}\r
1395\r
1396static PyObject *\r
1397form_freeze_form(formobject *f)\r
1398{\r
1399 return form_call(fl_freeze_form, f-> ob_form);\r
1400}\r
1401\r
1402static PyObject *\r
1403form_unfreeze_form(formobject *f)\r
1404{\r
1405 return form_call(fl_unfreeze_form, f-> ob_form);\r
1406}\r
1407\r
1408static PyObject *\r
1409form_activate_form(formobject *f)\r
1410{\r
1411 return form_call(fl_activate_form, f-> ob_form);\r
1412}\r
1413\r
1414static PyObject *\r
1415form_deactivate_form(formobject *f)\r
1416{\r
1417 return form_call(fl_deactivate_form, f-> ob_form);\r
1418}\r
1419\r
1420static PyObject *\r
1421form_bgn_group(formobject *f, PyObject *args)\r
1422{\r
1423 FL_OBJECT *obj;\r
1424\r
1425 fl_addto_form(f-> ob_form);\r
1426 obj = fl_bgn_group();\r
1427 fl_end_form();\r
1428\r
1429 if (obj == NULL) {\r
1430 PyErr_NoMemory();\r
1431 return NULL;\r
1432 }\r
1433\r
1434 return newgenericobject (obj, (PyMethodDef *) NULL);\r
1435}\r
1436\r
1437static PyObject *\r
1438form_end_group(formobject *f, PyObject *args)\r
1439{\r
1440 fl_addto_form(f-> ob_form);\r
1441 fl_end_group();\r
1442 fl_end_form();\r
1443 Py_INCREF(Py_None);\r
1444 return Py_None;\r
1445}\r
1446\r
1447static PyObject *\r
1448forms_find_first_or_last(FL_OBJECT *(*func)(FL_FORM *, int, float, float), formobject *f, PyObject *args)\r
1449{\r
1450 int type;\r
1451 float mx, my;\r
1452 FL_OBJECT *generic;\r
1453 genericobject *g;\r
1454\r
1455 if (!PyArg_Parse(args, "(iff)", &type, &mx, &my)) return NULL;\r
1456\r
1457 generic = (*func) (f-> ob_form, type, mx, my);\r
1458\r
1459 if (generic == NULL)\r
1460 {\r
1461 Py_INCREF(Py_None);\r
1462 return Py_None;\r
1463 }\r
1464\r
1465 g = findgeneric(generic);\r
1466 if (g == NULL) {\r
1467 PyErr_SetString(PyExc_RuntimeError,\r
1468 "forms_find_{first|last} returns unknown object");\r
1469 return NULL;\r
1470 }\r
1471 Py_INCREF(g);\r
1472 return (PyObject *) g;\r
1473}\r
1474\r
1475static PyObject *\r
1476form_find_first(formobject *f, PyObject *args)\r
1477{\r
1478 return forms_find_first_or_last(fl_find_first, f, args);\r
1479}\r
1480\r
1481static PyObject *\r
1482form_find_last(formobject *f, PyObject *args)\r
1483{\r
1484 return forms_find_first_or_last(fl_find_last, f, args);\r
1485}\r
1486\r
1487static PyObject *\r
1488form_set_object_focus(formobject *f, PyObject *args)\r
1489{\r
1490 genericobject *g;\r
1491 if (args == NULL || !is_genericobject(args)) {\r
1492 PyErr_BadArgument();\r
1493 return NULL;\r
1494 }\r
1495 g = (genericobject *)args;\r
1496 fl_set_object_focus(f->ob_form, g->ob_generic);\r
1497 Py_INCREF(Py_None);\r
1498 return Py_None;\r
1499}\r
1500\r
1501static PyMethodDef form_methods[] = {\r
1502/* adm */\r
1503 {"show_form", (PyCFunction)form_show_form, METH_OLDARGS},\r
1504 {"hide_form", (PyCFunction)form_hide_form, METH_NOARGS},\r
1505 {"redraw_form", (PyCFunction)form_redraw_form, METH_NOARGS},\r
1506 {"set_form_position", (PyCFunction)form_set_form_position, METH_OLDARGS},\r
1507 {"set_form_size", (PyCFunction)form_set_form_size, METH_OLDARGS},\r
1508 {"scale_form", (PyCFunction)form_scale_form, METH_OLDARGS},\r
1509 {"freeze_form", (PyCFunction)form_freeze_form, METH_NOARGS},\r
1510 {"unfreeze_form", (PyCFunction)form_unfreeze_form, METH_NOARGS},\r
1511 {"activate_form", (PyCFunction)form_activate_form, METH_NOARGS},\r
1512 {"deactivate_form", (PyCFunction)form_deactivate_form, METH_NOARGS},\r
1513 {"bgn_group", (PyCFunction)form_bgn_group, METH_OLDARGS},\r
1514 {"end_group", (PyCFunction)form_end_group, METH_OLDARGS},\r
1515 {"find_first", (PyCFunction)form_find_first, METH_OLDARGS},\r
1516 {"find_last", (PyCFunction)form_find_last, METH_OLDARGS},\r
1517 {"set_object_focus", (PyCFunction)form_set_object_focus, METH_OLDARGS},\r
1518\r
1519/* basic objects */\r
1520 {"add_button", (PyCFunction)form_add_button, METH_OLDARGS},\r
1521/* {"add_bitmap", (method)form_add_bitmap, METH_OLDARGS}, */\r
1522 {"add_lightbutton", (PyCFunction)form_add_lightbutton, METH_OLDARGS},\r
1523 {"add_roundbutton", (PyCFunction)form_add_roundbutton, METH_OLDARGS},\r
1524 {"add_menu", (PyCFunction)form_add_menu, METH_OLDARGS},\r
1525 {"add_slider", (PyCFunction)form_add_slider, METH_OLDARGS},\r
1526 {"add_positioner", (PyCFunction)form_add_positioner, METH_OLDARGS},\r
1527 {"add_valslider", (PyCFunction)form_add_valslider, METH_OLDARGS},\r
1528 {"add_dial", (PyCFunction)form_add_dial, METH_OLDARGS},\r
1529 {"add_counter", (PyCFunction)form_add_counter, METH_OLDARGS},\r
1530 {"add_box", (PyCFunction)form_add_box, METH_OLDARGS},\r
1531 {"add_clock", (PyCFunction)form_add_clock, METH_OLDARGS},\r
1532 {"add_choice", (PyCFunction)form_add_choice, METH_OLDARGS},\r
1533 {"add_browser", (PyCFunction)form_add_browser, METH_OLDARGS},\r
1534 {"add_input", (PyCFunction)form_add_input, METH_OLDARGS},\r
1535 {"add_timer", (PyCFunction)form_add_timer, METH_OLDARGS},\r
1536 {"add_text", (PyCFunction)form_add_text, METH_OLDARGS},\r
1537 {NULL, NULL} /* sentinel */\r
1538};\r
1539\r
1540static void\r
1541form_dealloc(formobject *f)\r
1542{\r
1543 releaseobjects(f->ob_form);\r
1544 if (f->ob_form->visible)\r
1545 fl_hide_form(f->ob_form);\r
1546 fl_free_form(f->ob_form);\r
1547 PyObject_Del(f);\r
1548}\r
1549\r
1550#define OFF(x) offsetof(FL_FORM, x)\r
1551\r
1552static struct memberlist form_memberlist[] = {\r
1553 {"window", T_LONG, OFF(window), RO},\r
1554 {"w", T_FLOAT, OFF(w)},\r
1555 {"h", T_FLOAT, OFF(h)},\r
1556 {"x", T_FLOAT, OFF(x), RO},\r
1557 {"y", T_FLOAT, OFF(y), RO},\r
1558 {"deactivated", T_INT, OFF(deactivated)},\r
1559 {"visible", T_INT, OFF(visible), RO},\r
1560 {"frozen", T_INT, OFF(frozen), RO},\r
1561 {"doublebuf", T_INT, OFF(doublebuf)},\r
1562 {NULL} /* Sentinel */\r
1563};\r
1564\r
1565#undef OFF\r
1566\r
1567static PyObject *\r
1568form_getattr(formobject *f, char *name)\r
1569{\r
1570 PyObject *meth;\r
1571\r
1572 meth = Py_FindMethod(form_methods, (PyObject *)f, name);\r
1573 if (meth != NULL)\r
1574 return meth;\r
1575 PyErr_Clear();\r
1576 return PyMember_Get((char *)f->ob_form, form_memberlist, name);\r
1577}\r
1578\r
1579static int\r
1580form_setattr(formobject *f, char *name, PyObject *v)\r
1581{\r
1582 if (v == NULL) {\r
1583 PyErr_SetString(PyExc_TypeError,\r
1584 "can't delete form attributes");\r
1585 return -1;\r
1586 }\r
1587\r
1588 return PyMember_Set((char *)f->ob_form, form_memberlist, name, v);\r
1589}\r
1590\r
1591static PyObject *\r
1592form_repr(formobject *f)\r
1593{\r
1594 char buf[100];\r
1595 PyOS_snprintf(buf, sizeof(buf), "<FORMS_form at %p, window=%ld>",\r
1596 f, f->ob_form->window);\r
1597 return PyString_FromString(buf);\r
1598}\r
1599\r
1600static PyTypeObject Formtype = {\r
1601 PyObject_HEAD_INIT(&PyType_Type)\r
1602 0, /*ob_size*/\r
1603 "fl.FORMS_form", /*tp_name*/\r
1604 sizeof(formobject), /*tp_size*/\r
1605 0, /*tp_itemsize*/\r
1606 /* methods */\r
1607 (destructor)form_dealloc, /*tp_dealloc*/\r
1608 0, /*tp_print*/\r
1609 (getattrfunc)form_getattr, /*tp_getattr*/\r
1610 (setattrfunc)form_setattr, /*tp_setattr*/\r
1611 0, /*tp_compare*/\r
1612 (reprfunc)form_repr, /*tp_repr*/\r
1613};\r
1614\r
1615static PyObject *\r
1616newformobject(FL_FORM *form)\r
1617{\r
1618 formobject *f;\r
1619 f = PyObject_New(formobject, &Formtype);\r
1620 if (f == NULL)\r
1621 return NULL;\r
1622 f->ob_form = form;\r
1623 return (PyObject *)f;\r
1624}\r
1625\r
1626\r
1627/* The "fl" module */\r
1628\r
1629static PyObject *\r
1630forms_make_form(PyObject *dummy, PyObject *args)\r
1631{\r
1632 int type;\r
1633 float w, h;\r
1634 FL_FORM *form;\r
1635 if (!PyArg_Parse(args, "(iff)", &type, &w, &h))\r
1636 return NULL;\r
1637 form = fl_bgn_form(type, w, h);\r
1638 if (form == NULL) {\r
1639 /* XXX Actually, cannot happen! */\r
1640 PyErr_NoMemory();\r
1641 return NULL;\r
1642 }\r
1643 fl_end_form();\r
1644 return newformobject(form);\r
1645}\r
1646\r
1647static PyObject *\r
1648forms_activate_all_forms(PyObject *f, PyObject *args)\r
1649{\r
1650 fl_activate_all_forms();\r
1651 Py_INCREF(Py_None);\r
1652 return Py_None;\r
1653}\r
1654\r
1655static PyObject *\r
1656forms_deactivate_all_forms(PyObject *f, PyObject *args)\r
1657{\r
1658 fl_deactivate_all_forms();\r
1659 Py_INCREF(Py_None);\r
1660 return Py_None;\r
1661}\r
1662\r
1663static PyObject *my_event_callback = NULL;\r
1664\r
1665static PyObject *\r
1666forms_set_event_call_back(PyObject *dummy, PyObject *args)\r
1667{\r
1668 if (args == Py_None)\r
1669 args = NULL;\r
1670 my_event_callback = args;\r
1671 Py_XINCREF(args);\r
1672 Py_INCREF(Py_None);\r
1673 return Py_None;\r
1674}\r
1675\r
1676static PyObject *\r
1677forms_do_or_check_forms(PyObject *dummy, FL_OBJECT *(*func)(void))\r
1678{\r
1679 FL_OBJECT *generic;\r
1680 genericobject *g;\r
1681 PyObject *arg, *res;\r
1682\r
1683 for (;;) {\r
1684 Py_BEGIN_ALLOW_THREADS\r
1685 generic = (*func)();\r
1686 Py_END_ALLOW_THREADS\r
1687 if (generic == NULL) {\r
1688 Py_INCREF(Py_None);\r
1689 return Py_None;\r
1690 }\r
1691 if (generic == FL_EVENT) {\r
1692 int dev;\r
1693 short val;\r
1694 if (my_event_callback == NULL)\r
1695 return PyInt_FromLong(-1L);\r
1696 dev = fl_qread(&val);\r
1697 arg = Py_BuildValue("(ih)", dev, val);\r
1698 if (arg == NULL)\r
1699 return NULL;\r
1700 res = PyEval_CallObject(my_event_callback, arg);\r
1701 Py_XDECREF(res);\r
1702 Py_DECREF(arg);\r
1703 if (res == NULL)\r
1704 return NULL; /* Callback raised exception */\r
1705 continue;\r
1706 }\r
1707 g = findgeneric(generic);\r
1708 if (g == NULL) {\r
1709 /* Object not known to us (some dialogs cause this) */\r
1710 continue; /* Ignore it */\r
1711 }\r
1712 if (g->ob_callback == NULL) {\r
1713 Py_INCREF(g);\r
1714 return ((PyObject *) g);\r
1715 }\r
1716 arg = PyTuple_Pack(2, (PyObject *)g, g->ob_callback_arg);\r
1717 if (arg == NULL)\r
1718 return NULL;\r
1719 res = PyEval_CallObject(g->ob_callback, arg);\r
1720 Py_XDECREF(res);\r
1721 Py_DECREF(arg);\r
1722 if (res == NULL)\r
1723 return NULL; /* Callback raised exception */\r
1724 }\r
1725}\r
1726\r
1727static PyObject *\r
1728forms_do_forms(PyObject *dummy)\r
1729{\r
1730 return forms_do_or_check_forms(dummy, fl_do_forms);\r
1731}\r
1732\r
1733static PyObject *\r
1734forms_check_forms(PyObject *dummy)\r
1735{\r
1736 return forms_do_or_check_forms(dummy, fl_check_forms);\r
1737}\r
1738\r
1739static PyObject *\r
1740forms_do_only_forms(PyObject *dummy)\r
1741{\r
1742 return forms_do_or_check_forms(dummy, fl_do_only_forms);\r
1743}\r
1744\r
1745static PyObject *\r
1746forms_check_only_forms(PyObject *dummy)\r
1747{\r
1748 return forms_do_or_check_forms(dummy, fl_check_only_forms);\r
1749}\r
1750\r
1751#ifdef UNUSED\r
1752static PyObject *\r
1753fl_call(void (*func)(void))\r
1754{\r
1755 (*func)();\r
1756 Py_INCREF(Py_None);\r
1757 return Py_None;\r
1758}\r
1759#endif\r
1760\r
1761static PyObject *\r
1762forms_set_graphics_mode(PyObject *dummy, PyObject *args)\r
1763{\r
1764 int rgbmode, doublebuf;\r
1765\r
1766 if (!PyArg_Parse(args, "(ii)", &rgbmode, &doublebuf))\r
1767 return NULL;\r
1768 fl_set_graphics_mode(rgbmode,doublebuf);\r
1769 Py_INCREF(Py_None);\r
1770 return Py_None;\r
1771}\r
1772\r
1773static PyObject *\r
1774forms_get_rgbmode(PyObject *dummy, PyObject *args)\r
1775{\r
1776 extern int fl_rgbmode;\r
1777\r
1778 if (args != NULL) {\r
1779 PyErr_BadArgument();\r
1780 return NULL;\r
1781 }\r
1782 return PyInt_FromLong((long)fl_rgbmode);\r
1783}\r
1784\r
1785static PyObject *\r
1786forms_show_errors(PyObject *dummy, PyObject *args)\r
1787{\r
1788 int show;\r
1789 if (!PyArg_Parse(args, "i", &show))\r
1790 return NULL;\r
1791 fl_show_errors(show);\r
1792 Py_INCREF(Py_None);\r
1793 return Py_None;\r
1794}\r
1795\r
1796static PyObject *\r
1797forms_set_font_name(PyObject *dummy, PyObject *args)\r
1798{\r
1799 int numb;\r
1800 char *name;\r
1801 if (!PyArg_Parse(args, "(is)", &numb, &name))\r
1802 return NULL;\r
1803 fl_set_font_name(numb, name);\r
1804 Py_INCREF(Py_None);\r
1805 return Py_None;\r
1806}\r
1807\r
1808\r
1809static PyObject *\r
1810forms_qdevice(PyObject *self, PyObject *args)\r
1811{\r
1812 short arg1;\r
1813 if (!PyArg_Parse(args, "h", &arg1))\r
1814 return NULL;\r
1815 fl_qdevice(arg1);\r
1816 Py_INCREF(Py_None);\r
1817 return Py_None;\r
1818}\r
1819\r
1820static PyObject *\r
1821forms_unqdevice(PyObject *self, PyObject *args)\r
1822{\r
1823 short arg1;\r
1824 if (!PyArg_Parse(args, "h", &arg1))\r
1825 return NULL;\r
1826 fl_unqdevice(arg1);\r
1827 Py_INCREF(Py_None);\r
1828 return Py_None;\r
1829}\r
1830\r
1831static PyObject *\r
1832forms_isqueued(PyObject *self, PyObject *args)\r
1833{\r
1834 long retval;\r
1835 short arg1;\r
1836 if (!PyArg_Parse(args, "h", &arg1))\r
1837 return NULL;\r
1838 retval = fl_isqueued(arg1);\r
1839\r
1840 return PyInt_FromLong(retval);\r
1841}\r
1842\r
1843static PyObject *\r
1844forms_qtest(PyObject *self, PyObject *args)\r
1845{\r
1846 long retval;\r
1847 retval = fl_qtest();\r
1848 return PyInt_FromLong(retval);\r
1849}\r
1850\r
1851\r
1852static PyObject *\r
1853forms_qread(PyObject *self, PyObject *args)\r
1854{\r
1855 int dev;\r
1856 short val;\r
1857 Py_BEGIN_ALLOW_THREADS\r
1858 dev = fl_qread(&val);\r
1859 Py_END_ALLOW_THREADS\r
1860 return Py_BuildValue("(ih)", dev, val);\r
1861}\r
1862\r
1863static PyObject *\r
1864forms_qreset(PyObject *self)\r
1865{\r
1866 fl_qreset();\r
1867 Py_INCREF(Py_None);\r
1868 return Py_None;\r
1869}\r
1870\r
1871static PyObject *\r
1872forms_qenter(PyObject *self, PyObject *args)\r
1873{\r
1874 short arg1, arg2;\r
1875 if (!PyArg_Parse(args, "(hh)", &arg1, &arg2))\r
1876 return NULL;\r
1877 fl_qenter(arg1, arg2);\r
1878 Py_INCREF(Py_None);\r
1879 return Py_None;\r
1880}\r
1881\r
1882static PyObject *\r
1883forms_color(PyObject *self, PyObject *args)\r
1884{\r
1885 int arg;\r
1886\r
1887 if (!PyArg_Parse(args, "i", &arg)) return NULL;\r
1888\r
1889 fl_color((short) arg);\r
1890\r
1891 Py_INCREF(Py_None);\r
1892 return Py_None;\r
1893}\r
1894\r
1895static PyObject *\r
1896forms_mapcolor(PyObject *self, PyObject *args)\r
1897{\r
1898 int arg0, arg1, arg2, arg3;\r
1899\r
1900 if (!PyArg_Parse(args, "(iiii)", &arg0, &arg1, &arg2, &arg3))\r
1901 return NULL;\r
1902\r
1903 fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3);\r
1904\r
1905 Py_INCREF(Py_None);\r
1906 return Py_None;\r
1907}\r
1908\r
1909static PyObject *\r
1910forms_getmcolor(PyObject *self, PyObject *args)\r
1911{\r
1912 int arg;\r
1913 short r, g, b;\r
1914\r
1915 if (!PyArg_Parse(args, "i", &arg)) return NULL;\r
1916\r
1917 fl_getmcolor(arg, &r, &g, &b);\r
1918\r
1919 return Py_BuildValue("(hhh)", r, g, b);\r
1920}\r
1921\r
1922static PyObject *\r
1923forms_get_mouse(PyObject *self)\r
1924{\r
1925 float x, y;\r
1926\r
1927 fl_get_mouse(&x, &y);\r
1928\r
1929 return Py_BuildValue("(ff)", x, y);\r
1930}\r
1931\r
1932static PyObject *\r
1933forms_tie(PyObject *self, PyObject *args)\r
1934{\r
1935 short arg1, arg2, arg3;\r
1936 if (!PyArg_Parse(args, "(hhh)", &arg1, &arg2, &arg3))\r
1937 return NULL;\r
1938 fl_tie(arg1, arg2, arg3);\r
1939 Py_INCREF(Py_None);\r
1940 return Py_None;\r
1941}\r
1942\r
1943static PyObject *\r
1944forms_show_message(PyObject *f, PyObject *args)\r
1945{\r
1946 char *a, *b, *c;\r
1947\r
1948 if (!PyArg_Parse(args, "(sss)", &a, &b, &c)) return NULL;\r
1949\r
1950 Py_BEGIN_ALLOW_THREADS\r
1951 fl_show_message(a, b, c);\r
1952 Py_END_ALLOW_THREADS\r
1953\r
1954 Py_INCREF(Py_None);\r
1955 return Py_None;\r
1956}\r
1957\r
1958static PyObject *\r
1959forms_show_choice(PyObject *f, PyObject *args)\r
1960{\r
1961 char *m1, *m2, *m3, *b1, *b2, *b3;\r
1962 int nb;\r
1963 char *format;\r
1964 long rv;\r
1965\r
1966 if (args == NULL || !PyTuple_Check(args)) {\r
1967 PyErr_BadArgument();\r
1968 return NULL;\r
1969 }\r
1970 nb = PyTuple_Size(args) - 3;\r
1971 if (nb <= 0) {\r
1972 PyErr_SetString(PyExc_TypeError,\r
1973 "need at least one button label");\r
1974 return NULL;\r
1975 }\r
1976 if (PyInt_Check(PyTuple_GetItem(args, 3))) {\r
1977 PyErr_SetString(PyExc_TypeError,\r
1978 "'number-of-buttons' argument not needed");\r
1979 return NULL;\r
1980 }\r
1981 switch (nb) {\r
1982 case 1: format = "(ssss)"; break;\r
1983 case 2: format = "(sssss)"; break;\r
1984 case 3: format = "(ssssss)"; break;\r
1985 default:\r
1986 PyErr_SetString(PyExc_TypeError, "too many button labels");\r
1987 return NULL;\r
1988 }\r
1989\r
1990 if (!PyArg_Parse(args, format, &m1, &m2, &m3, &b1, &b2, &b3))\r
1991 return NULL;\r
1992\r
1993 Py_BEGIN_ALLOW_THREADS\r
1994 rv = fl_show_choice(m1, m2, m3, nb, b1, b2, b3);\r
1995 Py_END_ALLOW_THREADS\r
1996 return PyInt_FromLong(rv);\r
1997}\r
1998\r
1999static PyObject *\r
2000forms_show_question(PyObject *f, PyObject *args)\r
2001{\r
2002 int ret;\r
2003 char *a, *b, *c;\r
2004\r
2005 if (!PyArg_Parse(args, "(sss)", &a, &b, &c)) return NULL;\r
2006\r
2007 Py_BEGIN_ALLOW_THREADS\r
2008 ret = fl_show_question(a, b, c);\r
2009 Py_END_ALLOW_THREADS\r
2010\r
2011 return PyInt_FromLong((long) ret);\r
2012}\r
2013\r
2014static PyObject *\r
2015forms_show_input(PyObject *f, PyObject *args)\r
2016{\r
2017 char *str;\r
2018 char *a, *b;\r
2019\r
2020 if (!PyArg_Parse(args, "(ss)", &a, &b)) return NULL;\r
2021\r
2022 Py_BEGIN_ALLOW_THREADS\r
2023 str = fl_show_input(a, b);\r
2024 Py_END_ALLOW_THREADS\r
2025\r
2026 if (str == NULL) {\r
2027 Py_INCREF(Py_None);\r
2028 return Py_None;\r
2029 }\r
2030 return PyString_FromString(str);\r
2031}\r
2032\r
2033static PyObject *\r
2034forms_file_selector(PyObject *f, PyObject *args)\r
2035{\r
2036 char *str;\r
2037 char *a, *b, *c, *d;\r
2038\r
2039 if (!PyArg_Parse(args, "(ssss)", &a, &b, &c, &d)) return NULL;\r
2040\r
2041 Py_BEGIN_ALLOW_THREADS\r
2042 str = fl_show_file_selector(a, b, c, d);\r
2043 Py_END_ALLOW_THREADS\r
2044\r
2045 if (str == NULL) {\r
2046 Py_INCREF(Py_None);\r
2047 return Py_None;\r
2048 }\r
2049 return PyString_FromString(str);\r
2050}\r
2051\r
2052\r
2053static PyObject *\r
2054forms_file_selector_func(PyObject *args, char *(*func)(void))\r
2055{\r
2056 char *str;\r
2057\r
2058 str = (*func) ();\r
2059\r
2060 if (str == NULL) {\r
2061 Py_INCREF(Py_None);\r
2062 return Py_None;\r
2063 }\r
2064 return PyString_FromString(str);\r
2065}\r
2066\r
2067static PyObject *\r
2068forms_get_directory(PyObject *f, PyObject *args)\r
2069{\r
2070 return forms_file_selector_func(args, fl_get_directory);\r
2071}\r
2072\r
2073static PyObject *\r
2074forms_get_pattern(PyObject *f, PyObject *args)\r
2075{\r
2076 return forms_file_selector_func(args, fl_get_pattern);\r
2077}\r
2078\r
2079static PyObject *\r
2080forms_get_filename(PyObject *f, PyObject *args)\r
2081{\r
2082 return forms_file_selector_func(args, fl_get_filename);\r
2083}\r
2084\r
2085static PyMethodDef forms_methods[] = {\r
2086/* adm */\r
2087 {"make_form", forms_make_form, METH_OLDARGS},\r
2088 {"activate_all_forms", forms_activate_all_forms, METH_OLDARGS},\r
2089 {"deactivate_all_forms",forms_deactivate_all_forms, METH_OLDARGS},\r
2090/* gl support wrappers */\r
2091 {"qdevice", forms_qdevice, METH_OLDARGS},\r
2092 {"unqdevice", forms_unqdevice, METH_OLDARGS},\r
2093 {"isqueued", forms_isqueued, METH_OLDARGS},\r
2094 {"qtest", forms_qtest, METH_OLDARGS},\r
2095 {"qread", forms_qread, METH_OLDARGS},\r
2096/* {"blkqread", forms_blkqread, METH_OLDARGS}, */\r
2097 {"qreset", forms_qreset, METH_NOARGS},\r
2098 {"qenter", forms_qenter, METH_OLDARGS},\r
2099 {"get_mouse", forms_get_mouse, METH_NOARGS},\r
2100 {"tie", forms_tie, METH_OLDARGS},\r
2101/* {"new_events", forms_new_events, METH_OLDARGS}, */\r
2102 {"color", forms_color, METH_OLDARGS},\r
2103 {"mapcolor", forms_mapcolor, METH_OLDARGS},\r
2104 {"getmcolor", forms_getmcolor, METH_OLDARGS},\r
2105/* interaction */\r
2106 {"do_forms", forms_do_forms, METH_NOARGS},\r
2107 {"do_only_forms", forms_do_only_forms, METH_NOARGS},\r
2108 {"check_forms", forms_check_forms, METH_NOARGS},\r
2109 {"check_only_forms", forms_check_only_forms, METH_NOARGS},\r
2110 {"set_event_call_back", forms_set_event_call_back, METH_OLDARGS},\r
2111/* goodies */\r
2112 {"show_message", forms_show_message, METH_OLDARGS},\r
2113 {"show_question", forms_show_question, METH_OLDARGS},\r
2114 {"show_choice", forms_show_choice, METH_OLDARGS},\r
2115 {"show_input", forms_show_input, METH_OLDARGS},\r
2116 {"show_file_selector", forms_file_selector, METH_OLDARGS},\r
2117 {"file_selector", forms_file_selector, METH_OLDARGS}, /* BW compat */\r
2118 {"get_directory", forms_get_directory, METH_OLDARGS},\r
2119 {"get_pattern", forms_get_pattern, METH_OLDARGS},\r
2120 {"get_filename", forms_get_filename, METH_OLDARGS},\r
2121 {"set_graphics_mode", forms_set_graphics_mode, METH_OLDARGS},\r
2122 {"get_rgbmode", forms_get_rgbmode, METH_OLDARGS},\r
2123 {"show_errors", forms_show_errors, METH_OLDARGS},\r
2124 {"set_font_name", forms_set_font_name, METH_OLDARGS},\r
2125 {NULL, NULL} /* sentinel */\r
2126};\r
2127\r
2128PyMODINIT_FUNC\r
2129initfl(void)\r
2130{\r
2131\r
2132 if (PyErr_WarnPy3k("the fl module has been removed in "\r
2133 "Python 3.0", 2) < 0)\r
2134 return;\r
2135\r
2136 Py_InitModule("fl", forms_methods);\r
2137 if (m == NULL)\r
2138 return;\r
2139 foreground();\r
2140 fl_init();\r
2141}\r
2142\r
2143\r
2144\r