Index: gobjectmodule.c =================================================================== RCS file: /cvs/gnome/gnome-python/pygtk/gobject/gobjectmodule.c,v retrieving revision 1.161 diff -u -p -r1.161 gobjectmodule.c --- gobjectmodule.c 16 Jan 2005 14:52:55 -0000 1.161 +++ gobjectmodule.c 18 Jan 2005 09:08:39 -0000 @@ -889,11 +889,52 @@ pyg_run_class_init(GType gtype, gpointer return 0; } +/* + * Lookup sys.modules[class.__module__].__name__ rather than using + * __module__ directly. The former seems to be canonical, but the + * latter can be e.g. "__main__" + */ +static char * +pyg_lookup_module_name_from_class (PyTypeObject *class) +{ + PyObject *modules, *module, *mod_name; + char *retval; + + mod_name = PyObject_GetAttrString((PyObject *)class, "__module__"); + if (!mod_name) { + PyErr_Clear(); + return NULL; + } + + if (!PyString_Check(mod_name)) { + Py_DECREF(mod_name); + return NULL; + } + + modules = PyImport_GetModuleDict(); + if ((module = PyDict_GetItemString(modules, PyString_AsString(mod_name))) == NULL) { + retval = g_strdup (PyString_AsString (mod_name)); + Py_DECREF(mod_name); + return retval; + } + + retval = PyModule_GetName (module); + if (!retval) { + PyErr_Clear(); + retval = g_strdup (PyString_AsString (mod_name)); + Py_DECREF(mod_name); + return retval; + } + + Py_DECREF(mod_name); + + return g_strdup(retval); +} static PyObject * pyg_type_register(PyObject *self, PyObject *args) { - PyObject *gtype, *module, *gsignals, *gproperties; + PyObject *gtype, *gsignals, *gproperties; PyTypeObject *class; GType parent_type, instance_type; gchar *type_name = NULL; @@ -933,20 +974,21 @@ pyg_type_register(PyObject *self, PyObje while (name_serial < 1000) /* give up after 1000 tries, just in case.. */ { char name_serial_str[16]; + char *module; snprintf(name_serial_str, 16, "-v%i", name_serial); - module = PyObject_GetAttrString((PyObject *)class, "__module__"); - if (module && PyString_Check(module)) { - type_name = g_strconcat(PyString_AsString(module), ".", + + module = pyg_lookup_module_name_from_class(class); + if (module) { + type_name = g_strconcat(module, ".", class->tp_name, name_serial > 1? name_serial_str : NULL, NULL); + g_free (module); } else { - if (module) - Py_DECREF(module); - else - PyErr_Clear(); - type_name = g_strdup(class->tp_name); + type_name = g_strconcat(class->tp_name, + name_serial > 1? name_serial_str : NULL, + NULL); } /* convert '.' in type name to '+', which isn't banned (grumble) */ for (i = 0; type_name[i] != '\0'; i++)