mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
scrollback: initial support for mouse scrolling
This commit is contained in:
parent
bcd111d203
commit
b058e6384a
3 changed files with 41 additions and 13 deletions
34
commands.c
34
commands.c
|
|
@ -10,15 +10,19 @@
|
||||||
#define max(x, y) ((x) > (y) ? (x) : (y))
|
#define max(x, y) ((x) > (y) ? (x) : (y))
|
||||||
|
|
||||||
void
|
void
|
||||||
cmd_scrollback_up(struct terminal *term)
|
cmd_scrollback_up(struct terminal *term, int rows)
|
||||||
{
|
{
|
||||||
|
if (term->grid == &term->alt)
|
||||||
|
return;
|
||||||
|
|
||||||
assert(term->grid->offset >= 0);
|
assert(term->grid->offset >= 0);
|
||||||
int new_view = (term->grid->view + term->grid->num_rows - term->rows) % term->grid->num_rows;
|
int new_view = (term->grid->view + term->grid->num_rows - rows) % term->grid->num_rows;
|
||||||
|
|
||||||
LOG_WARN("%d" ,new_view);
|
LOG_WARN("%d" ,new_view);
|
||||||
assert(new_view >= 0);
|
assert(new_view >= 0);
|
||||||
assert(new_view < term->grid->num_rows);
|
assert(new_view < term->grid->num_rows);
|
||||||
|
|
||||||
|
/* Avoid scrolling in uninitialized rows */
|
||||||
while (!term->grid->rows[new_view]->initialized)
|
while (!term->grid->rows[new_view]->initialized)
|
||||||
new_view = (new_view + 1) % term->grid->num_rows;
|
new_view = (new_view + 1) % term->grid->num_rows;
|
||||||
|
|
||||||
|
|
@ -34,20 +38,32 @@ cmd_scrollback_up(struct terminal *term)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cmd_scrollback_down(struct terminal *term)
|
cmd_scrollback_down(struct terminal *term, int rows)
|
||||||
{
|
{
|
||||||
|
if (term->grid == &term->alt)
|
||||||
|
return;
|
||||||
|
|
||||||
assert(term->grid->offset >= 0);
|
assert(term->grid->offset >= 0);
|
||||||
int new_view = (term->grid->view + term->rows) % term->grid->num_rows;
|
int new_view = (term->grid->view + rows) % term->grid->num_rows;
|
||||||
|
|
||||||
LOG_WARN("%d" ,new_view);
|
LOG_WARN("%d" ,new_view);
|
||||||
assert(new_view >= 0);
|
assert(new_view >= 0);
|
||||||
assert(new_view < term->grid->num_rows);
|
assert(new_view < term->grid->num_rows);
|
||||||
|
|
||||||
if (!term->grid->rows[new_view]->initialized) {
|
/* Prevent scrolling in uninitialized rows */
|
||||||
while (!term->grid->rows[new_view]->initialized)
|
bool all_initialized = false;
|
||||||
new_view = (new_view + term->grid->num_rows - 1) % term->grid->num_rows;
|
do {
|
||||||
new_view = (new_view + term->grid->num_rows - term->rows + 1) % term->grid->num_rows;
|
all_initialized = true;
|
||||||
}
|
|
||||||
|
for (int i = 0; i < term->rows; i++) {
|
||||||
|
int row_no = (new_view + i) % term->grid->num_rows;
|
||||||
|
if (!term->grid->rows[row_no]->initialized) {
|
||||||
|
all_initialized = false;
|
||||||
|
new_view--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (!all_initialized);
|
||||||
|
|
||||||
LOG_DBG("scrollback DOWN: %d -> %d (offset = %d, rows = %d)",
|
LOG_DBG("scrollback DOWN: %d -> %d (offset = %d, rows = %d)",
|
||||||
term->grid->view, new_view, term->grid->offset, term->grid->num_rows);
|
term->grid->view, new_view, term->grid->offset, term->grid->num_rows);
|
||||||
|
|
|
||||||
|
|
@ -2,5 +2,5 @@
|
||||||
|
|
||||||
#include "terminal.h"
|
#include "terminal.h"
|
||||||
|
|
||||||
void cmd_scrollback_up(struct terminal *term);
|
void cmd_scrollback_up(struct terminal *term, int rows);
|
||||||
void cmd_scrollback_down(struct terminal *term);
|
void cmd_scrollback_down(struct terminal *term, int rows);
|
||||||
|
|
|
||||||
16
input.c
16
input.c
|
|
@ -143,12 +143,12 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
|
||||||
|
|
||||||
if (effective_mods == shift) {
|
if (effective_mods == shift) {
|
||||||
if (sym == XKB_KEY_Page_Up) {
|
if (sym == XKB_KEY_Page_Up) {
|
||||||
cmd_scrollback_up(term);
|
cmd_scrollback_up(term, term->rows);
|
||||||
found_map = true;
|
found_map = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (sym == XKB_KEY_Page_Down) {
|
else if (sym == XKB_KEY_Page_Down) {
|
||||||
cmd_scrollback_down(term);
|
cmd_scrollback_down(term, term->rows);
|
||||||
found_map = true;
|
found_map = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -342,6 +342,18 @@ static void
|
||||||
wl_pointer_axis(void *data, struct wl_pointer *wl_pointer,
|
wl_pointer_axis(void *data, struct wl_pointer *wl_pointer,
|
||||||
uint32_t time, uint32_t axis, wl_fixed_t value)
|
uint32_t time, uint32_t axis, wl_fixed_t value)
|
||||||
{
|
{
|
||||||
|
struct terminal *term = data;
|
||||||
|
|
||||||
|
/* TODO: generate button event for BTN_FORWARD/BTN_BACK? */
|
||||||
|
|
||||||
|
if (axis != WL_POINTER_AXIS_VERTICAL_SCROLL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int amount = wl_fixed_to_int(value);
|
||||||
|
if (amount < 0)
|
||||||
|
cmd_scrollback_up(term, -amount);
|
||||||
|
else
|
||||||
|
cmd_scrollback_down(term, amount);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue