[gtksourceview] buffer: cache presence of draw-spaces-set tag



commit 9ee4eb95eb3d546aec0d382588f35cb4246033db
Author: Christian Hergert <chergert redhat com>
Date:   Wed Sep 4 20:23:08 2019 -0700

    buffer: cache presence of draw-spaces-set tag
    
    To avoid iterating the tag table during space drawing, we can cache if
    we've seen a tag with the draw-spaces-set field set. This can reduce a
    bit of work in the common case, which is space drawing solely based upon
    the matrix settings.

 gtksourceview/gtksourcebuffer-private.h |  5 +++
 gtksourceview/gtksourcebuffer.c         | 62 +++++++++++++++++++++++++++++++++
 gtksourceview/gtksourcespacedrawer.c    | 41 ++--------------------
 3 files changed, 69 insertions(+), 39 deletions(-)
---
diff --git a/gtksourceview/gtksourcebuffer-private.h b/gtksourceview/gtksourcebuffer-private.h
index 87c77970..5fcf12b9 100644
--- a/gtksourceview/gtksourcebuffer-private.h
+++ b/gtksourceview/gtksourcebuffer-private.h
@@ -22,8 +22,10 @@
 #define GTK_SOURCE_BUFFER_PRIVATE_H
 
 #include <gtk/gtk.h>
+
 #include "gtksourcetypes.h"
 #include "gtksourcetypes-private.h"
+#include "gtksourcebuffer.h"
 
 G_BEGIN_DECLS
 
@@ -83,6 +85,9 @@ gboolean               _gtk_source_buffer_is_undo_redo_enabled        (GtkSourceBuffer      
  *buff
 GTK_SOURCE_INTERNAL
 gboolean               _gtk_source_buffer_has_source_marks             (GtkSourceBuffer        *buffer);
 
+GTK_SOURCE_INTERNAL
+gboolean               _gtk_source_buffer_has_spaces_tag               (GtkSourceBuffer        *buffer);
+
 G_END_DECLS
 
 #endif /* GTK_SOURCE_BUFFER_PRIVATE_H */
diff --git a/gtksourceview/gtksourcebuffer.c b/gtksourceview/gtksourcebuffer.c
index 98670c5d..7be1f99a 100644
--- a/gtksourceview/gtksourcebuffer.c
+++ b/gtksourceview/gtksourcebuffer.c
@@ -216,6 +216,7 @@ struct _GtkSourceBufferPrivate
 
        GtkTextTag *invalid_char_tag;
 
+       guint has_draw_spaces_tag : 1;
        guint highlight_syntax : 1;
        guint highlight_brackets : 1;
        guint implicit_trailing_newline : 1;
@@ -269,10 +270,53 @@ static void        gtk_source_buffer_real_highlight_updated
                                                         GtkTextIter             *start,
                                                         GtkTextIter             *end);
 
