selection: auto-scroll: add SELECTION_SCROLL_NOT as a scroll ‘direction’

This commit is contained in:
Daniel Eklöf 2020-10-11 18:18:18 +02:00
parent dd14e0b3c3
commit 4ad7fdc19c
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 32 additions and 10 deletions

29
input.c
View file

@ -1327,16 +1327,32 @@ wl_pointer_motion(void *data, struct wl_pointer *wl_pointer,
/* Cursor is inside the grid, i.e. *not* in the margins */
const bool cursor_is_on_grid = seat->mouse.col >= 0 && seat->mouse.row >= 0;
const bool scroll_up = y < term->margins.top;
const bool scroll_down = y > term->height - term->margins.bottom;
enum selection_scroll_direction auto_scroll_direction
= y < term->margins.top ? SELECTION_SCROLL_UP
: y > term->height - term->margins.bottom ? SELECTION_SCROLL_DOWN
: SELECTION_SCROLL_NOT;
if (!scroll_up && !scroll_down)
if (auto_scroll_direction == SELECTION_SCROLL_NOT)
selection_stop_scroll_timer(term);
/* Update selection */
if (!term->is_searching) {
if (scroll_up || scroll_down) {
int distance = scroll_up
if (auto_scroll_direction != SELECTION_SCROLL_NOT) {
/*
* Start selection auto-scrolling
*
* The speed of the scrolling is proportional to the
* distance between the mouse and the grid; the
* further away the mouse is, the fast we scroll.
*
* Note that the speed is measures in intervals (in
* ns) between each timed scroll of a single line.
*
* Thus, the further away the mouse is, the smaller
* interval value we use.
*/
int distance = auto_scroll_direction == SELECTION_SCROLL_UP
? term->margins.top - y
: y - (term->height - term->margins.bottom);
@ -1346,8 +1362,7 @@ wl_pointer_motion(void *data, struct wl_pointer *wl_pointer,
selection_start_scroll_timer(
term, 400000000 / (divisor > 0 ? divisor : 1),
scroll_up ? SELECTION_SCROLL_UP : SELECTION_SCROLL_DOWN,
selection_col);
auto_scroll_direction, selection_col);
}
if (cursor_is_on_new_cell || term->selection.end.row < 0)

View file

@ -817,6 +817,9 @@ fdm_scroll_timer(struct fdm *fdm, int fd, int events, void *data)
}
switch (term->selection.auto_scroll.direction) {
case SELECTION_SCROLL_NOT:
return true;
case SELECTION_SCROLL_UP:
for (uint64_t i = 0; i < expiration_count; i++)
cmd_scrollback_up(term, 1);
@ -838,6 +841,8 @@ void
selection_start_scroll_timer(struct terminal *term, int interval_ns,
enum selection_scroll_direction direction, int col)
{
assert(direction != SELECTION_SCROLL_NOT);
if (!term->selection.ongoing)
return;
@ -875,7 +880,6 @@ selection_start_scroll_timer(struct terminal *term, int interval_ns,
term->selection.auto_scroll.direction = direction;
term->selection.auto_scroll.col = col;
return;
err:
@ -886,11 +890,14 @@ err:
void
selection_stop_scroll_timer(struct terminal *term)
{
if (term->selection.auto_scroll.fd < 0)
if (term->selection.auto_scroll.fd < 0) {
assert(term->selection.auto_scroll.direction == SELECTION_SCROLL_NOT);
return;
}
fdm_del(term->fdm, term->selection.auto_scroll.fd);
term->selection.auto_scroll.fd = -1;
term->selection.auto_scroll.direction = SELECTION_SCROLL_NOT;
}
static void

View file

@ -182,7 +182,7 @@ enum cursor_style { CURSOR_BLOCK, CURSOR_UNDERLINE, CURSOR_BAR };
enum selection_kind { SELECTION_NONE, SELECTION_NORMAL, SELECTION_BLOCK };
enum selection_direction {SELECTION_UNDIR, SELECTION_LEFT, SELECTION_RIGHT};
enum selection_scroll_direction {SELECTION_SCROLL_UP, SELECTION_SCROLL_DOWN};
enum selection_scroll_direction {SELECTION_SCROLL_NOT, SELECTION_SCROLL_UP, SELECTION_SCROLL_DOWN};
struct ptmx_buffer {
void *data;