diff options
author | James Henstridge <james@daa.com.au> | 2001-12-14 09:39:26 +0000 |
---|---|---|
committer | James Henstridge <jamesh@src.gnome.org> | 2001-12-14 09:39:26 +0000 |
commit | 1ce66bbaf5573c0ec27ed83c37c79f574e5d7e27 (patch) | |
tree | b4571580b659d57ee58d91544a4229914d52caf4 | |
parent | 5e3a4eb1c77121f9db6305aaa3456115255c12db (diff) | |
download | pygobject-1ce66bbaf5573c0ec27ed83c37c79f574e5d7e27.tar.gz pygobject-1ce66bbaf5573c0ec27ed83c37c79f574e5d7e27.tar.xz pygobject-1ce66bbaf5573c0ec27ed83c37c79f574e5d7e27.zip |
another helper function for overriding existing signals. Haven't done
2001-12-14 James Henstridge <james@daa.com.au>
* gobjectmodule.c (override_signal): another helper function for
overriding existing signals. Haven't done chaining support yet.
(add_signals): if value in __gsignals__ dict is None or
'override', then call override_signal instead.
-rw-r--r-- | gobject/gobjectmodule.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c index fc6ccfa..c42b367 100644 --- a/gobject/gobjectmodule.c +++ b/gobject/gobjectmodule.c @@ -1991,7 +1991,25 @@ create_signal (GType instance_type, const gchar *signal_name, PyObject *tuple) } static gboolean -add_signals (PyTypeObject *class, GType instance_type, PyObject *signals) +override_signal(GType instance_type, const gchar *signal_name) +{ + guint signal_id; + + signal_id = g_signal_lookup(signal_name, instance_type); + if (!signal_id) { + gchar buf[128]; + + g_snprintf(buf, sizeof(buf), "could not look up %s", signal_name); + PyErr_SetString(PyExc_TypeError, buf); + return FALSE; + } + g_signal_override_class_closure(signal_id, instance_type, + pyg_signal_class_closure_get()); + return TRUE; +} + +static gboolean +add_signals (GType instance_type, PyObject *signals) { int pos = 0; PyObject *key, *value; @@ -2006,8 +2024,15 @@ add_signals (PyTypeObject *class, GType instance_type, PyObject *signals) } signal_name = PyString_AsString (key); - if (!create_signal(instance_type, signal_name, value)) - return FALSE; + if (value == Py_None || + (PyString_Check(value) && + !strcmp(PyString_AsString(value), "override"))) { + if (!override_signal(instance_type, signal_name)) + return FALSE; + } else { + if (!create_signal(instance_type, signal_name, value)) + return FALSE; + } } return TRUE; } @@ -2102,7 +2127,7 @@ pyg_type_register(PyObject *self, PyObject *args) Py_DECREF(gsignals); return NULL; } - if (!add_signals(class, instance_type, gsignals)) { + if (!add_signals(instance_type, gsignals)) { Py_DECREF(gsignals); return NULL; } |