input: apply scrollback.multplier in alterate scroll mode

Before this patch, foot only applied [scrollback].multiplier on the
normal screen, never the alt screen.

However, scrolling can be done in two ways on the alt screen:

If the application has enabled mouse support, we simply pass on the
mouse scroll events to the application. Here, it makes sense to not
apply the multiplier, and instead let the application choose how much
to scroll for each scroll event.

But, if the application has not enabled mouse support, we can still
scroll by simulating the arrow keys being pressed - alternate
scrolling (private mode 1007).

This is enabled by default in foot (but can be disabled in foot.ini
with the [mouse].alternate-scroll-mode setting).

In this mode, it makes more sense to apply the multiplier. And that’s
what this patch changes - the multiplier is now applied, on the alt
screen, when the application has not enabled mouse support, and
alternate scrolling has been enabled in foot.

Closes #859
This commit is contained in:
Daniel Eklöf 2021-12-24 15:22:14 +01:00
parent a835436537
commit c9086e6d4f
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 10 additions and 4 deletions

View file

@ -51,6 +51,9 @@
* PaperColorDark and PaperColorLight themes renamed to * PaperColorDark and PaperColorLight themes renamed to
paper-color-dark and paper-color-light, for consistency with other paper-color-dark and paper-color-light, for consistency with other
theme names. theme names.
* `[scrollback].multiplier` is now applied in “alternate scroll” mode,
where scroll events are translated to fake arrow key presses on the
alt screen (https://codeberg.org/dnkl/foot/issues/859).
### Deprecated ### Deprecated

11
input.c
View file

@ -2576,9 +2576,10 @@ mouse_scroll(struct seat *seat, int amount, enum wl_pointer_axis axis)
} }
static float static float
mouse_scroll_multiplier(const struct terminal *term) mouse_scroll_multiplier(const struct terminal *term, const struct seat *seat)
{ {
return term->grid == &term->normal return (term->grid == &term->normal ||
(term_mouse_grabbed(term, seat) && term->alt_scrolling))
? term->conf->scrollback.multiplier ? term->conf->scrollback.multiplier
: 1.0; : 1.0;
} }
@ -2595,6 +2596,8 @@ wl_pointer_axis(void *data, struct wl_pointer *wl_pointer,
xassert(seat->mouse_focus != NULL); xassert(seat->mouse_focus != NULL);
xassert(axis < ALEN(seat->mouse.aggregated)); xassert(axis < ALEN(seat->mouse.aggregated));
const struct terminal *term = seat->mouse_focus;
/* /*
* Aggregate scrolled amount until we get at least 1.0 * Aggregate scrolled amount until we get at least 1.0
* *
@ -2602,7 +2605,7 @@ wl_pointer_axis(void *data, struct wl_pointer *wl_pointer,
* anything. * anything.
*/ */
seat->mouse.aggregated[axis] += seat->mouse.aggregated[axis] +=
mouse_scroll_multiplier(seat->mouse_focus) * wl_fixed_to_double(value); mouse_scroll_multiplier(term, seat) * wl_fixed_to_double(value);
if (fabs(seat->mouse.aggregated[axis]) < seat->mouse_focus->cell_height) if (fabs(seat->mouse.aggregated[axis]) < seat->mouse_focus->cell_height)
return; return;
@ -2623,7 +2626,7 @@ wl_pointer_axis_discrete(void *data, struct wl_pointer *wl_pointer,
if (axis == WL_POINTER_AXIS_HORIZONTAL_SCROLL) { if (axis == WL_POINTER_AXIS_HORIZONTAL_SCROLL) {
/* Treat mouse wheel left/right as regular buttons */ /* Treat mouse wheel left/right as regular buttons */
} else } else
amount *= mouse_scroll_multiplier(seat->mouse_focus); amount *= mouse_scroll_multiplier(seat->mouse_focus, seat);
mouse_scroll(seat, amount, axis); mouse_scroll(seat, amount, axis);
} }