diff --git a/config.c b/config.c index 69883b68..d46b5f8e 100644 --- a/config.c +++ b/config.c @@ -72,9 +72,11 @@ static const char *const binding_action_map[] = { /* Mouse-specific actions */ [BIND_ACTION_SELECT_BEGIN] = "select-begin", + [BIND_ACTION_SELECT_BEGIN_BLOCK] = "select-begin-block", + [BIND_ACTION_SELECT_EXTEND] = "select-extend", [BIND_ACTION_SELECT_WORD] = "select-word", [BIND_ACTION_SELECT_WORD_WS] = "select-word-whitespace", - [BIND_ACTION_SELECT_EXTEND] = "select-extend", + [BIND_ACTION_SELECT_ROW] = "select-row", }; static_assert(ALEN(binding_action_map) == BIND_ACTION_COUNT, @@ -1534,9 +1536,11 @@ add_default_mouse_bindings(struct config *conf) add_binding(BIND_ACTION_PRIMARY_PASTE, none, BTN_MIDDLE, 1); add_binding(BIND_ACTION_SELECT_BEGIN, none, BTN_LEFT, 1); + add_binding(BIND_ACTION_SELECT_BEGIN_BLOCK, ctrl, BTN_LEFT, 1); + add_binding(BIND_ACTION_SELECT_EXTEND, none, BTN_RIGHT, 1); add_binding(BIND_ACTION_SELECT_WORD, none, BTN_LEFT, 2); add_binding(BIND_ACTION_SELECT_WORD_WS, ctrl, BTN_LEFT, 2); - add_binding(BIND_ACTION_SELECT_EXTEND, none, BTN_RIGHT, 1); + add_binding(BIND_ACTION_SELECT_ROW, none, BTN_LEFT, 3); #undef add_binding } diff --git a/doc/footrc.5.scd b/doc/footrc.5.scd index 4476daa1..a5792671 100644 --- a/doc/footrc.5.scd +++ b/doc/footrc.5.scd @@ -388,7 +388,12 @@ All actions listed under *key-bindings* can be user here as well. *select-begin* Begin an interactive selection. The selection is finalized, and copied to the _primary selection_, when the button is - released..Default: _BTN\_LEFT_. + released. Default: _BTN\_LEFT_. + +*select-begin-block* + Begin an interactive block selection. The selection is finalized, + and copied to the _primary selection_, when the button is + released. Default: _Control+BTN\_LEFT_. *select-extend* Interactively extend an existing selection. The selection is @@ -403,6 +408,9 @@ All actions listed under *key-bindings* can be user here as well. Select the _word_ (separated by spaces _only_) under the pointer. Default: Control+_BTN\_LEFT-2_. +*select-row* + Select the whole row under the pointer. Default: _BTN\_LEFT-3_. + *primary-paste* Pastes from the _primary selection_. Default: _BTN\_MIDDLE_. diff --git a/footrc b/footrc index 062b9177..a76c71e9 100644 --- a/footrc +++ b/footrc @@ -94,6 +94,8 @@ [mouse-bindings] # primary-paste=BTN_MIDDLE # select-begin=BTN_LEFT +# select-begin-block=Control=BTN_LEFT +# select-extend=BTN_RIGHT # select-word=BTN_LEFT-2 # select-word-whitespace=Control+BTN_LEFT-2 -# select-extend=BTN_RIGHT +# select-row=BTN_LEFT-3 diff --git a/input.c b/input.c index 9e260e69..518a690b 100644 --- a/input.c +++ b/input.c @@ -255,11 +255,22 @@ execute_binding(struct seat *seat, struct terminal *term, } case BIND_ACTION_SELECT_BEGIN: - selection_start( - term, seat->mouse.col, seat->mouse.row, - seat->kbd.ctrl ? SELECTION_BLOCK : SELECTION_NORMAL); + selection_start(term, seat->mouse.col, seat->mouse.row, SELECTION_NORMAL); break; + case BIND_ACTION_SELECT_BEGIN_BLOCK: + selection_start(term, seat->mouse.col, seat->mouse.row, SELECTION_BLOCK); + break; + + case BIND_ACTION_SELECT_EXTEND: { + bool cursor_is_on_grid = seat->mouse.col >= 0 && seat->mouse.row >= 0; + if (selection_enabled(term, seat) && cursor_is_on_grid) { + selection_extend( + seat, term, seat->mouse.col, seat->mouse.row, serial); + } + break; + } + case BIND_ACTION_SELECT_WORD: selection_mark_word( seat, term, seat->mouse.col, seat->mouse.row, false, serial); @@ -270,14 +281,10 @@ execute_binding(struct seat *seat, struct terminal *term, seat, term, seat->mouse.col, seat->mouse.row, true, serial); break; - case BIND_ACTION_SELECT_EXTEND: { - bool cursor_is_on_grid = seat->mouse.col >= 0 && seat->mouse.row >= 0; - if (selection_enabled(term, seat) && cursor_is_on_grid) { - selection_extend( - seat, term, seat->mouse.col, seat->mouse.row, serial); - } + case BIND_ACTION_SELECT_ROW: + selection_mark_row(seat, term, seat->mouse.row, serial); break; - } + case BIND_ACTION_COUNT: assert(false); @@ -1279,10 +1286,8 @@ wl_pointer_motion(void *data, struct wl_pointer *wl_pointer, bool cursor_is_on_grid = seat->mouse.col >= 0 && seat->mouse.row >= 0; /* Update selection */ - if (seat->mouse.button == BTN_LEFT || seat->mouse.button == BTN_RIGHT) { - if (cursor_is_on_new_cell || term->selection.end.row < 0) - selection_update(term, selection_col, selection_row); - } + if (cursor_is_on_new_cell || term->selection.end.row < 0) + selection_update(term, selection_col, selection_row); /* Send mouse event to client application */ if (!term_mouse_grabbed(term, seat) && diff --git a/wayland.h b/wayland.h index b7528a7f..85cc1ca7 100644 --- a/wayland.h +++ b/wayland.h @@ -47,9 +47,11 @@ enum bind_action_normal { /* Mouse specific actions - i.e. they require a mouse coordinate */ BIND_ACTION_SELECT_BEGIN, + BIND_ACTION_SELECT_BEGIN_BLOCK, + BIND_ACTION_SELECT_EXTEND, BIND_ACTION_SELECT_WORD, BIND_ACTION_SELECT_WORD_WS, - BIND_ACTION_SELECT_EXTEND, + BIND_ACTION_SELECT_ROW, BIND_ACTION_COUNT, };