I thought it would be nice if exceptions could propagate from
callbacks, "through" the event loop and out to the top-level python
code. The folloing code seems to do the trick. Does it break something
else?
-- Ture
--- gtkmodule.c.~1~ Wed Feb 24 16:43:28 1999
+++ gtkmodule.c Thu Feb 25 16:25:36 1999
@@ -2826,17 +2826,21 @@ static void PyGtk_CallbackMarshal(GtkObj
}
ret = PyObject_CallObject(func, params);
Py_DECREF(params);
- if (ret == NULL) {
- PyErr_Print();
- PyErr_Clear();
+
+ /*
+ * If we dropped out of the called object on an exception, drop out
+ * of the GTK event loop as well
+ */
+ if (PyErr_Occurred()) {
+ /* fprintf(stderr, "PyGTK_CallbackMarshal: Exception pending\n"); */
+ gtk_main_quit();
return;
}
+
GtkRet_FromPyObject(&args[nargs], ret);
Py_DECREF(ret);
}
-
-
static
void PyGtk_SignalMarshal(GtkObject *object, /*gpointer*/ PyObject *func,
int nparams, GtkArg *args, GtkType *arg_types,
@@ -3022,6 +3026,19 @@ static GtkArg *PyDict_AsContainerArgs(Py
pos++;
}
return arg;
+}
+
+static PyObject *_wrap_gtk_main(PyObject *self, PyObject *args) {
+ if (!PyArg_ParseTuple(args, ":gtk_main"))
+ return NULL;
+ gtk_main();
+ if (PyErr_Occurred()) {
+ /* fprintf(stderr, "_wrap_gtk_main: exception pending\n"); */
+ return 0;
+ } else {
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
}
static PyObject *_wrap_gtk_signal_connect(PyObject *self, PyObject *args) {
--- gtkmodule_impl.c.~1~ Wed Feb 24 20:51:04 1999
+++ gtkmodule_impl.c Thu Feb 25 16:29:51 1999
@@ -163,14 +163,6 @@ static PyObject *_wrap_gtk_exit(PyObject
return Py_None;
}
-static PyObject *_wrap_gtk_main(PyObject *self, PyObject *args) {
- if (!PyArg_ParseTuple(args, ":gtk_main"))
- return NULL;
- gtk_main();
- Py_INCREF(Py_None);
- return Py_None;
-}
-
static PyObject *_wrap_gtk_main_quit(PyObject *self, PyObject *args) {
if (!PyArg_ParseTuple(args, ":gtk_main_quit"))
return NULL;
To unsubscribe: echo "unsubscribe" | mail [EMAIL PROTECTED]