From 0b3f7f7bb8a22d7043ba3b80e0fd3197beb8b737 Mon Sep 17 00:00:00 2001 From: djvs Date: Wed, 29 Mar 2023 10:20:06 -0400 Subject: [PATCH 1/2] scroll-multiplier option --- config/config.c | 2 ++ include/settings.h | 2 ++ source/widgets/listview.c | 34 +++++++++++++++++++++++----------- source/xrmoptions.c | 6 ++++++ 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/config/config.c b/config/config.c index 05dd91be9..be93bdbba 100644 --- a/config/config.c +++ b/config/config.c @@ -123,6 +123,8 @@ Settings config = { .window_match_fields = "all", /** Monitor */ .monitor = "-5", + /** Multiply scrolling amount **/ + .scroll_multiplier = 1, /** Set filter */ .filter = NULL, .dpi = -1, diff --git a/include/settings.h b/include/settings.h index 7a15112c6..852a30456 100644 --- a/include/settings.h +++ b/include/settings.h @@ -95,6 +95,8 @@ typedef struct { /** Toggle to enable sorting. */ unsigned int sort; /** Sorting method. */ + unsigned int scroll_multiplier; + /** Sorting method. */ SortingMethod sorting_method_enum; /** Sorting method. */ char *sorting_method; diff --git a/source/widgets/listview.c b/source/widgets/listview.c index 09a8e5425..600b9a741 100644 --- a/source/widgets/listview.c +++ b/source/widgets/listview.c @@ -819,13 +819,19 @@ static void listview_nav_up_int(listview *lv) { if (lv == NULL) { return; } - if (lv->req_elements == 0 || (lv->selected == 0 && !lv->cycle)) { - return; + unsigned int mult = 1; + if (config.scroll_multiplier){ + mult = config.scroll_multiplier; } - if (lv->selected == 0) { - lv->selected = lv->req_elements; + for (unsigned int i=0; i < mult; i++) { + if (lv->req_elements == 0 || (lv->selected == 0 && !lv->cycle)) { + return; + } + if (lv->selected == 0) { + lv->selected = lv->req_elements; + } + lv->selected--; } - lv->selected--; lv->barview.direction = RIGHT_TO_LEFT; if (lv->sc_callback) { @@ -837,13 +843,19 @@ static void listview_nav_down_int(listview *lv) { if (lv == NULL) { return; } - if (lv->req_elements == 0 || - (lv->selected == (lv->req_elements - 1) && !lv->cycle)) { - return; + unsigned int mult = 1; + if (config.scroll_multiplier){ + mult = config.scroll_multiplier; + } + for (unsigned int i=0; i < mult; i++) { + if (lv->req_elements == 0 || + (lv->selected == (lv->req_elements - 1) && !lv->cycle)) { + return; + } + lv->selected = lv->selected < lv->req_elements - 1 + ? MIN(lv->req_elements - 1, lv->selected + 1) + : 0; } - lv->selected = lv->selected < lv->req_elements - 1 - ? MIN(lv->req_elements - 1, lv->selected + 1) - : 0; lv->barview.direction = LEFT_TO_RIGHT; if (lv->sc_callback) { lv->sc_callback(lv, lv->selected, lv->sc_udata); diff --git a/source/xrmoptions.c b/source/xrmoptions.c index 34d2fff51..c7d5588e0 100644 --- a/source/xrmoptions.c +++ b/source/xrmoptions.c @@ -333,6 +333,12 @@ static XrmOption xrmOptions[] = { NULL, "Threads to use for string matching", CONFIG_DEFAULT}, + {xrm_Number, + "scroll-multiplier", + {.num = &config.scroll_multiplier}, + NULL, + "Scrolling multiplier (how many times as many lines to scroll)", + CONFIG_DEFAULT}, {xrm_Number, "scroll-method", {.num = &config.scroll_method}, From a382dd03c19c1656a43cb015ecd65e36b73dc9a7 Mon Sep 17 00:00:00 2001 From: djvs Date: Wed, 29 Mar 2023 17:10:06 -0400 Subject: [PATCH 2/2] fix --- include/widgets/listview.h | 21 +++++++++++-- source/widgets/listview.c | 63 +++++++++++++++++++++++++++++++++----- 2 files changed, 74 insertions(+), 10 deletions(-) diff --git a/include/widgets/listview.h b/include/widgets/listview.h index 292118383..09b39e91a 100644 --- a/include/widgets/listview.h +++ b/include/widgets/listview.h @@ -129,6 +129,21 @@ void listview_set_selected(listview *lv, unsigned int selected); */ unsigned int listview_get_selected(listview *lv); + +/** + * @param lv The listview handle + * + * Move the selection one row up. + * - Wrap around. + */ +void listview_scroll_prev(listview *lv); +/** + * @param lv listview handle. + * + * Alternate, potentially multi-row alternative to listview_nav_up + * - Wrap around. + */ +void listview_scroll_next(listview *lv); /** * @param lv The listview handle * @@ -143,12 +158,12 @@ void listview_nav_next(listview *lv); * - Wrap around. */ void listview_nav_prev(listview *lv); - /** * @param lv The listview handle * - * Move the selection one row up. - * - Wrap around. + * Alternate, potentially multi-row alternative to listview_nav_down + * - No wrap around. + * - Do not move to top row when at start. */ void listview_nav_up(listview *lv); /** diff --git a/source/widgets/listview.c b/source/widgets/listview.c index 600b9a741..2af74161c 100644 --- a/source/widgets/listview.c +++ b/source/widgets/listview.c @@ -693,10 +693,10 @@ listview_trigger_action(widget *wid, MouseBindingListviewAction action, listview_nav_right(lv); break; case SCROLL_DOWN: - listview_nav_down(lv); + listview_scroll_next(lv); break; case SCROLL_UP: - listview_nav_up(lv); + listview_scroll_prev(lv); break; } return WIDGET_TRIGGER_ACTION_RESULT_HANDLED; @@ -816,6 +816,55 @@ listview *listview_create(widget *parent, const char *name, */ static void listview_nav_up_int(listview *lv) { + if (lv == NULL) { + return; + } + if (lv->req_elements == 0 || (lv->selected == 0 && !lv->cycle)) { + return; + } + if (lv->selected == 0) { + lv->selected = lv->req_elements; + } + lv->selected--; + lv->barview.direction = RIGHT_TO_LEFT; + + if (lv->sc_callback) { + lv->sc_callback(lv, lv->selected, lv->sc_udata); + } + widget_queue_redraw(WIDGET(lv)); +} +static void listview_nav_down_int(listview *lv) { + if (lv == NULL) { + return; + } + if (lv->req_elements == 0 || + (lv->selected == (lv->req_elements - 1) && !lv->cycle)) { + return; + } + lv->selected = lv->selected < lv->req_elements - 1 + ? MIN(lv->req_elements - 1, lv->selected + 1) + : 0; + lv->barview.direction = LEFT_TO_RIGHT; + if (lv->sc_callback) { + lv->sc_callback(lv, lv->selected, lv->sc_udata); + } + widget_queue_redraw(WIDGET(lv)); +} +void listview_nav_next(listview *lv) { + if (lv == NULL) { + return; + } + listview_nav_down_int(lv); +} +void listview_nav_prev(listview *lv) { + if (lv == NULL) { + return; + } + listview_nav_up_int(lv); +} + + +static void listview_scroll_up_int(listview *lv) { if (lv == NULL) { return; } @@ -839,7 +888,7 @@ static void listview_nav_up_int(listview *lv) { } widget_queue_redraw(WIDGET(lv)); } -static void listview_nav_down_int(listview *lv) { +static void listview_scroll_down_int(listview *lv) { if (lv == NULL) { return; } @@ -862,17 +911,17 @@ static void listview_nav_down_int(listview *lv) { } widget_queue_redraw(WIDGET(lv)); } -void listview_nav_next(listview *lv) { +void listview_scroll_next(listview *lv) { if (lv == NULL) { return; } - listview_nav_down_int(lv); + listview_scroll_down_int(lv); } -void listview_nav_prev(listview *lv) { +void listview_scroll_prev(listview *lv) { if (lv == NULL) { return; } - listview_nav_up_int(lv); + listview_scroll_up_int(lv); } static void listview_nav_column_left_int(listview *lv) {