[gtk/wip/chergert/spellcheck: 37/40] textregion: allow breaking foreach early




commit 5e3f1ee42acfa30d3e47af8747869ce564ef8993
Author: Christian Hergert <chergert redhat com>
Date:   Mon Mar 29 20:44:58 2021 -0700

    textregion: allow breaking foreach early

 gtk/gtktextregion.c        |  6 ++++--
 gtk/gtktextregionprivate.h | 16 +++++++++++++---
 testsuite/gtk/textregion.c | 15 +++++++++++----
 3 files changed, 28 insertions(+), 9 deletions(-)
---
diff --git a/gtk/gtktextregion.c b/gtk/gtktextregion.c
index af32a5cc5d..100b6ea105 100644
--- a/gtk/gtktextregion.c
+++ b/gtk/gtktextregion.c
@@ -1234,7 +1234,8 @@ _gtk_text_region_foreach (GtkTextRegion            *region,
       g_assert (leaf->leaf.next == NULL || leaf->leaf.next->leaf.prev == leaf);
 
       SORTED_ARRAY_FOREACH (&leaf->leaf.runs, GtkTextRegionRun, run, {
-        func (offset, run, user_data);
+        if (func (offset, run, user_data))
+          return;
         offset += run->length;
       });
     }
@@ -1279,7 +1280,8 @@ _gtk_text_region_foreach_in_range (GtkTextRegion            *region,
         else
           {
             offset_within_node = 0;
-            func (position, run, user_data);
+            if (func (position, run, user_data))
+              return;
           }
 
         position += run->length;
diff --git a/gtk/gtktextregionprivate.h b/gtk/gtktextregionprivate.h
index e4868cea66..d8365e4115 100644
--- a/gtk/gtktextregionprivate.h
+++ b/gtk/gtktextregionprivate.h
@@ -33,9 +33,19 @@ typedef struct _GtkTextRegionRun
   gpointer data;
 } GtkTextRegionRun;
 
-typedef void (*GtkTextRegionForeachFunc)   (gsize                   offset,
-                                            const GtkTextRegionRun *run,
-                                            gpointer                user_data);
+/*
+ * GtkTextRegionForeachFunc:
+ * @offset: the offset in characters within the text region
+ * @run: the run of text and data pointer
+ * @user_data: user data supplied
+ *
+ * Function callback to iterate through runs within a text region.
+ *
+ * Returns: %FALSE to coninue iteration, otherwise %TRUE to stop.
+ */
+typedef gboolean (*GtkTextRegionForeachFunc) (gsize                   offset,
+                                              const GtkTextRegionRun *run,
+                                              gpointer                user_data);
 
 /*
  * GtkTextRegionJoinFunc:
diff --git a/testsuite/gtk/textregion.c b/testsuite/gtk/textregion.c
index ab5f4221ab..f2474b316e 100644
--- a/testsuite/gtk/textregion.c
+++ b/testsuite/gtk/textregion.c
@@ -98,12 +98,13 @@ assert_empty (GtkTextRegion *region)
   g_assert_cmpint (1, ==, count_leaves (region));
 }
 
-static void
+static gboolean
 non_overlapping_insert_remove_cb (gsize                   offset,
                                   const GtkTextRegionRun *run,
                                   gpointer                user_data)
 {
   g_assert_cmpint (offset, ==, GPOINTER_TO_UINT (run->data));
+  return FALSE;
 }
 
 static void
@@ -145,7 +146,7 @@ typedef struct {
   const SplitRunCheck *checks;
 } SplitRun;
 
-static void
+static gboolean
 split_run_cb (gsize                   offset,
               const GtkTextRegionRun *run,
               gpointer                user_data)
@@ -155,6 +156,8 @@ split_run_cb (gsize                   offset,
   g_assert_cmpint (run->length, ==, state->checks[state->index].length);
   g_assert_true (run->data == state->checks[state->index].data);
   state->index++;
+
+  return FALSE;
 }
 
 static void
@@ -463,7 +466,7 @@ typedef struct
   GString *res;
 } wordstate;
 
-static void
+static gboolean
 word_foreach_cb (gsize                   offset,
                  const GtkTextRegionRun *run,
                  gpointer                data)
@@ -485,6 +488,8 @@ word_foreach_cb (gsize                   offset,
 #endif
 
   g_string_append_len (state->res, src + soff, run->length);
+
+  return FALSE;
 }
 
 static gboolean
@@ -564,7 +569,7 @@ test_words_database (void)
   _gtk_text_region_free (region);
 }
 
-static void
+static gboolean
 foreach_cb (gsize                   offset,
             const GtkTextRegionRun *run,
             gpointer                user_data)
@@ -573,6 +578,8 @@ foreach_cb (gsize                   offset,
 
   g_assert_cmpint (GPOINTER_TO_SIZE (run->data), ==, offset);
   (*count)++;
+
+  return FALSE;
 }
 
 static void


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