summaryrefslogtreecommitdiffstats
path: root/gobject/pygtype.c
diff options
context:
space:
mode:
Diffstat (limited to 'gobject/pygtype.c')
-rw-r--r--gobject/pygtype.c33
1 files changed, 27 insertions, 6 deletions
diff --git a/gobject/pygtype.c b/gobject/pygtype.c
index 2075624..0051d25 100644
--- a/gobject/pygtype.c
+++ b/gobject/pygtype.c
@@ -282,6 +282,21 @@ pyg_value_from_pyobject(GValue *value, PyObject *obj)
PyObject *tmp;
switch (G_TYPE_FUNDAMENTAL(G_VALUE_TYPE(value))) {
+ case G_TYPE_INTERFACE:
+ /* we only handle interface types that have a GObject prereq */
+ if (g_type_is_a(G_VALUE_TYPE(value), G_TYPE_OBJECT)) {
+ if (!PyObject_TypeCheck(obj, &PyGObject_Type)) {
+ return -1;
+ }
+ if (!G_TYPE_CHECK_INSTANCE_TYPE(pygobject_get(obj),
+ G_VALUE_TYPE(value))) {
+ return -1;
+ }
+ g_value_set_object(value, pygobject_get(obj));
+ } else {
+ return -1;
+ }
+ break;
case G_TYPE_CHAR:
if ((tmp = PyObject_Str(obj)))
g_value_set_char(value, PyString_AsString(tmp)[0]);
@@ -446,13 +461,14 @@ pyg_value_from_pyobject(GValue *value, PyObject *obj)
return -1;
break;
case G_TYPE_OBJECT:
- {
- PyTypeObject *type = pygobject_lookup_class(G_VALUE_TYPE(value));
- if (!PyObject_TypeCheck(obj, type)) {
- return -1;
- }
- g_value_set_object(value, pygobject_get(obj));
+ if (!PyObject_TypeCheck(obj, &PyGObject_Type)) {
+ return -1;
+ }
+ if (!G_TYPE_CHECK_INSTANCE_TYPE(pygobject_get(obj),
+ G_VALUE_TYPE(value))) {
+ return -1;
}
+ g_value_set_object(value, pygobject_get(obj));
break;
default:
break;
@@ -466,6 +482,11 @@ pyg_value_as_pyobject(const GValue *value)
gchar buf[128];
switch (G_TYPE_FUNDAMENTAL(G_VALUE_TYPE(value))) {
+ case G_TYPE_INTERFACE:
+ if (g_type_is_a(G_VALUE_TYPE(value), G_TYPE_OBJECT))
+ return pygobject_new(g_value_get_object(value));
+ else
+ break;
case G_TYPE_CHAR:
{
gint8 val = g_value_get_char(value);