summaryrefslogtreecommitdiffstats
path: root/gobject/gobjectmodule.c
diff options
context:
space:
mode:
authorJames Henstridge <james@daa.com.au>2000-10-26 14:19:26 +0000
committerJames Henstridge <jamesh@src.gnome.org>2000-10-26 14:19:26 +0000
commit6e8f21334b3a815651121f6dcb59abeaa64cd22c (patch)
tree76892d7091251c51656eb3982d8112883b465f41 /gobject/gobjectmodule.c
parent05fe6d04db97488157bf618fda5cdd3cc107abce (diff)
downloadpygobject-6e8f21334b3a815651121f6dcb59abeaa64cd22c.tar.gz
pygobject-6e8f21334b3a815651121f6dcb59abeaa64cd22c.tar.xz
pygobject-6e8f21334b3a815651121f6dcb59abeaa64cd22c.zip
remove gtk_signal_set_funcs call.
2000-10-26 James Henstridge <james@daa.com.au> * gtk/gtkmodule.c (init_gtk): remove gtk_signal_set_funcs call. * gobjectmodule.c (pyg_value_from_pyobject): default to using CObject for unknown boxed values and pointer values. (pyg_value_as_pyobject): same here. (pygobject_connect*): Add signal connection functions.
Diffstat (limited to 'gobject/gobjectmodule.c')
-rw-r--r--gobject/gobjectmodule.c168
1 files changed, 166 insertions, 2 deletions
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c
index a834fe1..54a7310 100644
--- a/gobject/gobjectmodule.c
+++ b/gobject/gobjectmodule.c
@@ -324,7 +324,16 @@ pyg_value_from_pyobject(GValue *value, PyObject *obj)
} else if (G_IS_VALUE_BOXED(value)) {
PyGBoxedMarshal *bm = pyg_boxed_lookup(G_VALUE_TYPE(value));
- if (!bm || bm->tovalue(value, obj) < 0)
+ if (bm)
+ return bm->tovalue(value, obj);
+ if (PyCObject_Check(obj))
+ g_value_set_boxed(value, PyCObject_AsVoidPtr(obj));
+ else
+ return -1;
+ } else if (G_IS_VALUE_POINTER(value)) {
+ if (PyCObject_Check(obj))
+ g_value_set_pointer(value, PyCObject_AsVoidPtr(obj));
+ else
return -1;
}
return 0;
@@ -364,7 +373,10 @@ pyg_value_as_pyobject(const GValue *value)
if (bm)
return bm->fromvalue(value);
- /* fall through if unknown boxed type */
+ else
+ return PyCObject_FromVoidPtr(g_value_get_boxed(value), NULL);
+ } else if (G_IS_VALUE_POINTER(value)) {
+ return PyCObject_FromVoidPtr(g_value_get_pointer(value), NULL);
}
PyErr_SetString(PyExc_TypeError, "unknown type");
return NULL;
@@ -463,6 +475,7 @@ pyg_closure_new(PyObject *callback, PyObject *extra_args, PyObject *swap_data)
((PyGClosure *)closure)->swap_data;
closure->derivative_flag = TRUE;
}
+ return closure;
}
/* -------------- PyGObject behaviour ----------------- */
@@ -734,6 +747,153 @@ pygobject_set_data(PyGObject *self, PyObject *args)
return Py_None;
}
+static PyObject *
+pygobject_connect(PyGObject *self, PyObject *args)
+{
+ PyObject *first, *callback, *extra_args;
+ gchar *name;
+ guint handlerid, sigid, len;
+
+ len = PyTuple_Size(args);
+ if (len < 2) {
+ PyErr_SetString(PyExc_TypeError,
+ "GObject.connect requires at least 2 arguments");
+ return NULL;
+ }
+ first = PySequence_GetSlice(args, 0, 2);
+ if (!PyArg_ParseTuple(first, "sO:GObject.connect", &name, &callback)) {
+ Py_DECREF(first);
+ return NULL;
+ }
+ Py_DECREF(first);
+ if (!PyCallable_Check(callback)) {
+ PyErr_SetString(PyExc_TypeError, "second argument must be callable");
+ return NULL;
+ }
+ sigid = g_signal_lookup(name, G_OBJECT_TYPE(self->obj));
+ if (sigid == 0) {
+ PyErr_SetString(PyExc_TypeError, "unknown signal name");
+ return NULL;
+ }
+ extra_args = PySequence_GetSlice(args, 2, len);
+ if (extra_args == NULL)
+ return NULL;
+ handlerid = g_signal_connect_closure(self->obj, sigid,
+ pyg_closure_new(callback, extra_args, NULL), FALSE);
+ return PyInt_FromLong(handlerid);
+}
+
+static PyObject *
+pygobject_connect_after(PyGObject *self, PyObject *args)
+{
+ PyObject *first, *callback, *extra_args;
+ gchar *name;
+ guint handlerid, sigid, len;
+
+ len = PyTuple_Size(args);
+ if (len < 2) {
+ PyErr_SetString(PyExc_TypeError,
+ "GObject.connect_after requires at least 2 arguments");
+ return NULL;
+ }
+ first = PySequence_GetSlice(args, 0, 2);
+ if (!PyArg_ParseTuple(first, "sO:GObject.connect_after",
+ &name, &callback)) {
+ Py_DECREF(first);
+ return NULL;
+ }
+ Py_DECREF(first);
+ if (!PyCallable_Check(callback)) {
+ PyErr_SetString(PyExc_TypeError, "second argument must be callable");
+ return NULL;
+ }
+ sigid = g_signal_lookup(name, G_OBJECT_TYPE(self->obj));
+ if (sigid == 0) {
+ PyErr_SetString(PyExc_TypeError, "unknown signal name");
+ return NULL;
+ }
+ extra_args = PySequence_GetSlice(args, 2, len);
+ if (extra_args == NULL)
+ return NULL;
+ handlerid = g_signal_connect_closure(self->obj, sigid,
+ pyg_closure_new(callback, extra_args, NULL), TRUE);
+ return PyInt_FromLong(handlerid);
+}
+
+static PyObject *
+pygobject_connect_object(PyGObject *self, PyObject *args)
+{
+ PyObject *first, *callback, *extra_args, *object;
+ gchar *name;
+ guint handlerid, sigid, len;
+
+ len = PyTuple_Size(args);
+ if (len < 3) {
+ PyErr_SetString(PyExc_TypeError,
+ "GObject.connect_object requires at least 3 arguments");
+ return NULL;
+ }
+ first = PySequence_GetSlice(args, 0, 3);
+ if (!PyArg_ParseTuple(first, "sOO:GObject.connect_object",
+ &name, &callback, &object)) {
+ Py_DECREF(first);
+ return NULL;
+ }
+ Py_DECREF(first);
+ if (!PyCallable_Check(callback)) {
+ PyErr_SetString(PyExc_TypeError, "second argument must be callable");
+ return NULL;
+ }
+ sigid = g_signal_lookup(name, G_OBJECT_TYPE(self->obj));
+ if (sigid == 0) {
+ PyErr_SetString(PyExc_TypeError, "unknown signal name");
+ return NULL;
+ }
+ extra_args = PySequence_GetSlice(args, 3, len);
+ if (extra_args == NULL)
+ return NULL;
+ handlerid = g_signal_connect_closure(self->obj, sigid,
+ pyg_closure_new(callback, extra_args, object), FALSE);
+ return PyInt_FromLong(handlerid);
+}
+
+static PyObject *
+pygobject_connect_object_after(PyGObject *self, PyObject *args)
+{
+ PyObject *first, *callback, *extra_args, *object;
+ gchar *name;
+ guint handlerid, sigid, len;
+
+ len = PyTuple_Size(args);
+ if (len < 3) {
+ PyErr_SetString(PyExc_TypeError,
+ "GObject.connect_object_after requires at least 3 arguments");
+ return NULL;
+ }
+ first = PySequence_GetSlice(args, 0, 3);
+ if (!PyArg_ParseTuple(first, "sOO:GObject.connect_object_after",
+ &name, &callback, &object)) {
+ Py_DECREF(first);
+ return NULL;
+ }
+ Py_DECREF(first);
+ if (!PyCallable_Check(callback)) {
+ PyErr_SetString(PyExc_TypeError, "second argument must be callable");
+ return NULL;
+ }
+ sigid = g_signal_lookup(name, G_OBJECT_TYPE(self->obj));
+ if (sigid == 0) {
+ PyErr_SetString(PyExc_TypeError, "unknown signal name");
+ return NULL;
+ }
+ extra_args = PySequence_GetSlice(args, 3, len);
+ if (extra_args == NULL)
+ return NULL;
+ handlerid = g_signal_connect_closure(self->obj, sigid,
+ pyg_closure_new(callback, extra_args, object), TRUE);
+ return PyInt_FromLong(handlerid);
+}
+
static PyMethodDef pygobject_methods[] = {
{ "__class_init__", (PyCFunction)pygobject__class_init__, METH_VARARGS|METH_CLASS_METHOD },
{ "__init__", (PyCFunction)pygobject__init__, METH_VARARGS },
@@ -742,6 +902,10 @@ static PyMethodDef pygobject_methods[] = {
{ "queue_param_changed", (PyCFunction)pygobject_queue_param_changed, METH_VARARGS },
{ "get_data", (PyCFunction)pygobject_get_data, METH_VARARGS },
{ "set_data", (PyCFunction)pygobject_set_data, METH_VARARGS },
+ { "connect", (PyCFunction)pygobject_connect, METH_VARARGS },
+ { "connect_after", (PyCFunction)pygobject_connect_after, METH_VARARGS },
+ { "connect_object", (PyCFunction)pygobject_connect_object, METH_VARARGS },
+ { "connect_object_after", (PyCFunction)pygobject_connect_object_after, METH_VARARGS },
{ NULL, NULL, 0 }
};