diff options
author | James Henstridge <james@daa.com.au> | 1999-08-02 02:42:04 +0000 |
---|---|---|
committer | James Henstridge <jamesh@src.gnome.org> | 1999-08-02 02:42:04 +0000 |
commit | c4c2be444a5ed80bd15be678e522bfa6600aeacb (patch) | |
tree | caa6410ab6e2788919ca482ccc92ced08a61b763 | |
parent | 25c0bcd89109d807af8f87436daac91f7106c0de (diff) | |
download | pygtk-c4c2be444a5ed80bd15be678e522bfa6600aeacb.tar.gz |
pass extra arguments to the callback.
1999-08-02 James Henstridge <james@daa.com.au>
* gtk.py (idle_add, timeout_add, quit_add): pass extra arguments to
the callback.
* libglademodule.c (_wrap_glade_xml_signal_connect): fixed a small
problem with reference counting here.
* gtkmodule.c: added support for passing arguments to timeout, quit
and idle functions.
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | gtk.py | 12 | ||||
-rw-r--r-- | gtkmodule.c | 78 | ||||
-rw-r--r-- | libglademodule.c | 10 |
4 files changed, 75 insertions, 36 deletions
@@ -1,3 +1,14 @@ +1999-08-02 James Henstridge <james@daa.com.au> + + * gtk.py (idle_add, timeout_add, quit_add): pass extra arguments to + the callback. + + * libglademodule.c (_wrap_glade_xml_signal_connect): fixed a small + problem with reference counting here. + + * gtkmodule.c: added support for passing arguments to timeout, quit + and idle functions. + 1999-08-01 James Henstridge <james@daa.com.au> * pyglade/build.py (optionmenu_new): a small fix from David Cole. @@ -2484,20 +2484,20 @@ def events_pending(): return _gtk.gtk_events_pending() # idle/quit/timeout handlers -def idle_add(callback): - return _gtk.gtk_idle_add(callback) +def idle_add(callback, *args): + return _gtk.gtk_idle_add(callback, args) def idle_add_priority(priority, callback): return _gtk.gtk_idle_add_priority(priority, callback) def idle_remove(tag): _gtk.gtk_idle_remove(tag) -def quit_add(mainlevel, callback): - return _gtk.gtk_quit_add(mainlevel, callback) +def quit_add(mainlevel, callback, *args): + return _gtk.gtk_quit_add(mainlevel, callback, args) def quit_add_destroy(mainlevel, object): _gtk.gtk_quit_add_destroy(mainlevel, object._o) def quit_remove(tag): _gtk.gtk_quit_remove(tag) -def timeout_add(timeout, callback): - return _gtk.gtk_timeout_add(timeout, callback) +def timeout_add(timeout, callback, *args): + return _gtk.gtk_timeout_add(timeout, callback, args) def timeout_remove(tag): _gtk.gtk_timeout_remove(tag) diff --git a/gtkmodule.c b/gtkmodule.c index dc7c2c50..0b818a9d 100644 --- a/gtkmodule.c +++ b/gtkmodule.c @@ -2853,27 +2853,32 @@ void PyGtk_SignalDestroy(/*gpointer*/ PyObject *func) { /* used for timeout and idle functions */ static void PyGtk_HandlerMarshal(gpointer a, PyObject *func, int nargs, GtkArg *args) { - PyObject *ret; + PyObject *ret; - PyGTK_BLOCK_THREADS - ret = PyObject_CallObject(func, NULL); - if (ret == NULL) { - if (PyGtk_FatalExceptions) - gtk_main_quit(); - else { - PyErr_Print(); - PyErr_Clear(); + PyGTK_BLOCK_THREADS + + if (PyTuple_Check(func)) + ret = PyObject_CallObject(PyTuple_GetItem(func, 0), + PyTuple_GetItem(func, 1)); + else + ret = PyObject_CallObject(func, NULL); + if (ret == NULL) { + if (PyGtk_FatalExceptions) + gtk_main_quit(); + else { + PyErr_Print(); + PyErr_Clear(); + } + *GTK_RETLOC_BOOL(args[0]) = FALSE; + PyGTK_UNBLOCK_THREADS + return; } - *GTK_RETLOC_BOOL(args[0]) = FALSE; + if (ret == Py_None || (PyInt_Check(ret) && PyInt_AsLong(ret) == 0)) + *GTK_RETLOC_BOOL(args[0]) = FALSE; + else + *GTK_RETLOC_BOOL(args[0]) = TRUE; + Py_DECREF(ret); PyGTK_UNBLOCK_THREADS - return; - } - if (ret == Py_None || (PyInt_Check(ret) && PyInt_AsLong(ret) == 0)) - *GTK_RETLOC_BOOL(args[0]) = FALSE; - else - *GTK_RETLOC_BOOL(args[0]) = TRUE; - Py_DECREF(ret); - PyGTK_UNBLOCK_THREADS } /* callback for input handlers */ @@ -3227,31 +3232,44 @@ static PyObject *_wrap_gtk_events_pending(PyObject *self, PyObject *args) { static PyObject * _wrap_gtk_timeout_add(PyObject *self, PyObject *args) { guint32 interval; - PyObject *callback; - if (!PyArg_ParseTuple(args, "iO:gtk_timeout_add", &interval, &callback)) + PyObject *callback, *cbargs = NULL; + if (!PyArg_ParseTuple(args, "iO|O!:gtk_timeout_add", &interval, &callback, + &PyTuple_Type, &cbargs)) return NULL; if (!PyCallable_Check(callback)) { PyErr_SetString(PyExc_TypeError, "second arg not callable"); return NULL; } + if (cbargs) + Py_INCREF(cbargs); + else + cbargs = PyTuple_New(0); Py_INCREF(callback); return PyInt_FromLong(gtk_timeout_add_full(interval, NULL, - (GtkCallbackMarshal)PyGtk_HandlerMarshal, callback, + (GtkCallbackMarshal)PyGtk_HandlerMarshal, + Py_BuildValue("(OO)", callback, cbargs), (GtkDestroyNotify)PyGtk_DestroyNotify)); } static PyObject * _wrap_gtk_idle_add(PyObject *self, PyObject *args) { - PyObject *callback; - if (!PyArg_ParseTuple(args, "O:gtk_idle_add", &callback)) + PyObject *callback, *cbargs = NULL; + + if (!PyArg_ParseTuple(args, "O|O!:gtk_idle_add", &callback, + &PyTuple_Type, &cbargs)) return NULL; if (!PyCallable_Check(callback)) { PyErr_SetString(PyExc_TypeError, "arg not callable"); return NULL; } + if (cbargs) + Py_INCREF(cbargs); + else + cbargs = PyTuple_New(0); Py_INCREF(callback); return PyInt_FromLong(gtk_idle_add_full(GTK_PRIORITY_DEFAULT, NULL, - (GtkCallbackMarshal)PyGtk_HandlerMarshal, callback, + (GtkCallbackMarshal)PyGtk_HandlerMarshal, + Py_BuildValue("(OO)", callback, cbargs), (GtkDestroyNotify)PyGtk_DestroyNotify)); } @@ -3284,16 +3302,22 @@ static PyObject *_wrap_gtk_idle_remove_function(PyObject *self, PyObject *args) static PyObject * _wrap_gtk_quit_add(PyObject *self, PyObject *args) { int main_level; - PyObject *callback; - if (!PyArg_ParseTuple(args, "iO:gtk_quit_add", &main_level, &callback)) + PyObject *callback, *cbargs = NULL; + if (!PyArg_ParseTuple(args, "iO|O!:gtk_quit_add", &main_level, &callback, + &PyTuple_Type, &cbargs)) return NULL; if (!PyCallable_Check(callback)) { PyErr_SetString(PyExc_TypeError, "2nd arg not callable"); return NULL; } + if (cbargs) + Py_INCREF(cbargs); + else + cbargs = PyTuple_New(0); Py_INCREF(callback); return PyInt_FromLong(gtk_quit_add_full(main_level, NULL, - (GtkCallbackMarshal)PyGtk_HandlerMarshal, callback, + (GtkCallbackMarshal)PyGtk_HandlerMarshal, + Py_BuildValue("(OO)", callback, cbargs), (GtkDestroyNotify)PyGtk_DestroyNotify)); } diff --git a/libglademodule.c b/libglademodule.c index e15828f8..00509dd4 100644 --- a/libglademodule.c +++ b/libglademodule.c @@ -69,15 +69,19 @@ static PyObject *_wrap_glade_xml_signal_connect(PyObject *self, PyObject *args) PyObject *xml, *func, *cbargs = NULL, *data; gchar *handler_name; - if (!PyArg_ParseTuple(args, "O!sO|O:glade_xml_signal_connect", &PyGtk_Type, - &xml, &handler_name, &func, &cbargs)) + if (!PyArg_ParseTuple(args, "O!sO|O!:glade_xml_signal_connect", + &PyGtk_Type, &xml, &handler_name, &func, + &PyTuple_Type, &cbargs)) return NULL; if (!PyCallable_Check(func)) { PyErr_SetString(PyExc_TypeError, "third argument not callable"); return NULL; } - if (!cbargs) + if (cbargs) + Py_INCREF(cbargs); + else cbargs = PyTuple_New(0); + Py_INCREF(func); data = Py_BuildValue("(OO)", func, cbargs); glade_xml_signal_connect_full(GLADE_XML(PyGtk_Get(xml)), handler_name, connect_one, data); |