summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Finlay <finlay@src.gnome.org>2004-05-18 23:58:55 +0000
committerJohn Finlay <finlay@src.gnome.org>2004-05-18 23:58:55 +0000
commit3cb80cdf86d4332af900bee349527e4ba002dea7 (patch)
tree562a87530017036430c34d8dc0062dabfdb0a3c5
parent69c5d5cb8cd9401abfc3f39743d755a4a525409b (diff)
downloadpygobject-3cb80cdf86d4332af900bee349527e4ba002dea7.tar.gz
pygobject-3cb80cdf86d4332af900bee349527e4ba002dea7.tar.xz
pygobject-3cb80cdf86d4332af900bee349527e4ba002dea7.zip
pygobject.c (pygobject_new_with_interfaces) Add new type to the module
* pygobject.c (pygobject_new_with_interfaces) Add new type to the module dict as is done for built-in types.
-rw-r--r--gobject/pygobject.c38
1 files changed, 36 insertions, 2 deletions
diff --git a/gobject/pygobject.c b/gobject/pygobject.c
index f3da5af..7e278b3 100644
--- a/gobject/pygobject.c
+++ b/gobject/pygobject.c
@@ -190,6 +190,8 @@ pygobject_new_with_interfaces(GType gtype)
int i;
PyObject *bases;
GType parent_type, interface_type;
+ PyObject *modules, *module;
+ gchar *type_name, *mod_name, *gtype_name;
interfaces = g_type_interfaces (gtype, &n_interfaces);
bases = PyTuple_New(n_interfaces+1);
@@ -221,8 +223,33 @@ pygobject_new_with_interfaces(GType gtype)
/* set up __doc__ descriptor on type */
PyDict_SetItemString(dict, "__doc__", pyg_object_descr_doc_get());
- type = (PyTypeObject*)PyObject_CallFunction((PyObject*)&PyType_Type,
- "sOO", g_type_name(gtype), bases, dict);
+ /* generate the pygtk module name and extract the base type name */
+ gtype_name = (gchar *)g_type_name(gtype);
+ if (g_str_has_prefix(gtype_name, "Gtk")) {
+ mod_name = "gtk";
+ gtype_name += 3;
+ type_name = g_strconcat(mod_name, ".", gtype_name, NULL);
+ } else if (g_str_has_prefix(gtype_name, "Gdk")) {
+ mod_name = "gtk.gdk";
+ gtype_name += 3;
+ type_name = g_strconcat(mod_name, ".", gtype_name, NULL);
+ } else if (g_str_has_prefix(gtype_name, "Atk")) {
+ mod_name = "atk";
+ gtype_name += 3;
+ type_name = g_strconcat(mod_name, ".", gtype_name, NULL);
+ } else if (g_str_has_prefix(gtype_name, "Pango")) {
+ mod_name = "pango";
+ gtype_name += 5;
+ type_name = g_strconcat(mod_name, ".", gtype_name, NULL);
+ } else {
+ mod_name = "__main__";
+ type_name = g_strconcat(mod_name, ".", gtype_name, NULL);
+ }
+
+ type = (PyTypeObject*)PyObject_CallFunction((PyObject*)&PyType_Type, "sOO",
+ type_name, bases, dict);
+ g_free(type_name);
+
if (type == NULL) {
PyErr_Print();
return NULL;
@@ -232,6 +259,13 @@ pygobject_new_with_interfaces(GType gtype)
g_warning ("couldn't make the type `%s' ready", type->tp_name);
return NULL;
}
+ /* insert type name in module dict */
+ modules = PyImport_GetModuleDict();
+ if ((module = PyDict_GetItemString(modules, mod_name)) != NULL) {
+ PyObject *mod_dict = PyModule_GetDict(module);
+ if (mod_dict != NULL)
+ PyDict_SetItemString(mod_dict, gtype_name, (PyObject *)type);
+ }
if (!pygobject_class_key)
pygobject_class_key = g_quark_from_static_string(pygobject_class_id);