From e00f7cd6db3445304027828b549aa0f873a03bcf Mon Sep 17 00:00:00 2001 From: tokyo4j Date: Fri, 8 Mar 2024 00:53:39 +0900 Subject: [PATCH] view: validate move/resize request from clients Move/resize requests from xwayland views and xdg toplevels should be ignored when the view is not pressed. This is relevant for touchpad taps with disabled. When the user taps the client surface (e.g. chromium and mpv) with the setting above, libinput sends button press & release signals so quickly that the compositor receives move/resize request from the client AFTER the button release signal is processed, so `interactive_finish()` is never called. --- include/labwc.h | 4 ++++ src/xdg.c | 8 ++++++-- src/xwayland.c | 8 ++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/include/labwc.h b/include/labwc.h index 38fd5c9f..0510cff2 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -135,6 +135,10 @@ struct seat { * This allows to keep dragging a scrollbar or selecting text even * when moving outside of the window. * + * It is also used to: + * - determine the target view for action in "Drag" mousebind + * - validate view move/resize requests from CSD clients + * * Both (view && !surface) and (surface && !view) are possible. */ struct { diff --git a/src/xdg.c b/src/xdg.c index a2de7f53..8a9d2d52 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -241,7 +241,9 @@ handle_request_move(struct wl_listener *listener, void *data) * want. */ struct view *view = wl_container_of(listener, view, request_move); - interactive_begin(view, LAB_INPUT_STATE_MOVE, 0); + if (view == view->server->seat.pressed.view) { + interactive_begin(view, LAB_INPUT_STATE_MOVE, 0); + } } static void @@ -257,7 +259,9 @@ handle_request_resize(struct wl_listener *listener, void *data) */ struct wlr_xdg_toplevel_resize_event *event = data; struct view *view = wl_container_of(listener, view, request_resize); - interactive_begin(view, LAB_INPUT_STATE_RESIZE, event->edges); + if (view == view->server->seat.pressed.view) { + interactive_begin(view, LAB_INPUT_STATE_RESIZE, event->edges); + } } static void diff --git a/src/xwayland.c b/src/xwayland.c index 85e57f29..398de0c2 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -228,7 +228,9 @@ handle_request_move(struct wl_listener *listener, void *data) * want. */ struct view *view = wl_container_of(listener, view, request_move); - interactive_begin(view, LAB_INPUT_STATE_MOVE, 0); + if (view == view->server->seat.pressed.view) { + interactive_begin(view, LAB_INPUT_STATE_MOVE, 0); + } } static void @@ -244,7 +246,9 @@ handle_request_resize(struct wl_listener *listener, void *data) */ struct wlr_xwayland_resize_event *event = data; struct view *view = wl_container_of(listener, view, request_resize); - interactive_begin(view, LAB_INPUT_STATE_RESIZE, event->edges); + if (view == view->server->seat.pressed.view) { + interactive_begin(view, LAB_INPUT_STATE_RESIZE, event->edges); + } } static void