scrollback: initial support for mouse scrolling

This commit is contained in:
Daniel Eklöf 2019-07-10 09:15:37 +02:00
parent bcd111d203
commit b058e6384a
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 41 additions and 13 deletions

View file

@ -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);

View file

@ -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
View file

@ -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