summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Hergert <chergert@redhat.com>2022-03-23 17:00:21 -0700
committerMatthias Clasen <mclasen@redhat.com>2022-05-11 16:32:17 -0400
commitf737131d27dc3d5f4c4bf9c55866aba5b91e325b (patch)
treed718875a8d3042567ebea41b300579156921a723
parentf54c1537750e35f7bef365c6b87a65123ab2fa13 (diff)
downloadgtk+-f737131d27dc3d5f4c4bf9c55866aba5b91e325b.tar.gz
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 freeze the frame clock of the popup until it is mapped again.
-rw-r--r--gdk/wayland/gdksurface-wayland.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/gdk/wayland/gdksurface-wayland.c b/gdk/wayland/gdksurface-wayland.c
index 09328bdb89..0b3315075e 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;
@@ -2984,6 +2985,9 @@ gdk_wayland_surface_hide_surface (GdkSurface *surface)
if (GDK_IS_POPUP (surface))
{
+ impl->popup_thaw_upon_show = TRUE;
+ gdk_surface_freeze_updates (surface);
+
switch (impl->popup_state)
{
case POPUP_STATE_WAITING_FOR_REPOSITIONED:
@@ -3223,6 +3227,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);
}