From: tokyo4j Date: Mon, 23 Sep 2024 19:49:08 +0000 (+0900) Subject: cursor: prevent Drag mousebinds from running without button press X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=1557cb774f6d74d5b9c2c7b476d1c35925609dd8;p=proto%2Flabwc.git cursor: prevent Drag mousebinds from running without button press For `Drag` mousebinds, `pressed_in_context` is set by `cursor_process_button_press()` and cleared by `cursor_process_motion()` which runs actions bound to them. However, when `cursor_process_motion()` is called while interactive move/resize, it doesn't clear `pressed_in_context` due to the early-return and the `Drag` mousebinds are unexpectedly executed on another call to `cursor_process_motion()` after the interactive move/resize is finished by button release, even when the button is not pressed. So this commit fixes it by always clearing `pressed_in_context` on button releases. --- diff --git a/include/input/cursor.h b/include/input/cursor.h index 8087c49a..4e62183d 100644 --- a/include/input/cursor.h +++ b/include/input/cursor.h @@ -142,7 +142,7 @@ bool cursor_process_button_release(struct seat *seat, uint32_t button, uint32_t * Finishes cursor button release. The return value indicates if an interactive * move/resize had been finished. Should be called after notifying a client. */ -bool cursor_finish_button_release(struct seat *seat); +bool cursor_finish_button_release(struct seat *seat, uint32_t button); void cursor_init(struct seat *seat); void cursor_reload(struct seat *seat); diff --git a/src/input/cursor.c b/src/input/cursor.c index 68636f1a..6777faea 100644 --- a/src/input/cursor.c +++ b/src/input/cursor.c @@ -903,15 +903,7 @@ handle_release_mousebinding(struct server *server, actions_run(ctx->view, server, &mousebind->actions, ctx); } } - /* - * Clear "pressed" status for all bindings of this mouse button, - * regardless of whether handled or not - */ - wl_list_for_each(mousebind, &rc.mousebinds, link) { - if (mousebind->button == button) { - mousebind->pressed_in_context = false; - } - } + return consumed_by_frame_context; } @@ -1137,10 +1129,18 @@ cursor_process_button_release(struct seat *seat, uint32_t button, } bool -cursor_finish_button_release(struct seat *seat) +cursor_finish_button_release(struct seat *seat, uint32_t button) { struct server *server = seat->server; + /* Clear "pressed" status for all bindings of this mouse button */ + struct mousebind *mousebind; + wl_list_for_each(mousebind, &rc.mousebinds, link) { + if (mousebind->button == button) { + mousebind->pressed_in_context = false; + } + } + if (server->input_mode == LAB_INPUT_STATE_MOVE || server->input_mode == LAB_INPUT_STATE_RESIZE) { if (resize_outlines_enabled(server->grabbed_view)) { @@ -1182,7 +1182,7 @@ cursor_button(struct wl_listener *listener, void *data) wlr_seat_pointer_notify_button(seat->seat, event->time_msec, event->button, event->state); } - cursor_finish_button_release(seat); + cursor_finish_button_release(seat, event->button); break; } } @@ -1245,7 +1245,7 @@ cursor_emulate_button(struct seat *seat, uint32_t button, if (notify) { wlr_seat_pointer_notify_button(seat->seat, time_msec, button, state); } - cursor_finish_button_release(seat); + cursor_finish_button_release(seat, button); break; } } diff --git a/src/input/tablet.c b/src/input/tablet.c index 617af8fd..9a72e6e5 100644 --- a/src/input/tablet.c +++ b/src/input/tablet.c @@ -516,7 +516,7 @@ handle_tablet_tool_tip(struct wl_listener *listener, void *data) wlr_tablet_v2_tablet_tool_notify_up(tool->tool_v2); } - bool exit_interactive = cursor_finish_button_release(tool->seat); + bool exit_interactive = cursor_finish_button_release(tool->seat, BTN_LEFT); if (exit_interactive && surface && tool->tool_v2->focused_surface) { /* * Re-enter the surface after a resize/move to ensure