[gtksourceview] gutter: avoid connecting to GtkWidget::draw()
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtksourceview] gutter: avoid connecting to GtkWidget::draw()
- Date: Mon, 18 Apr 2016 22:43:27 +0000 (UTC)
commit 774145422cf57035202d44b4dc49bece783ec287
Author: Christian Hergert <christian hergert me>
Date: Mon Apr 18 15:06:39 2016 -0700
gutter: avoid connecting to GtkWidget::draw()
By connecting to the GtkWidget::draw signal, GtkSourceGutter was preventing
GtkWidget to take the fast path by avoiding signal emission. (See
gtkwidget.c for how it checks for pending signal handlers).
This instead adds a private draw function in the gutter that is called by
the view during the render case.
I've verified that this allows test-widget to hit the fast path in
gtkwidget.c.
gtksourceview/gtksourcegutter-private.h | 6 ++++++
gtksourceview/gtksourcegutter.c | 22 +++++-----------------
gtksourceview/gtksourceview.c | 11 +++++++++++
3 files changed, 22 insertions(+), 17 deletions(-)
---
diff --git a/gtksourceview/gtksourcegutter-private.h b/gtksourceview/gtksourcegutter-private.h
index 7868948..460e38e 100644
--- a/gtksourceview/gtksourcegutter-private.h
+++ b/gtksourceview/gtksourcegutter-private.h
@@ -31,6 +31,12 @@ G_GNUC_INTERNAL
GtkSourceGutter *gtk_source_gutter_new (GtkSourceView *view,
GtkTextWindowType type);
+G_GNUC_INTERNAL
+void gtk_source_gutter_draw (GtkSourceGutter *gutter,
+ GtkSourceView *view,
+ cairo_t *cr);
+
+
G_END_DECLS
#endif /* __GTK_SOURCE_GUTTER_PRIVATE_H__ */
diff --git a/gtksourceview/gtksourcegutter.c b/gtksourceview/gtksourcegutter.c
index f60fbca..e21e1a3 100644
--- a/gtksourceview/gtksourcegutter.c
+++ b/gtksourceview/gtksourcegutter.c
@@ -93,10 +93,6 @@ struct _GtkSourceGutterPrivate
G_DEFINE_TYPE_WITH_PRIVATE (GtkSourceGutter, gtk_source_gutter, G_TYPE_OBJECT)
-static gboolean on_view_draw (GtkSourceView *view,
- cairo_t *cr,
- GtkSourceGutter *gutter);
-
static gboolean on_view_motion_notify_event (GtkSourceView *view,
GdkEventMotion *event,
GtkSourceGutter *gutter);
@@ -294,12 +290,6 @@ set_view (GtkSourceGutter *gutter,
gutter->priv->view = view;
g_signal_connect_object (view,
- "draw",
- G_CALLBACK (on_view_draw),
- gutter,
- G_CONNECT_AFTER);
-
- g_signal_connect_object (view,
"motion-notify-event",
G_CALLBACK (on_view_motion_notify_event),
gutter,
@@ -1220,10 +1210,10 @@ end_draw (GtkSourceGutter *gutter)
}
}
-static gboolean
-on_view_draw (GtkSourceView *view,
- cairo_t *cr,
- GtkSourceGutter *gutter)
+void
+gtk_source_gutter_draw (GtkSourceGutter *gutter,
+ GtkSourceView *view,
+ cairo_t *cr)
{
GdkRectangle clip;
GtkTextView *text_view;
@@ -1237,7 +1227,7 @@ on_view_draw (GtkSourceView *view,
if (!get_clip_rectangle (gutter, view, cr, &clip))
{
- return GDK_EVENT_PROPAGATE;
+ return;
}
gutter->priv->is_drawing = TRUE;
@@ -1294,8 +1284,6 @@ on_view_draw (GtkSourceView *view,
g_array_free (renderer_widths, TRUE);
lines_info_free (info);
-
- return GDK_EVENT_PROPAGATE;
}
static Renderer *
diff --git a/gtksourceview/gtksourceview.c b/gtksourceview/gtksourceview.c
index 0b87993..2e716f1 100644
--- a/gtksourceview/gtksourceview.c
+++ b/gtksourceview/gtksourceview.c
@@ -3006,6 +3006,7 @@ static gboolean
gtk_source_view_draw (GtkWidget *widget,
cairo_t *cr)
{
+ GtkSourceView *view = (GtkSourceView *)widget;
gboolean event_handled;
#ifdef ENABLE_PROFILE
@@ -3024,6 +3025,16 @@ gtk_source_view_draw (GtkWidget *widget,
event_handled = GTK_WIDGET_CLASS (gtk_source_view_parent_class)->draw (widget, cr);
+ if (view->priv->left_gutter != NULL)
+ {
+ gtk_source_gutter_draw (view->priv->left_gutter, view, cr);
+ }
+
+ if (view->priv->right_gutter != NULL)
+ {
+ gtk_source_gutter_draw (view->priv->right_gutter, view, cr);
+ }
+
PROFILE ({
g_timer_stop (timer);
g_print (" gtk_source_view_draw time: %g (sec * 1000)\n",
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]