mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-05 04:06:08 -05:00
selection: auto-scroll: add SELECTION_SCROLL_NOT as a scroll ‘direction’
This commit is contained in:
parent
dd14e0b3c3
commit
4ad7fdc19c
3 changed files with 32 additions and 10 deletions
29
input.c
29
input.c
|
|
@ -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)
|
||||
|
|
|
|||
11
selection.c
11
selection.c
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue