From f595538db940b6cee91e87f75ee4a87fa2fb1174 Mon Sep 17 00:00:00 2001 From: Moritz Bruder Date: Sun, 10 Feb 2013 01:06:58 +0100 Subject: Added a wrap around option for workspace switcher Includes: - a toggle button in the preferences (wrap_workspaces_toggle), a gboolean keeping track (wrap_workspaces) - another entry in the schema (gsettings) - and some minor code changes (which only affect the code when scrolling while on the last or first index) --- ....panel.applet.workspace-switcher.gschema.xml.in | 5 ++ applets/wncklet/workspace-switcher.c | 59 +++++++++++++++++++++- applets/wncklet/workspace-switcher.ui | 15 ++++++ 3 files changed, 78 insertions(+), 1 deletion(-) (limited to 'applets') diff --git a/applets/wncklet/org.mate.panel.applet.workspace-switcher.gschema.xml.in b/applets/wncklet/org.mate.panel.applet.workspace-switcher.gschema.xml.in index f4664312..682e42de 100644 --- a/applets/wncklet/org.mate.panel.applet.workspace-switcher.gschema.xml.in +++ b/applets/wncklet/org.mate.panel.applet.workspace-switcher.gschema.xml.in @@ -15,5 +15,10 @@ Rows in workspace switcher This key specifies how many rows (for horizontal layout) or columns (for vertical layout) the workspace switcher shows the workspaces in. This key is only relevant if the display_all_workspaces key is true. + + false + Wrap around on scroll + If true, the workspace switcher will allow wrap-around, which means switching from the first to the last workspace and vice versa via scrolling. + diff --git a/applets/wncklet/workspace-switcher.c b/applets/wncklet/workspace-switcher.c index 4d24663f..474f84ec 100644 --- a/applets/wncklet/workspace-switcher.c +++ b/applets/wncklet/workspace-switcher.c @@ -62,6 +62,7 @@ typedef struct { GtkWidget* workspace_names_label; GtkWidget* workspace_names_scroll; GtkWidget* display_workspaces_toggle; + GtkWidget* wrap_workspaces_toggle; GtkWidget* all_workspaces_radio; GtkWidget* current_only_radio; GtkWidget* num_rows_spin; /* for vertical layout this is cols */ @@ -74,6 +75,7 @@ typedef struct { int n_rows; /* for vertical layout this is cols */ MatewnckPagerDisplayMode display_mode; gboolean display_all; + gboolean wrap_workspaces; GSettings* settings; } PagerData; @@ -251,6 +253,10 @@ static gboolean applet_scroll(MatePanelApplet* applet, GdkEventScroll* event, Pa { index += n_columns; } + else if (pager->wrap_workspaces && index == n_workspaces - 1) + { + index = 0; + } else if ((index < n_workspaces - 1 && index + in_last_row != n_workspaces - 1) || (index == n_workspaces - 1 && in_last_row != 0)) { index = (index % n_columns) + 1; @@ -259,7 +265,13 @@ static gboolean applet_scroll(MatePanelApplet* applet, GdkEventScroll* event, Pa case GDK_SCROLL_RIGHT: if (index < n_workspaces - 1) + { index++; + } + else if (pager->wrap_workspaces) + { + index = 0; + } break; case GDK_SCROLL_UP: @@ -271,6 +283,10 @@ static gboolean applet_scroll(MatePanelApplet* applet, GdkEventScroll* event, Pa { index = ((pager->n_rows - 1) * n_columns) + (index % n_columns) - 1; } + else if (pager->wrap_workspaces) + { + index = n_workspaces - 1; + } if (index >= n_workspaces) index -= n_columns; @@ -278,7 +294,13 @@ static gboolean applet_scroll(MatePanelApplet* applet, GdkEventScroll* event, Pa case GDK_SCROLL_LEFT: if (index > 0) + { index--; + } + else if (pager->wrap_workspaces) + { + index = n_workspaces - 1; + } break; default: g_assert_not_reached(); @@ -394,6 +416,20 @@ static void all_workspaces_changed(GSettings* settings, gchar* key, PagerData* p } } +static void wrap_workspaces_changed(GSettings* settings, gchar* key, PagerData* pager) +{ + gboolean value = FALSE; /* Default value */ + + value = g_settings_get_boolean (settings, key); + + pager->wrap_workspaces = value; + + if (pager->wrap_workspaces_toggle && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pager->wrap_workspaces_toggle)) != value) + { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pager->wrap_workspaces_toggle), value); + } +} + static void setup_gsettings(PagerData* pager) { pager->settings = mate_panel_applet_settings_new (MATE_PANEL_APPLET (pager->applet), WORKSPACE_SWITCHER_SCHEMA); @@ -410,6 +446,11 @@ static void setup_gsettings(PagerData* pager) "changed::display-all-workspaces", G_CALLBACK (all_workspaces_changed), pager); + g_signal_connect (pager->settings, + "changed::wrap-workspaces", + G_CALLBACK (wrap_workspaces_changed), + pager); + } gboolean workspace_switcher_applet_fill(MatePanelApplet* applet) @@ -418,6 +459,7 @@ gboolean workspace_switcher_applet_fill(MatePanelApplet* applet) GtkActionGroup* action_group; gchar* ui_path; gboolean display_names; + gboolean wrap_workspaces; pager = g_new0(PagerData, 1); @@ -433,6 +475,8 @@ gboolean workspace_switcher_applet_fill(MatePanelApplet* applet) display_names = g_settings_get_boolean(pager->settings, "display-workspace-names"); + wrap_workspaces = g_settings_get_boolean(pager->settings, "wrap-workspaces"); + if (display_names) { pager->display_mode = MATEWNCK_PAGER_DISPLAY_NAME; @@ -537,8 +581,12 @@ static void display_about_dialog(GtkAction* action, PagerData* pager) NULL); } +static void wrap_workspaces_toggled(GtkToggleButton* button, PagerData* pager) +{ + g_settings_set_boolean(pager->settings, "wrap-workspaces", gtk_toggle_button_get_active(button)); +} -static void display_workspace_names_toggled(GtkToggleButton*button, PagerData* pager) +static void display_workspace_names_toggled(GtkToggleButton* button, PagerData* pager) { g_settings_set_boolean(pager->settings, "display-workspace-names", gtk_toggle_button_get_active(button)); } @@ -655,6 +703,7 @@ static void properties_dialog_destroyed(GtkWidget* widget, PagerData* pager) pager->workspace_names_label = NULL; pager->workspace_names_scroll = NULL; pager->display_workspaces_toggle = NULL; + pager->wrap_workspaces_toggle = NULL; pager->all_workspaces_radio = NULL; pager->current_only_radio = NULL; pager->num_rows_spin = NULL; @@ -751,6 +800,9 @@ static void setup_dialog(GtkBuilder* builder, PagerData* pager) pager->display_workspaces_toggle = WID("workspace_name_toggle"); setup_sensitivity(pager, builder, "workspace_name_toggle", NULL, NULL, pager->settings, "display-workspace-names" /* key */); + pager->wrap_workspaces_toggle = WID("workspace_wrap_toggle"); + setup_sensitivity(pager, builder, "workspace_wrap_toggle", NULL, NULL, pager->settings, "wrap-workspaces" /* key */); + pager->all_workspaces_radio = WID("all_workspaces_radio"); pager->current_only_radio = WID("current_only_radio"); setup_sensitivity(pager, builder, "all_workspaces_radio", "current_only_radio", "label_row_col", pager->settings, "display-all-workspaces" /* key */); @@ -768,6 +820,11 @@ static void setup_dialog(GtkBuilder* builder, PagerData* pager) g_object_unref (marco_general_settings); g_object_unref (marco_workspaces_settings); + + /* Wrap workspaces: */ + + g_signal_connect(G_OBJECT(pager->wrap_workspaces_toggle), "toggled", (GCallback) wrap_workspaces_toggled, pager); + /* Display workspace names: */ g_signal_connect(G_OBJECT(pager->display_workspaces_toggle), "toggled", (GCallback) display_workspace_names_toggled, pager); diff --git a/applets/wncklet/workspace-switcher.ui b/applets/wncklet/workspace-switcher.ui index 8de7fb34..00aae987 100644 --- a/applets/wncklet/workspace-switcher.ui +++ b/applets/wncklet/workspace-switcher.ui @@ -234,6 +234,21 @@ 3 + + + Allow workspace _wrap around in switcher + True + True + False + True + True + + + False + False + 4 + + -- cgit v1.2.1