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]

Reply via email to