summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Henstridge <james@daa.com.au>1999-08-02 02:42:04 +0000
committerJames Henstridge <jamesh@src.gnome.org>1999-08-02 02:42:04 +0000
commitc4c2be444a5ed80bd15be678e522bfa6600aeacb (patch)
treecaa6410ab6e2788919ca482ccc92ced08a61b763
parent25c0bcd89109d807af8f87436daac91f7106c0de (diff)
downloadpygtk-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--ChangeLog11
-rw-r--r--gtk.py12
-rw-r--r--gtkmodule.c78
-rw-r--r--libglademodule.c10
4 files changed, 75 insertions, 36 deletions
diff --git a/ChangeLog b/ChangeLog
index 89229e3e..ec078076 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/gtk.py b/gtk.py
index 3bd2530a..4731d874 100644
--- a/gtk.py
+++ b/gtk.py
@@ -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);