summaryrefslogtreecommitdiff
path: root/applets/wncklet/workspace-switcher.c
diff options
context:
space:
mode:
Diffstat (limited to 'applets/wncklet/workspace-switcher.c')
-rw-r--r--applets/wncklet/workspace-switcher.c98
1 files changed, 88 insertions, 10 deletions
diff --git a/applets/wncklet/workspace-switcher.c b/applets/wncklet/workspace-switcher.c
index 4d24663f..cda52708 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;
@@ -192,17 +194,34 @@ static void applet_change_orient(MatePanelApplet* applet, MatePanelAppletOrient
static void applet_change_background(MatePanelApplet* applet, MatePanelAppletBackgroundType type, GdkColor* color, GdkPixmap* pixmap, PagerData* pager)
{
+ /* taken from the TrashApplet */
+ GtkRcStyle *rc_style;
+ GtkStyle *style;
+
+ /* reset style */
+ gtk_widget_set_style (GTK_WIDGET (pager->pager), NULL);
+ rc_style = gtk_rc_style_new ();
+ gtk_widget_modify_style (GTK_WIDGET (pager->pager), rc_style);
+ g_object_unref (rc_style);
+
switch (type)
{
- case PANEL_NO_BACKGROUND:
- matewnck_pager_set_shadow_type(MATEWNCK_PAGER(pager->pager), GTK_SHADOW_IN);
- break;
- case PANEL_COLOR_BACKGROUND:
- matewnck_pager_set_shadow_type(MATEWNCK_PAGER(pager->pager), GTK_SHADOW_NONE);
- break;
- case PANEL_PIXMAP_BACKGROUND:
- matewnck_pager_set_shadow_type(MATEWNCK_PAGER(pager->pager), GTK_SHADOW_NONE);
- break;
+ case PANEL_COLOR_BACKGROUND:
+ gtk_widget_modify_bg (GTK_WIDGET (pager->pager), GTK_STATE_NORMAL, color);
+ break;
+
+ case PANEL_PIXMAP_BACKGROUND:
+ style = gtk_style_copy (gtk_widget_get_style (GTK_WIDGET (pager->pager)));
+ if (style->bg_pixmap[GTK_STATE_NORMAL])
+ g_object_unref (style->bg_pixmap[GTK_STATE_NORMAL]);
+ style->bg_pixmap[GTK_STATE_NORMAL] = g_object_ref(pixmap);
+ gtk_widget_set_style (GTK_WIDGET (pager->pager), style);
+ g_object_unref (style);
+ break;
+
+ case PANEL_NO_BACKGROUND:
+ default:
+ break;
}
}
@@ -251,6 +270,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 +282,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 +300,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 +311,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 +433,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 +463,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)
@@ -433,6 +491,8 @@ gboolean workspace_switcher_applet_fill(MatePanelApplet* applet)
display_names = g_settings_get_boolean(pager->settings, "display-workspace-names");
+ pager->wrap_workspaces = g_settings_get_boolean(pager->settings, "wrap-workspaces");
+
if (display_names)
{
pager->display_mode = MATEWNCK_PAGER_DISPLAY_NAME;
@@ -537,8 +597,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 +719,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 +816,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 +836,16 @@ static void setup_dialog(GtkBuilder* builder, PagerData* pager)
g_object_unref (marco_general_settings);
g_object_unref (marco_workspaces_settings);
+
+ /* Wrap workspaces: */
+ if (pager->wrap_workspaces_toggle)
+ {
+ /* make sure the toggle button resembles the value of wrap_workspaces */
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pager->wrap_workspaces_toggle), pager->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);