diff -Naur xfwm4-4.4.2-orig/defaults/defaults xfwm4-4.4.2/defaults/defaults --- xfwm4-4.4.2-orig/defaults/defaults 2007-11-17 20:32:16.000000000 +0100 +++ xfwm4-4.4.2/defaults/defaults 2008-05-04 18:23:22.000000000 +0200 @@ -17,6 +17,7 @@ frame_opacity=100 full_width_title=true inactive_opacity=100 +invert_scroll_workspaces=false keytheme=Default maximized_offset=0 move_opacity=100 diff -Naur xfwm4-4.4.2-orig/mcs-plugin/wmtweaks_plugin.c xfwm4-4.4.2/mcs-plugin/wmtweaks_plugin.c --- xfwm4-4.4.2-orig/mcs-plugin/wmtweaks_plugin.c 2007-11-17 20:32:17.000000000 +0100 +++ xfwm4-4.4.2/mcs-plugin/wmtweaks_plugin.c 2008-05-05 00:13:05.000000000 +0200 @@ -66,6 +66,7 @@ static gboolean raise_with_any_button = FALSE; static gboolean restore_on_move = TRUE; static gboolean scroll_workspaces = TRUE; +static gboolean invert_scroll_workspaces = FALSE; static gboolean snap_resist = FALSE; static gboolean toggle_workspaces = FALSE; static gboolean unredirect_overlays = FALSE; @@ -317,6 +318,12 @@ } #endif +static void +cb_scroll_workspaces_changed (GtkWidget * widget, gpointer user_data) +{ + gtk_widget_set_sensitive (GTK_WIDGET (user_data), gtk_toggle_button_get_active GTK_TOGGLE_BUTTON (widget)); +} + static void cb_dialog_response (GtkWidget * dialog, gint response_id) { @@ -356,6 +362,8 @@ GtkWidget *range; GtkWidget *action_area; GtkWidget *button; + GtkWidget *check_button_scroll_workspaces; + GtkWidget *check_button_invert_scroll_workspaces; guint nth = 0; static const gchar *const modifier_list[] = { @@ -491,12 +499,21 @@ gtk_container_add (GTK_CONTAINER (notebook), vbox); gtk_widget_show (vbox); - check_button = + check_button_scroll_workspaces = create_gboolean_button (mcs_plugin, _("Switch workspaces using the mouse wheel over the desktop"), "Xfwm/ScrollWorkspaces", &scroll_workspaces); - gtk_box_pack_start (GTK_BOX (vbox), check_button, FALSE, TRUE, 0); - gtk_widget_show (check_button); + gtk_box_pack_start (GTK_BOX (vbox), check_button_scroll_workspaces, FALSE, TRUE, 0); + gtk_widget_show (check_button_scroll_workspaces); + + check_button_invert_scroll_workspaces = + create_gboolean_button (mcs_plugin, + _("Invert mouse wheel workspace switching direction"), "Xfwm/InvertScrollWorkspaces", + &invert_scroll_workspaces); + gtk_box_pack_start (GTK_BOX (vbox), check_button_invert_scroll_workspaces, FALSE, TRUE, 0); + gtk_widget_show (check_button_invert_scroll_workspaces); + gtk_widget_set_sensitive (check_button_invert_scroll_workspaces, gtk_toggle_button_get_active GTK_TOGGLE_BUTTON (check_button_scroll_workspaces)); + g_signal_connect (G_OBJECT (check_button_scroll_workspaces), "toggled", G_CALLBACK (cb_scroll_workspaces_changed), check_button_invert_scroll_workspaces); check_button = create_gboolean_button (mcs_plugin, @@ -751,6 +768,7 @@ init_gboolean_setting (mcs_plugin, "Xfwm/RestoreOnMove", &restore_on_move); init_gboolean_setting (mcs_plugin, "Xfwm/SnapResist", &snap_resist); init_gboolean_setting (mcs_plugin, "Xfwm/ScrollWorkspaces", &scroll_workspaces); + init_gboolean_setting (mcs_plugin, "Xfwm/InvertScrollWorkspaces", &invert_scroll_workspaces); init_gboolean_setting (mcs_plugin, "Xfwm/ToggleWorkspaces", &toggle_workspaces); init_gboolean_setting (mcs_plugin, "Xfwm/UnredirectOverlays", &unredirect_overlays); init_gboolean_setting (mcs_plugin, "Xfwm/UseCompositing", &use_compositing); diff -Naur xfwm4-4.4.2-orig/src/events.c xfwm4-4.4.2/src/events.c --- xfwm4-4.4.2-orig/src/events.c 2007-11-17 20:32:13.000000000 +0100 +++ xfwm4-4.4.2/src/events.c 2008-05-04 20:14:44.000000000 +0200 @@ -860,11 +860,11 @@ if (ev->button == Button4) { - workspaceSwitch (screen_info, screen_info->current_ws - 1, NULL, TRUE, ev->time); + workspaceSwitch (screen_info, screen_info->current_ws - (screen_info->params->invert_scroll_workspaces ? -1 : 1), NULL, TRUE, ev->time); } else if (ev->button == Button5) { - workspaceSwitch (screen_info, screen_info->current_ws + 1, NULL, TRUE, ev->time); + workspaceSwitch (screen_info, screen_info->current_ws + (screen_info->params->invert_scroll_workspaces ? -1 : 1), NULL, TRUE, ev->time); } } diff -Naur xfwm4-4.4.2-orig/src/settings.c xfwm4-4.4.2/src/settings.c --- xfwm4-4.4.2-orig/src/settings.c 2007-11-17 20:32:13.000000000 +0100 +++ xfwm4-4.4.2/src/settings.c 2008-05-04 18:29:52.000000000 +0200 @@ -456,6 +456,10 @@ { screen_info->params->scroll_workspaces = setting->data.v_int; } + else if (!strcmp (name, "Xfwm/InvertScrollWorkspaces")) + { + screen_info->params->invert_scroll_workspaces = setting->data.v_int; + } else if (!strcmp (name, "Xfwm/ToggleWorkspaces")) { screen_info->params->toggle_workspaces = setting->data.v_int; @@ -858,6 +862,12 @@ setBooleanValueFromInt ("scroll_workspaces", setting->data.v_int, rc); mcs_setting_free (setting); } + if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/InvertScrollWorkspaces", CHANNEL5, + &setting) == MCS_SUCCESS) + { + setBooleanValueFromInt ("invert_scroll_workspaces", setting->data.v_int, rc); + mcs_setting_free (setting); + } if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ToggleWorkspaces", CHANNEL5, &setting) == MCS_SUCCESS) { @@ -1329,6 +1339,7 @@ {"frame_opacity", NULL, TRUE}, {"full_width_title", NULL, TRUE}, {"inactive_opacity", NULL, TRUE}, + {"invert_scroll_workspaces", NULL, FALSE}, {"keytheme", NULL, TRUE}, {"margin_bottom", NULL, FALSE}, {"margin_left", NULL, FALSE}, @@ -1563,6 +1574,8 @@ !g_ascii_strcasecmp ("true", getValue ("wrap_cycle", rc)); screen_info->params->scroll_workspaces = !g_ascii_strcasecmp ("true", getValue ("scroll_workspaces", rc)); + screen_info->params->invert_scroll_workspaces = + !g_ascii_strcasecmp ("true", getValue ("invert_scroll_workspaces", rc)); screen_info->params->wrap_resistance = abs (TOINT (getValue ("wrap_resistance", rc))); diff -Naur xfwm4-4.4.2-orig/src/settings.h xfwm4-4.4.2/src/settings.h --- xfwm4-4.4.2-orig/src/settings.h 2007-11-17 20:32:13.000000000 +0100 +++ xfwm4-4.4.2/src/settings.h 2008-05-04 18:28:09.000000000 +0200 @@ -211,6 +211,7 @@ gboolean focus_hint; gboolean focus_new; gboolean full_width_title; + gboolean invert_scroll_workspaces; gboolean prevent_focus_stealing; gboolean raise_on_click; gboolean raise_on_focus;