[gtk/gsk-binding-api] gsk: Avoid using gtk css types in public api




commit f13891120dcf1438ffeaaaf481080666639a0c53
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Nov 16 22:21:27 2020 -0500

    gsk: Avoid using gtk css types in public api
    
    Using GtkCssSection in public headers here may be
    ok from the C perspective, since it all ends up in
    the same library anyway. But it causes circular
    dependency problems for our gir files that are still
    split by namespace.
    
    To avoid this problem, copy the GtkCssLocation struct
    struct as GskParseLocation, and pass take two of them
    instead of a GtkCssSection in the error callback.
    
    Update all users.
    
    Fixes: #2454

 demos/node-editor/node-editor-window.c |  9 ++++-----
 gsk/gskrendernode.h                    | 23 ++++++++++++++++++-----
 gsk/gskrendernodeparser.c              | 10 ++++------
 tests/showrendernode.c                 | 23 +++++++++++++++++------
 testsuite/gsk/node-parser.c            | 25 ++++++++++++++++---------
 5 files changed, 59 insertions(+), 31 deletions(-)
---
diff --git a/demos/node-editor/node-editor-window.c b/demos/node-editor/node-editor-window.c
index 73cf2b06ec..ff536d60ca 100644
--- a/demos/node-editor/node-editor-window.c
+++ b/demos/node-editor/node-editor-window.c
@@ -102,12 +102,11 @@ text_buffer_remove_all_tags (GtkTextBuffer *buffer)
 }
 
 static void
-deserialize_error_func (const GtkCssSection *section,
-                        const GError        *error,
-                        gpointer             user_data)
+deserialize_error_func (const GskParseLocation *start_location,
+                        const GskParseLocation *end_location,
+                        const GError           *error,
+                        gpointer                user_data)
 {
-  const GtkCssLocation *start_location = gtk_css_section_get_start_location (section);
-  const GtkCssLocation *end_location = gtk_css_section_get_end_location (section);
   NodeEditorWindow *self = user_data;
   GtkTextIter start_iter, end_iter;
   TextViewError text_view_error;
diff --git a/gsk/gskrendernode.h b/gsk/gskrendernode.h
index dd655d3b35..683bf5d9ff 100644
--- a/gsk/gskrendernode.h
+++ b/gsk/gskrendernode.h
@@ -54,18 +54,31 @@ struct _GskShadow
   float radius;
 };
 
+typedef struct _GskParseLocation GskParseLocation;
+
+struct _GskParseLocation
+{
+  gsize bytes;
+  gsize chars;
+  gsize lines;
+  gsize line_bytes;
+  gsize line_chars;
+};
+
 /**
  * GskParseErrorFunc:
- * @section: the #GtkCssSection where the error occurred
- * @error:  the error
+ * @start: start of the error location
+ * @end: end of the error location
+ * @error: the error
  * @user_data: user data
  *
  * The type of callback that is called when a parse error occurs
  * during deserialization of node data.
  */
-typedef void           (* GskParseErrorFunc)                    (const GtkCssSection *section,
-                                                                 const GError        *error,
-                                                                 gpointer             user_data);
+typedef void           (* GskParseErrorFunc)                    (const GskParseLocation *start,
+                                                                 const GskParseLocation *end,
+                                                                 const GError           *error,
+                                                                 gpointer                user_data);
 
 GDK_AVAILABLE_IN_ALL
 GType                   gsk_render_node_get_type                (void) G_GNUC_CONST;
diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c
index 320f74a13c..2be0a55393 100644
--- a/gsk/gskrendernodeparser.c
+++ b/gsk/gskrendernodeparser.c
@@ -1859,12 +1859,10 @@ gsk_render_node_parser_error (GtkCssParser         *parser,
   } *error_func_pair = user_data;
 
   if (error_func_pair->error_func)
-    {
-      GtkCssSection *section = gtk_css_section_new (gtk_css_parser_get_file (parser), start, end);
-
-      error_func_pair->error_func (section, error, error_func_pair->user_data);
-      gtk_css_section_unref (section);
-    }
+    error_func_pair->error_func ((const GskParseLocation *)start,
+                                 (const GskParseLocation *)end,
+                                 error,
+                                 error_func_pair->user_data);
 }
 
 GskRenderNode *
diff --git a/tests/showrendernode.c b/tests/showrendernode.c
index 92bc6d40eb..5fafd3c00e 100644
--- a/tests/showrendernode.c
+++ b/tests/showrendernode.c
@@ -102,15 +102,26 @@ gtk_node_view_class_init (GtkNodeViewClass *klass)
 }
 
 static void
-deserialize_error_func (const GtkCssSection *section,
-                        const GError        *error,
-                        gpointer             user_data)
+deserialize_error_func (const GskParseLocation *start,
+                        const GskParseLocation *end,
+                        const GError           *error,
+                        gpointer                user_data)
 {
-  char *section_str = gtk_css_section_to_string (section);
+  GString *string = g_string_new ("<data>");
 
-  g_warning ("Error at %s: %s", section_str, error->message);
+  g_string_append_printf (string, ":%zu:%zu",
+                          start->lines + 1, start->line_chars + 1);
+  if (start->lines != end->lines || start->line_chars != end->line_chars)
+    {
+      g_string_append (string, "-");
+      if (start->lines != end->lines)
+        g_string_append_printf (string, "%zu:", end->lines + 1);
+      g_string_append_printf (string, "%zu", end->line_chars + 1);
+    }
+
+  g_warning ("Error at %s: %s", string->str, error->message);
 
-  g_free (section_str);
+  g_string_free (string, TRUE);
 }
 
 static void
diff --git a/testsuite/gsk/node-parser.c b/testsuite/gsk/node-parser.c
index cd3c930461..e7cf97887e 100644
--- a/testsuite/gsk/node-parser.c
+++ b/testsuite/gsk/node-parser.c
@@ -122,19 +122,26 @@ append_error_value (GString *string,
 }
 
 static void
-deserialize_error_func (const GtkCssSection *section,
-                        const GError        *error,
-                        gpointer             user_data)
+deserialize_error_func (const GskParseLocation *start,
+                        const GskParseLocation *end,
+                        const GError           *error,
+                        gpointer                user_data)
 {
   GString *errors = user_data;
-  char *section_string;
+  GString *string = g_string_new ("<data>");
 
-  section_string = gtk_css_section_to_string (section);
+  g_string_append_printf (string, ":%zu:%zu",
+                          start->lines + 1, start->line_chars + 1);
+  if (start->lines != end->lines || start->line_chars != end->line_chars)
+    {
+      g_string_append (string, "-");
+      if (start->lines != end->lines)
+        g_string_append_printf (string, "%zu:", end->lines + 1);
+      g_string_append_printf (string, "%zu", end->line_chars + 1);
+    }
 
-  g_string_append_printf (errors,
-                          "%s: error: ",
-                          section_string);
-  g_free (section_string);
+  g_string_append_printf (errors, "%s: error: ", string->str);
+  g_string_free (string, TRUE);
 
   if (error->domain == GTK_CSS_PARSER_ERROR)
     append_error_value (errors, GTK_TYPE_CSS_PARSER_ERROR, error->code);


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