[gtk: 12/88] frame-clock: Add 'compute-size' phase




commit e07fde5c81d9421a2479e92fa41a81e49aaab31e
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Tue Nov 24 15:02:35 2020 +0100

    frame-clock: Add 'compute-size' phase
    
    This will be handled between 'update' (which may trigger animation
    ticks, CSS update, etc) and 'layout' which will allocate the widget
    tree. It's meant to perform surface size computation, and is done
    between these two phases in order to have an up to date state, and
    letting the layout phase have an up to date size to layout in.

 gdk/gdkframeclock.c        | 28 ++++++++++++++++++++++++++++
 gdk/gdkframeclock.h        | 10 ++++++----
 gdk/gdkframeclockidle.c    | 12 ++++++++++++
 gdk/gdkframeclockprivate.h |  1 +
 4 files changed, 47 insertions(+), 4 deletions(-)
---
diff --git a/gdk/gdkframeclock.c b/gdk/gdkframeclock.c
index 5e4492744c..15efa30afe 100644
--- a/gdk/gdkframeclock.c
+++ b/gdk/gdkframeclock.c
@@ -78,6 +78,7 @@ enum {
   FLUSH_EVENTS,
   BEFORE_PAINT,
   UPDATE,
+  COMPUTE_SIZE,
   LAYOUT,
   PAINT,
   AFTER_PAINT,
@@ -184,6 +185,21 @@ gdk_frame_clock_class_init (GdkFrameClockClass *klass)
                   NULL, NULL, NULL,
                   G_TYPE_NONE, 0);
 
