mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-05 04:06:08 -05:00
This patch adds the following new search key bindings: * extend-char (shift+right) * extend-line-down (shift+down) * extend-backward-char (shift+left) * extend-backward-to-word-boundary (ctrl+shift+left) * extend-backward-to-next-whitespace (ctrl+shift+alt+left) * extend-line-up (shift+up) They can be used to extend the search match (i.e. the selection). This patch also adds an initial set of key bindings to scroll in the scrollback history: * scrollback-up-page * scrollback-down-page These work just like the key bindings for the normal mode. Also note that it was already possible to scroll using the mouse. This patch also fixes a couple of search mode bugs: * crashing when a search match ends in the last column * grapheme clusters not being matched correctly * Search match not being "extendable" after a pointer leave event * A few others, related to either large matches, or extending matches after moving the viewport. There are still a couple of (known) issues: * A search match isn't correctly highlighted if its *starting* point is outside the viewport. * Extending the match to end of the scrollback (i.e. the most recent output) is simply buggy. Related to #419
162 lines
4.6 KiB
C
162 lines
4.6 KiB
C
#pragma once
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <xkbcommon/xkbcommon.h>
|
|
#include <tllist.h>
|
|
|
|
#include "config.h"
|
|
|
|
enum bind_action_normal {
|
|
BIND_ACTION_NONE,
|
|
BIND_ACTION_NOOP,
|
|
BIND_ACTION_SCROLLBACK_UP_PAGE,
|
|
BIND_ACTION_SCROLLBACK_UP_HALF_PAGE,
|
|
BIND_ACTION_SCROLLBACK_UP_LINE,
|
|
BIND_ACTION_SCROLLBACK_DOWN_PAGE,
|
|
BIND_ACTION_SCROLLBACK_DOWN_HALF_PAGE,
|
|
BIND_ACTION_SCROLLBACK_DOWN_LINE,
|
|
BIND_ACTION_SCROLLBACK_HOME,
|
|
BIND_ACTION_SCROLLBACK_END,
|
|
BIND_ACTION_CLIPBOARD_COPY,
|
|
BIND_ACTION_CLIPBOARD_PASTE,
|
|
BIND_ACTION_PRIMARY_PASTE,
|
|
BIND_ACTION_SEARCH_START,
|
|
BIND_ACTION_FONT_SIZE_UP,
|
|
BIND_ACTION_FONT_SIZE_DOWN,
|
|
BIND_ACTION_FONT_SIZE_RESET,
|
|
BIND_ACTION_SPAWN_TERMINAL,
|
|
BIND_ACTION_MINIMIZE,
|
|
BIND_ACTION_MAXIMIZE,
|
|
BIND_ACTION_FULLSCREEN,
|
|
BIND_ACTION_PIPE_SCROLLBACK,
|
|
BIND_ACTION_PIPE_VIEW,
|
|
BIND_ACTION_PIPE_SELECTED,
|
|
BIND_ACTION_SHOW_URLS_COPY,
|
|
BIND_ACTION_SHOW_URLS_LAUNCH,
|
|
BIND_ACTION_SHOW_URLS_PERSISTENT,
|
|
BIND_ACTION_TEXT_BINDING,
|
|
BIND_ACTION_PROMPT_PREV,
|
|
BIND_ACTION_PROMPT_NEXT,
|
|
BIND_ACTION_UNICODE_INPUT,
|
|
|
|
/* Mouse specific actions - i.e. they require a mouse coordinate */
|
|
BIND_ACTION_SCROLLBACK_UP_MOUSE,
|
|
BIND_ACTION_SCROLLBACK_DOWN_MOUSE,
|
|
BIND_ACTION_SELECT_BEGIN,
|
|
BIND_ACTION_SELECT_BEGIN_BLOCK,
|
|
BIND_ACTION_SELECT_EXTEND,
|
|
BIND_ACTION_SELECT_EXTEND_CHAR_WISE,
|
|
BIND_ACTION_SELECT_WORD,
|
|
BIND_ACTION_SELECT_WORD_WS,
|
|
BIND_ACTION_SELECT_QUOTE,
|
|
BIND_ACTION_SELECT_ROW,
|
|
|
|
BIND_ACTION_KEY_COUNT = BIND_ACTION_UNICODE_INPUT + 1,
|
|
BIND_ACTION_COUNT = BIND_ACTION_SELECT_ROW + 1,
|
|
};
|
|
|
|
enum bind_action_search {
|
|
BIND_ACTION_SEARCH_NONE,
|
|
BIND_ACTION_SEARCH_SCROLLBACK_UP_PAGE,
|
|
BIND_ACTION_SEARCH_SCROLLBACK_DOWN_PAGE,
|
|
// TODO: copy the remaining scrollback key-bindings from normal mode
|
|
BIND_ACTION_SEARCH_CANCEL,
|
|
BIND_ACTION_SEARCH_COMMIT,
|
|
BIND_ACTION_SEARCH_FIND_PREV,
|
|
BIND_ACTION_SEARCH_FIND_NEXT,
|
|
BIND_ACTION_SEARCH_EDIT_LEFT,
|
|
BIND_ACTION_SEARCH_EDIT_LEFT_WORD,
|
|
BIND_ACTION_SEARCH_EDIT_RIGHT,
|
|
BIND_ACTION_SEARCH_EDIT_RIGHT_WORD,
|
|
BIND_ACTION_SEARCH_EDIT_HOME,
|
|
BIND_ACTION_SEARCH_EDIT_END,
|
|
BIND_ACTION_SEARCH_DELETE_PREV,
|
|
BIND_ACTION_SEARCH_DELETE_PREV_WORD,
|
|
BIND_ACTION_SEARCH_DELETE_NEXT,
|
|
BIND_ACTION_SEARCH_DELETE_NEXT_WORD,
|
|
BIND_ACTION_SEARCH_EXTEND_CHAR,
|
|
BIND_ACTION_SEARCH_EXTEND_WORD,
|
|
BIND_ACTION_SEARCH_EXTEND_WORD_WS,
|
|
BIND_ACTION_SEARCH_EXTEND_LINE_DOWN,
|
|
BIND_ACTION_SEARCH_EXTEND_BACKWARD_CHAR,
|
|
BIND_ACTION_SEARCH_EXTEND_BACKWARD_WORD,
|
|
BIND_ACTION_SEARCH_EXTEND_BACKWARD_WORD_WS,
|
|
BIND_ACTION_SEARCH_EXTEND_LINE_UP,
|
|
BIND_ACTION_SEARCH_CLIPBOARD_PASTE,
|
|
BIND_ACTION_SEARCH_PRIMARY_PASTE,
|
|
BIND_ACTION_SEARCH_UNICODE_INPUT,
|
|
BIND_ACTION_SEARCH_COUNT,
|
|
};
|
|
|
|
enum bind_action_url {
|
|
BIND_ACTION_URL_NONE,
|
|
BIND_ACTION_URL_CANCEL,
|
|
BIND_ACTION_URL_TOGGLE_URL_ON_JUMP_LABEL,
|
|
BIND_ACTION_URL_COUNT,
|
|
};
|
|
|
|
typedef tll(xkb_keycode_t) xkb_keycode_list_t;
|
|
|
|
struct key_binding {
|
|
enum key_binding_type type;
|
|
|
|
int action; /* enum bind_action_* */
|
|
xkb_mod_mask_t mods;
|
|
|
|
union {
|
|
struct {
|
|
xkb_keysym_t sym;
|
|
xkb_keycode_list_t key_codes;
|
|
} k;
|
|
|
|
struct {
|
|
uint32_t button;
|
|
int count;
|
|
} m;
|
|
};
|
|
|
|
const struct binding_aux *aux;
|
|
};
|
|
typedef tll(struct key_binding) key_binding_list_t;
|
|
|
|
struct terminal;
|
|
struct seat;
|
|
struct wayland;
|
|
|
|
struct key_binding_set {
|
|
key_binding_list_t key;
|
|
key_binding_list_t search;
|
|
key_binding_list_t url;
|
|
key_binding_list_t mouse;
|
|
xkb_mod_mask_t selection_overrides;
|
|
};
|
|
|
|
struct key_binding_manager;
|
|
|
|
struct key_binding_manager *key_binding_manager_new(void);
|
|
void key_binding_manager_destroy(struct key_binding_manager *mgr);
|
|
|
|
void key_binding_new_for_seat(
|
|
struct key_binding_manager *mgr, const struct seat *seat);
|
|
|
|
void key_binding_new_for_conf(
|
|
struct key_binding_manager *mgr, const struct wayland *wayl,
|
|
const struct config *conf);
|
|
|
|
/* Returns the set of key bindings associated with this seat/conf pair */
|
|
struct key_binding_set *key_binding_for(
|
|
struct key_binding_manager *mgr, const struct config *conf,
|
|
const struct seat *seat);
|
|
|
|
/* Remove all key bindings tied to the specified seat */
|
|
void key_binding_remove_seat(
|
|
struct key_binding_manager *mgr, const struct seat *seat);
|
|
|
|
void key_binding_unref(
|
|
struct key_binding_manager *mgr, const struct config *conf);
|
|
|
|
void key_binding_load_keymap(
|
|
struct key_binding_manager *mgr, const struct seat *seat);
|
|
void key_binding_unload_keymap(
|
|
struct key_binding_manager *mgr, const struct seat *seat);
|