From: msw Date: Wed, 25 Aug 1999 22:26:06 +0000 (+0000) Subject: fixed callback refcounts X-Git-Tag: r0-50~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1dfa0cfa4e6e227b4474827731a02ce35a1445cf;p=thirdparty%2Fnewt.git fixed callback refcounts --- diff --git a/CHANGES b/CHANGES index 2edad3c..b96b3e3 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,7 @@ +0.40 -> 0.50 + - added CheckboxTree widget + - vastly improved python bindings + 0.30 -> 0.40 - GPM mouse support added diff --git a/newt.spec b/newt.spec index 3a974be..123e32e 100644 --- a/newt.spec +++ b/newt.spec @@ -2,7 +2,7 @@ Summary: A development library for text mode user interfaces. Name: newt %define version 0.50 Version: %{version} -Release: 8 +Release: 9 Copyright: LGPL Group: System Environment/Libraries Source: ftp://ftp.redhat.com/pub/redhat/code/newt/newt-%{version}.tar.gz @@ -55,6 +55,9 @@ rm -rf $RPM_BUILD_ROOT %postun -p /sbin/ldconfig %changelog +* Wed Aug 25 1999 Matt Wilson +- fixed snack callback function refcounts, as well as optional data args + * Mon Aug 23 1999 Matt Wilson - added buttons argument to entrywindow diff --git a/snack.py b/snack.py index 000593f..90dc3ec 100644 --- a/snack.py +++ b/snack.py @@ -17,8 +17,10 @@ FLAGS_RESET = _snack.FLAGS_RESET FLAGS_TOGGLE = _snack.FLAGS_TOGGLE class Widget: - def setCallback(self, obj, data): - self.w.setCallback(obj, data) + def setCallback(self, obj, data = None): + if data: + self.w.setCallback(obj, data) + self.w.setCallback(obj) class Button(Widget): @@ -231,8 +233,10 @@ class SnackScreen: def finish(self): return _snack.finish() - def suspendCallback(self, cb, data): - return _snack.suspendcallback(cb, data) + def suspendCallback(self, cb, data = None): + if data: + return _snack.suspendcallback(cb, data) + return _snack.suspendcallback(cb) def openWindow(self, left, top, width, height, title): return _snack.openwindow(left, top, width, height, title) diff --git a/snackmodule.c b/snackmodule.c index 2bb4dc0..d9f0e93 100644 --- a/snackmodule.c +++ b/snackmodule.c @@ -15,6 +15,8 @@ struct callbackStruct { PyObject * cb, * data; }; +static struct callbackStruct suspend; + static void emptyDestructor(PyObject * s); static snackWidget * buttonWidget(PyObject * s, PyObject * args); @@ -158,6 +160,7 @@ struct snackWidget_s { static PyObject * widgetAddCallback(snackWidget * s, PyObject * args); static PyObject * widgetGetAttr(PyObject * s, char * name); +static void widgetDestructor(PyObject * s); static PyObject * widgetEntrySetValue(snackWidget * s, PyObject * args); static PyObject * widgetLabelText(snackWidget * s, PyObject * args); static PyObject * widgetListboxSetW(snackWidget * s, PyObject * args); @@ -199,7 +202,7 @@ static PyTypeObject snackWidgetType = { "snackwidget", /* tp_name */ sizeof(snackWidget), /* tp_size */ 0, /* tp_itemsize */ - emptyDestructor, /* tp_dealloc */ + widgetDestructor, /* tp_dealloc */ 0, /* tp_print */ widgetGetAttr, /* tp_getattr */ 0, /* tp_setattr */ @@ -210,7 +213,21 @@ static PyTypeObject snackWidgetType = { 0, /* tp_as_mapping */ }; +static snackWidget * snackWidgetNew (void) { + snackWidget * widget; + + widget = PyObject_NEW(snackWidget, &snackWidgetType); + + widget->scs.cb = NULL; + widget->scs.data = NULL; + + return widget; +} + static PyObject * initScreen(PyObject * s, PyObject * args) { + suspend.cb = NULL; + suspend.data = NULL; + newtInit(); newtCls(); @@ -236,7 +253,7 @@ static PyObject * scaleWidget(PyObject * s, PyObject * args) { if (!PyArg_ParseTuple(args, "ii", &width, &fullAmount)) return NULL; - widget = PyObject_NEW(snackWidget, &snackWidgetType); + widget = snackWidgetNew (); widget->co = newtScale(-1, -1, width, fullAmount); return (PyObject *) widget; @@ -268,10 +285,18 @@ static void suspendCallbackMarshall(void * data) { struct callbackStruct * scs = data; PyObject * args, * result; - args = Py_BuildValue("(O)", scs->data); - result = PyEval_CallObject(scs->cb, args); + if (scs->data) { + args = Py_BuildValue("(O)", scs->data); + result = PyEval_CallObject(scs->cb, args); + Py_DECREF (args); + } else + result = PyEval_CallObject(scs->cb, NULL); + + if (!result) { + PyErr_Print(); + PyErr_Clear(); + } - Py_DECREF(args); Py_XDECREF(result); return; @@ -281,27 +306,31 @@ static void callbackMarshall(newtComponent co, void * data) { struct callbackStruct * scs = data; PyObject * args, * result; - args = Py_BuildValue("(O)", scs->data); - result = PyEval_CallObject(scs->cb, args); + if (scs->data) { + args = Py_BuildValue("(O)", scs->data); + result = PyEval_CallObject(scs->cb, args); + Py_DECREF (args); + } else + result = PyEval_CallObject(scs->cb, NULL); if (!result) { PyErr_Print(); PyErr_Clear(); } - Py_DECREF(args); Py_XDECREF(result); return; } static PyObject * setSuspendCallback(PyObject * s, PyObject * args) { - static struct callbackStruct scs; - - if (!PyArg_ParseTuple(args, "O|O", &scs.cb, &scs.data)) + if (!PyArg_ParseTuple(args, "O|O", &suspend.cb, &suspend.data)) return NULL; - newtSetSuspendCallback(suspendCallbackMarshall, &scs); + Py_INCREF (suspend.cb); + Py_XINCREF (suspend.data); + + newtSetSuspendCallback(suspendCallbackMarshall, &suspend); Py_INCREF(Py_None); return Py_None; @@ -450,7 +479,7 @@ static snackWidget * buttonWidget(PyObject * s, PyObject * args) { if (!PyArg_ParseTuple(args, "s", &label)) return NULL; - widget = PyObject_NEW(snackWidget, &snackWidgetType); + widget = snackWidgetNew (); widget->co = newtButton(-1, -1, label); return widget; @@ -462,7 +491,7 @@ static snackWidget * labelWidget(PyObject * s, PyObject * args) { if (!PyArg_ParseTuple(args, "s", &label)) return NULL; - widget = PyObject_NEW(snackWidget, &snackWidgetType); + widget = snackWidgetNew (); widget->co = newtLabel(-1, -1, label); return widget; @@ -498,7 +527,7 @@ static snackWidget * listboxWidget(PyObject * s, PyObject * args) { if (!PyArg_ParseTuple(args, "i|ii", &height, &doScroll, &returnExit)) return NULL; - widget = PyObject_NEW(snackWidget, &snackWidgetType); + widget = snackWidgetNew (); widget->co = newtListbox(-1, -1, height, (doScroll ? NEWT_FLAG_SCROLL : 0) | (returnExit ? NEWT_FLAG_RETURNEXIT : 0)); @@ -517,7 +546,7 @@ static snackWidget * textWidget(PyObject * s, PyObject * args) { if (!PyArg_ParseTuple(args, "iis|ii", &width, &height, &text, &scrollBar, &wrap)) return NULL; - widget = PyObject_NEW(snackWidget, &snackWidgetType); + widget = snackWidgetNew (); widget->co = newtTextbox(-1, -1, width, height, (scrollBar ? NEWT_FLAG_SCROLL : 0) | (wrap ? NEWT_FLAG_WRAP : 0)); @@ -534,7 +563,7 @@ static snackWidget * radioButtonWidget(PyObject * s, PyObject * args) { if (!PyArg_ParseTuple(args, "sOi", &text, &group, &isOn)) return NULL; - widget = PyObject_NEW(snackWidget, &snackWidgetType); + widget = snackWidgetNew (); if ((PyObject *) group == Py_None) widget->co = newtRadiobutton(-1, -1, text, isOn, NULL); @@ -551,7 +580,7 @@ static snackWidget * checkboxWidget(PyObject * s, PyObject * args) { if (!PyArg_ParseTuple(args, "si", &text, &isOn)) return NULL; - widget = PyObject_NEW(snackWidget, &snackWidgetType); + widget = snackWidgetNew (); widget->co = newtCheckbox(-1, -1, text, isOn ? '*' : ' ', NULL, &widget->achar); @@ -579,7 +608,7 @@ static snackWidget * entryWidget(PyObject * s, PyObject * args) { if (!PyArg_ParseTuple(args, "isiii", &width, &initial, &isHidden, &isScrolled, &returnExit)) return NULL; - widget = PyObject_NEW(snackWidget, &snackWidgetType); + widget = snackWidgetNew (); widget->co = newtEntry(-1, -1, initial, width, (char **) &widget->apointer, (isHidden ? NEWT_FLAG_HIDDEN : 0) | (returnExit ? NEWT_FLAG_RETURNEXIT : 0) | @@ -732,10 +761,25 @@ static PyObject * widgetGetAttr(PyObject * s, char * name) { return Py_FindMethod(widgetMethods, s, name); } +static void widgetDestructor(PyObject * o) { + snackWidget * s = (snackWidget *) o; + + Py_XDECREF (s->scs.cb); + Py_XDECREF (s->scs.data); + + PyMem_DEL(o); +} + static PyObject * widgetAddCallback(snackWidget * s, PyObject * args) { + s->scs.cb = NULL; + s->scs.data = NULL; + if (!PyArg_ParseTuple(args, "O|O", &s->scs.cb, &s->scs.data)) return NULL; + Py_INCREF (s->scs.cb); + Py_XINCREF (s->scs.data); + newtComponentAddCallback(s->co, callbackMarshall, &s->scs); Py_INCREF(Py_None); @@ -843,7 +887,7 @@ static snackWidget * checkboxTreeWidget(PyObject * s, PyObject * args) { if (!PyArg_ParseTuple(args, "i|i", &height, &scrollBar)) return NULL; - widget = PyObject_NEW(snackWidget, &snackWidgetType); + widget = snackWidgetNew (); widget->co = newtCheckboxTree(-1, -1, height, scrollBar ? NEWT_FLAG_SCROLL : 0);