mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-05-02 06:46:32 -04:00
Merge branch 'mouse-events-never-sent-to-client'
This commit is contained in:
commit
1d9cd8cc04
5 changed files with 91 additions and 111 deletions
|
|
@ -73,6 +73,13 @@
|
|||
|
||||
|
||||
### Fixed
|
||||
|
||||
* Some mouse bindings (_primary paste_, for example) did not require
|
||||
`shift` to be pressed while used in a mouse grabbing
|
||||
application. This meant the mouse event was never seen by the
|
||||
application.
|
||||
|
||||
|
||||
### Security
|
||||
### Contributors
|
||||
|
||||
|
|
|
|||
26
input.c
26
input.c
|
|
@ -82,8 +82,6 @@ execute_binding(struct seat *seat, struct terminal *term,
|
|||
enum bind_action_normal action, char *const *pipe_argv,
|
||||
uint32_t serial)
|
||||
{
|
||||
const bool cursor_is_on_grid = seat->mouse.col >= 0 && seat->mouse.row >= 0;
|
||||
|
||||
switch (action) {
|
||||
case BIND_ACTION_NONE:
|
||||
return true;
|
||||
|
|
@ -274,33 +272,22 @@ execute_binding(struct seat *seat, struct terminal *term,
|
|||
}
|
||||
|
||||
case BIND_ACTION_SELECT_BEGIN:
|
||||
if (selection_enabled(term, seat) && cursor_is_on_grid) {
|
||||
selection_start(
|
||||
term, seat->mouse.col, seat->mouse.row, SELECTION_CHAR_WISE, false);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
case BIND_ACTION_SELECT_BEGIN_BLOCK:
|
||||
if (selection_enabled(term, seat) && cursor_is_on_grid) {
|
||||
selection_start(
|
||||
term, seat->mouse.col, seat->mouse.row, SELECTION_BLOCK, false);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
case BIND_ACTION_SELECT_EXTEND:
|
||||
if (selection_enabled(term, seat) && cursor_is_on_grid) {
|
||||
selection_extend(
|
||||
seat, term, seat->mouse.col, seat->mouse.row, term->selection.kind);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
case BIND_ACTION_SELECT_EXTEND_CHAR_WISE:
|
||||
if (selection_enabled(term, seat) && cursor_is_on_grid &&
|
||||
term->selection.kind != SELECTION_BLOCK)
|
||||
{
|
||||
if (term->selection.kind != SELECTION_BLOCK) {
|
||||
selection_extend(
|
||||
seat, term, seat->mouse.col, seat->mouse.row, SELECTION_CHAR_WISE);
|
||||
return true;
|
||||
|
|
@ -308,28 +295,19 @@ execute_binding(struct seat *seat, struct terminal *term,
|
|||
return false;
|
||||
|
||||
case BIND_ACTION_SELECT_WORD:
|
||||
if (selection_enabled(term, seat) && cursor_is_on_grid) {
|
||||
selection_start(
|
||||
term, seat->mouse.col, seat->mouse.row, SELECTION_WORD_WISE, false);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
case BIND_ACTION_SELECT_WORD_WS:
|
||||
if (selection_enabled(term, seat) && cursor_is_on_grid) {
|
||||
selection_start(
|
||||
term, seat->mouse.col, seat->mouse.row, SELECTION_WORD_WISE, true);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
case BIND_ACTION_SELECT_ROW:
|
||||
if (selection_enabled(term, seat) && cursor_is_on_grid) {
|
||||
selection_start(
|
||||
term, seat->mouse.col, seat->mouse.row, SELECTION_LINE_WISE, false);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
case BIND_ACTION_COUNT:
|
||||
xassert(false);
|
||||
|
|
@ -1707,6 +1685,7 @@ wl_pointer_button(void *data, struct wl_pointer *wl_pointer,
|
|||
case WL_POINTER_BUTTON_STATE_PRESSED: {
|
||||
bool consumed = false;
|
||||
|
||||
if (cursor_is_on_grid && term_mouse_grabbed(term, seat)) {
|
||||
if (seat->wl_keyboard != NULL && seat->kbd.xkb_state != NULL) {
|
||||
/* Seat has keyboard - use mouse bindings *with* modifiers */
|
||||
|
||||
|
|
@ -1780,6 +1759,7 @@ wl_pointer_button(void *data, struct wl_pointer *wl_pointer,
|
|||
seat, term, match->action, match->pipe.argv, serial);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
send_to_client = !consumed && cursor_is_on_grid;
|
||||
|
||||
|
|
|
|||
10
selection.c
10
selection.c
|
|
@ -33,16 +33,6 @@ static const char *const mime_type_map[] = {
|
|||
[DATA_OFFER_MIME_URI_LIST] = "text/uri-list",
|
||||
};
|
||||
|
||||
bool
|
||||
selection_enabled(const struct terminal *term, struct seat *seat)
|
||||
{
|
||||
return
|
||||
seat->mouse.col >= 0 && seat->mouse.row >= 0 &&
|
||||
(term->mouse_tracking == MOUSE_NONE ||
|
||||
term_mouse_grabbed(term, seat) ||
|
||||
term->is_searching);
|
||||
}
|
||||
|
||||
bool
|
||||
selection_on_rows(const struct terminal *term, int row_start, int row_end)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@
|
|||
extern const struct wl_data_device_listener data_device_listener;
|
||||
extern const struct zwp_primary_selection_device_v1_listener primary_selection_device_listener;
|
||||
|
||||
bool selection_enabled(const struct terminal *term, struct seat *seat);
|
||||
void selection_start(
|
||||
struct terminal *term, int col, int row,
|
||||
enum selection_kind new_kind, bool spaces_only);
|
||||
|
|
|
|||
10
terminal.c
10
terminal.c
|
|
@ -2431,9 +2431,10 @@ term_mouse_grabbed(const struct terminal *term, struct seat *seat)
|
|||
/*
|
||||
* Mouse is grabbed by us, regardless of whether mouse tracking has been enabled or not.
|
||||
*/
|
||||
return seat->kbd_focus == term &&
|
||||
return term->mouse_tracking == MOUSE_NONE ||
|
||||
(seat->kbd_focus == term &&
|
||||
seat->kbd.shift &&
|
||||
!seat->kbd.alt && /*!seat->kbd.ctrl &&*/ !seat->kbd.meta;
|
||||
!seat->kbd.alt && /*!seat->kbd.ctrl &&*/ !seat->kbd.meta);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -2569,7 +2570,10 @@ term_xcursor_update_for_seat(struct terminal *term, struct seat *seat)
|
|||
const char *xcursor
|
||||
= seat->pointer.hidden ? XCURSOR_HIDDEN
|
||||
: term->is_searching ? XCURSOR_LEFT_PTR
|
||||
: selection_enabled(term, seat) ? XCURSOR_TEXT
|
||||
: (seat->mouse.col >= 0 &&
|
||||
seat->mouse.row >= 0 &&
|
||||
term_mouse_grabbed(term, seat)) ? XCURSOR_TEXT
|
||||
: term->is_searching ? XCURSOR_TEXT
|
||||
: XCURSOR_LEFT_PTR;
|
||||
|
||||
render_xcursor_set(seat, term, xcursor);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue