summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Henstridge <james@daa.com.au>2001-12-14 09:39:26 +0000
committerJames Henstridge <jamesh@src.gnome.org>2001-12-14 09:39:26 +0000
commit1ce66bbaf5573c0ec27ed83c37c79f574e5d7e27 (patch)
treeb4571580b659d57ee58d91544a4229914d52caf4
parent5e3a4eb1c77121f9db6305aaa3456115255c12db (diff)
downloadpygobject-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.c33
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;
}