[gtksourceview/wip/search] search: avoid flickering



commit 3e2f19eb57a4c460d848d0365a400e0da87b167d
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Thu Jun 20 19:10:10 2013 +0200

    search: avoid flickering

 gtksourceview/gtksourcesearch.c |   64 +++++++++++++++++++--------------------
 1 files changed, 31 insertions(+), 33 deletions(-)
---
diff --git a/gtksourceview/gtksourcesearch.c b/gtksourceview/gtksourcesearch.c
index 1b24ba0..3990929 100644
--- a/gtksourceview/gtksourcesearch.c
+++ b/gtksourceview/gtksourcesearch.c
@@ -200,9 +200,6 @@ get_first_subregion (GtkTextRegion *region,
 static void
 clear_search (GtkSourceSearch *search)
 {
-       GtkTextIter start;
-       GtkTextIter end;
-
        if (search->priv->region != NULL)
        {
                gtk_text_region_destroy (search->priv->region, TRUE);
@@ -221,13 +218,6 @@ clear_search (GtkSourceSearch *search)
                search->priv->idle_scan_id = 0;
        }
 
-       gtk_text_buffer_get_bounds (search->priv->buffer, &start, &end);
-
-       gtk_text_buffer_remove_tag (search->priv->buffer,
-                                   search->priv->found_tag,
-                                   &start,
-                                   &end);
-
        search->priv->occurrences_count = 0;
 }
 
@@ -245,8 +235,6 @@ highlight_subregion (GtkSourceSearch *search,
        text_tag_set_highest_priority (search->priv->found_tag,
                                       search->priv->buffer);
 
-       g_return_if_fail (search->priv->text_nb_lines > 0);
-
        if (!gtk_text_iter_starts_line (start))
        {
                gtk_text_iter_set_line_offset (start, 0);
@@ -257,8 +245,8 @@ highlight_subregion (GtkSourceSearch *search,
                gtk_text_iter_forward_to_line_end (end);
        }
 
-       gtk_text_iter_backward_lines (start, search->priv->text_nb_lines - 1);
-       gtk_text_iter_forward_lines (end, search->priv->text_nb_lines - 1);
+       gtk_text_iter_backward_lines (start, MAX (0, search->priv->text_nb_lines - 1));
+       gtk_text_iter_forward_lines (end, MAX (0, search->priv->text_nb_lines - 1));
 
        if (gtk_text_iter_has_tag (start, search->priv->found_tag) &&
            !gtk_text_iter_ends_tag (start, search->priv->found_tag))
@@ -282,6 +270,17 @@ highlight_subregion (GtkSourceSearch *search,
                                    start,
                                    end);
 
+       if (search->priv->region != NULL)
+       {
+               gtk_text_region_subtract (search->priv->region, start, end);
+       }
+
+       if (search->priv->text == NULL)
+       {
+               /* We have removed the found_tag, we are done. */
+               return;
+       }
+
        iter = *start;
 
        if (gtk_text_iter_is_end (end))
@@ -316,15 +315,6 @@ highlight_subregion (GtkSourceSearch *search,
                iter = match_end;
 
        } while (found);
-
-       if (search->priv->region != NULL)
-       {
-               gtk_text_region_subtract (search->priv->region, start, end);
-       }
-       else
-       {
-               g_warning ("search: region is NULL");
-       }
 }
 
 static void
@@ -413,6 +403,7 @@ idle_scan_cb (GtkSourceSearch *search)
        if (is_text_region_empty (search->priv->region))
        {
                finished = TRUE;
+               search->priv->idle_scan_id = 0;
 
                if (search->priv->region != NULL)
                {
@@ -441,7 +432,7 @@ add_subregion_to_scan (GtkSourceSearch *search,
        GtkTextIter start = *subregion_start;
        GtkTextIter end = *subregion_end;
 
-       if (is_text_region_empty (search->priv->region))
+       if (search->priv->region == NULL)
        {
                return;
        }
@@ -482,17 +473,16 @@ update (GtkSourceSearch *search)
 
        clear_search (search);
 
+       gtk_text_buffer_get_bounds (search->priv->buffer, &start, &end);
+
        if (search->priv->text == NULL)
        {
+               g_signal_emit_by_name (search->priv->buffer, "highlight-updated", &start, &end);
                return;
        }
 
        search->priv->region = gtk_text_region_new (search->priv->buffer);
-
-       gtk_text_buffer_get_bounds (search->priv->buffer, &start, &end);
        add_subregion_to_scan (search, &start, &end);
-
-       install_idle_scan (search);
 }
 
 static void
@@ -692,15 +682,22 @@ _gtk_source_search_update_highlight (GtkSourceSearch   *search,
        g_return_if_fail (start != NULL);
        g_return_if_fail (end != NULL);
 
-       if (dispose_has_run (search) ||
-           is_text_region_empty (search->priv->region))
+       if (dispose_has_run (search))
        {
                return;
        }
 
-       region_to_highlight = gtk_text_region_intersect (search->priv->region,
-                                                        start,
-                                                        end);
+       if (is_text_region_empty (search->priv->region))
+       {
+               region_to_highlight = gtk_text_region_new (search->priv->buffer);
+               gtk_text_region_add (region_to_highlight, start, end);
+       }
+       else
+       {
+               region_to_highlight = gtk_text_region_intersect (search->priv->region,
+                                                                start,
+                                                                end);
+       }
 
        if (region_to_highlight == NULL)
        {
@@ -725,6 +722,7 @@ _gtk_source_search_update_highlight (GtkSourceSearch   *search,
                }
 
                search->priv->high_priority_region = region_to_highlight;
+               install_idle_scan (search);
        }
 }
 


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