[pygobject/gsoc2009: 139/160] Register introspected objects



commit a17c5cb6e180eaf517c992e78d246ce16d4d38b6
Author: Simon van der Linden <svdlinden src gnome org>
Date:   Wed Aug 12 15:39:44 2009 +0200

    Register introspected objects

 gi/pygi-info.c              |   27 +++++++++++++++++++++++++++
 gi/types.py                 |    3 +--
 gobject/gobjectmodule.c     |    3 ++-
 gobject/pyginterface.c      |    2 +-
 gobject/pygobject-private.h |    2 ++
 gobject/pygobject.c         |   11 +++++++++--
 gobject/pygobject.h         |    8 ++++++--
 7 files changed, 48 insertions(+), 8 deletions(-)
---
diff --git a/gi/pygi-info.c b/gi/pygi-info.c
index 93e6518..75b7f93 100644
--- a/gi/pygi-info.c
+++ b/gi/pygi-info.c
@@ -1282,11 +1282,38 @@ _wrap_g_object_info_get_interfaces (PyGIBaseInfo *self)
     return infos;
 }
 
+static PyObject *
+_wrap_g_object_info_register_type (PyGIBaseInfo *self,
+                                   PyObject     *args,
+                                   PyObject     *kwargs)
+{
+    static char *kwlist[] = { "type", NULL };
+    PyTypeObject *type;
+    GType g_type;
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs,
+                "O!:ObjectInfo.register_type",
+                kwlist, &PyType_Type, &type)) {
+        return NULL;
+    }
+
+    if (!PyType_IsSubtype(type, &PyGObject_Type)) {
+        PyErr_SetString(PyExc_TypeError, "argument 1: Must be a subtype of gobject.GObject");
+        return NULL;
+    }
+
+    g_type = g_registered_type_info_get_g_type((GIRegisteredTypeInfo *)self->info);
+    pyg_register_object_type(g_type, type);
+
+    Py_RETURN_NONE;
+}
+
 static PyMethodDef _PyGIObjectInfo_methods[] = {
     { "get_parent", (PyCFunction)_wrap_g_object_info_get_parent, METH_NOARGS },
     { "get_methods", (PyCFunction)_wrap_g_object_info_get_methods, METH_NOARGS },
     { "get_fields", (PyCFunction)_wrap_g_object_info_get_fields, METH_NOARGS },
     { "get_interfaces", (PyCFunction)_wrap_g_object_info_get_interfaces, METH_NOARGS },
+    { "register_type", (PyCFunction)_wrap_g_object_info_register_type, METH_VARARGS | METH_KEYWORDS },
     { NULL, NULL, 0 }
 };
 
diff --git a/gi/types.py b/gi/types.py
index 64e9a8c..d400035 100644
--- a/gi/types.py
+++ b/gi/types.py
@@ -99,8 +99,7 @@ class GObjectMeta(gobject.GObjectMeta, MetaClassHelper):
             if hasattr(cls, '__gtype__'):
                 setObjectHasNewConstructor(cls.__gtype__)
 
-        if (isinstance(cls.__info__, InterfaceInfo)):
-            cls.__info__.register_type(cls)
+        cls.__info__.register_type(cls)
 
 
 class StructMeta(type, MetaClassHelper):
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c
index 929153a..aeebb8c 100644
--- a/gobject/gobjectmodule.c
+++ b/gobject/gobjectmodule.c
@@ -2573,9 +2573,10 @@ struct _PyGObject_Functions pygobject_api_functions = {
 
   pyglib_option_group_new,
 
-  &PyGObject_Type,
   &PyGTypeWrapper_Type,
 
+  &PyGObject_Type,
+  pyg_register_object_type,
   pygobject_new_from_type,
 
   &PyGInterface_Type,
diff --git a/gobject/pyginterface.c b/gobject/pyginterface.c
index 4f43d92..1c169e5 100644
--- a/gobject/pyginterface.c
+++ b/gobject/pyginterface.c
@@ -92,7 +92,7 @@ pyg_register_interface(PyObject *dict, const gchar *class_name,
         Py_DECREF(o);
     }
 
-	pyg_register_interface_type(type, gtype);
+	pyg_register_interface_type(gtype, type);
 
     PyDict_SetItemString(dict, (char *)class_name, (PyObject *)type);
 
diff --git a/gobject/pygobject-private.h b/gobject/pygobject-private.h
index 18ab07d..f8efcf6 100644
--- a/gobject/pygobject-private.h
+++ b/gobject/pygobject-private.h
@@ -157,6 +157,8 @@ void          pygobject_register_sinkfunc(GType type,
 					  void (* sinkfunc)(GObject *object));
 int           pyg_type_register          (PyTypeObject *class,
 					  const gchar *type_name);
+void          pyg_register_object_type   (GType g_type,
+                                          PyTypeObject *type);
 
 /* from pygboxed.c */
 extern PyTypeObject PyGBoxed_Type;
diff --git a/gobject/pygobject.c b/gobject/pygobject.c
index 2a47ddb..2e47f53 100644
--- a/gobject/pygobject.c
+++ b/gobject/pygobject.c
@@ -648,6 +648,14 @@ pyg_type_get_bases(GType gtype)
     return bases;
 }
 
+void
+pyg_register_object_type (GType         g_type,
+                          PyTypeObject *type)
+{
+    Py_INCREF(type);
+    g_type_set_qdata(g_type, pygobject_class_key, type);
+}
+
 /**
  * pygobject_new_with_interfaces
  * @gtype: the GType of the GObject subclass.
@@ -748,8 +756,7 @@ pygobject_new_with_interfaces(GType gtype)
     }
 
     /* stash a pointer to the python class with the GType */
-    Py_INCREF(type);
-    g_type_set_qdata(gtype, pygobject_class_key, type);
+    pyg_register_object_type(gtype, type);
 
     pyglib_gil_state_release(state);
 
diff --git a/gobject/pygobject.h b/gobject/pygobject.h
index 14987f1..bad52ad 100644
--- a/gobject/pygobject.h
+++ b/gobject/pygobject.h
@@ -199,9 +199,11 @@ struct _PyGObject_Functions {
     gboolean  (*gerror_exception_check) (GError **error);
     PyObject* (*option_group_new) (GOptionGroup *group);
 
-    PyTypeObject *object_type;
     PyTypeObject *type_wrapper_type;
 
+    PyTypeObject *object_type;
+    void      (*register_object_type) (GType         g_type,
+                                       PyTypeObject *type);
     PyObject *(*object_new_from_type) (PyTypeObject *type,
                                        GObject *obj,
                                        gboolean sink);
@@ -275,8 +277,10 @@ struct _PyGObject_Functions *_PyGObject_API;
 #define pyg_type_register_custom_callback (_PyGObject_API->type_register_custom)
 #define pyg_gerror_exception_check (_PyGObject_API->gerror_exception_check)
 #define pyg_option_group_new       (_PyGObject_API->option_group_new)
-#define PyGObject_Type             (*_PyGObject_API->object_type)
 #define PyGTypeWrapper_Type        (*_PyGObject_API->type_wrapper_type)
+
+#define PyGObject_Type             (*_PyGObject_API->object_type)
+#define pyg_register_object_type   (_PyGObject_API->register_object_type)
 #define pygobject_new_from_type    (_PyGObject_API->object_new_from_type)
 
 #define PyGInterface_Type          (*_PyGObject_API->interface_type)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]