wayland/popup: Handle late received reposition feedback
authorJonas Ådahl <jadahl@gmail.com>
Mon, 27 Mar 2023 19:27:44 +0000 (21:27 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 1 Apr 2023 00:21:28 +0000 (20:21 -0400)
If we map, reposition, unmap, remap, the reposition feedback from the
last time a popup was mapped might be received while we're dealing with
the new version of the popup. At this point, the old reposition token
has no meating, so lets drop it. Also reset the reposition tokens when
creating new protocol objects, so that the reposition token are as if
we're in the initial state.

This fixes an issue where we'd get stuck if repeatedly smashing a button
that'd create popups that'd immediately get dismissed by the compositor.

gdk/wayland/gdkpopup-wayland.c

index a79670aef28c7a2d066cc0ea91324681f01e5297..38a498eb4faf19af4bfe21cbc8454ea5143e5301 100644 (file)
@@ -398,7 +398,11 @@ gdk_wayland_popup_handle_configure (GdkWaylandSurface *wayland_surface)
     g_warn_if_reached ();
 
   if (wayland_popup->pending.has_repositioned_token)
-    wayland_popup->received_reposition_token = wayland_popup->pending.repositioned_token;
+    {
+      wayland_popup->received_reposition_token =
+        wayland_popup->pending.repositioned_token;
+      wayland_popup->pending.has_repositioned_token = FALSE;
+    }
 
   switch (wayland_popup->state)
     {
@@ -968,6 +972,9 @@ gdk_wayland_surface_create_xdg_popup (GdkWaylandPopup *wayland_popup,
       g_assert_not_reached ();
     }
 
+  wayland_popup->received_reposition_token = 0;
+  wayland_popup->reposition_token = 0;
+
   gdk_popup_layout_get_shadow_width (layout,
                                      &impl->shadow_left,
                                      &impl->shadow_right,