From 4c4c720dc134b6e05ed1c40c444b18b34d2bcd50 Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Tue, 25 Jan 2011 16:27:31 -0500 Subject: [PATCH] Update _NET_CURRENT_DESKTOP on workspace removal When we delete a workspace before the active workspace, we need to upate the _NET_CURRENT_DESKTOP since the active workspace index changes. To do this workspace.c:set_active_space_hint() is moved to screen.c:meta_screen_set_active_workspace_hint() so that it can be shared. https://bugzilla.gnome.org/show_bug.cgi?id=640581 --- src/core/screen-private.h | 2 ++ src/core/screen.c | 33 +++++++++++++++++++++++++++++++++ src/core/workspace.c | 30 ++---------------------------- 3 files changed, 37 insertions(+), 28 deletions(-) diff --git a/src/core/screen-private.h b/src/core/screen-private.h index 7db354420..f64f7458c 100644 --- a/src/core/screen-private.h +++ b/src/core/screen-private.h @@ -255,4 +255,6 @@ void meta_screen_workspace_switched (MetaScreen *screen, int to, MetaMotionDirection direction); +void meta_screen_set_active_workspace_hint (MetaScreen *screen); + #endif diff --git a/src/core/screen.c b/src/core/screen.c index 50ebeeb50..502d149c8 100644 --- a/src/core/screen.c +++ b/src/core/screen.c @@ -1283,6 +1283,7 @@ meta_screen_remove_workspace (MetaScreen *screen, MetaWorkspace *workspace, MetaWorkspace *neighbour = NULL; GList *next = NULL; int index; + gboolean active_index_changed; int new_num; l = screen->workspaces; @@ -1321,6 +1322,7 @@ meta_screen_remove_workspace (MetaScreen *screen, MetaWorkspace *workspace, /* To emit the signal after removing the workspace */ index = meta_workspace_index (workspace); + active_index_changed = index < meta_screen_get_active_workspace_index (screen); /* This also removes the workspace from the screens list */ meta_workspace_remove (workspace); @@ -1330,6 +1332,11 @@ meta_screen_remove_workspace (MetaScreen *screen, MetaWorkspace *workspace, set_number_of_spaces_hint (screen, new_num); meta_prefs_set_num_workspaces (new_num); + /* If deleting a workspace before the current workspace, the active + * workspace index changes, so we need to update that hint */ + if (active_index_changed) + meta_screen_set_active_workspace_hint (workspace->screen); + l = next; while (l) { @@ -3345,3 +3352,29 @@ meta_screen_workspace_switched (MetaScreen *screen, from, to, direction); } +void +meta_screen_set_active_workspace_hint (MetaScreen *screen) +{ + unsigned long data[1]; + + /* this is because we destroy the spaces in order, + * so we always end up setting a current desktop of + * 0 when closing a screen, so lose the current desktop + * on restart. By doing this we keep the current + * desktop on restart. + */ + if (screen->closing > 0) + return; + + data[0] = meta_workspace_index (screen->active_workspace); + + meta_verbose ("Setting _NET_CURRENT_DESKTOP to %lu\n", data[0]); + + meta_error_trap_push (screen->display); + XChangeProperty (screen->display->xdisplay, screen->xroot, + screen->display->atom__NET_CURRENT_DESKTOP, + XA_CARDINAL, + 32, PropModeReplace, (guchar*) data, 1); + meta_error_trap_pop (screen->display); +} + diff --git a/src/core/workspace.c b/src/core/workspace.c index c5c9d6af6..51a3de755 100644 --- a/src/core/workspace.c +++ b/src/core/workspace.c @@ -24,6 +24,7 @@ */ #include +#include "screen-private.h" #include "workspace.h" #include "workspace-private.h" #include "boxes-private.h" @@ -45,7 +46,6 @@ enum { }; void meta_workspace_queue_calc_showing (MetaWorkspace *workspace); -static void set_active_space_hint (MetaScreen *screen); static void focus_ancestor_or_mru_window (MetaWorkspace *workspace, MetaWindow *not_this_one, guint32 timestamp); @@ -557,7 +557,7 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace, workspace->screen->active_workspace = workspace; - set_active_space_hint (workspace->screen); + meta_screen_set_active_workspace_hint (workspace->screen); /* If the "show desktop" mode is active for either the old workspace * or the new one *but not both*, then update the @@ -752,32 +752,6 @@ meta_workspace_list_windows (MetaWorkspace *workspace) return workspace_windows; } -static void -set_active_space_hint (MetaScreen *screen) -{ - unsigned long data[1]; - - /* this is because we destroy the spaces in order, - * so we always end up setting a current desktop of - * 0 when closing a screen, so lose the current desktop - * on restart. By doing this we keep the current - * desktop on restart. - */ - if (screen->closing > 0) - return; - - data[0] = meta_workspace_index (screen->active_workspace); - - meta_verbose ("Setting _NET_CURRENT_DESKTOP to %lu\n", data[0]); - - meta_error_trap_push (screen->display); - XChangeProperty (screen->display->xdisplay, screen->xroot, - screen->display->atom__NET_CURRENT_DESKTOP, - XA_CARDINAL, - 32, PropModeReplace, (guchar*) data, 1); - meta_error_trap_pop (screen->display); -} - void meta_workspace_invalidate_work_area (MetaWorkspace *workspace) {