[gtk+] API: cssprovider: Change parsing-error signal
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] API: cssprovider: Change parsing-error signal
- Date: Fri, 26 Aug 2011 14:35:57 +0000 (UTC)
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]