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 */ /* 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 cursor_is_on_grid = seat->mouse.col >= 0 && seat->mouse.row >= 0;
const bool scroll_up = y < term->margins.top; enum selection_scroll_direction auto_scroll_direction
const bool scroll_down = y > term->height - term->margins.bottom; = 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); selection_stop_scroll_timer(term);
/* Update selection */ /* Update selection */
if (!term->is_searching) { if (!term->is_searching) {
if (scroll_up || scroll_down) { if (auto_scroll_direction != SELECTION_SCROLL_NOT) {
int distance = scroll_up /*
* 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 ? term->margins.top - y
: y - (term->height - term->margins.bottom); : y - (term->height - term->margins.bottom);
@ -1346,8 +1362,7 @@ wl_pointer_motion(void *data, struct wl_pointer *wl_pointer,
selection_start_scroll_timer( selection_start_scroll_timer(
term, 400000000 / (divisor > 0 ? divisor : 1), term, 400000000 / (divisor > 0 ? divisor : 1),
scroll_up ? SELECTION_SCROLL_UP : SELECTION_SCROLL_DOWN, auto_scroll_direction, selection_col);
selection_col);
} }
if (cursor_is_on_new_cell || term->selection.end.row < 0) 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) { switch (term->selection.auto_scroll.direction) {
case SELECTION_SCROLL_NOT:
return true;
case SELECTION_SCROLL_UP: case SELECTION_SCROLL_UP:
for (uint64_t i = 0; i < expiration_count; i++) for (uint64_t i = 0; i < expiration_count; i++)
cmd_scrollback_up(term, 1); cmd_scrollback_up(term, 1);
@ -838,6 +841,8 @@ void
selection_start_scroll_timer(struct terminal *term, int interval_ns, selection_start_scroll_timer(struct terminal *term, int interval_ns,
enum selection_scroll_direction direction, int col) enum selection_scroll_direction direction, int col)
{ {
assert(direction != SELECTION_SCROLL_NOT);
if (!term->selection.ongoing) if (!term->selection.ongoing)
return; 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.direction = direction;
term->selection.auto_scroll.col = col; term->selection.auto_scroll.col = col;
return; return;
err: err:
@ -886,11 +890,14 @@ err:
void void
selection_stop_scroll_timer(struct terminal *term) 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; return;
}
fdm_del(term->fdm, term->selection.auto_scroll.fd); fdm_del(term->fdm, term->selection.auto_scroll.fd);
term->selection.auto_scroll.fd = -1; term->selection.auto_scroll.fd = -1;
term->selection.auto_scroll.direction = SELECTION_SCROLL_NOT;
} }
static void 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_kind { SELECTION_NONE, SELECTION_NORMAL, SELECTION_BLOCK };
enum selection_direction {SELECTION_UNDIR, SELECTION_LEFT, SELECTION_RIGHT}; 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 { struct ptmx_buffer {
void *data; void *data;