From b7bacc30da3091fb78a6aba4e9bcdd2be19ef598 Mon Sep 17 00:00:00 2001 From: Simon Steinbeiss Date: Sun, 18 Aug 2019 18:00:58 +0200 Subject: pager: Add wnck_pager_set_scroll_mode There are two scroll modes: the default 2d scroll mode is essentially only useful for touchpads, because mice cannot scroll horizontally, so scrolling up/down to get to the next workspace will get users confused. By setting the scroll_mode to 1 users get a simple way of scrolling through workspaces, irrespective of the number of rows the pager sets. https://gitlab.gnome.org/GNOME/libwnck/issues/134 Fixes: #134 --- doc/libwnck-sections.txt | 2 + libwnck/pager.c | 180 ++++++++++++++++++++++++++++++----------------- libwnck/pager.h | 18 +++++ libwnck/test-pager.c | 12 +++- 4 files changed, 147 insertions(+), 65 deletions(-) diff --git a/doc/libwnck-sections.txt b/doc/libwnck-sections.txt index a4de2f6..6fb1139 100644 --- a/doc/libwnck-sections.txt +++ b/doc/libwnck-sections.txt @@ -244,6 +244,8 @@ wnck_pager_set_orientation wnck_pager_set_n_rows WnckPagerDisplayMode wnck_pager_set_display_mode +WnckPagerScrollMode +wnck_pager_set_scroll_mode wnck_pager_set_show_all wnck_pager_set_shadow_type diff --git a/libwnck/pager.c b/libwnck/pager.c index a0921ae..f75bdd8 100644 --- a/libwnck/pager.c +++ b/libwnck/pager.c @@ -65,6 +65,7 @@ struct _WnckPagerPrivate int n_rows; /* really columns for vertical orientation */ WnckPagerDisplayMode display_mode; + WnckPagerScrollMode scroll_mode; gboolean show_all_workspaces; GtkShadowType shadow_type; gboolean wrap_on_scroll; @@ -212,6 +213,7 @@ wnck_pager_init (WnckPager *pager) pager->priv->n_rows = 1; pager->priv->display_mode = WNCK_PAGER_DISPLAY_CONTENT; + pager->priv->scroll_mode = WNCK_PAGER_SCROLL_2D; pager->priv->show_all_workspaces = TRUE; pager->priv->shadow_type = GTK_SHADOW_NONE; pager->priv->wrap_on_scroll = FALSE; @@ -2078,73 +2080,103 @@ wnck_pager_scroll_event (GtkWidget *widget, } } - switch (absolute_direction) + if (pager->priv->scroll_mode == WNCK_PAGER_SCROLL_2D) { - case GDK_SCROLL_DOWN: - if (index + n_columns < n_workspaces) - { - index += n_columns; - } - else if (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; - } - break; - - case GDK_SCROLL_RIGHT: - if (index < n_workspaces - 1) - { - index++; - } - else if (wrap_workspaces) - { - index = 0; - } - break; - - case GDK_SCROLL_UP: - if (index - n_columns >= 0) - { - index -= n_columns; - } - else if (index > 0) - { - index = ((pager->priv->n_rows - 1) * n_columns) + (index % n_columns) - 1; - } - else if (wrap_workspaces) - { - index = n_workspaces - 1; - } - - if (index >= n_workspaces) - { - index -= n_columns; - } - break; - - case GDK_SCROLL_LEFT: - if (index > 0) - { - index--; - } - else if (wrap_workspaces) + switch (absolute_direction) + { + case GDK_SCROLL_DOWN: + if (index + n_columns < n_workspaces) + { + index += n_columns; + } + else if (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; + } + break; + case GDK_SCROLL_RIGHT: + if (index < n_workspaces - 1) + { + index++; + } + else if (wrap_workspaces) + { + index = 0; + } + break; + case GDK_SCROLL_UP: + if (index - n_columns >= 0) + { + index -= n_columns; + } + else if (index > 0) + { + index = ((pager->priv->n_rows - 1) * n_columns) + (index % n_columns) - 1; + } + else if (wrap_workspaces) + { + index = n_workspaces - 1; + } + if (index >= n_workspaces) + { + index -= n_columns; + } + break; + case GDK_SCROLL_LEFT: + if (index > 0) + { + index--; + } + else if (wrap_workspaces) + { + index = n_workspaces - 1; + } + break; + case GDK_SCROLL_SMOOTH: + default: + g_assert_not_reached (); + break; + } + } + else + { + switch (absolute_direction) { - index = n_workspaces - 1; + case GDK_SCROLL_UP: + case GDK_SCROLL_LEFT: + if (index > 0) + { + index--; + } + else if (wrap_workspaces) + { + index = n_workspaces - 1; + } + break; + case GDK_SCROLL_DOWN: + case GDK_SCROLL_RIGHT: + if (index < n_workspaces - 1) + { + index++; + } + else if (wrap_workspaces) + { + index = 0; + } + break; + case GDK_SCROLL_SMOOTH: + default: + g_assert_not_reached (); + break; } - break; - - case GDK_SCROLL_SMOOTH: - default: - g_assert_not_reached (); - break; - } + } space = wnck_screen_get_workspace (pager->priv->screen, index); wnck_workspace_activate (space, event->time); @@ -2396,6 +2428,26 @@ wnck_pager_set_display_mode (WnckPager *pager, gtk_widget_queue_resize (GTK_WIDGET (pager)); } +/** + * wnck_pager_set_scroll_mode: + * @pager: a #WnckPager. + * @scroll_mode: a scroll mode. + * + * Sets @pager to react to input device scrolling in one of the + * available scroll modes. + */ +void +wnck_pager_set_scroll_mode (WnckPager *pager, + WnckPagerScrollMode scroll_mode) +{ + g_return_if_fail (WNCK_IS_PAGER (pager)); + + if (pager->priv->scroll_mode == scroll_mode) + return; + + pager->priv->scroll_mode = scroll_mode; +} + /** * wnck_pager_set_show_all: * @pager: a #WnckPager. diff --git a/libwnck/pager.h b/libwnck/pager.h index 5a43d05..aaa667c 100644 --- a/libwnck/pager.h +++ b/libwnck/pager.h @@ -80,6 +80,22 @@ typedef enum { WNCK_PAGER_DISPLAY_CONTENT } WnckPagerDisplayMode; +/** + * WnckPagerScrollMode: + * @WNCK_PAGER_SCROLL_2D: given that the workspaces are set up in multiple rows, + * scrolling on the #WnckPager will cycle through the workspaces as if on a + * 2-dimensional map. Example cycling order with 2 rows and 4 workspaces: 1 3 2 4. + * @WNCK_PAGER_SCROLL_1D: the #WnckPager will always cycle workspaces in a linear + * manner, irrespective of how many rows are configured. (Hint: Better for mice) + * Example cycling order with 2 rows and 4 workspaces: 1 2 3 4. + * + * Mode defining in which order scrolling on a #WnckPager will cycle through workspaces. + */ +typedef enum { + WNCK_PAGER_SCROLL_2D, + WNCK_PAGER_SCROLL_1D +} WnckPagerScrollMode; + GType wnck_pager_get_type (void) G_GNUC_CONST; GtkWidget* wnck_pager_new (void); @@ -90,6 +106,8 @@ gboolean wnck_pager_set_n_rows (WnckPager *pager, int n_rows); void wnck_pager_set_display_mode (WnckPager *pager, WnckPagerDisplayMode mode); +void wnck_pager_set_scroll_mode (WnckPager *pager, + WnckPagerScrollMode scroll_mode); void wnck_pager_set_show_all (WnckPager *pager, gboolean show_all_workspaces); void wnck_pager_set_shadow_type (WnckPager *pager, diff --git a/libwnck/test-pager.c b/libwnck/test-pager.c index 316b13a..d60b047 100644 --- a/libwnck/test-pager.c +++ b/libwnck/test-pager.c @@ -7,6 +7,7 @@ static int n_rows = 1; static gboolean only_current = FALSE; static gboolean rtl = FALSE; static gboolean show_name = FALSE; +static gboolean simple_scrolling = FALSE; static gboolean vertical = FALSE; static gboolean wrap_on_scroll = FALSE; @@ -15,6 +16,7 @@ static GOptionEntry entries[] = { {"only-current", 'c', 0, G_OPTION_ARG_NONE, &only_current, "Only show current workspace", NULL}, {"rtl", 'r', 0, G_OPTION_ARG_NONE, &rtl, "Use RTL as default direction", NULL}, {"show-name", 's', 0, G_OPTION_ARG_NONE, &show_name, "Show workspace names instead of workspace contents", NULL}, + {"simple-scrolling", 'd', 0, G_OPTION_ARG_NONE, &simple_scrolling, "Use the simple 1d scroll mode", NULL}, {"vertical-orientation", 'v', 0, G_OPTION_ARG_NONE, &vertical, "Use a vertical orientation", NULL}, {"wrap-on-scroll", 'w', 0, G_OPTION_ARG_NONE, &wrap_on_scroll, "Wrap on scrolling over borders", NULL}, {NULL } @@ -24,6 +26,7 @@ static void create_pager_window (GtkOrientation orientation, gboolean show_all, WnckPagerDisplayMode mode, + WnckPagerScrollMode scroll_mode, int rows, gboolean wrap) { @@ -51,6 +54,7 @@ create_pager_window (GtkOrientation orientation, wnck_pager_set_show_all (WNCK_PAGER (pager), show_all); wnck_pager_set_display_mode (WNCK_PAGER (pager), mode); + wnck_pager_set_scroll_mode (WNCK_PAGER (pager), scroll_mode); wnck_pager_set_orientation (WNCK_PAGER (pager), orientation); wnck_pager_set_n_rows (WNCK_PAGER (pager), rows); wnck_pager_set_shadow_type (WNCK_PAGER (pager), GTK_SHADOW_IN); @@ -67,6 +71,7 @@ main (int argc, char **argv) GOptionContext *ctxt; GtkOrientation orientation; WnckPagerDisplayMode mode; + WnckPagerScrollMode scroll_mode; WnckScreen *screen; ctxt = g_option_context_new (""); @@ -96,7 +101,12 @@ main (int argc, char **argv) else mode = WNCK_PAGER_DISPLAY_CONTENT; - create_pager_window (orientation, !only_current, mode, n_rows, wrap_on_scroll); + if (simple_scrolling) + scroll_mode = WNCK_PAGER_SCROLL_1D; + else + scroll_mode = WNCK_PAGER_SCROLL_2D; + + create_pager_window (orientation, !only_current, mode, scroll_mode, n_rows, wrap_on_scroll); gtk_main (); -- cgit v1.2.1