diff options
author | Paul Pogonyshev <pogonyshev@gmx.net> | 2008-07-26 19:02:33 +0000 |
---|---|---|
committer | Paul Pogonyshev <paulp@src.gnome.org> | 2008-07-26 19:02:33 +0000 |
commit | ebb7b6a72f2e3e686b5109178a4088c48e4ced51 (patch) | |
tree | e59a4d3b4cf5e8bd71486ced1db7bbfcac73dd33 /gtk/gtkbuilder.override | |
parent | 96e43e4b733429f62d06dfbbaa4dbf75b3a3666c (diff) | |
download | pygtk-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.override | 42 |
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, ¬ify); - 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; + } } %% |