diff --git a/ChangeLog b/ChangeLog index d173678f3..3467d48e6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-09-01 Thomas Thurman + + * src/core/workspace.c: When a workspace's list of struts + is freed, free the struts too. Closes #549952, and #468075. + 2008-09-01 Thomas Thurman Add new move_to_center keybinding, requested by Khanh-Dang Nguyen diff --git a/src/core/workspace.c b/src/core/workspace.c index 13731d57f..ddb2541f6 100644 --- a/src/core/workspace.c +++ b/src/core/workspace.c @@ -35,6 +35,9 @@ static void set_active_space_hint (MetaScreen *screen); static void focus_ancestor_or_mru_window (MetaWorkspace *workspace, MetaWindow *not_this_one, guint32 timestamp); +static void free_this (gpointer candidate, + gpointer dummy); +static void workspace_free_struts (MetaWorkspace *workspace); static void maybe_add_to_list (MetaScreen *screen, MetaWindow *window, gpointer data) @@ -79,6 +82,29 @@ meta_workspace_new (MetaScreen *screen) return workspace; } +/** Foreach function for workspace_free_struts() */ +static void +free_this (gpointer candidate, gpointer dummy) +{ + g_free (candidate); +} + +/** + * Frees the struts list of a workspace. + * + * \param workspace The workspace. + */ +static void +workspace_free_struts (MetaWorkspace *workspace) +{ + if (workspace->all_struts == NULL) + return; + + g_slist_foreach (workspace->all_struts, free_this, NULL); + g_slist_free (workspace->all_struts); + workspace->all_struts = NULL; +} + void meta_workspace_free (MetaWorkspace *workspace) { @@ -127,7 +153,7 @@ meta_workspace_free (MetaWorkspace *workspace) if (!workspace->work_areas_invalid) { - g_slist_free (workspace->all_struts); + workspace_free_struts (workspace); for (i = 0; i < screen->n_xinerama_infos; i++) meta_rectangle_free_list_and_elements (workspace->xinerama_region[i]); g_free (workspace->xinerama_region); @@ -457,8 +483,7 @@ meta_workspace_invalidate_work_area (MetaWorkspace *workspace) g_free (workspace->work_area_xinerama); workspace->work_area_xinerama = NULL; - g_slist_free (workspace->all_struts); - workspace->all_struts = NULL; + workspace_free_struts (workspace); for (i = 0; i < workspace->screen->n_xinerama_infos; i++) meta_rectangle_free_list_and_elements (workspace->xinerama_region[i]);