diff options
author | Gustavo Carneiro <gjc@inescporto.pt> | 2009-06-18 00:26:25 +0300 |
---|---|---|
committer | Paul Pogonyshev <pogonyshev@gmx.net> | 2009-06-18 00:45:43 +0300 |
commit | e955848c108b37fea4825c3ca539e931b87e6bca (patch) | |
tree | 9df5a0ab7683d449f7b372f7c7e43abafd95bebc /gtk/gtkwindow.override | |
parent | fdbda760740db172f8ea36f13563d895fbd00343 (diff) | |
download | pygtk-e955848c108b37fea4825c3ca539e931b87e6bca.tar.gz |
Protect window objects from GC in gtk.window_get_toplevels()
Fixes bug #574259.
Diffstat (limited to 'gtk/gtkwindow.override')
-rw-r--r-- | gtk/gtkwindow.override | 9 |
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; } |