diff --git a/ChangeLog b/ChangeLog index d84dd8ff2..8061a6a6b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2006-02-10 Thomas Thurman + + Avoid a memory leak when checking which workspace(s) a window is + on. Fixes #322059. + + * src/workspace.h (struct MetaWorkspace): + * src/workspace.c (meta_workspace_new, meta_workspace_free): + added list_containing_self member to MetaWorkspace + + * src/window.c (meta_window_get_workspaces): use + window->workspace->list_containing_self instead of allocating (and + leaking) such a list on the fly. + 2006-02-09 Thomas Thurman * src/testboxes.c (test_regions_okay, test_clamping_to_region): diff --git a/src/window.c b/src/window.c index 46a6e7c56..82422fc44 100644 --- a/src/window.c +++ b/src/window.c @@ -5677,7 +5677,7 @@ meta_window_get_workspaces (MetaWindow *window) if (window->on_all_workspaces) return window->screen->workspaces; else - return g_list_prepend (NULL, window->workspace); + return window->workspace->list_containing_self; } static void diff --git a/src/workspace.c b/src/workspace.c index ce22c1fd7..217df4e61 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -68,6 +68,7 @@ meta_workspace_new (MetaScreen *screen) workspace->xinerama_region = NULL; workspace->screen_edges = NULL; workspace->xinerama_edges = NULL; + workspace->list_containing_self = g_list_prepend (NULL, workspace); workspace->all_struts = NULL; @@ -114,6 +115,7 @@ meta_workspace_free (MetaWorkspace *workspace) g_list_free (workspace->mru_list); g_slist_free (workspace->all_struts); + g_list_free (workspace->list_containing_self); for (i = 0; i < screen->n_xinerama_infos; i++) meta_rectangle_free_list_and_elements (workspace->xinerama_region[i]); diff --git a/src/workspace.h b/src/workspace.h index 3c3e8d81f..73f710106 100644 --- a/src/workspace.h +++ b/src/workspace.h @@ -43,6 +43,8 @@ struct _MetaWorkspace GList *windows; GList *mru_list; + GList *list_containing_self; + MetaRectangle work_area_screen; MetaRectangle *work_area_xinerama; GList *screen_region;