From dd9425e3bf65d942c5b74bd4b19abc66d1e856d6 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 204f60e3..df80267b 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