aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm>2019-08-08 04:05:08 +0200
committerDrew DeVault <sir@cmpwn.com>2019-08-12 09:31:49 +0900
commit52037d13f7617bef8e0f2566cb4609646cf8cd8f (patch)
tree3bab56a3cad2019c8a2463ca762913535330012a
parent78d96009e47549ec6fe7df94011989ac19855c83 (diff)
wlr_xdg_popup: don't treat all surfaces of grabbing client as grabbing surfaces
Fixes #897
-rw-r--r--types/xdg_shell/wlr_xdg_popup.c21
-rw-r--r--types/xdg_shell_v6/wlr_xdg_popup_v6.c21
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;
}