From 52037d13f7617bef8e0f2566cb4609646cf8cd8f Mon Sep 17 00:00:00 2001 From: Sebastian Krzyszkowiak Date: Thu, 8 Aug 2019 04:05:08 +0200 Subject: wlr_xdg_popup: don't treat all surfaces of grabbing client as grabbing surfaces Fixes #897 --- types/xdg_shell/wlr_xdg_popup.c | 21 +++++++++++++++++++-- types/xdg_shell_v6/wlr_xdg_popup_v6.c | 21 +++++++++++++++++++-- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/types/xdg_shell/wlr_xdg_popup.c b/types/xdg_shell/wlr_xdg_popup.c index fd608a95..3589e5cb 100644 --- a/types/xdg_shell/wlr_xdg_popup.c +++ b/types/xdg_shell/wlr_xdg_popup.c @@ -18,7 +18,16 @@ static void xdg_popup_grab_end(struct wlr_xdg_popup_grab *popup_grab) { static void xdg_pointer_grab_enter(struct wlr_seat_pointer_grab *grab, struct wlr_surface *surface, double sx, double sy) { struct wlr_xdg_popup_grab *popup_grab = grab->data; - if (wl_resource_get_client(surface->resource) == popup_grab->client) { + + bool grabbing = false; + struct wlr_xdg_popup *popup; + wl_list_for_each(popup, &popup_grab->popups, grab_link) { + if (surface == popup->base->surface) { + grabbing = true; + } + } + + if (grabbing) { wlr_seat_pointer_enter(grab->seat, surface, sx, sy); } else { wlr_seat_pointer_clear_focus(grab->seat); @@ -97,7 +106,15 @@ static uint32_t xdg_touch_grab_down(struct wlr_seat_touch_grab *grab, uint32_t time, struct wlr_touch_point *point) { struct wlr_xdg_popup_grab *popup_grab = grab->data; - if (wl_resource_get_client(point->surface->resource) != popup_grab->client) { + bool grabbing = false; + struct wlr_xdg_popup *popup; + wl_list_for_each(popup, &popup_grab->popups, grab_link) { + if (point->surface == popup->base->surface) { + grabbing = true; + } + } + + if (!grabbing) { xdg_popup_grab_end(grab->data); return 0; } diff --git a/types/xdg_shell_v6/wlr_xdg_popup_v6.c b/types/xdg_shell_v6/wlr_xdg_popup_v6.c index 7d3e06fc..76371ae4 100644 --- a/types/xdg_shell_v6/wlr_xdg_popup_v6.c +++ b/types/xdg_shell_v6/wlr_xdg_popup_v6.c @@ -28,7 +28,16 @@ static void xdg_popup_grab_end(struct wlr_xdg_popup_grab_v6 *popup_grab) { static void xdg_pointer_grab_enter(struct wlr_seat_pointer_grab *grab, struct wlr_surface *surface, double sx, double sy) { struct wlr_xdg_popup_grab_v6 *popup_grab = grab->data; - if (wl_resource_get_client(surface->resource) == popup_grab->client) { + + bool grabbing = false; + struct wlr_xdg_popup_v6 *popup; + wl_list_for_each(popup, &popup_grab->popups, grab_link) { + if (surface == popup->base->surface) { + grabbing = true; + } + } + + if (grabbing) { wlr_seat_pointer_enter(grab->seat, surface, sx, sy); } else { wlr_seat_pointer_clear_focus(grab->seat); @@ -107,7 +116,15 @@ static uint32_t xdg_touch_grab_down(struct wlr_seat_touch_grab *grab, uint32_t time, struct wlr_touch_point *point) { struct wlr_xdg_popup_grab_v6 *popup_grab = grab->data; - if (wl_resource_get_client(point->surface->resource) != popup_grab->client) { + bool grabbing = false; + struct wlr_xdg_popup_v6 *popup; + wl_list_for_each(popup, &popup_grab->popups, grab_link) { + if (point->surface == popup->base->surface) { + grabbing = true; + } + } + + if (!grabbing) { xdg_popup_grab_end(grab->data); return 0; } -- cgit v1.2.3