diff options
author | John Finlay <finlay@src.gnome.org> | 2004-05-18 23:58:55 +0000 |
---|---|---|
committer | John Finlay <finlay@src.gnome.org> | 2004-05-18 23:58:55 +0000 |
commit | 3cb80cdf86d4332af900bee349527e4ba002dea7 (patch) | |
tree | 562a87530017036430c34d8dc0062dabfdb0a3c5 | |
parent | 69c5d5cb8cd9401abfc3f39743d755a4a525409b (diff) | |
download | pygobject-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.c | 38 |
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); |