diff --git a/src/core/display.c b/src/core/display.c index c1857624f..017d5415a 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -805,6 +805,7 @@ meta_display_open (void) enable_compositor (the_display); + meta_screen_init_workspaces (screen); meta_screen_create_guard_window (screen); /* We know that if mutter is running as a Wayland compositor, diff --git a/src/core/screen-private.h b/src/core/screen-private.h index c312599b0..766af4bd5 100644 --- a/src/core/screen-private.h +++ b/src/core/screen-private.h @@ -135,6 +135,7 @@ MetaScreen* meta_screen_new (MetaDisplay *displ guint32 timestamp); void meta_screen_free (MetaScreen *screen, guint32 timestamp); +void meta_screen_init_workspaces (MetaScreen *screen); void meta_screen_manage_all_windows (MetaScreen *screen); void meta_screen_foreach_window (MetaScreen *screen, MetaScreenWindowFunc func, diff --git a/src/core/screen.c b/src/core/screen.c index afc3ca95d..e47115caf 100644 --- a/src/core/screen.c +++ b/src/core/screen.c @@ -506,7 +506,6 @@ meta_screen_new (MetaDisplay *display, Atom wm_sn_atom; char buf[128]; guint32 manager_timestamp; - gulong current_workspace; MetaMonitorManager *manager; replace_current_wm = meta_get_replace_current_wm (); @@ -721,24 +720,10 @@ meta_screen_new (MetaDisplay *display, meta_screen_update_workspace_layout (screen); - /* Get current workspace */ - current_workspace = 0; - if (meta_prop_get_cardinal (screen->display, - screen->xroot, - screen->display->atom__NET_CURRENT_DESKTOP, - ¤t_workspace)) - meta_verbose ("Read existing _NET_CURRENT_DESKTOP = %d\n", - (int) current_workspace); - else - meta_verbose ("No _NET_CURRENT_DESKTOP present\n"); - /* Screens must have at least one workspace at all times, * so create that required workspace. */ - meta_workspace_activate (meta_workspace_new (screen), timestamp); - update_num_workspaces (screen, timestamp); - - set_workspace_names (screen); + meta_workspace_new (screen); screen->keys_grabbed = FALSE; meta_screen_grab_keys (screen); @@ -764,23 +749,46 @@ meta_screen_new (MetaDisplay *display, screen->startup_sequence_timeout = 0; #endif - /* Switch to the _NET_CURRENT_DESKTOP workspace */ - { - MetaWorkspace *space; - - space = meta_screen_get_workspace_by_index (screen, - current_workspace); - - if (space != NULL) - meta_workspace_activate (space, timestamp); - } - meta_verbose ("Added screen %d ('%s') root 0x%lx\n", screen->number, screen->screen_name, screen->xroot); return screen; } +void +meta_screen_init_workspaces (MetaScreen *screen) +{ + MetaWorkspace *current_workspace; + gulong current_workspace_index = 0; + guint32 timestamp; + + g_return_if_fail (META_IS_SCREEN (screen)); + + timestamp = screen->wm_sn_timestamp; + + /* Get current workspace */ + if (meta_prop_get_cardinal (screen->display, + screen->xroot, + screen->display->atom__NET_CURRENT_DESKTOP, + ¤t_workspace_index)) + meta_verbose ("Read existing _NET_CURRENT_DESKTOP = %d\n", + (int) current_workspace_index); + else + meta_verbose ("No _NET_CURRENT_DESKTOP present\n"); + + meta_workspace_activate (screen->workspaces->data, timestamp); + update_num_workspaces (screen, timestamp); + + set_workspace_names (screen); + + /* Switch to the _NET_CURRENT_DESKTOP workspace */ + current_workspace = meta_screen_get_workspace_by_index (screen, + current_workspace_index); + + if (current_workspace != NULL) + meta_workspace_activate (current_workspace, timestamp); +} + void meta_screen_free (MetaScreen *screen, guint32 timestamp)