macos: be more careful about freezing/thawing surfaces
authorChristian Hergert <christian@hergert.me>
Wed, 2 Feb 2022 00:06:08 +0000 (16:06 -0800)
committerChristian Hergert <christian@hergert.me>
Fri, 4 Feb 2022 03:26:16 +0000 (19:26 -0800)
We need to avoid conflating the managing of frame callbacks from
the freeze/thaw mechanics and ensure we don't perform extra thaw
requests at the wrong time.

gdk/macos/gdkmacosdisplay.c
gdk/macos/gdkmacossurface-private.h
gdk/macos/gdkmacossurface.c

index 5866e03b5e7b450609d9af77008563c1ba9f8b67..657fb57558e8a2f81fe0bf4d3b7e6cd945acd109 100644 (file)
@@ -301,10 +301,14 @@ gdk_macos_display_frame_cb (gpointer data)
 
       iter = iter->next;
 
+      _gdk_macos_surface_publish_timings (surface,
+                                          source->presentation_time,
+                                          source->refresh_interval);
+
       _gdk_macos_display_remove_frame_callback (self, surface);
-      _gdk_macos_surface_thaw (surface,
-                               source->presentation_time,
-                               source->refresh_interval);
+
+      if (GDK_SURFACE_IS_MAPPED (GDK_SURFACE (surface)))
+        gdk_surface_thaw_updates (GDK_SURFACE (surface));
     }
 
   return G_SOURCE_CONTINUE;
@@ -993,8 +997,6 @@ _gdk_macos_display_add_frame_callback (GdkMacosDisplay *self,
        */
       g_queue_push_head_link (&self->awaiting_frames, &surface->frame);
 
-      gdk_surface_freeze_updates (GDK_SURFACE (surface));
-
       if (self->awaiting_frames.length == 1)
         gdk_display_link_source_unpause ((GdkDisplayLinkSource *)self->frame_source);
     }
index e65505f8a918af7f8a477e5ce855e25be42435e4..ccb8a8317951461a60c047bdb75de9a4e6d3a4c1 100644 (file)
@@ -104,7 +104,7 @@ void               _gdk_macos_surface_resize                  (GdkMacosSurface
 void               _gdk_macos_surface_update_fullscreen_state (GdkMacosSurface    *self);
 void               _gdk_macos_surface_update_position         (GdkMacosSurface    *self);
 void               _gdk_macos_surface_show                    (GdkMacosSurface    *self);
-void               _gdk_macos_surface_thaw                    (GdkMacosSurface    *self,
+void               _gdk_macos_surface_publish_timings         (GdkMacosSurface    *self,
                                                                gint64              predicted_presentation_time,
                                                                gint64              refresh_interval);
 CGContextRef       _gdk_macos_surface_acquire_context         (GdkMacosSurface    *self,
index 19a4453212223ad2a209b77d4981f0b2ce119c41..6374f84e006e6472d10cd6026b1831044d86e358 100644 (file)
@@ -125,6 +125,8 @@ gdk_macos_surface_hide (GdkSurface *surface)
 
   g_assert (GDK_IS_MACOS_SURFACE (self));
 
+  _gdk_macos_display_remove_frame_callback (GDK_MACOS_DISPLAY (surface->display), self);
+
   was_mapped = GDK_SURFACE_IS_MAPPED (GDK_SURFACE (self));
 
   seat = gdk_display_get_default_seat (surface->display);
@@ -199,7 +201,11 @@ gdk_macos_surface_end_frame (GdkMacosSurface *self)
   if ((timings = gdk_frame_clock_get_current_timings (frame_clock)))
     self->pending_frame_counter = timings->frame_counter;
 
-  _gdk_macos_display_add_frame_callback (GDK_MACOS_DISPLAY (display), self);
+  if (GDK_SURFACE_IS_MAPPED (GDK_SURFACE (self)))
+    {
+      _gdk_macos_display_add_frame_callback (GDK_MACOS_DISPLAY (display), self);
+      gdk_surface_freeze_updates (GDK_SURFACE (self));
+    }
 }
 
 static void
@@ -718,17 +724,15 @@ _gdk_macos_surface_update_position (GdkMacosSurface *self)
 }
 
 void
-_gdk_macos_surface_thaw (GdkMacosSurface *self,
-                         gint64           presentation_time,
-                         gint64           refresh_interval)
+_gdk_macos_surface_publish_timings (GdkMacosSurface *self,
+                                    gint64           presentation_time,
+                                    gint64           refresh_interval)
 {
   GdkFrameTimings *timings;
   GdkFrameClock *frame_clock;
 
   g_return_if_fail (GDK_IS_MACOS_SURFACE (self));
 
-  gdk_surface_thaw_updates (GDK_SURFACE (self));
-
   if (!(frame_clock = gdk_surface_get_frame_clock (GDK_SURFACE (self))))
     return;