]>
Commit | Line | Data |
---|---|---|
80d03bd8 | 1 | #include <errno.h> |
2 | #include <fcntl.h> | |
3 | #include <sys/stat.h> | |
4 | #include <sys/time.h> | |
5 | #include <unistd.h> | |
6 | ||
7 | #include "Python.h" | |
8 | #include "newt.h" | |
9 | ||
10 | typedef struct snackWidget_s snackWidget; | |
11 | typedef struct snackGrid_s snackGrid; | |
12 | typedef struct snackForm_s snackForm; | |
13 | ||
5d678658 | 14 | struct callbackStruct { |
06cf519e | 15 | PyObject * cb, * data; |
16 | }; | |
17 | ||
1dfa0cfa | 18 | static struct callbackStruct suspend; |
19 | ||
80d03bd8 | 20 | static void emptyDestructor(PyObject * s); |
21 | ||
22 | static snackWidget * buttonWidget(PyObject * s, PyObject * args); | |
23 | static PyObject * centeredWindow(PyObject * s, PyObject * args); | |
24 | static snackWidget * checkboxWidget(PyObject * s, PyObject * args); | |
25 | static PyObject * choiceWindow(PyObject * s, PyObject * args); | |
26 | static snackWidget * entryWidget(PyObject * s, PyObject * args); | |
75fb0452 | 27 | static PyObject * drawRootText(PyObject * s, PyObject * args); |
80d03bd8 | 28 | static snackForm * formCreate(PyObject * s, PyObject * args); |
29 | static snackGrid * gridCreate(PyObject * s, PyObject * args); | |
30 | static PyObject * gridWrappedWindow(PyObject * s, PyObject * args); | |
31 | static PyObject * finishScreen(PyObject * s, PyObject * args); | |
32 | static PyObject * initScreen(PyObject * s, PyObject * args); | |
33 | static snackWidget * labelWidget(PyObject * s, PyObject * args); | |
6e25d997 | 34 | static snackWidget * listboxWidget(PyObject * s, PyObject * args); |
80d03bd8 | 35 | static PyObject * messageWindow(PyObject * s, PyObject * args); |
36 | static PyObject * openWindow(PyObject * s, PyObject * args); | |
75fb0452 | 37 | static PyObject * popHelpLine(PyObject * s, PyObject * args); |
80d03bd8 | 38 | static PyObject * popWindow(PyObject * s, PyObject * args); |
75fb0452 | 39 | static PyObject * pushHelpLine(PyObject * s, PyObject * args); |
80d03bd8 | 40 | static snackWidget * radioButtonWidget(PyObject * s, PyObject * args); |
41 | static PyObject * refreshScreen(PyObject * s, PyObject * args); | |
06cf519e | 42 | static PyObject * scaleWidget(PyObject * s, PyObject * args); |
43 | static PyObject * scaleSet(snackWidget * s, PyObject * args); | |
9f0ab2ac | 44 | static PyObject * screenSize(PyObject * s, PyObject * args); |
06cf519e | 45 | static PyObject * setSuspendCallback(PyObject * s, PyObject * args); |
6e25d997 | 46 | static PyObject * reflowText(PyObject * s, PyObject * args); |
47 | static snackWidget * textWidget(PyObject * s, PyObject * args); | |
80d03bd8 | 48 | static PyObject * ternaryWindow(PyObject * s, PyObject * args); |
f06c5a99 | 49 | static snackWidget * checkboxTreeWidget(PyObject * s, PyObject * args); |
80d03bd8 | 50 | |
51 | static PyMethodDef snackModuleMethods[] = { | |
52 | { "button", (PyCFunction) buttonWidget, METH_VARARGS, NULL }, | |
53 | { "checkbox", (PyCFunction) checkboxWidget, METH_VARARGS, NULL }, | |
54 | { "choice", choiceWindow, METH_VARARGS, NULL }, | |
55 | { "centeredwindow", centeredWindow, METH_VARARGS, NULL }, | |
75fb0452 | 56 | { "drawroottext", drawRootText, METH_VARARGS, NULL }, |
80d03bd8 | 57 | { "entry", (PyCFunction) entryWidget, METH_VARARGS, NULL }, |
58 | { "finish", finishScreen, METH_VARARGS, NULL }, | |
59 | { "form", (PyCFunction) formCreate, METH_VARARGS, NULL }, | |
60 | { "grid", (PyCFunction) gridCreate, METH_VARARGS, NULL }, | |
61 | { "gridwrappedwindow", gridWrappedWindow, METH_VARARGS, NULL }, | |
62 | { "init", initScreen, METH_VARARGS, NULL }, | |
63 | { "label", (PyCFunction) labelWidget, METH_VARARGS, NULL }, | |
6e25d997 | 64 | { "listbox", (PyCFunction) listboxWidget, METH_VARARGS, NULL }, |
80d03bd8 | 65 | { "message", messageWindow, METH_VARARGS, NULL }, |
66 | { "openwindow", openWindow, METH_VARARGS, NULL }, | |
75fb0452 | 67 | { "pophelpline", popHelpLine, METH_VARARGS, NULL }, |
80d03bd8 | 68 | { "popwindow", popWindow, METH_VARARGS, NULL }, |
75fb0452 | 69 | { "pushhelpline", pushHelpLine, METH_VARARGS, NULL }, |
80d03bd8 | 70 | { "radiobutton", (PyCFunction) radioButtonWidget, METH_VARARGS, NULL }, |
6e25d997 | 71 | { "reflow", (PyCFunction) reflowText, METH_VARARGS, NULL }, |
80d03bd8 | 72 | { "refresh", refreshScreen, METH_VARARGS, NULL }, |
06cf519e | 73 | { "scale", scaleWidget, METH_VARARGS, NULL }, |
9f0ab2ac | 74 | { "size", screenSize, METH_VARARGS, NULL }, |
06cf519e | 75 | { "suspendcallback", setSuspendCallback, METH_VARARGS, NULL }, |
80d03bd8 | 76 | { "ternary", ternaryWindow, METH_VARARGS, NULL }, |
6e25d997 | 77 | { "textbox", (PyCFunction) textWidget, METH_VARARGS, NULL }, |
f06c5a99 | 78 | { "checkboxtree", (PyCFunction) checkboxTreeWidget, METH_VARARGS, NULL }, |
80d03bd8 | 79 | { NULL } |
80 | } ; | |
81 | ||
82 | struct snackGrid_s { | |
83 | PyObject_HEAD; | |
84 | newtGrid grid; | |
85 | } ; | |
86 | ||
87 | static PyObject * gridGetAttr(PyObject * s, char * name); | |
88 | static PyObject * gridPlace(snackGrid * s, PyObject * args); | |
89 | static PyObject * gridSetField(snackGrid * s, PyObject * args); | |
90 | ||
91 | static PyMethodDef gridMethods[] = { | |
92 | { "place", (PyCFunction) gridPlace, METH_VARARGS, NULL }, | |
93 | { "setfield", (PyCFunction) gridSetField, METH_VARARGS, NULL }, | |
94 | { NULL } | |
95 | }; | |
96 | ||
97 | static PyTypeObject snackGridType = { | |
98 | PyObject_HEAD_INIT(&PyType_Type) | |
99 | 0, /* ob_size */ | |
100 | "snackgrid", /* tp_name */ | |
101 | sizeof(snackGrid), /* tp_size */ | |
102 | 0, /* tp_itemsize */ | |
103 | emptyDestructor, /* tp_dealloc */ | |
104 | 0, /* tp_print */ | |
105 | gridGetAttr, /* tp_getattr */ | |
106 | 0, /* tp_setattr */ | |
107 | 0, /* tp_compare */ | |
108 | 0, /* tp_repr */ | |
109 | 0, /* tp_as_number */ | |
110 | 0, /* tp_as_sequence */ | |
111 | 0, /* tp_as_mapping */ | |
112 | }; | |
113 | ||
114 | struct snackForm_s { | |
115 | PyObject_HEAD; | |
116 | newtComponent fo; | |
117 | } ; | |
118 | ||
119 | static PyObject * formGetAttr(PyObject * s, char * name); | |
120 | static PyObject * formAdd(snackForm * s, PyObject * args); | |
bd38d47e | 121 | static PyObject * formDraw(snackForm * s, PyObject * args); |
80d03bd8 | 122 | static PyObject * formRun(snackForm * s, PyObject * args); |
ea59ae12 | 123 | static PyObject * formHotKey(snackForm * s, PyObject * args); |
5d678658 | 124 | static PyObject * formSetCurrent(snackForm * form, PyObject * args); |
80d03bd8 | 125 | |
126 | static PyMethodDef formMethods[] = { | |
127 | { "add", (PyCFunction) formAdd, METH_VARARGS, NULL }, | |
bd38d47e | 128 | { "draw", (PyCFunction) formDraw, METH_VARARGS, NULL }, |
80d03bd8 | 129 | { "run", (PyCFunction) formRun, METH_VARARGS, NULL }, |
ea59ae12 | 130 | { "addhotkey", (PyCFunction) formHotKey, METH_VARARGS, NULL }, |
5d678658 | 131 | { "setcurrent", (PyCFunction) formSetCurrent, METH_VARARGS, NULL }, |
80d03bd8 | 132 | { NULL } |
133 | }; | |
134 | ||
135 | static PyTypeObject snackFormType = { | |
136 | PyObject_HEAD_INIT(&PyType_Type) | |
137 | 0, /* ob_size */ | |
138 | "snackform", /* tp_name */ | |
139 | sizeof(snackForm), /* tp_size */ | |
140 | 0, /* tp_itemsize */ | |
141 | emptyDestructor, /* tp_dealloc */ | |
142 | 0, /* tp_print */ | |
143 | formGetAttr, /* tp_getattr */ | |
144 | 0, /* tp_setattr */ | |
145 | 0, /* tp_compare */ | |
146 | 0, /* tp_repr */ | |
147 | 0, /* tp_as_number */ | |
148 | 0, /* tp_as_sequence */ | |
149 | 0, /* tp_as_mapping */ | |
150 | }; | |
151 | ||
152 | struct snackWidget_s { | |
153 | PyObject_HEAD; | |
154 | newtComponent co; | |
155 | char achar; | |
156 | void * apointer; | |
6e25d997 | 157 | int anint; |
5d678658 | 158 | struct callbackStruct scs; |
80d03bd8 | 159 | } ; |
160 | ||
6a703ca8 | 161 | static PyObject * widgetAddCallback(snackWidget * s, PyObject * args); |
80d03bd8 | 162 | static PyObject * widgetGetAttr(PyObject * s, char * name); |
1dfa0cfa | 163 | static void widgetDestructor(PyObject * s); |
80d03bd8 | 164 | static PyObject * widgetEntrySetValue(snackWidget * s, PyObject * args); |
522d3500 | 165 | static PyObject * widgetLabelText(snackWidget * s, PyObject * args); |
6e25d997 | 166 | static PyObject * widgetListboxSetW(snackWidget * s, PyObject * args); |
167 | static PyObject * widgetListboxAdd(snackWidget * s, PyObject * args); | |
a507b3ec | 168 | static PyObject * widgetListboxIns(snackWidget * s, PyObject * args); |
169 | static PyObject * widgetListboxDel(snackWidget * s, PyObject * args); | |
6e25d997 | 170 | static PyObject * widgetListboxGet(snackWidget * s, PyObject * args); |
99438c19 | 171 | static PyObject * widgetListboxSet(snackWidget * s, PyObject * args); |
36f926a6 | 172 | static PyObject * widgetTextboxText(snackWidget * s, PyObject * args); |
75d40644 | 173 | static PyObject * widgetCheckboxTreeAddItem(snackWidget * s, PyObject * args); |
5d678658 | 174 | static PyObject * widgetCheckboxTreeGetSel(snackWidget * s, PyObject * args); |
175 | static PyObject * widgetEntrySetFlags(snackWidget * s, PyObject * args); | |
c573c71b | 176 | static PyObject * widgetCheckboxSetFlags(snackWidget * s, PyObject * args); |
80d03bd8 | 177 | |
178 | static PyMethodDef widgetMethods[] = { | |
6a703ca8 | 179 | { "setCallback", (PyCFunction) widgetAddCallback, METH_VARARGS, NULL }, |
522d3500 | 180 | { "labelText", (PyCFunction) widgetLabelText, METH_VARARGS, NULL }, |
36f926a6 | 181 | { "textboxText", (PyCFunction) widgetTextboxText, METH_VARARGS, NULL }, |
80d03bd8 | 182 | { "entrySetValue", (PyCFunction) widgetEntrySetValue, METH_VARARGS, NULL }, |
6e25d997 | 183 | { "listboxAddItem", (PyCFunction) widgetListboxAdd, METH_VARARGS, NULL }, |
a507b3ec | 184 | { "listboxInsertItem", (PyCFunction) widgetListboxIns, METH_VARARGS, NULL }, |
6e25d997 | 185 | { "listboxGetCurrent", (PyCFunction) widgetListboxGet, METH_VARARGS, NULL }, |
99438c19 | 186 | { "listboxSetCurrent", (PyCFunction) widgetListboxSet, METH_VARARGS, NULL }, |
6e25d997 | 187 | { "listboxSetWidth", (PyCFunction) widgetListboxSetW, METH_VARARGS, NULL }, |
a507b3ec | 188 | { "listboxDeleteItem", (PyCFunction) widgetListboxDel, METH_VARARGS, NULL }, |
06cf519e | 189 | { "scaleSet", (PyCFunction) scaleSet, METH_VARARGS, NULL }, |
75d40644 | 190 | { "checkboxtreeAddItem", (PyCFunction) widgetCheckboxTreeAddItem, |
f06c5a99 | 191 | METH_VARARGS, NULL }, |
192 | { "checkboxtreeGetSelection", (PyCFunction) widgetCheckboxTreeGetSel, | |
193 | METH_VARARGS, NULL }, | |
5d678658 | 194 | { "entrySetFlags", (PyCFunction) widgetEntrySetFlags, METH_VARARGS, NULL }, |
c573c71b | 195 | { "checkboxSetFlags", (PyCFunction) widgetCheckboxSetFlags, METH_VARARGS, NULL }, |
80d03bd8 | 196 | { NULL } |
197 | }; | |
198 | ||
199 | static PyTypeObject snackWidgetType = { | |
200 | PyObject_HEAD_INIT(&PyType_Type) | |
201 | 0, /* ob_size */ | |
202 | "snackwidget", /* tp_name */ | |
203 | sizeof(snackWidget), /* tp_size */ | |
204 | 0, /* tp_itemsize */ | |
1dfa0cfa | 205 | widgetDestructor, /* tp_dealloc */ |
80d03bd8 | 206 | 0, /* tp_print */ |
207 | widgetGetAttr, /* tp_getattr */ | |
208 | 0, /* tp_setattr */ | |
209 | 0, /* tp_compare */ | |
210 | 0, /* tp_repr */ | |
211 | 0, /* tp_as_number */ | |
212 | 0, /* tp_as_sequence */ | |
213 | 0, /* tp_as_mapping */ | |
214 | }; | |
215 | ||
1dfa0cfa | 216 | static snackWidget * snackWidgetNew (void) { |
217 | snackWidget * widget; | |
218 | ||
219 | widget = PyObject_NEW(snackWidget, &snackWidgetType); | |
220 | ||
221 | widget->scs.cb = NULL; | |
222 | widget->scs.data = NULL; | |
223 | ||
224 | return widget; | |
225 | } | |
226 | ||
80d03bd8 | 227 | static PyObject * initScreen(PyObject * s, PyObject * args) { |
1dfa0cfa | 228 | suspend.cb = NULL; |
229 | suspend.data = NULL; | |
230 | ||
80d03bd8 | 231 | newtInit(); |
232 | newtCls(); | |
233 | ||
234 | Py_INCREF(Py_None); | |
235 | return Py_None; | |
236 | } | |
237 | ||
238 | static PyObject * finishScreen(PyObject * s, PyObject * args) { | |
dd66cfb7 | 239 | Py_XDECREF (suspend.cb); |
240 | Py_XDECREF (suspend.data); | |
241 | ||
80d03bd8 | 242 | newtFinished(); |
243 | Py_INCREF(Py_None); | |
244 | return Py_None; | |
245 | } | |
246 | ||
247 | static PyObject * refreshScreen(PyObject * s, PyObject * args) { | |
248 | newtRefresh(); | |
249 | Py_INCREF(Py_None); | |
250 | return Py_None; | |
251 | } | |
252 | ||
06cf519e | 253 | static PyObject * scaleWidget(PyObject * s, PyObject * args) { |
254 | snackWidget * widget; | |
255 | int width, fullAmount; | |
256 | ||
257 | if (!PyArg_ParseTuple(args, "ii", &width, &fullAmount)) return NULL; | |
258 | ||
1dfa0cfa | 259 | widget = snackWidgetNew (); |
06cf519e | 260 | widget->co = newtScale(-1, -1, width, fullAmount); |
261 | ||
262 | return (PyObject *) widget; | |
263 | } | |
264 | ||
265 | static PyObject * scaleSet(snackWidget * s, PyObject * args) { | |
266 | int amount; | |
267 | ||
268 | if (!PyArg_ParseTuple(args, "i", &amount)) return NULL; | |
269 | ||
270 | newtScaleSet(s->co, amount); | |
271 | ||
272 | Py_INCREF(Py_None); | |
273 | return Py_None; | |
274 | } | |
275 | ||
9f0ab2ac | 276 | static PyObject * screenSize(PyObject * s, PyObject * args) { |
277 | int width, height; | |
278 | ||
279 | if (!PyArg_ParseTuple(args, "")) | |
280 | return NULL; | |
281 | ||
282 | newtGetScreenSize(&width, &height); | |
283 | ||
284 | return Py_BuildValue("(ii)", width, height); | |
285 | } | |
286 | ||
5d678658 | 287 | static void suspendCallbackMarshall(void * data) { |
288 | struct callbackStruct * scs = data; | |
289 | PyObject * args, * result; | |
290 | ||
1dfa0cfa | 291 | if (scs->data) { |
292 | args = Py_BuildValue("(O)", scs->data); | |
293 | result = PyEval_CallObject(scs->cb, args); | |
294 | Py_DECREF (args); | |
295 | } else | |
296 | result = PyEval_CallObject(scs->cb, NULL); | |
297 | ||
298 | if (!result) { | |
299 | PyErr_Print(); | |
300 | PyErr_Clear(); | |
301 | } | |
5d678658 | 302 | |
5d678658 | 303 | Py_XDECREF(result); |
304 | ||
305 | return; | |
306 | } | |
307 | ||
308 | static void callbackMarshall(newtComponent co, void * data) { | |
309 | struct callbackStruct * scs = data; | |
06cf519e | 310 | PyObject * args, * result; |
311 | ||
1dfa0cfa | 312 | if (scs->data) { |
313 | args = Py_BuildValue("(O)", scs->data); | |
314 | result = PyEval_CallObject(scs->cb, args); | |
315 | Py_DECREF (args); | |
316 | } else | |
317 | result = PyEval_CallObject(scs->cb, NULL); | |
1ea8f607 | 318 | |
5d678658 | 319 | if (!result) { |
320 | PyErr_Print(); | |
321 | PyErr_Clear(); | |
322 | } | |
323 | ||
1ea8f607 | 324 | Py_XDECREF(result); |
06cf519e | 325 | |
1ea8f607 | 326 | return; |
06cf519e | 327 | } |
328 | ||
329 | static PyObject * setSuspendCallback(PyObject * s, PyObject * args) { | |
1dfa0cfa | 330 | if (!PyArg_ParseTuple(args, "O|O", &suspend.cb, &suspend.data)) |
06cf519e | 331 | return NULL; |
332 | ||
1dfa0cfa | 333 | Py_INCREF (suspend.cb); |
334 | Py_XINCREF (suspend.data); | |
335 | ||
336 | newtSetSuspendCallback(suspendCallbackMarshall, &suspend); | |
06cf519e | 337 | |
338 | Py_INCREF(Py_None); | |
339 | return Py_None; | |
340 | } | |
341 | ||
75fb0452 | 342 | static PyObject * drawRootText(PyObject * s, PyObject * args) { |
343 | int left, top; | |
344 | char * text; | |
345 | ||
346 | if (!PyArg_ParseTuple(args, "iis", &left, &top, &text)) | |
347 | return NULL; | |
348 | ||
ec65dcfe | 349 | newtDrawRootText(left, top, text); |
75fb0452 | 350 | |
351 | Py_INCREF(Py_None); | |
352 | return Py_None; | |
353 | } | |
354 | ||
355 | static PyObject * popHelpLine(PyObject * s, PyObject * args) { | |
356 | newtPopHelpLine(); | |
357 | Py_INCREF(Py_None); | |
358 | return Py_None; | |
359 | } | |
360 | ||
361 | static PyObject * pushHelpLine(PyObject * s, PyObject * args) { | |
362 | char * text; | |
363 | ||
364 | if (!PyArg_ParseTuple(args, "s", &text)) | |
365 | return NULL; | |
366 | ||
367 | if (!strcmp(text, "*default*")) | |
368 | newtPushHelpLine(NULL); | |
369 | else | |
370 | newtPushHelpLine(text); | |
371 | ||
372 | Py_INCREF(Py_None); | |
373 | return Py_None; | |
374 | } | |
375 | ||
6e25d997 | 376 | static PyObject * reflowText(PyObject * s, PyObject * args) { |
377 | char * text, * new; | |
378 | int width, minus = 5, plus = 5; | |
379 | int realWidth, realHeight; | |
380 | PyObject * tuple; | |
381 | ||
382 | if (!PyArg_ParseTuple(args, "si|ii", &text, &width, &minus, &plus)) | |
383 | return NULL; | |
384 | ||
385 | new = newtReflowText(text, width, minus, plus, &realWidth, &realHeight); | |
386 | ||
387 | tuple = Py_BuildValue("(sii)", new, realWidth, realHeight); | |
388 | free(new); | |
389 | ||
390 | return tuple; | |
391 | } | |
392 | ||
80d03bd8 | 393 | static PyObject * centeredWindow(PyObject * s, PyObject * args) { |
394 | int width, height; | |
395 | char * title; | |
396 | ||
397 | if (!PyArg_ParseTuple(args, "iis", &width, &height, &title)) | |
398 | return NULL; | |
399 | ||
400 | newtCenteredWindow(width, height, title); | |
401 | ||
402 | Py_INCREF(Py_None); | |
403 | return Py_None; | |
404 | } | |
405 | ||
406 | static PyObject * gridWrappedWindow(PyObject * s, PyObject * args) { | |
407 | snackGrid * grid; | |
408 | char * title; | |
409 | ||
410 | if (!PyArg_ParseTuple(args, "O!s", &snackGridType, &grid, &title)) | |
411 | return NULL; | |
412 | ||
413 | newtGridWrappedWindow(grid->grid, title); | |
414 | ||
415 | Py_INCREF(Py_None); | |
416 | return Py_None; | |
417 | } | |
418 | ||
419 | static PyObject * openWindow(PyObject * s, PyObject * args) { | |
420 | int left, top, width, height; | |
421 | char * title; | |
422 | ||
423 | if (!PyArg_ParseTuple(args, "iiiis", &left, &top, &width, &height, &title)) | |
424 | return NULL; | |
425 | ||
426 | newtOpenWindow(left, top, width, height, title); | |
427 | ||
428 | Py_INCREF(Py_None); | |
429 | return Py_None; | |
430 | } | |
431 | ||
432 | static PyObject * popWindow(PyObject * s, PyObject * args) { | |
433 | newtPopWindow(); | |
434 | Py_INCREF(Py_None); | |
435 | return Py_None; | |
436 | } | |
437 | ||
438 | static PyObject * messageWindow(PyObject * s, PyObject * args) { | |
439 | char * title, * text; | |
440 | char * okbutton = "Ok"; | |
441 | ||
442 | if (!PyArg_ParseTuple(args, "ss|s", &title, &text, &okbutton)) | |
443 | return NULL; | |
444 | ||
445 | newtWinMessage(title, okbutton, text); | |
446 | ||
447 | Py_INCREF(Py_None); | |
448 | return Py_None; | |
449 | } | |
450 | ||
451 | static PyObject * choiceWindow(PyObject * s, PyObject * args) { | |
452 | char * title, * text; | |
453 | char * okbutton = "Ok"; | |
454 | char * cancelbutton = "Cancel"; | |
455 | int rc; | |
456 | ||
457 | if (!PyArg_ParseTuple(args, "ss|ss", &title, &text, &okbutton, | |
458 | &cancelbutton)) | |
459 | return NULL; | |
460 | ||
461 | rc = newtWinChoice(title, okbutton, cancelbutton, text); | |
462 | ||
93a3a267 | 463 | return Py_BuildValue("i", rc); |
80d03bd8 | 464 | } |
465 | ||
466 | static PyObject * ternaryWindow(PyObject * s, PyObject * args) { | |
467 | char * title, * text, * button1, * button2, * button3; | |
468 | int rc; | |
469 | ||
470 | if (!PyArg_ParseTuple(args, "sssss", &title, &text, &button1, &button2, | |
471 | &button3)) | |
472 | return NULL; | |
473 | ||
474 | rc = newtWinTernary(title, button1, button2, button3, text); | |
475 | ||
476 | return Py_BuildValue("i", rc); | |
477 | } | |
478 | ||
479 | static snackWidget * buttonWidget(PyObject * s, PyObject * args) { | |
480 | snackWidget * widget; | |
481 | char * label; | |
482 | ||
483 | if (!PyArg_ParseTuple(args, "s", &label)) return NULL; | |
484 | ||
1dfa0cfa | 485 | widget = snackWidgetNew (); |
80d03bd8 | 486 | widget->co = newtButton(-1, -1, label); |
487 | ||
488 | return widget; | |
489 | } | |
490 | ||
491 | static snackWidget * labelWidget(PyObject * s, PyObject * args) { | |
492 | char * label; | |
493 | snackWidget * widget; | |
494 | ||
495 | if (!PyArg_ParseTuple(args, "s", &label)) return NULL; | |
496 | ||
1dfa0cfa | 497 | widget = snackWidgetNew (); |
80d03bd8 | 498 | widget->co = newtLabel(-1, -1, label); |
499 | ||
500 | return widget; | |
501 | } | |
502 | ||
522d3500 | 503 | static PyObject * widgetLabelText(snackWidget * s, PyObject * args) { |
504 | char * label; | |
505 | ||
506 | if (!PyArg_ParseTuple(args, "s", &label)) return NULL; | |
507 | ||
508 | newtLabelSetText(s->co, label); | |
509 | ||
510 | Py_INCREF(Py_None); | |
511 | return Py_None; | |
512 | } | |
513 | ||
36f926a6 | 514 | static PyObject * widgetTextboxText(snackWidget * s, PyObject * args) { |
515 | char * text; | |
516 | ||
517 | if (!PyArg_ParseTuple(args, "s", &text)) return NULL; | |
518 | ||
519 | newtTextboxSetText(s->co, text); | |
520 | ||
521 | Py_INCREF(Py_None); | |
522 | return Py_None; | |
523 | } | |
524 | ||
6e25d997 | 525 | static snackWidget * listboxWidget(PyObject * s, PyObject * args) { |
526 | snackWidget * widget; | |
527 | int height; | |
528 | int doScroll = 0, returnExit = 0 ; | |
529 | ||
530 | if (!PyArg_ParseTuple(args, "i|ii", &height, &doScroll, &returnExit)) | |
531 | return NULL; | |
532 | ||
1dfa0cfa | 533 | widget = snackWidgetNew (); |
6e25d997 | 534 | widget->co = newtListbox(-1, -1, height, |
49a91bd2 | 535 | (doScroll ? NEWT_FLAG_SCROLL : 0) | |
6e25d997 | 536 | (returnExit ? NEWT_FLAG_RETURNEXIT : 0)); |
a507b3ec | 537 | widget->anint = 1; |
6e25d997 | 538 | |
539 | return widget; | |
540 | } | |
541 | ||
542 | static snackWidget * textWidget(PyObject * s, PyObject * args) { | |
543 | char * text; | |
544 | int width, height; | |
545 | int scrollBar = 0; | |
36f926a6 | 546 | int wrap = 0; |
6e25d997 | 547 | snackWidget * widget; |
548 | ||
36f926a6 | 549 | if (!PyArg_ParseTuple(args, "iis|ii", &width, &height, &text, &scrollBar, &wrap)) |
6e25d997 | 550 | return NULL; |
551 | ||
1dfa0cfa | 552 | widget = snackWidgetNew (); |
6e25d997 | 553 | widget->co = newtTextbox(-1, -1, width, height, |
36f926a6 | 554 | (scrollBar ? NEWT_FLAG_SCROLL : 0) | |
555 | (wrap ? NEWT_FLAG_WRAP : 0)); | |
6e25d997 | 556 | newtTextboxSetText(widget->co, text); |
557 | ||
558 | return widget; | |
559 | } | |
560 | ||
80d03bd8 | 561 | static snackWidget * radioButtonWidget(PyObject * s, PyObject * args) { |
562 | snackWidget * widget, * group; | |
563 | char * text; | |
564 | int isOn; | |
565 | ||
566 | if (!PyArg_ParseTuple(args, "sOi", &text, &group, &isOn)) | |
567 | return NULL; | |
568 | ||
1dfa0cfa | 569 | widget = snackWidgetNew (); |
80d03bd8 | 570 | |
571 | if ((PyObject *) group == Py_None) | |
572 | widget->co = newtRadiobutton(-1, -1, text, isOn, NULL); | |
573 | else | |
574 | widget->co = newtRadiobutton(-1, -1, text, isOn, group->co); | |
575 | ||
576 | return widget; | |
577 | } | |
578 | ||
579 | static snackWidget * checkboxWidget(PyObject * s, PyObject * args) { | |
580 | snackWidget * widget; | |
581 | char * text; | |
582 | int isOn; | |
583 | ||
584 | if (!PyArg_ParseTuple(args, "si", &text, &isOn)) return NULL; | |
585 | ||
1dfa0cfa | 586 | widget = snackWidgetNew (); |
80d03bd8 | 587 | widget->co = newtCheckbox(-1, -1, text, isOn ? '*' : ' ', NULL, |
588 | &widget->achar); | |
589 | ||
590 | return widget; | |
591 | } | |
592 | ||
c573c71b | 593 | static PyObject * widgetCheckboxSetFlags(snackWidget * s, PyObject * args) { |
594 | int flag, sense; | |
595 | ||
596 | if (!PyArg_ParseTuple(args, "ii", &flag, &sense)) return NULL; | |
597 | ||
598 | newtCheckboxSetFlags(s->co, flag, sense); | |
599 | ||
600 | Py_INCREF(Py_None); | |
601 | return Py_None; | |
602 | } | |
603 | ||
604 | ||
80d03bd8 | 605 | static snackWidget * entryWidget(PyObject * s, PyObject * args) { |
606 | snackWidget * widget; | |
607 | int width; | |
608 | char * initial; | |
5a8da880 | 609 | int isHidden, isScrolled, returnExit; |
80d03bd8 | 610 | |
b85af896 | 611 | if (!PyArg_ParseTuple(args, "isiii", &width, &initial, |
5a8da880 | 612 | &isHidden, &isScrolled, &returnExit)) return NULL; |
80d03bd8 | 613 | |
1dfa0cfa | 614 | widget = snackWidgetNew (); |
80d03bd8 | 615 | widget->co = newtEntry(-1, -1, initial, width, (char **) &widget->apointer, |
616 | (isHidden ? NEWT_FLAG_HIDDEN : 0) | | |
5a8da880 | 617 | (returnExit ? NEWT_FLAG_RETURNEXIT : 0) | |
49a91bd2 | 618 | (isScrolled ? NEWT_FLAG_SCROLL : 0)); |
80d03bd8 | 619 | |
620 | return widget; | |
621 | } | |
622 | ||
623 | static snackForm * formCreate(PyObject * s, PyObject * args) { | |
624 | snackForm * form; | |
625 | ||
626 | form = PyObject_NEW(snackForm, &snackFormType); | |
627 | form->fo = newtForm(NULL, NULL, 0); | |
628 | ||
629 | return form; | |
630 | } | |
631 | ||
632 | static snackGrid * gridCreate(PyObject * s, PyObject * args) { | |
633 | int rows, cols; | |
634 | snackGrid * grid; | |
635 | ||
636 | if (!PyArg_ParseTuple(args, "ii", &cols, &rows)) return NULL; | |
637 | ||
638 | grid = PyObject_NEW(snackGrid, &snackGridType); | |
639 | grid->grid = newtCreateGrid(cols, rows); | |
640 | ||
641 | return grid; | |
642 | } | |
643 | ||
644 | static PyObject * gridGetAttr(PyObject * s, char * name) { | |
645 | return Py_FindMethod(gridMethods, s, name); | |
646 | } | |
647 | ||
648 | static PyObject * gridPlace(snackGrid * grid, PyObject * args) { | |
649 | int x, y; | |
650 | ||
651 | if (!PyArg_ParseTuple(args, "ii", &x, &y)) return NULL; | |
652 | ||
653 | newtGridPlace(grid->grid, x, y); | |
654 | ||
655 | Py_INCREF(Py_None); | |
656 | return Py_None; | |
657 | } | |
658 | ||
659 | static PyObject * gridSetField(snackGrid * grid, PyObject * args) { | |
660 | snackWidget * w; | |
6e25d997 | 661 | snackGrid * g; |
80d03bd8 | 662 | int x, y; |
663 | int pLeft = 0, pTop = 0, pRight = 0, pBottom = 0; | |
6e25d997 | 664 | int anchorFlags = 0, growFlags = 0; |
80d03bd8 | 665 | |
6e25d997 | 666 | if (!PyArg_ParseTuple(args, "iiO|(iiii)ii", &x, &y, |
667 | &w, &pLeft, &pTop, &pRight, &pBottom, | |
668 | &anchorFlags, &growFlags)) | |
80d03bd8 | 669 | return NULL; |
670 | ||
6e25d997 | 671 | if (w->ob_type == &snackWidgetType) { |
672 | newtGridSetField(grid->grid, x, y, NEWT_GRID_COMPONENT, | |
673 | w->co, pLeft, pTop, pRight, pBottom, anchorFlags, | |
674 | growFlags); | |
675 | } else { | |
676 | g = (snackGrid *) w; | |
677 | newtGridSetField(grid->grid, x, y, NEWT_GRID_SUBGRID, | |
678 | g->grid, pLeft, pTop, pRight, pBottom, anchorFlags, | |
679 | growFlags); | |
680 | } | |
80d03bd8 | 681 | |
682 | Py_INCREF(Py_None); | |
683 | return Py_None; | |
684 | } | |
685 | ||
686 | static PyObject * formGetAttr(PyObject * s, char * name) { | |
687 | return Py_FindMethod(formMethods, s, name); | |
688 | } | |
689 | ||
bd38d47e | 690 | static PyObject * formDraw(snackForm * s, PyObject * args) { |
691 | newtDrawForm(s->fo); | |
692 | ||
693 | Py_INCREF(Py_None); | |
694 | return Py_None; | |
695 | } | |
696 | ||
80d03bd8 | 697 | static PyObject * formAdd(snackForm * s, PyObject * args) { |
698 | snackWidget * w; | |
699 | int size = PyTuple_Size(args), i; | |
700 | ||
701 | if (!size) { | |
702 | /* this is a hack, I should give an error directly */ | |
703 | if (!PyArg_ParseTuple(args, "O!", &snackWidgetType, &w)) | |
704 | return NULL; | |
705 | } | |
706 | ||
707 | for (i = 0; i < size; i++) { | |
708 | w = (snackWidget *) PyTuple_GET_ITEM(args, i); | |
709 | newtFormAddComponent(s->fo, w->co); | |
710 | } | |
711 | ||
712 | Py_INCREF(Py_None); | |
713 | return Py_None; | |
714 | } | |
715 | ||
716 | static PyObject * formRun(snackForm * s, PyObject * args) { | |
ea59ae12 | 717 | struct newtExitStruct result; |
718 | ||
719 | newtFormRun(s->fo, &result); | |
720 | ||
721 | if (result.reason == NEWT_EXIT_HOTKEY) | |
722 | return Py_BuildValue("(si)", "hotkey", result.u.key); | |
723 | else | |
724 | return Py_BuildValue("(si)", "widget", result.u.co); | |
725 | } | |
726 | ||
727 | static PyObject * formHotKey(snackForm * s, PyObject * args) { | |
728 | int key; | |
729 | ||
730 | if (!PyArg_ParseTuple(args, "i", &key)) | |
731 | return NULL; | |
732 | ||
733 | newtFormAddHotKey(s->fo, key); | |
80d03bd8 | 734 | |
735 | Py_INCREF(Py_None); | |
736 | return Py_None; | |
737 | } | |
738 | ||
5d678658 | 739 | static PyObject * formSetCurrent(snackForm * form, PyObject * args) { |
740 | snackWidget * w; | |
741 | ||
742 | if (!PyArg_ParseTuple(args, "O", &w)) | |
743 | return NULL; | |
744 | ||
745 | newtFormSetCurrent(form->fo, w->co); | |
746 | ||
747 | Py_INCREF(Py_None); | |
748 | return Py_None; | |
749 | } | |
750 | ||
80d03bd8 | 751 | static PyObject * widgetGetAttr(PyObject * s, char * name) { |
752 | snackWidget * w = (snackWidget *) s; | |
753 | ||
ea59ae12 | 754 | if (!strcmp(name, "key")) { |
80d03bd8 | 755 | return Py_BuildValue("i", w->co); |
756 | } else if (!strcmp(name, "entryValue")) { | |
757 | return Py_BuildValue("s", w->apointer); | |
758 | } else if (!strcmp(name, "checkboxValue")) { | |
759 | return Py_BuildValue("i", w->achar == ' ' ? 0 : 1); | |
760 | } else if (!strcmp(name, "radioValue")) { | |
761 | return Py_BuildValue("i", newtRadioGetCurrent(w->co)); | |
762 | } | |
763 | ||
764 | return Py_FindMethod(widgetMethods, s, name); | |
765 | } | |
766 | ||
1dfa0cfa | 767 | static void widgetDestructor(PyObject * o) { |
768 | snackWidget * s = (snackWidget *) o; | |
769 | ||
770 | Py_XDECREF (s->scs.cb); | |
771 | Py_XDECREF (s->scs.data); | |
772 | ||
773 | PyMem_DEL(o); | |
774 | } | |
775 | ||
6a703ca8 | 776 | static PyObject * widgetAddCallback(snackWidget * s, PyObject * args) { |
1dfa0cfa | 777 | s->scs.cb = NULL; |
778 | s->scs.data = NULL; | |
779 | ||
5d678658 | 780 | if (!PyArg_ParseTuple(args, "O|O", &s->scs.cb, &s->scs.data)) |
6a703ca8 | 781 | return NULL; |
782 | ||
1dfa0cfa | 783 | Py_INCREF (s->scs.cb); |
784 | Py_XINCREF (s->scs.data); | |
785 | ||
5d678658 | 786 | newtComponentAddCallback(s->co, callbackMarshall, &s->scs); |
6a703ca8 | 787 | |
788 | Py_INCREF(Py_None); | |
789 | return Py_None; | |
790 | } | |
791 | ||
80d03bd8 | 792 | static PyObject * widgetEntrySetValue(snackWidget * s, PyObject * args) { |
793 | char * val; | |
794 | ||
795 | if (!PyArg_ParseTuple(args, "s", &val)) | |
796 | return NULL; | |
797 | ||
798 | newtEntrySet(s->co, val, 1); | |
799 | ||
800 | Py_INCREF(Py_None); | |
801 | return Py_None; | |
802 | } | |
803 | ||
5d678658 | 804 | static PyObject * widgetEntrySetFlags(snackWidget * s, PyObject * args) { |
805 | int flag, sense; | |
806 | ||
807 | if (!PyArg_ParseTuple(args, "ii", &flag, &sense)) return NULL; | |
808 | ||
809 | newtEntrySetFlags(s->co, flag, sense); | |
810 | ||
811 | Py_INCREF(Py_None); | |
812 | return Py_None; | |
813 | } | |
814 | ||
815 | ||
6e25d997 | 816 | static PyObject * widgetListboxAdd(snackWidget * s, PyObject * args) { |
817 | char * text; | |
818 | ||
819 | if (!PyArg_ParseTuple(args, "s", &text)) | |
820 | return NULL; | |
821 | ||
822 | newtListboxAddEntry(s->co, text, (void *) s->anint); | |
823 | ||
824 | return PyInt_FromLong(s->anint++); | |
825 | } | |
826 | ||
a507b3ec | 827 | static PyObject * widgetListboxIns(snackWidget * s, PyObject * args) { |
828 | char * text; | |
829 | int key; | |
830 | ||
831 | if (!PyArg_ParseTuple(args, "si", &text, &key)) | |
832 | return NULL; | |
833 | ||
834 | newtListboxInsertEntry(s->co, text, (void *) s->anint, (void *) key); | |
835 | ||
836 | return PyInt_FromLong(s->anint++); | |
837 | } | |
838 | ||
839 | static PyObject * widgetListboxDel(snackWidget * s, PyObject * args) { | |
840 | int key; | |
841 | ||
842 | if (!PyArg_ParseTuple(args, "i", &key)) | |
843 | return NULL; | |
844 | ||
845 | newtListboxDeleteEntry(s->co, (void *) key); | |
846 | ||
847 | Py_INCREF(Py_None); | |
848 | return Py_None; | |
849 | } | |
850 | ||
6e25d997 | 851 | static PyObject * widgetListboxGet(snackWidget * s, PyObject * args) { |
852 | if (!PyArg_ParseTuple(args, "")) | |
853 | return NULL; | |
854 | ||
855 | return PyInt_FromLong((long) newtListboxGetCurrent(s->co)); | |
856 | } | |
857 | ||
99438c19 | 858 | static PyObject * widgetListboxSet(snackWidget * s, PyObject * args) { |
859 | int index; | |
860 | ||
861 | if (!PyArg_ParseTuple(args, "i", &index)) | |
862 | return NULL; | |
863 | ||
f5ec4033 | 864 | newtListboxSetCurrentByKey(s->co, index); |
99438c19 | 865 | |
866 | Py_INCREF(Py_None); | |
867 | return Py_None; | |
868 | } | |
869 | ||
6e25d997 | 870 | static PyObject * widgetListboxSetW(snackWidget * s, PyObject * args) { |
871 | int width; | |
872 | ||
873 | if (!PyArg_ParseTuple(args, "i", &width)) | |
874 | return NULL; | |
875 | ||
876 | newtListboxSetWidth(s->co, width); | |
877 | ||
878 | Py_INCREF(Py_None); | |
879 | return Py_None; | |
880 | } | |
881 | ||
80d03bd8 | 882 | static void emptyDestructor(PyObject * s) { |
883 | } | |
884 | ||
f06c5a99 | 885 | static snackWidget * checkboxTreeWidget(PyObject * s, PyObject * args) { |
886 | int height; | |
887 | int scrollBar = 0; | |
888 | snackWidget * widget; | |
889 | ||
890 | if (!PyArg_ParseTuple(args, "i|i", &height, &scrollBar)) | |
891 | return NULL; | |
892 | ||
1dfa0cfa | 893 | widget = snackWidgetNew (); |
f06c5a99 | 894 | widget->co = newtCheckboxTree(-1, -1, height, |
895 | scrollBar ? NEWT_FLAG_SCROLL : 0); | |
896 | ||
897 | widget->anint = 1; | |
898 | ||
899 | return widget; | |
900 | } | |
901 | ||
75d40644 | 902 | static PyObject * widgetCheckboxTreeAddItem(snackWidget * s, PyObject * args) { |
f06c5a99 | 903 | char * text; |
f06c5a99 | 904 | int selected = 0; |
75d40644 | 905 | PyObject * pathList, * o; |
906 | int len; | |
907 | int * path; | |
908 | int i; | |
909 | ||
910 | if (!PyArg_ParseTuple(args, "sOi", &text, &pathList, &selected)) | |
f06c5a99 | 911 | return NULL; |
912 | ||
75d40644 | 913 | len = PyTuple_Size(pathList); |
914 | path = alloca(sizeof(*path) * (len + 1)); | |
915 | for (i = 0; i < len; i++) { | |
916 | o = PyTuple_GetItem(pathList, i); | |
917 | path[i] = PyInt_AsLong(o); | |
75d40644 | 918 | } |
919 | path[len] = NEWT_ARG_LAST; | |
920 | ||
5a6729cf | 921 | newtCheckboxTreeAddArray(s->co, text, (void *) s->anint, |
75d40644 | 922 | selected ? NEWT_FLAG_SELECTED : 0, path); |
f06c5a99 | 923 | |
924 | return PyInt_FromLong(s->anint++); | |
925 | } | |
926 | ||
5a6729cf | 927 | static PyObject * widgetCheckboxTreeGetSel(snackWidget * s, |
f06c5a99 | 928 | PyObject * args) { |
929 | void ** selection; | |
930 | int numselected; | |
5a6729cf | 931 | int i; |
932 | PyObject * sel; | |
f06c5a99 | 933 | |
934 | selection = newtCheckboxTreeGetSelection(s->co, &numselected); | |
935 | ||
788ec656 | 936 | sel = PyList_New(0); |
937 | ||
5a6729cf | 938 | if (!selection) { |
788ec656 | 939 | return sel; |
f06c5a99 | 940 | } |
941 | ||
5a6729cf | 942 | sel = PyList_New(0); |
943 | for (i = 0; i < numselected; i++) { | |
944 | PyList_Append(sel, PyInt_FromLong((int) selection[i])); | |
5a6729cf | 945 | } |
946 | free(selection); | |
f06c5a99 | 947 | |
5a6729cf | 948 | return sel; |
f06c5a99 | 949 | } |
950 | ||
80d03bd8 | 951 | void init_snack(void) { |
6e25d997 | 952 | PyObject * d, * m; |
953 | ||
954 | m = Py_InitModule("_snack", snackModuleMethods); | |
955 | d = PyModule_GetDict(m); | |
956 | ||
957 | PyDict_SetItemString(d, "ANCHOR_LEFT", PyInt_FromLong(NEWT_ANCHOR_LEFT)); | |
958 | PyDict_SetItemString(d, "ANCHOR_TOP", PyInt_FromLong(NEWT_ANCHOR_TOP)); | |
959 | PyDict_SetItemString(d, "ANCHOR_RIGHT", PyInt_FromLong(NEWT_ANCHOR_RIGHT)); | |
960 | PyDict_SetItemString(d, "ANCHOR_BOTTOM", | |
961 | PyInt_FromLong(NEWT_ANCHOR_BOTTOM)); | |
962 | PyDict_SetItemString(d, "GRID_GROWX", PyInt_FromLong(NEWT_GRID_FLAG_GROWX)); | |
963 | PyDict_SetItemString(d, "GRID_GROWY", PyInt_FromLong(NEWT_GRID_FLAG_GROWY)); | |
ea59ae12 | 964 | |
965 | PyDict_SetItemString(d, "FORM_EXIT_HOTKEY", PyString_FromString("hotkey")); | |
966 | PyDict_SetItemString(d, "FORM_EXIT_WIDGET", PyString_FromString("widget")); | |
967 | ||
968 | PyDict_SetItemString(d, "KEY_F1", PyInt_FromLong(NEWT_KEY_F1)); | |
969 | PyDict_SetItemString(d, "KEY_F2", PyInt_FromLong(NEWT_KEY_F2)); | |
970 | PyDict_SetItemString(d, "KEY_F3", PyInt_FromLong(NEWT_KEY_F3)); | |
971 | PyDict_SetItemString(d, "KEY_F4", PyInt_FromLong(NEWT_KEY_F4)); | |
972 | PyDict_SetItemString(d, "KEY_F5", PyInt_FromLong(NEWT_KEY_F5)); | |
973 | PyDict_SetItemString(d, "KEY_F6", PyInt_FromLong(NEWT_KEY_F6)); | |
974 | PyDict_SetItemString(d, "KEY_F7", PyInt_FromLong(NEWT_KEY_F7)); | |
975 | PyDict_SetItemString(d, "KEY_F8", PyInt_FromLong(NEWT_KEY_F8)); | |
976 | PyDict_SetItemString(d, "KEY_F9", PyInt_FromLong(NEWT_KEY_F9)); | |
977 | PyDict_SetItemString(d, "KEY_F10", PyInt_FromLong(NEWT_KEY_F10)); | |
978 | PyDict_SetItemString(d, "KEY_F11", PyInt_FromLong(NEWT_KEY_F11)); | |
979 | PyDict_SetItemString(d, "KEY_F12", PyInt_FromLong(NEWT_KEY_F12)); | |
5d678658 | 980 | |
981 | PyDict_SetItemString(d, "FLAG_DISABLED", PyInt_FromLong(NEWT_FLAG_DISABLED)); | |
982 | PyDict_SetItemString(d, "FLAGS_SET", PyInt_FromLong(NEWT_FLAGS_SET)); | |
983 | PyDict_SetItemString(d, "FLAGS_RESET", PyInt_FromLong(NEWT_FLAGS_RESET)); | |
984 | PyDict_SetItemString(d, "FLAGS_TOGGLE", PyInt_FromLong(NEWT_FLAGS_TOGGLE)); | |
80d03bd8 | 985 | } |