mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-30 11:10:23 -04:00
Merge branch 'configurable-alternate-scroll-mode' into master
Closes #135
This commit is contained in:
commit
2593459b55
8 changed files with 70 additions and 38 deletions
|
|
@ -73,6 +73,12 @@
|
||||||
(https://codeberg.org/dnkl/foot/issues/128).
|
(https://codeberg.org/dnkl/foot/issues/128).
|
||||||
* **scrollback-up-line** and **scrollback-down-line** key
|
* **scrollback-up-line** and **scrollback-down-line** key
|
||||||
bindings. They scroll up/down a single line in the scrollback.
|
bindings. They scroll up/down a single line in the scrollback.
|
||||||
|
* **mouse.alternate-scroll-mode** option to `foot.ini`. This option
|
||||||
|
controls the initial state of the _Alternate Scroll Mode_, and
|
||||||
|
defaults to `yes`. When enabled, mouse scroll events are translated
|
||||||
|
to up/down key events in the alternate screen, letting you scroll in
|
||||||
|
e.g. `less` and other applications without enabling native mouse
|
||||||
|
support in them (https://codeberg.org/dnkl/foot/issues/135).
|
||||||
|
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
|
|
|
||||||
4
config.c
4
config.c
|
|
@ -764,6 +764,9 @@ parse_section_mouse(const char *key, const char *value, struct config *conf,
|
||||||
if (strcmp(key, "hide-when-typing") == 0)
|
if (strcmp(key, "hide-when-typing") == 0)
|
||||||
conf->mouse.hide_when_typing = str_to_bool(value);
|
conf->mouse.hide_when_typing = str_to_bool(value);
|
||||||
|
|
||||||
|
else if (strcmp(key, "alternate-scroll-mode") == 0)
|
||||||
|
conf->mouse.alternate_scroll_mode = str_to_bool(value);
|
||||||
|
|
||||||
else {
|
else {
|
||||||
LOG_AND_NOTIFY_ERR("%s:%d: [mouse]: %s: invalid key", path, lineno, key);
|
LOG_AND_NOTIFY_ERR("%s:%d: [mouse]: %s: invalid key", path, lineno, key);
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -1907,6 +1910,7 @@ config_load(struct config *conf, const char *conf_path,
|
||||||
},
|
},
|
||||||
.mouse = {
|
.mouse = {
|
||||||
.hide_when_typing = false,
|
.hide_when_typing = false,
|
||||||
|
.alternate_scroll_mode = true,
|
||||||
},
|
},
|
||||||
.csd = {
|
.csd = {
|
||||||
.preferred = CONF_CSD_PREFER_SERVER,
|
.preferred = CONF_CSD_PREFER_SERVER,
|
||||||
|
|
|
||||||
1
config.h
1
config.h
|
|
@ -119,6 +119,7 @@ struct config {
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
bool hide_when_typing;
|
bool hide_when_typing;
|
||||||
|
bool alternate_scroll_mode;
|
||||||
} mouse;
|
} mouse;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
|
|
||||||
|
|
@ -143,6 +143,24 @@ applications can change these at runtime.
|
||||||
*hide-when-typing*
|
*hide-when-typing*
|
||||||
Boolean. When enabled, the mouse cursor is hidden while typing.
|
Boolean. When enabled, the mouse cursor is hidden while typing.
|
||||||
|
|
||||||
|
*alternate-scroll-mode*
|
||||||
|
Boolean. This option controls the initial value for the _alternate
|
||||||
|
scroll mode_. When this mode is enabled, mouse scroll events are
|
||||||
|
translated to _up_/_down_ key events when displaying the alternate
|
||||||
|
screen.
|
||||||
|
|
||||||
|
This lets you scroll with the mouse in e.g. pagers (like _less_)
|
||||||
|
without enabling native mouse support in them.
|
||||||
|
|
||||||
|
Alternate scrolling is *not* used if the application enables
|
||||||
|
native mouse support.
|
||||||
|
|
||||||
|
This option can be modified by applications at run-time using the
|
||||||
|
escape sequences *CSI ? 1007 h* (enable) and *CSI ? 1007 l*
|
||||||
|
(disable).
|
||||||
|
|
||||||
|
Default: _yes_.
|
||||||
|
|
||||||
|
|
||||||
# SECTION: colors
|
# SECTION: colors
|
||||||
|
|
||||||
|
|
|
||||||
1
foot.ini
1
foot.ini
|
|
@ -23,6 +23,7 @@
|
||||||
|
|
||||||
[mouse]
|
[mouse]
|
||||||
# hide-when-typing=no
|
# hide-when-typing=no
|
||||||
|
# alternate-scroll-mode=yes
|
||||||
|
|
||||||
[colors]
|
[colors]
|
||||||
# alpha=1.0
|
# alpha=1.0
|
||||||
|
|
|
||||||
74
input.c
74
input.c
|
|
@ -498,6 +498,9 @@ keyboard_keymap(void *data, struct wl_keyboard *wl_keyboard,
|
||||||
seat->kbd.mod_ctrl = xkb_keymap_mod_get_index(seat->kbd.xkb_keymap, "Control");
|
seat->kbd.mod_ctrl = xkb_keymap_mod_get_index(seat->kbd.xkb_keymap, "Control");
|
||||||
seat->kbd.mod_meta = xkb_keymap_mod_get_index(seat->kbd.xkb_keymap, "Mod4");
|
seat->kbd.mod_meta = xkb_keymap_mod_get_index(seat->kbd.xkb_keymap, "Mod4");
|
||||||
|
|
||||||
|
seat->kbd.key_arrow_up = xkb_keymap_key_by_name(seat->kbd.xkb_keymap, "UP");
|
||||||
|
seat->kbd.key_arrow_down = xkb_keymap_key_by_name(seat->kbd.xkb_keymap, "DOWN");
|
||||||
|
|
||||||
/* Compose (dead keys) */
|
/* Compose (dead keys) */
|
||||||
seat->kbd.xkb_compose_table = xkb_compose_table_new_from_locale(
|
seat->kbd.xkb_compose_table = xkb_compose_table_new_from_locale(
|
||||||
seat->kbd.xkb, setlocale(LC_CTYPE, NULL), XKB_COMPOSE_COMPILE_NO_FLAGS);
|
seat->kbd.xkb, setlocale(LC_CTYPE, NULL), XKB_COMPOSE_COMPILE_NO_FLAGS);
|
||||||
|
|
@ -1610,6 +1613,20 @@ wl_pointer_button(void *data, struct wl_pointer *wl_pointer,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
alternate_scroll(struct seat *seat, int amount, int button)
|
||||||
|
{
|
||||||
|
if (seat->wl_keyboard == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
xkb_keycode_t key = button == BTN_BACK
|
||||||
|
? seat->kbd.key_arrow_up : seat->kbd.key_arrow_down;
|
||||||
|
|
||||||
|
for (int i = 0; i < amount; i++)
|
||||||
|
keyboard_key(seat, NULL, seat->kbd.serial, 0, key - 8, XKB_KEY_DOWN);
|
||||||
|
keyboard_key(seat, NULL, seat->kbd.serial, 0, key - 8, XKB_KEY_UP);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mouse_scroll(struct seat *seat, int amount)
|
mouse_scroll(struct seat *seat, int amount)
|
||||||
{
|
{
|
||||||
|
|
@ -1617,52 +1634,33 @@ mouse_scroll(struct seat *seat, int amount)
|
||||||
assert(term != NULL);
|
assert(term != NULL);
|
||||||
|
|
||||||
int button = amount < 0 ? BTN_BACK : BTN_FORWARD;
|
int button = amount < 0 ? BTN_BACK : BTN_FORWARD;
|
||||||
|
|
||||||
void (*scrollback)(struct terminal *term, int rows)
|
|
||||||
= amount < 0 ? &cmd_scrollback_up : &cmd_scrollback_down;
|
|
||||||
|
|
||||||
amount = abs(amount);
|
amount = abs(amount);
|
||||||
|
|
||||||
if ((button == BTN_BACK || button == BTN_FORWARD) &&
|
if (term->mouse_tracking == MOUSE_NONE) {
|
||||||
term->grid == &term->alt && term->alt_scrolling)
|
if (term->grid == &term->alt) {
|
||||||
{
|
if (term->alt_scrolling)
|
||||||
/*
|
alternate_scroll(seat, amount, button);
|
||||||
* alternateScroll/faux scrolling - translate mouse
|
} else {
|
||||||
* "back"/"forward" to up/down keys
|
if (button == BTN_BACK)
|
||||||
*/
|
cmd_scrollback_up(term, amount);
|
||||||
|
else
|
||||||
static xkb_keycode_t key_arrow_up = 0;
|
cmd_scrollback_down(term, amount);
|
||||||
static xkb_keycode_t key_arrow_down = 0;
|
|
||||||
|
|
||||||
if (key_arrow_up == 0) {
|
|
||||||
key_arrow_up = xkb_keymap_key_by_name(seat->kbd.xkb_keymap, "UP");
|
|
||||||
key_arrow_down = xkb_keymap_key_by_name(seat->kbd.xkb_keymap, "DOWN");
|
|
||||||
}
|
}
|
||||||
|
} else if (!term_mouse_grabbed(term, seat) &&
|
||||||
|
seat->mouse.col >= 0 && seat->mouse.row >= 0)
|
||||||
|
{
|
||||||
|
assert(seat->mouse.col < term->cols);
|
||||||
|
assert(seat->mouse.row < term->rows);
|
||||||
|
|
||||||
xkb_keycode_t key = button == BTN_BACK ? key_arrow_up : key_arrow_down;
|
for (int i = 0; i < amount; i++) {
|
||||||
|
term_mouse_down(
|
||||||
for (int i = 0; i < amount; i++)
|
|
||||||
keyboard_key(seat, NULL, seat->kbd.serial, 0, key - 8, XKB_KEY_DOWN);
|
|
||||||
keyboard_key(seat, NULL, seat->kbd.serial, 0, key - 8, XKB_KEY_UP);
|
|
||||||
} else {
|
|
||||||
if (!term_mouse_grabbed(term, seat) &&
|
|
||||||
seat->mouse.col >= 0 && seat->mouse.row >= 0)
|
|
||||||
{
|
|
||||||
assert(seat->mouse.col < term->cols);
|
|
||||||
assert(seat->mouse.row < term->rows);
|
|
||||||
|
|
||||||
for (int i = 0; i < amount; i++) {
|
|
||||||
term_mouse_down(
|
|
||||||
term, button, seat->mouse.row, seat->mouse.col,
|
|
||||||
seat->kbd.shift, seat->kbd.alt, seat->kbd.ctrl);
|
|
||||||
}
|
|
||||||
|
|
||||||
term_mouse_up(
|
|
||||||
term, button, seat->mouse.row, seat->mouse.col,
|
term, button, seat->mouse.row, seat->mouse.col,
|
||||||
seat->kbd.shift, seat->kbd.alt, seat->kbd.ctrl);
|
seat->kbd.shift, seat->kbd.alt, seat->kbd.ctrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
scrollback(term, amount);
|
term_mouse_up(
|
||||||
|
term, button, seat->mouse.row, seat->mouse.col,
|
||||||
|
seat->kbd.shift, seat->kbd.alt, seat->kbd.ctrl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -964,6 +964,7 @@ term_init(const struct config *conf, struct fdm *fdm, struct reaper *reaper,
|
||||||
.grid = &term->normal,
|
.grid = &term->normal,
|
||||||
.composed_count = 0,
|
.composed_count = 0,
|
||||||
.composed = NULL,
|
.composed = NULL,
|
||||||
|
.alt_scrolling = conf->mouse.alternate_scroll_mode,
|
||||||
.meta = {
|
.meta = {
|
||||||
.esc_prefix = true,
|
.esc_prefix = true,
|
||||||
.eight_bit = true,
|
.eight_bit = true,
|
||||||
|
|
|
||||||
|
|
@ -149,6 +149,9 @@ struct seat {
|
||||||
xkb_mod_index_t mod_ctrl;
|
xkb_mod_index_t mod_ctrl;
|
||||||
xkb_mod_index_t mod_meta;
|
xkb_mod_index_t mod_meta;
|
||||||
|
|
||||||
|
xkb_keycode_t key_arrow_up;
|
||||||
|
xkb_keycode_t key_arrow_down;
|
||||||
|
|
||||||
/* Enabled modifiers */
|
/* Enabled modifiers */
|
||||||
bool shift;
|
bool shift;
|
||||||
bool alt;
|
bool alt;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue