[gtk+/wip/baedert/progressbar: 13/14] frameclock: add _gdk_frame_clock_set_paint_callback
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/baedert/progressbar: 13/14] frameclock: add _gdk_frame_clock_set_paint_callback
- Date: Tue, 25 Apr 2017 11:09:18 +0000 (UTC)
commit 9467139930ba2d6dce87b2387df47a4b927774d3
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]