diff --git a/src/core/prefs.c b/src/core/prefs.c
index 92aec455e..58ee473cf 100644
--- a/src/core/prefs.c
+++ b/src/core/prefs.c
@@ -82,6 +82,7 @@ static int num_workspaces = 4;
static GDesktopTitlebarAction action_double_click_titlebar = G_DESKTOP_TITLEBAR_ACTION_TOGGLE_MAXIMIZE;
static GDesktopTitlebarAction action_middle_click_titlebar = G_DESKTOP_TITLEBAR_ACTION_LOWER;
static GDesktopTitlebarAction action_right_click_titlebar = G_DESKTOP_TITLEBAR_ACTION_MENU;
+static gboolean dynamic_workspaces = FALSE;
static gboolean application_based = FALSE;
static gboolean disable_workarounds = FALSE;
static gboolean auto_raise = FALSE;
@@ -280,6 +281,13 @@ static MetaBoolPreference preferences_bool[] =
},
&use_system_font,
},
+ {
+ { "dynamic-workspaces",
+ SCHEMA_MUTTER,
+ META_PREF_DYNAMIC_WORKSPACES,
+ },
+ &dynamic_workspaces,
+ },
{
{ "application-based",
SCHEMA_GENERAL,
@@ -1498,6 +1506,12 @@ meta_prefs_get_num_workspaces (void)
return num_workspaces;
}
+gboolean
+meta_prefs_get_dynamic_workspaces (void)
+{
+ return dynamic_workspaces;
+}
+
gboolean
meta_prefs_get_application_based (void)
{
diff --git a/src/core/screen.c b/src/core/screen.c
index 4010c7a71..ba2b96717 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -1173,7 +1173,9 @@ prefs_changed_callback (MetaPreference pref,
{
MetaScreen *screen = data;
- if (pref == META_PREF_NUM_WORKSPACES)
+ if ((pref == META_PREF_NUM_WORKSPACES ||
+ pref == META_PREF_DYNAMIC_WORKSPACES) &&
+ !meta_prefs_get_dynamic_workspaces ())
{
/* GSettings doesn't provide timestamps, but luckily update_num_workspaces
* often doesn't need it...
@@ -1483,7 +1485,9 @@ meta_screen_remove_workspace (MetaScreen *screen, MetaWorkspace *workspace,
new_num = g_list_length (screen->workspaces);
set_number_of_spaces_hint (screen, new_num);
- meta_prefs_set_num_workspaces (new_num);
+
+ if (!meta_prefs_get_dynamic_workspaces ())
+ 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 */
@@ -1538,7 +1542,9 @@ meta_screen_append_new_workspace (MetaScreen *screen, gboolean activate,
new_num = g_list_length (screen->workspaces);
set_number_of_spaces_hint (screen, new_num);
- meta_prefs_set_num_workspaces (new_num);
+
+ if (!meta_prefs_get_dynamic_workspaces ())
+ meta_prefs_set_num_workspaces (new_num);
meta_screen_queue_workarea_recalc (screen);
diff --git a/src/meta/prefs.h b/src/meta/prefs.h
index 8232a7254..bfdc72643 100644
--- a/src/meta/prefs.h
+++ b/src/meta/prefs.h
@@ -47,6 +47,7 @@ typedef enum
META_PREF_THEME,
META_PREF_TITLEBAR_FONT,
META_PREF_NUM_WORKSPACES,
+ META_PREF_DYNAMIC_WORKSPACES,
META_PREF_APPLICATION_BASED,
META_PREF_KEYBINDINGS,
META_PREF_DISABLE_WORKAROUNDS,
@@ -94,6 +95,7 @@ const char* meta_prefs_get_theme (void);
/* returns NULL if GTK default should be used */
const PangoFontDescription* meta_prefs_get_titlebar_font (void);
int meta_prefs_get_num_workspaces (void);
+gboolean meta_prefs_get_dynamic_workspaces (void);
gboolean meta_prefs_get_application_based (void);
gboolean meta_prefs_get_disable_workarounds (void);
gboolean meta_prefs_get_auto_raise (void);
diff --git a/src/org.gnome.mutter.gschema.xml.in b/src/org.gnome.mutter.gschema.xml.in
index 8d11154e1..e3c559049 100644
--- a/src/org.gnome.mutter.gschema.xml.in
+++ b/src/org.gnome.mutter.gschema.xml.in
@@ -45,6 +45,16 @@
+
+ false
+ <_summary>Workspaces are managed dynamically
+ <_description>
+ Determines whether workspaces are managed dynamically or
+ whether there's a static number of workspaces (determined
+ by the num-workspaces key in org.gnome.desktop.wm.preferences).
+
+
+
false
<_summary>Workspaces only on primary