[gtksourceview/gnome-3-20] gutter: avoid connecting to GtkWidget::draw()



commit af4a5b59da348e19914c8acb8340940e75a8c273
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]