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