[gtk+] API: cssprovider: Change parsing-error signal



commit 26e9d0771848e6a7ff510dd1819788781968edaa
Author: Benjamin Otte <otte redhat com>
Date:   Fri Jun 17 07:39:11 2011 +0200

    API: cssprovider: Change parsing-error signal
    
    Instead of path, line and position, emit the section the error happened
    in. This has a lot more information to consume.

 gtk/gtkcssprovider.c               |  122 ++++++++++++++++++-----------------
 gtk/gtkcssprovider.h               |    5 +-
 gtk/gtkcsssection.c                |   17 +++++
 gtk/gtkcsssectionprivate.h         |    2 +
 gtk/gtkmarshalers.list             |    1 -
 tests/css/parser/test-css-parser.c |   15 ++---
 tests/testboxcss.c                 |   17 +++---
 7 files changed, 98 insertions(+), 81 deletions(-)
---
diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c
index 996fe9d..dd73322 100644
--- a/gtk/gtkcssprovider.c
+++ b/gtk/gtkcssprovider.c
@@ -1036,10 +1036,8 @@ G_DEFINE_TYPE_EXTENDED (GtkCssProvider, gtk_css_provider, G_TYPE_OBJECT, 0,
 
 static void
 gtk_css_provider_parsing_error (GtkCssProvider  *provider,
-                                const gchar     *path,
-                                guint            line,
-                                guint            position,
-                                const GError *   error)
+                                GtkCssSection   *section,
+                                const GError    *error)
 {
   /* Only emit a warning when we have no error handlers. This is our
    * default handlers. And in this case erroneous CSS files are a bug
@@ -1052,7 +1050,34 @@ gtk_css_provider_parsing_error (GtkCssProvider  *provider,
                                      0,
                                      TRUE))
     {
-      g_warning ("Theme parsing error: %s:%u:%u: %s", path ? path : "<unknown>", line, position, error->message);
+      GFileInfo *info;
+      GFile *file;
+      const char *path;
+
+      file = gtk_css_section_get_file (section);
+      if (file)
+        {
+          GFileInfo *info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME, 0, NULL, NULL);
+
+          if (info)
+            path = g_file_info_get_display_name (info);
+          else
+            path = "<broken file>";
+        }
+      else
+        {
+          info = NULL;
+          path = "<data>";
+        }
+
+      g_warning ("Theme parsing error: %s:%u:%u: %s",
+                 path,
+                 gtk_css_section_get_end_line (section) + 1,
+                 gtk_css_section_get_end_position (section),
+                 error->message);
+
+      if (info)
+        g_object_unref (info);
     }
 }
 
@@ -1064,11 +1089,7 @@ gtk_css_provider_class_init (GtkCssProviderClass *klass)
   /**
    * GtkCssProvider::parsing-error:
    * @provider: the provider that had a parsing error
-   * @path: path to the parsed file or %NULL if the file cannot be
-   *   identified or the data was not loaded from a file
-   * @line: line in the file or data or 0 if unknown
-   * @position: offset into the current line or 0 if unknown or the
-   *   whole line is affected
+   * @section: section the error happened in
    * @error: The parsing error
    *
    * Signals that a parsing error occured. the @path, @line and @position
@@ -1089,9 +1110,8 @@ gtk_css_provider_class_init (GtkCssProviderClass *klass)
                   G_SIGNAL_RUN_LAST,
                   G_STRUCT_OFFSET (GtkCssProviderClass, parsing_error),
                   NULL, NULL,
-                  _gtk_marshal_VOID__STRING_UINT_UINT_BOXED,
-                  G_TYPE_NONE, 4,
-                  G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_ERROR);
+                  _gtk_marshal_VOID__BOXED_BOXED,
+                  G_TYPE_NONE, 2, GTK_TYPE_CSS_SECTION, G_TYPE_ERROR);
 
   object_class->finalize = gtk_css_provider_finalize;
 
@@ -1101,27 +1121,6 @@ gtk_css_provider_class_init (GtkCssProviderClass *klass)
 }
 
 static void
-gtk_css_provider_take_error_full (GtkCssProvider *provider,
-                                  GFile          *file,
-                                  guint           line,
-                                  guint           position,
-                                  GError         *error)
-{
-  char *filename;
-
-  if (file)
-    filename = g_file_get_path (file);
-  else
-    filename = NULL;
-
-  g_signal_emit (provider, css_provider_signals[PARSING_ERROR], 0,
-                 filename, line, position, error);
-
-  g_free (filename);
-  g_error_free (error);
-}
-
-static void
 gtk_css_ruleset_init_copy (GtkCssRuleset       *new,
                            const GtkCssRuleset *ruleset,
                            GtkCssSelector      *selector)
@@ -1249,17 +1248,24 @@ gtk_css_scanner_destroy (GtkCssScanner *scanner)
 }
 
 static void
+gtk_css_provider_emit_error (GtkCssProvider *provider,
+                             GtkCssScanner  *scanner,
+                             const GError   *error)
+{
+  g_signal_emit (provider, css_provider_signals[PARSING_ERROR], 0,
+                 scanner->section, error);
+}
+
+static void
 gtk_css_scanner_parser_error (GtkCssParser *parser,
                               const GError *error,
                               gpointer      user_data)
 {
   GtkCssScanner *scanner = user_data;
 
-  gtk_css_provider_take_error_full (scanner->provider,
-                                    scanner->file,
-                                    _gtk_css_parser_get_line (scanner->parser),
-                                    _gtk_css_parser_get_position (scanner->parser),
-                                    g_error_copy (error));
+  gtk_css_provider_emit_error (scanner->provider,
+                               scanner,
+                               error);
 }
 
 static GtkCssScanner *
@@ -1559,11 +1565,11 @@ gtk_css_provider_take_error (GtkCssProvider *provider,
                              GtkCssScanner  *scanner,
                              GError         *error)
 {
-  gtk_css_provider_take_error_full (provider,
-                                    scanner->file,
-                                    _gtk_css_parser_get_line (scanner->parser),
-                                    _gtk_css_parser_get_position (scanner->parser),
-                                    error);
+  gtk_css_provider_emit_error (scanner->provider,
+                               scanner,
+                               error);
+
+  g_error_free (error);
 }
 
 static void
@@ -2512,23 +2518,21 @@ gtk_css_provider_load_internal (GtkCssProvider *css_provider,
         }
       else
         {
+          GtkCssSection *section;
+          
           if (parent)
-            {
-              gtk_css_provider_error (css_provider,
-                                      parent,
-                                      GTK_CSS_PROVIDER_ERROR,
-                                      GTK_CSS_PROVIDER_ERROR_IMPORT,
-                                      "Failed to import: %s",
-                                      load_error->message);
-              g_error_free (load_error);
-            }
+            section = gtk_css_section_ref (parent->section);
           else
-            {
-              gtk_css_provider_take_error_full (css_provider,
-                                                file,
-                                                0, 0,
-                                                load_error);
-            }
+            section = _gtk_css_section_new_for_file (GTK_CSS_SECTION_DOCUMENT, file);
+
+          gtk_css_provider_error (css_provider,
+                                  parent,
+                                  GTK_CSS_PROVIDER_ERROR,
+                                  GTK_CSS_PROVIDER_ERROR_IMPORT,
+                                  "Failed to import: %s",
+                                  load_error->message);
+
+          gtk_css_section_unref (section);
         }
     }
 
diff --git a/gtk/gtkcssprovider.h b/gtk/gtkcssprovider.h
index a9c7fdf..e1d0cfa 100644
--- a/gtk/gtkcssprovider.h
+++ b/gtk/gtkcssprovider.h
@@ -21,6 +21,7 @@
 #define __GTK_CSS_PROVIDER_H__
 
 #include <gio/gio.h>
+#include <gtk/gtkcsssection.h>
 
 G_BEGIN_DECLS
 
@@ -60,9 +61,7 @@ struct _GtkCssProviderClass
   GObjectClass parent_class;
 
   void (* parsing_error)                        (GtkCssProvider  *provider,
-                                                 const gchar     *path,
-                                                 guint            line,
-                                                 guint            position,
+                                                 GtkCssSection   *section,
                                                  const GError *   error);
 
   /* Padding for future expansion */
diff --git a/gtk/gtkcsssection.c b/gtk/gtkcsssection.c
index 4b1d0e5..a33e3b4 100644
--- a/gtk/gtkcsssection.c
+++ b/gtk/gtkcsssection.c
@@ -74,6 +74,23 @@ _gtk_css_section_new (GtkCssSection     *parent,
   return section;
 }
 
+GtkCssSection *
+_gtk_css_section_new_for_file (GtkCssSectionType  type,
+                               GFile             *file)
+{
+  GtkCssSection *section;
+
+  g_return_val_if_fail (G_IS_FILE (file), NULL);
+
+  section = g_slice_new0 (GtkCssSection);
+
+  section->ref_count = 1;
+  section->section_type = type;
+  section->file = g_object_ref (file);
+
+  return section;
+}
+
 void
 _gtk_css_section_end (GtkCssSection *section)
 {
diff --git a/gtk/gtkcsssectionprivate.h b/gtk/gtkcsssectionprivate.h
index 776fd5d..ba70414 100644
--- a/gtk/gtkcsssectionprivate.h
+++ b/gtk/gtkcsssectionprivate.h
@@ -30,6 +30,8 @@ GtkCssSection *    _gtk_css_section_new                (GtkCssSection        *pa
                                                         GtkCssSectionType     type,
                                                         GtkCssParser         *parser,
                                                         GFile                *file);
+GtkCssSection *    _gtk_css_section_new_for_file       (GtkCssSectionType     type,
+                                                        GFile                *file);
 
 void               _gtk_css_section_end                (GtkCssSection        *section);
 
diff --git a/gtk/gtkmarshalers.list b/gtk/gtkmarshalers.list
index 7961149..fa60a7c 100644
--- a/gtk/gtkmarshalers.list
+++ b/gtk/gtkmarshalers.list
@@ -108,7 +108,6 @@ VOID:STRING,STRING,STRING
 VOID:STRING,INT,POINTER
 VOID:STRING,UINT,FLAGS
 VOID:STRING,UINT,FLAGS,UINT
-VOID:STRING,UINT,UINT,BOXED
 VOID:UINT,FLAGS,BOXED
 VOID:UINT,UINT
 VOID:UINT,STRING
diff --git a/tests/css/parser/test-css-parser.c b/tests/css/parser/test-css-parser.c
index 8d4fcd0..60f77de 100644
--- a/tests/css/parser/test-css-parser.c
+++ b/tests/css/parser/test-css-parser.c
@@ -134,21 +134,16 @@ append_error_value (GString *string,
 
 static void
 parsing_error_cb (GtkCssProvider *provider,
-                  const gchar     *path,
-                  guint            line,
-                  guint            position,
-                  const GError *   error,
-                  GString *        errors)
+                  GtkCssSection  *section,
+                  const GError   *error,
+                  GString        *errors)
 {
   char *basename;
 
-  g_assert (path);
-  g_assert (line > 0);
-
-  basename = g_path_get_basename (path);
+  basename = g_file_get_basename (gtk_css_section_get_file (section));
   g_string_append_printf (errors,
                           "%s:%u: error: ",
-                          basename, line + 1);
+                          basename, gtk_css_section_get_end_line (section) + 1);
   g_free (basename);
                           
   if (error->domain == GTK_CSS_PROVIDER_ERROR)
diff --git a/tests/testboxcss.c b/tests/testboxcss.c
index 2ae081b..17d576e 100644
--- a/tests/testboxcss.c
+++ b/tests/testboxcss.c
@@ -49,20 +49,21 @@
 
 static void
 show_parsing_error (GtkCssProvider *provider,
-                    const gchar    *path,
-                    guint           line,
-                    guint           position,
+                    GtkCssSection  *section,
                     const GError   *error,
                     GtkTextBuffer  *buffer)
 {
   GtkTextIter start, end;
   const char *tag_name;
 
-  gtk_text_buffer_get_iter_at_line (buffer, &start, line - 1);
-  if (gtk_text_buffer_get_line_count (buffer) <= line)
-    gtk_text_buffer_get_end_iter (buffer, &end);
-  else
-    gtk_text_buffer_get_iter_at_line (buffer, &end, line);
+  gtk_text_buffer_get_iter_at_line_index (buffer,
+                                          &start,
+                                          gtk_css_section_get_start_line (section),
+                                          gtk_css_section_get_start_position (section));
+  gtk_text_buffer_get_iter_at_line_index (buffer,
+                                          &end,
+                                          gtk_css_section_get_end_line (section),
+                                          gtk_css_section_get_end_position (section));
 
   if (g_error_matches (error, GTK_CSS_PROVIDER_ERROR, GTK_CSS_PROVIDER_ERROR_DEPRECATED))
     tag_name = "warning";



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