+  /**
+   * GdkFrameClock::compute-size:
+   * @clock: the frame clock emitting the signal
+   *
+   * This signal is used for computing the size of the underlying
+   * #GdkSurface. Applications should generally not handle this signal.
+   */
+  signals[COMPUTE_SIZE] =
+    g_signal_new (g_intern_static_string ("compute-size"),
+                  GDK_TYPE_FRAME_CLOCK,
+                  G_SIGNAL_RUN_LAST,
+                  0,
+                  NULL, NULL, NULL,
+                  G_TYPE_NONE, 0);
+
   /**
    * GdkFrameClock::layout:
    * @clock: the frame clock emitting the signal
@@ -682,6 +698,18 @@ _gdk_frame_clock_emit_update (GdkFrameClock *frame_clock)
   gdk_profiler_end_mark (before, "frameclock update", NULL);
 }
 
+void
+_gdk_frame_clock_emit_compute_size (GdkFrameClock *frame_clock)
+{
+  gint64 before G_GNUC_UNUSED;
+
+  before = GDK_PROFILER_CURRENT_TIME;
+
+  g_signal_emit (frame_clock, signals[COMPUTE_SIZE], 0);
+
+  gdk_profiler_end_mark (before, "frameclock compute size", NULL);
+}
+
 void
 _gdk_frame_clock_emit_layout (GdkFrameClock *frame_clock)
 {
diff --git a/gdk/gdkframeclock.h b/gdk/gdkframeclock.h
index a2eba246ad..dfe0c23747 100644
--- a/gdk/gdkframeclock.h
+++ b/gdk/gdkframeclock.h
@@ -50,6 +50,7 @@ typedef struct _GdkFrameClockClass         GdkFrameClockClass;
  * @GDK_FRAME_CLOCK_PHASE_FLUSH_EVENTS: corresponds to GdkFrameClock::flush-events. Should not be handled by 
applications.
  * @GDK_FRAME_CLOCK_PHASE_BEFORE_PAINT: corresponds to GdkFrameClock::before-paint. Should not be handled by 
applications.
  * @GDK_FRAME_CLOCK_PHASE_UPDATE: corresponds to GdkFrameClock::update.
+ * @GDK_FRAME_CLOCK_PHASE_COMPUTE_SIZE: corresponds to GdkFrameClock::compute-size. Should not be handled by 
applications.
  * @GDK_FRAME_CLOCK_PHASE_LAYOUT: corresponds to GdkFrameClock::layout.
  * @GDK_FRAME_CLOCK_PHASE_PAINT: corresponds to GdkFrameClock::paint.
  * @GDK_FRAME_CLOCK_PHASE_RESUME_EVENTS: corresponds to GdkFrameClock::resume-events. Should not be handled 
by applications.
@@ -64,10 +65,11 @@ typedef enum {
   GDK_FRAME_CLOCK_PHASE_FLUSH_EVENTS  = 1 << 0,
   GDK_FRAME_CLOCK_PHASE_BEFORE_PAINT  = 1 << 1,
   GDK_FRAME_CLOCK_PHASE_UPDATE        = 1 << 2,
-  GDK_FRAME_CLOCK_PHASE_LAYOUT        = 1 << 3,
-  GDK_FRAME_CLOCK_PHASE_PAINT         = 1 << 4,
-  GDK_FRAME_CLOCK_PHASE_RESUME_EVENTS = 1 << 5,
-  GDK_FRAME_CLOCK_PHASE_AFTER_PAINT   = 1 << 6
+  GDK_FRAME_CLOCK_PHASE_COMPUTE_SIZE  = 1 << 3,
+  GDK_FRAME_CLOCK_PHASE_LAYOUT        = 1 << 4,
+  GDK_FRAME_CLOCK_PHASE_PAINT         = 1 << 5,
+  GDK_FRAME_CLOCK_PHASE_RESUME_EVENTS = 1 << 6,
+  GDK_FRAME_CLOCK_PHASE_AFTER_PAINT   = 1 << 7
 } GdkFrameClockPhase;
 
 GDK_AVAILABLE_IN_ALL
diff --git a/gdk/gdkframeclockidle.c b/gdk/gdkframeclockidle.c
index 4870a110a6..ac69aba627 100644
--- a/gdk/gdkframeclockidle.c
+++ b/gdk/gdkframeclockidle.c
@@ -552,6 +552,18 @@ gdk_frame_clock_paint_idle (void *data)
             }
           G_GNUC_FALLTHROUGH;
 
+        case GDK_FRAME_CLOCK_PHASE_COMPUTE_SIZE:
+          if (priv->freeze_count == 0)
+            {
+              priv->phase = GDK_FRAME_CLOCK_PHASE_COMPUTE_SIZE;
+              if ((priv->requested & GDK_FRAME_CLOCK_PHASE_COMPUTE_SIZE) != 0)
+                {
+                  priv->requested &= ~GDK_FRAME_CLOCK_PHASE_COMPUTE_SIZE;
+                  _gdk_frame_clock_emit_compute_size (clock);
+                }
+            }
+          G_GNUC_FALLTHROUGH;
+
         case GDK_FRAME_CLOCK_PHASE_LAYOUT:
           if (priv->freeze_count == 0)
             {
diff --git a/gdk/gdkframeclockprivate.h b/gdk/gdkframeclockprivate.h
index 010aa4564f..a68bc85da8 100644
--- a/gdk/gdkframeclockprivate.h
+++ b/gdk/gdkframeclockprivate.h
@@ -122,6 +122,7 @@ gboolean         _gdk_frame_timings_steal (GdkFrameTimings *timings,
 void _gdk_frame_clock_emit_flush_events  (GdkFrameClock *frame_clock);
 void _gdk_frame_clock_emit_before_paint  (GdkFrameClock *frame_clock);
 void _gdk_frame_clock_emit_update        (GdkFrameClock *frame_clock);
+void _gdk_frame_clock_emit_compute_size  (GdkFrameClock *frame_clock);
 void _gdk_frame_clock_emit_layout        (GdkFrameClock *frame_clock);
 void _gdk_frame_clock_emit_paint         (GdkFrameClock *frame_clock);
 void _gdk_frame_clock_emit_after_paint   (GdkFrameClock *frame_clock);


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