wayland: Avoid popup grab focus changes if there's an implicit grab

Event delivery with grabbing popups stay essentially the same within
the grabbing client, we still must honor the implicit grab as long as
there is one.

This is however not the case, the popup_grab_focus() function ignores
the button state. The popup_grab_button() function will already indirectly
re-sync the focus surface after the last button is released, so checking
for button state in popup_grab_focus() is sufficient to make the implicit
grab honored with popup grabs involved.

Fixes: https://gitlab.gnome.org/GNOME/mutter/-/issues/1275

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1270
This commit is contained in:
Carlos Garnacho 2020-05-27 11:03:26 +02:00 committed by Georges Basile Stavracas Neto
parent e5ea8f5483
commit 79050004b0

View File

@ -102,6 +102,7 @@ popup_grab_focus (MetaWaylandPointerGrab *grab,
{ {
MetaWaylandPopupGrab *popup_grab = (MetaWaylandPopupGrab*)grab; MetaWaylandPopupGrab *popup_grab = (MetaWaylandPopupGrab*)grab;
MetaWaylandSeat *seat = meta_wayland_pointer_get_seat (grab->pointer); MetaWaylandSeat *seat = meta_wayland_pointer_get_seat (grab->pointer);
MetaWaylandPointer *pointer = grab->pointer;
/* /*
* We rely on having a pointer grab even when the seat doesn't have * We rely on having a pointer grab even when the seat doesn't have
@ -112,6 +113,9 @@ popup_grab_focus (MetaWaylandPointerGrab *grab,
if (!meta_wayland_seat_has_pointer (seat)) if (!meta_wayland_seat_has_pointer (seat))
return; return;
if (pointer->button_count > 0)
return;
/* Popup grabs are in owner-events mode (ie, events for the same client /* Popup grabs are in owner-events mode (ie, events for the same client
are reported as normal) */ are reported as normal) */
if (surface && if (surface &&