mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
selection: don't automatically no-op operations if selection isn't enabled
When the client is capturing the mouse, selection can only be done by holding done shift. This is why a lot of selection functions are no-ops if selection isn't currently enabled. However, there are many cases where we actually need to modify the selection. In particular, selection_cancel(). Thus, only check for enabled selection when we're dealing with user input. Bonus: this also fixes a bug where an ongoing selection were finalized as soon as the user released shift, even if he was still holding down the mouse button.
This commit is contained in:
parent
38c050746d
commit
e4a2d41f51
3 changed files with 25 additions and 29 deletions
|
|
@ -24,6 +24,14 @@
|
|||
### Deprecated
|
||||
### Removed
|
||||
### Fixed
|
||||
|
||||
* Do not stop an ongoing selection when `shift` is released. When the
|
||||
client application is capturing mouse events, one must hold down
|
||||
`shift` to start a selection. This selection is now finalized only
|
||||
when the mouse button is released - not as soon as `shift` is
|
||||
released.
|
||||
|
||||
|
||||
### Security
|
||||
|
||||
|
||||
|
|
|
|||
31
input.c
31
input.c
|
|
@ -1176,26 +1176,29 @@ wl_pointer_button(void *data, struct wl_pointer *wl_pointer,
|
|||
if (button == BTN_LEFT && wayl->mouse.count <= 3) {
|
||||
selection_cancel(term);
|
||||
|
||||
switch (wayl->mouse.count) {
|
||||
case 1:
|
||||
selection_start(
|
||||
term, wayl->mouse.col, wayl->mouse.row,
|
||||
wayl->kbd.ctrl ? SELECTION_BLOCK : SELECTION_NORMAL);
|
||||
break;
|
||||
if (selection_enabled(term)) {
|
||||
switch (wayl->mouse.count) {
|
||||
case 1:
|
||||
selection_start(
|
||||
term, wayl->mouse.col, wayl->mouse.row,
|
||||
wayl->kbd.ctrl ? SELECTION_BLOCK : SELECTION_NORMAL);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
selection_mark_word(term, wayl->mouse.col, wayl->mouse.row,
|
||||
wayl->kbd.ctrl, serial);
|
||||
break;
|
||||
case 2:
|
||||
selection_mark_word(term, wayl->mouse.col, wayl->mouse.row,
|
||||
wayl->kbd.ctrl, serial);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
selection_mark_row(term, wayl->mouse.row, serial);
|
||||
break;
|
||||
case 3:
|
||||
selection_mark_row(term, wayl->mouse.row, serial);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if (button == BTN_RIGHT && wayl->mouse.count == 1) {
|
||||
selection_extend(term, wayl->mouse.col, wayl->mouse.row, serial);
|
||||
if (selection_enabled(term))
|
||||
selection_extend(term, wayl->mouse.col, wayl->mouse.row, serial);
|
||||
}
|
||||
|
||||
else {
|
||||
|
|
|
|||
15
selection.c
15
selection.c
|
|
@ -314,9 +314,6 @@ void
|
|||
selection_start(struct terminal *term, int col, int row,
|
||||
enum selection_kind kind)
|
||||
{
|
||||
if (!selection_enabled(term))
|
||||
return;
|
||||
|
||||
selection_cancel(term);
|
||||
|
||||
LOG_DBG("%s selection started at %d,%d",
|
||||
|
|
@ -367,7 +364,6 @@ mark_selected(struct terminal *term, struct row *row, struct cell *cell,
|
|||
static void
|
||||
selection_modify(struct terminal *term, struct coord start, struct coord end)
|
||||
{
|
||||
assert(selection_enabled(term));
|
||||
assert(term->selection.start.row != -1);
|
||||
assert(start.row != -1 && start.col != -1);
|
||||
assert(end.row != -1 && end.col != -1);
|
||||
|
|
@ -393,7 +389,6 @@ selection_modify(struct terminal *term, struct coord start, struct coord end)
|
|||
void
|
||||
selection_update(struct terminal *term, int col, int row)
|
||||
{
|
||||
if (!selection_enabled(term))
|
||||
return;
|
||||
|
||||
LOG_DBG("selection updated: start = %d,%d, end = %d,%d -> %d, %d",
|
||||
|
|
@ -401,7 +396,6 @@ selection_update(struct terminal *term, int col, int row)
|
|||
term->selection.end.row, term->selection.end.col,
|
||||
row, col);
|
||||
|
||||
assert(term->selection.start.row != -1);
|
||||
assert(term->grid->view + row != -1);
|
||||
|
||||
struct coord new_end = {col, term->grid->view + row};
|
||||
|
|
@ -526,9 +520,6 @@ selection_extend_block(struct terminal *term, int col, int row, uint32_t serial)
|
|||
void
|
||||
selection_extend(struct terminal *term, int col, int row, uint32_t serial)
|
||||
{
|
||||
if (!selection_enabled(term))
|
||||
return;
|
||||
|
||||
if (term->selection.start.row == -1 || term->selection.end.row == -1) {
|
||||
/* No existing selection */
|
||||
return;
|
||||
|
|
@ -587,9 +578,6 @@ selection_finalize(struct terminal *term, uint32_t serial)
|
|||
void
|
||||
selection_cancel(struct terminal *term)
|
||||
{
|
||||
if (!selection_enabled(term))
|
||||
return;
|
||||
|
||||
LOG_DBG("selection cancelled: start = %d,%d end = %d,%d",
|
||||
term->selection.start.row, term->selection.start.col,
|
||||
term->selection.end.row, term->selection.end.col);
|
||||
|
|
@ -610,9 +598,6 @@ void
|
|||
selection_mark_word(struct terminal *term, int col, int row, bool spaces_only,
|
||||
uint32_t serial)
|
||||
{
|
||||
if (!selection_enabled(term))
|
||||
return;
|
||||
|
||||
selection_cancel(term);
|
||||
|
||||
struct coord start = {col, row};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue