summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorGustavo Carneiro <gjc@inescporto.pt>2009-06-18 00:26:25 +0300
committerPaul Pogonyshev <pogonyshev@gmx.net>2009-06-18 00:45:43 +0300
commite955848c108b37fea4825c3ca539e931b87e6bca (patch)
tree9df5a0ab7683d449f7b372f7c7e43abafd95bebc /gtk
parentfdbda760740db172f8ea36f13563d895fbd00343 (diff)
downloadpygtk-e955848c108b37fea4825c3ca539e931b87e6bca.tar.gz
Protect window objects from GC in gtk.window_get_toplevels()
Fixes bug #574259.
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtkwindow.override9
1 files changed, 9 insertions, 0 deletions
diff --git a/gtk/gtkwindow.override b/gtk/gtkwindow.override
index 58264eb8..c694229e 100644
--- a/gtk/gtkwindow.override
+++ b/gtk/gtkwindow.override
@@ -34,13 +34,20 @@ _wrap_gtk_window_list_toplevels(PyGObject *self)
list = gtk_window_list_toplevels();
+ /* See bug #574259. We temporarily reference each window. After
+ * the list is created, windows will be referenced from PyGTK
+ * wrappers, so we remove the temporary refs. */
+ g_list_foreach(list, (GFunc) g_object_ref, NULL);
+
if ((py_list = PyList_New(0)) == NULL) {
+ g_list_foreach(list, (GFunc) g_object_unref, NULL);
g_list_free(list);
return NULL;
}
for (tmp = list; tmp != NULL; tmp = tmp->next) {
gtk_obj = pygobject_new(G_OBJECT(tmp->data));
if (gtk_obj == NULL) {
+ g_list_foreach(list, (GFunc) g_object_unref, NULL);
g_list_free(list);
Py_DECREF(py_list);
return NULL;
@@ -48,6 +55,8 @@ _wrap_gtk_window_list_toplevels(PyGObject *self)
PyList_Append(py_list, gtk_obj);
Py_DECREF(gtk_obj);
}
+
+ g_list_foreach(list, (GFunc) g_object_unref, NULL);
g_list_free(list);
return py_list;
}