]> git.ipfire.org Git - thirdparty/newt.git/blame - snackmodule.c
oops
[thirdparty/newt.git] / snackmodule.c
CommitLineData
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
10typedef struct snackWidget_s snackWidget;
11typedef struct snackGrid_s snackGrid;
12typedef struct snackForm_s snackForm;
13
5d678658 14struct callbackStruct {
06cf519e 15 PyObject * cb, * data;
16};
17
1dfa0cfa 18static struct callbackStruct suspend;
19
80d03bd8 20static void emptyDestructor(PyObject * s);
21
22static snackWidget * buttonWidget(PyObject * s, PyObject * args);
23static PyObject * centeredWindow(PyObject * s, PyObject * args);
24static snackWidget * checkboxWidget(PyObject * s, PyObject * args);
25static PyObject * choiceWindow(PyObject * s, PyObject * args);
26static snackWidget * entryWidget(PyObject * s, PyObject * args);
75fb0452 27static PyObject * drawRootText(PyObject * s, PyObject * args);
80d03bd8 28static snackForm * formCreate(PyObject * s, PyObject * args);
29static snackGrid * gridCreate(PyObject * s, PyObject * args);
30static PyObject * gridWrappedWindow(PyObject * s, PyObject * args);
31static PyObject * finishScreen(PyObject * s, PyObject * args);
32static PyObject * initScreen(PyObject * s, PyObject * args);
33static snackWidget * labelWidget(PyObject * s, PyObject * args);
6e25d997 34static snackWidget * listboxWidget(PyObject * s, PyObject * args);
80d03bd8 35static PyObject * messageWindow(PyObject * s, PyObject * args);
36static PyObject * openWindow(PyObject * s, PyObject * args);
75fb0452 37static PyObject * popHelpLine(PyObject * s, PyObject * args);
80d03bd8 38static PyObject * popWindow(PyObject * s, PyObject * args);
75fb0452 39static PyObject * pushHelpLine(PyObject * s, PyObject * args);
80d03bd8 40static snackWidget * radioButtonWidget(PyObject * s, PyObject * args);
41static PyObject * refreshScreen(PyObject * s, PyObject * args);
06cf519e 42static PyObject * scaleWidget(PyObject * s, PyObject * args);
43static PyObject * scaleSet(snackWidget * s, PyObject * args);
9f0ab2ac 44static PyObject * screenSize(PyObject * s, PyObject * args);
06cf519e 45static PyObject * setSuspendCallback(PyObject * s, PyObject * args);
6e25d997 46static PyObject * reflowText(PyObject * s, PyObject * args);
47static snackWidget * textWidget(PyObject * s, PyObject * args);
80d03bd8 48static PyObject * ternaryWindow(PyObject * s, PyObject * args);
f06c5a99 49static snackWidget * checkboxTreeWidget(PyObject * s, PyObject * args);
80d03bd8 50
51static 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
82struct snackGrid_s {
83 PyObject_HEAD;
84 newtGrid grid;
85} ;
86
87static PyObject * gridGetAttr(PyObject * s, char * name);
88static PyObject * gridPlace(snackGrid * s, PyObject * args);
89static PyObject * gridSetField(snackGrid * s, PyObject * args);
90
91static PyMethodDef gridMethods[] = {
92 { "place", (PyCFunction) gridPlace, METH_VARARGS, NULL },
93 { "setfield", (PyCFunction) gridSetField, METH_VARARGS, NULL },
94 { NULL }
95};
96
97static 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
114struct snackForm_s {
115 PyObject_HEAD;
116 newtComponent fo;
117} ;
118
119static PyObject * formGetAttr(PyObject * s, char * name);
120static PyObject * formAdd(snackForm * s, PyObject * args);
bd38d47e 121static PyObject * formDraw(snackForm * s, PyObject * args);
80d03bd8 122static PyObject * formRun(snackForm * s, PyObject * args);
ea59ae12 123static PyObject * formHotKey(snackForm * s, PyObject * args);
5d678658 124static PyObject * formSetCurrent(snackForm * form, PyObject * args);
80d03bd8 125
126static 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
135static 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
152struct 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 161static PyObject * widgetAddCallback(snackWidget * s, PyObject * args);
80d03bd8 162static PyObject * widgetGetAttr(PyObject * s, char * name);
1dfa0cfa 163static void widgetDestructor(PyObject * s);
80d03bd8 164static PyObject * widgetEntrySetValue(snackWidget * s, PyObject * args);
522d3500 165static PyObject * widgetLabelText(snackWidget * s, PyObject * args);
6e25d997 166static PyObject * widgetListboxSetW(snackWidget * s, PyObject * args);
167static PyObject * widgetListboxAdd(snackWidget * s, PyObject * args);
a507b3ec 168static PyObject * widgetListboxIns(snackWidget * s, PyObject * args);
169static PyObject * widgetListboxDel(snackWidget * s, PyObject * args);
6e25d997 170static PyObject * widgetListboxGet(snackWidget * s, PyObject * args);
99438c19 171static PyObject * widgetListboxSet(snackWidget * s, PyObject * args);
36f926a6 172static PyObject * widgetTextboxText(snackWidget * s, PyObject * args);
75d40644 173static PyObject * widgetCheckboxTreeAddItem(snackWidget * s, PyObject * args);
5d678658 174static PyObject * widgetCheckboxTreeGetSel(snackWidget * s, PyObject * args);
175static PyObject * widgetEntrySetFlags(snackWidget * s, PyObject * args);
c573c71b 176static PyObject * widgetCheckboxSetFlags(snackWidget * s, PyObject * args);
80d03bd8 177
178static 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
199static 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 216static 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 227static 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
238static 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
247static PyObject * refreshScreen(PyObject * s, PyObject * args) {
248 newtRefresh();
249 Py_INCREF(Py_None);
250 return Py_None;
251}
252
06cf519e 253static 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
265static 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 276static 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 287static 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
308static 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
329static 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 342static 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
355static PyObject * popHelpLine(PyObject * s, PyObject * args) {
356 newtPopHelpLine();
357 Py_INCREF(Py_None);
358 return Py_None;
359}
360
361static 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 376static 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 393static 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
406static 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
419static 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
432static PyObject * popWindow(PyObject * s, PyObject * args) {
433 newtPopWindow();
434 Py_INCREF(Py_None);
435 return Py_None;
436}
437
438static 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
451static 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
466static 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
479static 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
491static 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 503static 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 514static 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 525static 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
542static 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 561static 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
579static 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 593static 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 605static 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
623static 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
632static 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
644static PyObject * gridGetAttr(PyObject * s, char * name) {
645 return Py_FindMethod(gridMethods, s, name);
646}
647
648static 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
659static 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
686static PyObject * formGetAttr(PyObject * s, char * name) {
687 return Py_FindMethod(formMethods, s, name);
688}
689
bd38d47e 690static PyObject * formDraw(snackForm * s, PyObject * args) {
691 newtDrawForm(s->fo);
692
693 Py_INCREF(Py_None);
694 return Py_None;
695}
696
80d03bd8 697static 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
716static 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
727static 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 739static 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 751static 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 767static 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 776static 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 792static 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 804static 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 816static 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 827static 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
839static 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 851static 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 858static 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 870static 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 882static void emptyDestructor(PyObject * s) {
883}
884
f06c5a99 885static 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 902static 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 927static 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 951void 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}