+static void
+gtk_source_buffer_check_tag_for_spaces (GtkSourceBuffer *buffer,
+                                        GtkSourceTag    *tag)
+{
+       if (!buffer->priv->has_draw_spaces_tag)
+       {
+               gboolean draw_spaces_set;
+
+               g_object_get (tag,
+                             "draw-spaces-set", &draw_spaces_set,
+                             NULL);
+
+               if (draw_spaces_set)
+               {
+                       buffer->priv->has_draw_spaces_tag = TRUE;
+               }
+       }
+}
+
+static void
+gtk_source_buffer_tag_changed_cb (GtkTextTagTable *table,
+                                  GtkTextTag      *tag,
+                                  gboolean         size_changed,
+                                  GtkSourceBuffer *buffer)
+{
+       if (GTK_SOURCE_IS_TAG (tag))
+       {
+               gtk_source_buffer_check_tag_for_spaces (buffer, GTK_SOURCE_TAG (tag));
+       }
+}
+
+static void
+gtk_source_buffer_tag_added_cb (GtkTextTagTable *table,
+                                GtkTextTag      *tag,
+                                GtkSourceBuffer *buffer)
+{
+       if (GTK_SOURCE_IS_TAG (tag))
+       {
+               gtk_source_buffer_check_tag_for_spaces (buffer, GTK_SOURCE_TAG (tag));
+       }
+}
+
 static void
 gtk_source_buffer_constructed (GObject *object)
 {
        GtkSourceBuffer *buffer = GTK_SOURCE_BUFFER (object);
+       GtkTextTagTable *table;
 
        if (buffer->priv->undo_manager == NULL)
        {
@@ -281,6 +325,16 @@ gtk_source_buffer_constructed (GObject *object)
        }
 
        G_OBJECT_CLASS (gtk_source_buffer_parent_class)->constructed (object);
+
+       table = gtk_text_buffer_get_tag_table (GTK_TEXT_BUFFER (buffer));
+       g_signal_connect_object (table,
+                                "tag-changed",
+                                G_CALLBACK (gtk_source_buffer_tag_changed_cb),
+                                buffer, 0);
+       g_signal_connect_object (table,
+                                "tag-added",
+                                G_CALLBACK (gtk_source_buffer_tag_added_cb),
+                                buffer, 0);
 }
 
 static void
@@ -3349,3 +3403,11 @@ gtk_source_buffer_create_source_tag (GtkSourceBuffer *buffer,
 
        return tag;
 }
+
+gboolean
+_gtk_source_buffer_has_spaces_tag (GtkSourceBuffer *buffer)
+{
+       g_return_val_if_fail (GTK_SOURCE_IS_BUFFER (buffer), FALSE);
+
+       return buffer->priv->has_draw_spaces_tag;
+}
diff --git a/gtksourceview/gtksourcespacedrawer.c b/gtksourceview/gtksourcespacedrawer.c
index 62c87c4d..f6b1cf7d 100644
--- a/gtksourceview/gtksourcespacedrawer.c
+++ b/gtksourceview/gtksourcespacedrawer.c
@@ -30,6 +30,7 @@
 #include "gtksourcespacedrawer.h"
 #include "gtksourcespacedrawer-private.h"
 #include "gtksourcebuffer.h"
+#include "gtksourcebuffer-private.h"
 #include "gtksourceiter.h"
 #include "gtksourcestylescheme.h"
 #include "gtksourcetag.h"
@@ -957,44 +958,6 @@ draw_whitespace_at_iter (GtkTextView *text_view,
        }
 }
 
-static void
-draw_spaces_tag_foreach (GtkTextTag *tag,
-                        gboolean   *found)
-{
-       if (*found)
-       {
-               return;
-       }
-
-       if (GTK_SOURCE_IS_TAG (tag))
-       {
-               gboolean draw_spaces_set;
-
-               g_object_get (tag,
-                             "draw-spaces-set", &draw_spaces_set,
-                             NULL);
-
-               if (draw_spaces_set)
-               {
-                       *found = TRUE;
-               }
-       }
-}
-
-static gboolean
-buffer_has_draw_spaces_tag (GtkTextBuffer *buffer)
-{
-       GtkTextTagTable *table;
-       gboolean found = FALSE;
-
-       table = gtk_text_buffer_get_tag_table (buffer);
-       gtk_text_tag_table_foreach (table,
-                                   (GtkTextTagTableForeach) draw_spaces_tag_foreach,
-                                   &found);
-
-       return found;
-}
-
 static void
 space_needs_drawing_according_to_tag (const GtkTextIter *iter,
                                      gboolean          *has_tag,
@@ -1224,7 +1187,7 @@ _gtk_source_space_drawer_draw (GtkSourceSpaceDrawer *drawer,
        buffer = gtk_text_view_get_buffer (text_view);
 
        if ((!drawer->priv->enable_matrix || is_zero_matrix (drawer)) &&
-           !buffer_has_draw_spaces_tag (buffer))
+           !_gtk_source_buffer_has_spaces_tag (GTK_SOURCE_BUFFER (buffer)))
        {
                return;
        }


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