]> git.ipfire.org Git - thirdparty/newt.git/commitdiff
fixed callback refcounts
authormsw <msw>
Wed, 25 Aug 1999 22:26:06 +0000 (22:26 +0000)
committermsw <msw>
Wed, 25 Aug 1999 22:26:06 +0000 (22:26 +0000)
CHANGES
newt.spec
snack.py
snackmodule.c

diff --git a/CHANGES b/CHANGES
index 2edad3c3e794c97106714490e3770945a4e19fc6..b96b3e36857d753bf3e9e837157d4a1fa1ee95f2 100644 (file)
--- 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
 
index 3a974be20363a2ff49daae606ee09bee3a9c83fb..123e32e7e82ffa6dbc6b5d3055777c83c6011804 100644 (file)
--- 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 <msw@redhat.com>
+- fixed snack callback function refcounts, as well as optional data args
+
 * Mon Aug 23 1999 Matt Wilson <msw@redhat.com>
 - added buttons argument to entrywindow
 
index 000593fa29a8f6d7d9e31a08bae0625c0d1b17be..90dc3ec58bf398429e4d1c9ec217f4d59757dd76 100644 (file)
--- 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)
index 2bb4dc09d35417b0a925cf28c6379a50ecacfc7b..d9f0e9359b4acf1bf9c3c4df5ef543b3ad38bb34 100644 (file)
@@ -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);