diff -Naur xfce4-panel-4.5.91-orig/plugins/pager/pager.c xfce4-panel-4.5.91/plugins/pager/pager.c --- xfce4-panel-4.5.91-orig/plugins/pager/pager.c 2008-09-06 12:10:15.000000000 +0200 +++ xfce4-panel-4.5.91/plugins/pager/pager.c 2008-11-02 00:55:00.000000000 +0100 @@ -48,6 +48,7 @@ gint rows; guint scrolling : 1; + guint invert_scrolling : 1; guint show_names : 1; } Pager; @@ -132,6 +133,7 @@ XfceRc *rc; int rows = 1; gboolean scrolling = TRUE; + gboolean invert_scrolling = FALSE; gboolean show_names = FALSE; if ((file = xfce_panel_plugin_lookup_rc_file (plugin)) != NULL) @@ -143,12 +145,14 @@ { rows = xfce_rc_read_int_entry (rc, "rows", 1); scrolling = xfce_rc_read_bool_entry (rc, "scrolling", TRUE); + invert_scrolling = xfce_rc_read_bool_entry (rc, "invert_scrolling", FALSE); show_names = xfce_rc_read_bool_entry (rc, "show-names", FALSE); } } pager->rows = rows; pager->scrolling = scrolling; + pager->invert_scrolling = invert_scrolling; pager->show_names = show_names; } @@ -171,6 +175,8 @@ xfce_rc_write_bool_entry (rc, "scrolling", pager->scrolling); + xfce_rc_write_bool_entry (rc, "invert_scrolling", pager->invert_scrolling); + xfce_rc_write_bool_entry (rc, "show-names", pager->show_names); xfce_rc_close (rc); @@ -273,6 +279,7 @@ xfce_panel_plugin_get_orientation (plugin)); wnck_pager_set_n_rows (WNCK_PAGER (pager->pager), pager->rows); xfce_pager_set_workspace_scrolling (XFCE_PAGER (pager->pager), pager->scrolling); + xfce_pager_set_workspace_invert_scrolling (XFCE_PAGER (pager->pager), pager->invert_scrolling); gtk_widget_show (pager->pager); gtk_container_add (GTK_CONTAINER (plugin), pager->pager); @@ -331,6 +338,25 @@ } static void +enable_workspace_invert_scrolling (GtkWidget *widget, GtkWidget *invert) +{ + gtk_widget_set_sensitive (GTK_WIDGET (invert), gtk_toggle_button_get_active GTK_TOGGLE_BUTTON (widget)); +} + +static void +workspace_invert_scrolling_toggled (GtkWidget *button, Pager *pager) +{ + gboolean invert_scrolling = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)); + + if (pager->invert_scrolling != invert_scrolling) + { + pager->invert_scrolling = invert_scrolling; + + xfce_pager_set_workspace_invert_scrolling (XFCE_PAGER (pager->pager), invert_scrolling); + } +} + +static void workspace_show_names_toggled (GtkWidget *button, Pager *pager) { gboolean show_names = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)); @@ -357,7 +383,7 @@ static void pager_properties_dialog (XfcePanelPlugin *plugin, Pager *pager) { - GtkWidget *dlg, *vbox, *hbox, *label, *spin, *scrolling, *show_names; + GtkWidget *dlg, *vbox, *hbox, *label, *spin, *scrolling, *invert_scrolling, *show_names; gint max; xfce_panel_plugin_block_menu (plugin); @@ -431,6 +457,19 @@ g_signal_connect (scrolling, "toggled", G_CALLBACK (workspace_scrolling_toggled), pager); + invert_scrolling = gtk_check_button_new_with_mnemonic (_("Invert mouse wheel workspace switching direction")); + gtk_widget_show (invert_scrolling); + gtk_box_pack_start (GTK_BOX (vbox), invert_scrolling, FALSE, FALSE, 0); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (invert_scrolling), pager->invert_scrolling); + + gtk_widget_set_sensitive (GTK_WIDGET (invert_scrolling), + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scrolling))); + + g_signal_connect (invert_scrolling, "toggled", + G_CALLBACK (workspace_invert_scrolling_toggled), pager); + g_signal_connect (scrolling, "toggled", + G_CALLBACK (enable_workspace_invert_scrolling), invert_scrolling); + show_names = gtk_check_button_new_with_mnemonic (_("Show workspace names")); gtk_widget_show (show_names); gtk_box_pack_start (GTK_BOX (vbox), show_names, FALSE, FALSE, 0); diff -Naur xfce4-panel-4.5.91-orig/plugins/pager/xfce-pager.c xfce4-panel-4.5.91/plugins/pager/xfce-pager.c --- xfce4-panel-4.5.91-orig/plugins/pager/xfce-pager.c 2008-09-06 12:10:15.000000000 +0200 +++ xfce4-panel-4.5.91/plugins/pager/xfce-pager.c 2008-11-02 15:33:38.000000000 +0100 @@ -35,6 +35,7 @@ { WnckScreen *screen; guint workspace_scrolling : 1; + guint workspace_invert_scrolling : 1; }; @@ -118,6 +119,15 @@ +void +xfce_pager_set_workspace_invert_scrolling (XfcePager *pager, + gboolean invert_scrolling) +{ + pager->priv->workspace_invert_scrolling = invert_scrolling; +} + + + static gboolean xfce_pager_scroll_event (GtkWidget *widget, GdkEventScroll *event) @@ -137,38 +147,119 @@ screen = xfce_pager_get_screen (pager); n = wnck_screen_get_workspace_count (screen); - active = wnck_workspace_get_number (wnck_screen_get_active_workspace(screen)); - switch (event->direction) - { - case GDK_SCROLL_UP: - case GDK_SCROLL_LEFT: - if (active > 0) - { - ws = wnck_screen_get_workspace (screen, active - 1); - } - else - { - ws = wnck_screen_get_workspace (screen, n - 1); - } - wnck_workspace_activate (ws, 0); - break; - - case GDK_SCROLL_DOWN: - case GDK_SCROLL_RIGHT: - if (active < n - 1) - { - ws = wnck_screen_get_workspace (screen, active + 1); - } - else + if (n == 1) { + /* If only one workspace exists, try moving the viewport (compiz) */ + int viewport_x; + int viewport_y; + + if (ws = wnck_screen_get_active_workspace (screen)) + { + int screen_width, screen_height; + int workspace_width, workspace_height; + int scroll_direction; + + /* Total workspacesize, e.g. 5120x1024 (5120=4x1280) */ + workspace_width = wnck_workspace_get_width (ws); + workspace_height = wnck_workspace_get_height (ws); + /* Current screensize, e.g. 1280x1024 */ + screen_width = wnck_screen_get_width (screen); + screen_height = wnck_screen_get_height (screen); + /* Current viewportcoordinates, e.g. 0,0 or 1280,0 */ + viewport_x = wnck_workspace_get_viewport_x (ws); + viewport_y = wnck_workspace_get_viewport_y (ws); + + switch (event->direction) { - ws = wnck_screen_get_workspace (screen, 0); - } - wnck_workspace_activate (ws, 0); - break; - - default: - break; + case GDK_SCROLL_UP: + case GDK_SCROLL_LEFT: + scroll_direction = (pager->priv->workspace_invert_scrolling + ? 1 : -1); + break; + case GDK_SCROLL_DOWN: + case GDK_SCROLL_RIGHT: + scroll_direction = (pager->priv->workspace_invert_scrolling + ? -1 : 1); + break; + default: + break; + } + /* Viewportscroll is only in x-direction */ + viewport_x = viewport_x + (scroll_direction * screen_width); + + /* Wrap if needed */ + if (viewport_x > workspace_width) + viewport_x = 0; + if (viewport_x < 0) + viewport_x = workspace_width - screen_width; + + wnck_screen_move_viewport (pager->priv->screen, + viewport_x, viewport_y); + + } + + } + else + { + active = wnck_workspace_get_number (wnck_screen_get_active_workspace(screen)); + switch (event->direction) + { + case GDK_SCROLL_UP: + case GDK_SCROLL_LEFT: + if (!pager->priv->workspace_invert_scrolling) + { + if (active > 0) + { + ws = wnck_screen_get_workspace (screen, active - 1); + } + else + { + ws = wnck_screen_get_workspace (screen, n - 1); + } + } + else + { + if (active < n - 1) + { + ws = wnck_screen_get_workspace (screen, active + 1); + } + else + { + ws = wnck_screen_get_workspace (screen, 0); + } + } + wnck_workspace_activate (ws, 0); + break; + case GDK_SCROLL_DOWN: + case GDK_SCROLL_RIGHT: + if (!pager->priv->workspace_invert_scrolling) + { + if (active < n - 1) + { + ws = wnck_screen_get_workspace (screen, active + 1); + } + else + { + ws = wnck_screen_get_workspace (screen, 0); + } + } + else + { + if (active > 0) + { + ws = wnck_screen_get_workspace (screen, active - 1); + } + else + { + ws = wnck_screen_get_workspace (screen, n - 1); + } + } + wnck_workspace_activate (ws, 0); + break; + default: + break; + } + } return TRUE; diff -Naur xfce4-panel-4.5.91-orig/plugins/pager/xfce-pager.h xfce4-panel-4.5.91/plugins/pager/xfce-pager.h --- xfce4-panel-4.5.91-orig/plugins/pager/xfce-pager.h 2008-09-06 12:10:15.000000000 +0200 +++ xfce4-panel-4.5.91/plugins/pager/xfce-pager.h 2008-11-02 00:55:00.000000000 +0100 @@ -48,4 +48,7 @@ void xfce_pager_set_workspace_scrolling (XfcePager *pager, gboolean scrolling); +void xfce_pager_set_workspace_invert_scrolling (XfcePager *pager, + gboolean invert_scrolling); + #endif /* __XFCE_PAGER_H__ */