From d5d508415148994905c89320f4f6e655d2368c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Wed, 21 Sep 2016 13:41:11 +0800 Subject: [PATCH] wayland/pointer: Check pointer presence at set focus call site Make the caller of focus setting check whether there is a pointer to update the focus state of. It makes it more obvious what to expect, as the call would be a no-op in when no pointer is present. Grabbing is still allowed without the presence of a pointer because it is used by popups even on touch-only systems. https://bugzilla.gnome.org/show_bug.cgi?id=771646 --- src/wayland/meta-wayland-pointer.c | 8 +++----- src/wayland/meta-wayland-popup.c | 10 ++++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c index 1d8ddd383..60df63529 100644 --- a/src/wayland/meta-wayland-pointer.c +++ b/src/wayland/meta-wayland-pointer.c @@ -416,11 +416,13 @@ default_grab_focus (MetaWaylandPointerGrab *grab, MetaWaylandSurface *surface) { MetaWaylandPointer *pointer = grab->pointer; + MetaWaylandSeat *seat = meta_wayland_pointer_get_seat (pointer); if (pointer->button_count > 0) return; - meta_wayland_pointer_set_focus (pointer, surface); + if (meta_wayland_seat_has_pointer (seat)) + meta_wayland_pointer_set_focus (pointer, surface); } static void @@ -794,10 +796,6 @@ meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer, MetaWaylandSurface *surface) { MetaWaylandInputDevice *input_device = META_WAYLAND_INPUT_DEVICE (pointer); - MetaWaylandSeat *seat = meta_wayland_pointer_get_seat (pointer); - - if (!meta_wayland_seat_has_pointer (seat)) - return; if (pointer->focus_surface == surface) return; diff --git a/src/wayland/meta-wayland-popup.c b/src/wayland/meta-wayland-popup.c index c89b878d7..f9141dd06 100644 --- a/src/wayland/meta-wayland-popup.c +++ b/src/wayland/meta-wayland-popup.c @@ -101,6 +101,16 @@ popup_grab_focus (MetaWaylandPointerGrab *grab, MetaWaylandSurface *surface) { MetaWaylandPopupGrab *popup_grab = (MetaWaylandPopupGrab*)grab; + MetaWaylandSeat *seat = meta_wayland_pointer_get_seat (grab->pointer); + + /* + * We rely on having a pointer grab even when the seat doesn't have + * the pointer capability. In this case, we shouldn't update any pointer focus + * since there is no such thing when the seat doesn't have the pointer + * capability. + */ + if (!meta_wayland_seat_has_pointer (seat)) + return; /* Popup grabs are in owner-events mode (ie, events for the same client are reported as normal) */