summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Henstridge <jamesh@src.gnome.org>2001-03-27 04:12:03 +0000
committerJames Henstridge <jamesh@src.gnome.org>2001-03-27 04:12:03 +0000
commit52ef209f971c317bf6e55763d1f3737d7a267886 (patch)
tree483192376b4a14c2fb38196264d0c8bfe1b7f1fa
parentd0aaf23e9ae87dc78a5403e916756b7b67f45541 (diff)
downloadpygobject-52ef209f971c317bf6e55763d1f3737d7a267886.tar.gz
(pyg_signal_new): new function to create new signals. Doesn't
work right yet.
-rw-r--r--gobject/gobjectmodule.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c
index f65c0e8e..3107374d 100644
--- a/gobject/gobjectmodule.c
+++ b/gobject/gobjectmodule.c
@@ -1485,6 +1485,85 @@ pyg_type_interfaces (PyObject *self, PyObject *args)
}
+static PyObject *
+pyg_signal_new(PyObject *self, PyObject *args)
+{
+ gchar *signal_name;
+ PyObject *py_type;
+ GSignalFlags signal_flags;
+ GType return_type;
+ PyObject *py_param_types;
+
+ GType instance_type = 0;
+ guint n_params, i;
+ GType *param_types;
+
+ guint signal_id;
+
+ if (!PyArg_ParseTuple(args, "sOiiO:gobject.signal_new", &signal_name,
+ &py_type, &signal_flags, &return_type,
+ &py_param_types))
+ return NULL;
+ if (pygobject_check(py_type, &PyGObject_Type)) {
+ PyObject *gtype = PyObject_GetAttrString(py_type, "__gtype__");
+
+ if (!gtype) {
+ PyErr_Clear();
+ PyErr_SetString(PyExc_TypeError,
+ "argument 2 must be a GObject or a GType code");
+ return NULL;
+ }
+ instance_type = (GType) PyInt_AsLong(gtype);
+ if (PyErr_Occurred()) {
+ PyErr_Clear();
+ Py_DECREF(gtype);
+ PyErr_SetString(PyExc_TypeError,
+ "argument 2 must be a GObject or a GType code");
+ return NULL;
+ }
+ Py_DECREF(gtype);
+ } else {
+ instance_type = (GType)PyInt_AsLong(py_type);
+ if (PyErr_Occurred()) {
+ PyErr_Clear();
+ PyErr_SetString(PyExc_TypeError,
+ "argument 2 must be a GObject or a GType code");
+ return NULL;
+ }
+ }
+ if (!PySequence_Check(py_param_types)) {
+ PyErr_SetString(PyExc_TypeError,
+ "argument 5 must be a sequence of GType codes");
+ return NULL;
+ }
+ n_params = PySequence_Length(py_param_types);
+ param_types = g_new(GType, n_params);
+ for (i = 0; i < n_params; i++) {
+ PyObject *item = PySequence_GetItem(py_param_types, i);
+
+ param_types[i] = (GType) PyInt_AsLong(item);
+ if (PyErr_Occurred()) {
+ PyErr_Clear();
+ Py_DECREF(item);
+ PyErr_SetString(PyExc_TypeError,
+ "argument 5 must be a sequence of GType codes");
+ return NULL;
+ }
+ Py_DECREF(item);
+ }
+
+ signal_id = g_signal_newv(signal_name, instance_type, signal_flags,
+ pyg_signal_class_closure_get(),
+ (GSignalAccumulator)0, NULL,
+ (GSignalCMarshaller)0,
+ return_type, n_params, param_types);
+ g_free(param_types);
+ if (signal_id != 0)
+ return PyInt_FromLong(signal_id);
+ PyErr_SetString(PyExc_RuntimeError, "could not create signal");
+ return NULL;
+}
+
static PyMethodDef pygobject_functions[] = {
{ "type_name", pyg_type_name, METH_VARARGS },
{ "type_from_name", pyg_type_from_name, METH_VARARGS },
@@ -1492,6 +1571,7 @@ static PyMethodDef pygobject_functions[] = {
{ "type_is_a", pyg_type_is_a, METH_VARARGS },
{ "type_children", pyg_type_children, METH_VARARGS },
{ "type_interfaces", pyg_type_interfaces, METH_VARARGS },
+ { "signal_new", pyg_signal_new, METH_VARARGS },
{ NULL, NULL, 0 }
};