[gtk+/wip/baedert/progressbar] frameclock: add _gdk_frame_clock_set_paint_callback



commit 242f0caa28a0a704a1457edde221670fbc26aa77
Author: Timm Bäder <mail baedert org>
Date:   Tue Apr 25 08:43:56 2017 +0200

    frameclock: add _gdk_frame_clock_set_paint_callback
    
    For use in GdkWindow instead of connecting to GdkFrameClock::paint.
    This way we can get rid of signal emissions during every paint and the
    stack trace looks much nicer in sysprof.

 gdk/gdkframeclock.c        |   22 +++++++++++++++++++++-
 gdk/gdkframeclockprivate.h |    7 +++++++
 gdk/gdkwindow.c            |   12 +++++-------
 3 files changed, 33 insertions(+), 8 deletions(-)
---
diff --git a/gdk/gdkframeclock.c b/gdk/gdkframeclock.c
index 8083682..93a50ed 100644
--- a/gdk/gdkframeclock.c
+++ b/gdk/gdkframeclock.c
@@ -88,6 +88,9 @@ struct _GdkFrameClockPrivate
   gint n_timings;
   gint current;
   GdkFrameTimings *timings[FRAME_HISTORY_MAX_LENGTH];
+
+  GdkFrameClockPaintFunc paint_func;
+  gpointer               paint_data;
 };
 
 G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GdkFrameClock, gdk_frame_clock, G_TYPE_OBJECT)
@@ -637,7 +640,13 @@ _gdk_frame_clock_emit_layout (GdkFrameClock *frame_clock)
 void
 _gdk_frame_clock_emit_paint (GdkFrameClock *frame_clock)
 {
-  g_signal_emit (frame_clock, signals[PAINT], 0);
+  GdkFrameClockPrivate *priv = gdk_frame_clock_get_instance_private (frame_clock);
+
+  if (priv->paint_func)
+    (*priv->paint_func) (frame_clock, priv->paint_data);
+
+  if (g_signal_has_handler_pending (frame_clock, signals[PAINT], 0, FALSE))
+    g_signal_emit (frame_clock, signals[PAINT], 0);
 }
 
 void
@@ -651,3 +660,14 @@ _gdk_frame_clock_emit_resume_events (GdkFrameClock *frame_clock)
 {
   g_signal_emit (frame_clock, signals[RESUME_EVENTS], 0);
 }
+
+void
+_gdk_frame_clock_set_paint_callback (GdkFrameClock          *frame_clock,
+                                     GdkFrameClockPaintFunc  func,
+                                     gpointer                user_data)
+{
+  GdkFrameClockPrivate *priv = gdk_frame_clock_get_instance_private (frame_clock);
+
+  priv->paint_func = func;
+  priv->paint_data = user_data;
+}
diff --git a/gdk/gdkframeclockprivate.h b/gdk/gdkframeclockprivate.h
index 17e06df..c516de7 100644
--- a/gdk/gdkframeclockprivate.h
+++ b/gdk/gdkframeclockprivate.h
@@ -104,6 +104,9 @@ struct _GdkFrameTimings
   guint slept_before : 1;
 };
 
+typedef void (* GdkFrameClockPaintFunc) (GdkFrameClock *frame_clock,
+                                         gpointer       user_data);
+
 void _gdk_frame_clock_freeze (GdkFrameClock *clock);
 void _gdk_frame_clock_thaw   (GdkFrameClock *clock);
 
@@ -123,6 +126,10 @@ void _gdk_frame_clock_emit_paint         (GdkFrameClock *frame_clock);
 void _gdk_frame_clock_emit_after_paint   (GdkFrameClock *frame_clock);
 void _gdk_frame_clock_emit_resume_events (GdkFrameClock *frame_clock);
 
+void _gdk_frame_clock_set_paint_callback (GdkFrameClock          *frame_clock,
+                                          GdkFrameClockPaintFunc  callback,
+                                          gpointer                callback_data);
+
 G_END_DECLS
 
 #endif /* __GDK_FRAME_CLOCK_PRIVATE_H__ */
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index 59d21d4..bdf5ccd 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -42,6 +42,7 @@
 #include "gdkglcontextprivate.h"
 #include "gdkdrawingcontextprivate.h"
 #include "gdk-private.h"
+#include "gdkframeclockprivate.h"
 
 #include <math.h>
 
@@ -9108,13 +9109,10 @@ gdk_window_set_frame_clock (GdkWindow     *window,
                         G_CALLBACK (gdk_window_flush_events),
                         window);
       g_signal_connect (G_OBJECT (clock),
-                        "paint",
-                        G_CALLBACK (gdk_window_paint_on_clock),
-                        window);
-      g_signal_connect (G_OBJECT (clock),
                         "resume-events",
                         G_CALLBACK (gdk_window_resume_events),
                         window);
+      _gdk_frame_clock_set_paint_callback (clock, gdk_window_paint_on_clock, window);
     }
 
   if (window->frame_clock)
@@ -9126,11 +9124,11 @@ gdk_window_set_frame_clock (GdkWindow     *window,
                                             G_CALLBACK (gdk_window_flush_events),
                                             window);
       g_signal_handlers_disconnect_by_func (G_OBJECT (window->frame_clock),
-                                            G_CALLBACK (gdk_window_paint_on_clock),
-                                            window);
-      g_signal_handlers_disconnect_by_func (G_OBJECT (window->frame_clock),
                                             G_CALLBACK (gdk_window_resume_events),
                                             window);
+
+      _gdk_frame_clock_set_paint_callback (window->frame_clock, NULL, NULL);
+
       g_object_unref (window->frame_clock);
     }
 


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