[gtk/wip/chergert/fix-wayland-glitching] gdk/wayland: freeze popups when hidden




commit 524d507035b104f51feae7ec48e4e83bc4a8f171
Author: Christian Hergert <chergert redhat com>
Date:   Wed Mar 23 17:00:21 2022 -0700

    gdk/wayland: freeze popups when hidden
    
    Previously, there was an issue with glitching after showing/hiding a
    popover that was not also destroyed. This was due to the popover having
    an update_freeze_count of zero after hiding the surface.
    
    That resulted in it's toplevel continuously dropping frames such as during
    high-frame-rate scrolling in textviews. This problem is much more visible
    on high-frame-rate displays such as 120hz/144hz.
    
    With this commit, we track the POPUP_STATE_IDLE case and also freeze the
    frame clock of the popup until it is mapped again.

 gdk/wayland/gdksurface-wayland.c | 9 +++++++++
 1 file changed, 9 insertions(+)
---
diff --git a/gdk/wayland/gdksurface-wayland.c b/gdk/wayland/gdksurface-wayland.c
index 09328bdb89..acf24da73f 100644
--- a/gdk/wayland/gdksurface-wayland.c
+++ b/gdk/wayland/gdksurface-wayland.c
@@ -113,6 +113,7 @@ struct _GdkWaylandSurface
 
   PopupState popup_state;
 
+  unsigned int popup_thaw_upon_show : 1;
   unsigned int initial_configure_received : 1;
   unsigned int has_uncommitted_ack_configure : 1;
   unsigned int mapped : 1;
@@ -2994,6 +2995,8 @@ gdk_wayland_surface_hide_surface (GdkSurface *surface)
               thaw_popup_toplevel_state (surface);
               break;
             case POPUP_STATE_IDLE:
+              impl->popup_thaw_upon_show = TRUE;
+              gdk_surface_freeze_updates (surface);
               break;
             default:
               g_assert_not_reached ();
@@ -3223,6 +3226,12 @@ show_popup (GdkSurface     *surface,
   if (!impl->display_server.wl_surface)
     gdk_wayland_surface_create_surface (surface);
 
+  if (impl->popup_thaw_upon_show)
+    {
+      impl->popup_thaw_upon_show = FALSE;
+      gdk_surface_thaw_updates (surface);
+    }
+
   gdk_wayland_surface_map_popup (surface, width, height, layout);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]