summaryrefslogtreecommitdiff
path: root/gtk/gtkbuilder.override
diff options
context:
space:
mode:
authorPaul Pogonyshev <pogonyshev@gmx.net>2008-07-26 19:02:33 +0000
committerPaul Pogonyshev <paulp@src.gnome.org>2008-07-26 19:02:33 +0000
commitebb7b6a72f2e3e686b5109178a4088c48e4ced51 (patch)
treee59a4d3b4cf5e8bd71486ced1db7bbfcac73dd33 /gtk/gtkbuilder.override
parent96e43e4b733429f62d06dfbbaa4dbf75b3a3666c (diff)
downloadpygtk-ebb7b6a72f2e3e686b5109178a4088c48e4ced51.tar.gz
Add 'missing_handlers' (Python list) and 'exception_pending' (boolean)
2008-07-26 Paul Pogonyshev <pogonyshev@gmx.net> * gtk/gtkbuilder.override (PyGCustomSignalNotify): Add 'missing_handlers' (Python list) and 'exception_pending' (boolean) fields. (connect_many, _wrap_gtk_builder_connect_signals): Warn user on missing handlers and set/modify new fields as appropriate (bug #543768). 2008-07-26 Paul Pogonyshev <pogonyshev@gmx.net> * pygtk-gtkbuilder.xml (connect_signals): Fix signature and document changes in 2.14. svn path=/trunk/; revision=3012
Diffstat (limited to 'gtk/gtkbuilder.override')
-rw-r--r--gtk/gtkbuilder.override42
1 files changed, 40 insertions, 2 deletions
diff --git a/gtk/gtkbuilder.override b/gtk/gtkbuilder.override
index 64ef837d..ab8da71d 100644
--- a/gtk/gtkbuilder.override
+++ b/gtk/gtkbuilder.override
@@ -26,6 +26,8 @@ headers
typedef struct{
PyObject *obj;
PyObject *data;
+ PyObject *missing_handlers;
+ gboolean exception_pending;
} PyGCustomSignalNotify;
%%
@@ -40,12 +42,33 @@ connect_many(GtkBuilder *builder, GObject *obj,
PyObject *tuple, *self;
GClosure *closure = NULL;
+ if (notify->exception_pending)
+ return;
+
tuple = PyMapping_GetItemString(handler_dict, (gchar *)handler_name);
if (!tuple) {
PyErr_Clear();
tuple = PyObject_GetAttrString(handler_dict, (gchar *)handler_name);
if (!tuple) {
+ gchar *error_message;
+ PyObject *name_obj;
+
PyErr_Clear();
+
+ name_obj = PyString_FromString(handler_name);
+ PyList_Append(notify->missing_handlers, name_obj);
+ Py_DECREF(name_obj);
+
+ error_message = g_strdup_printf("missing handler '%s'", handler_name);
+ if (PyErr_Warn(NULL, error_message)) {
+ /* PyErr_Warn requests us to raise the warning as exception. That can
+ * happen when user explicitly used warnings.filterwarnings('error'...).
+ * So, we will not call any Python code anymore and raise the exception
+ * from connect_signals(). */
+ notify->exception_pending = TRUE;
+ }
+
+ g_free(error_message);
return;
}
}
@@ -94,12 +117,27 @@ _wrap_gtk_builder_connect_signals(PyGObject *self, PyObject *args,
notify.obj = object;
notify.data = user_data;
+ notify.missing_handlers = PyList_New(0);
+ notify.exception_pending = FALSE;
+
+ if (!notify.missing_handlers)
+ return NULL;
gtk_builder_connect_signals_full(GTK_BUILDER(self->obj),
connect_many,
&notify);
- Py_INCREF(Py_None);
- return Py_None;
+
+ if (notify.exception_pending) {
+ Py_DECREF(notify.missing_handlers);
+ return NULL;
+ }
+ else if (PyObject_IsTrue(notify.missing_handlers))
+ return notify.missing_handlers;
+ else {
+ Py_DECREF(notify.missing_handlers);
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
}
%%