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.
This commit is contained in:
Benjamin Otte
2011-06-17 07:39:11 +02:00
parent 8d6b560ff3
commit 26e9d07718
7 changed files with 98 additions and 81 deletions

View File

@ -1036,10 +1036,8 @@ G_DEFINE_TYPE_EXTENDED (GtkCssProvider, gtk_css_provider, G_TYPE_OBJECT, 0,
static void static void
gtk_css_provider_parsing_error (GtkCssProvider *provider, gtk_css_provider_parsing_error (GtkCssProvider *provider,
const gchar *path, GtkCssSection *section,
guint line, const GError *error)
guint position,
const GError * error)
{ {
/* Only emit a warning when we have no error handlers. This is our /* 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 * default handlers. And in this case erroneous CSS files are a bug
@ -1052,7 +1050,34 @@ gtk_css_provider_parsing_error (GtkCssProvider *provider,
0, 0,
TRUE)) 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: * GtkCssProvider::parsing-error:
* @provider: the provider that had a parsing error * @provider: the provider that had a parsing error
* @path: path to the parsed file or %NULL if the file cannot be * @section: section the error happened in
* 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
* @error: The parsing error * @error: The parsing error
* *
* Signals that a parsing error occured. the @path, @line and @position * 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_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GtkCssProviderClass, parsing_error), G_STRUCT_OFFSET (GtkCssProviderClass, parsing_error),
NULL, NULL, NULL, NULL,
_gtk_marshal_VOID__STRING_UINT_UINT_BOXED, _gtk_marshal_VOID__BOXED_BOXED,
G_TYPE_NONE, 4, G_TYPE_NONE, 2, GTK_TYPE_CSS_SECTION, G_TYPE_ERROR);
G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_ERROR);
object_class->finalize = gtk_css_provider_finalize; object_class->finalize = gtk_css_provider_finalize;
@ -1100,27 +1120,6 @@ gtk_css_provider_class_init (GtkCssProviderClass *klass)
g_type_class_add_private (object_class, sizeof (GtkCssProviderPrivate)); g_type_class_add_private (object_class, sizeof (GtkCssProviderPrivate));
} }
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 static void
gtk_css_ruleset_init_copy (GtkCssRuleset *new, gtk_css_ruleset_init_copy (GtkCssRuleset *new,
const GtkCssRuleset *ruleset, const GtkCssRuleset *ruleset,
@ -1248,6 +1247,15 @@ gtk_css_scanner_destroy (GtkCssScanner *scanner)
g_slice_free (GtkCssScanner, scanner); g_slice_free (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 static void
gtk_css_scanner_parser_error (GtkCssParser *parser, gtk_css_scanner_parser_error (GtkCssParser *parser,
const GError *error, const GError *error,
@ -1255,11 +1263,9 @@ gtk_css_scanner_parser_error (GtkCssParser *parser,
{ {
GtkCssScanner *scanner = user_data; GtkCssScanner *scanner = user_data;
gtk_css_provider_take_error_full (scanner->provider, gtk_css_provider_emit_error (scanner->provider,
scanner->file, scanner,
_gtk_css_parser_get_line (scanner->parser), error);
_gtk_css_parser_get_position (scanner->parser),
g_error_copy (error));
} }
static GtkCssScanner * static GtkCssScanner *
@ -1559,11 +1565,11 @@ gtk_css_provider_take_error (GtkCssProvider *provider,
GtkCssScanner *scanner, GtkCssScanner *scanner,
GError *error) GError *error)
{ {
gtk_css_provider_take_error_full (provider, gtk_css_provider_emit_error (scanner->provider,
scanner->file, scanner,
_gtk_css_parser_get_line (scanner->parser), error);
_gtk_css_parser_get_position (scanner->parser),
error); g_error_free (error);
} }
static void static void
@ -2512,23 +2518,21 @@ gtk_css_provider_load_internal (GtkCssProvider *css_provider,
} }
else else
{ {
GtkCssSection *section;
if (parent) if (parent)
{ section = gtk_css_section_ref (parent->section);
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);
}
else else
{ section = _gtk_css_section_new_for_file (GTK_CSS_SECTION_DOCUMENT, file);
gtk_css_provider_take_error_full (css_provider,
file, gtk_css_provider_error (css_provider,
0, 0, parent,
load_error); GTK_CSS_PROVIDER_ERROR,
} GTK_CSS_PROVIDER_ERROR_IMPORT,
"Failed to import: %s",
load_error->message);
gtk_css_section_unref (section);
} }
} }

View File

@ -21,6 +21,7 @@
#define __GTK_CSS_PROVIDER_H__ #define __GTK_CSS_PROVIDER_H__
#include <gio/gio.h> #include <gio/gio.h>
#include <gtk/gtkcsssection.h>
G_BEGIN_DECLS G_BEGIN_DECLS
@ -60,9 +61,7 @@ struct _GtkCssProviderClass
GObjectClass parent_class; GObjectClass parent_class;
void (* parsing_error) (GtkCssProvider *provider, void (* parsing_error) (GtkCssProvider *provider,
const gchar *path, GtkCssSection *section,
guint line,
guint position,
const GError * error); const GError * error);
/* Padding for future expansion */ /* Padding for future expansion */

View File

@ -74,6 +74,23 @@ _gtk_css_section_new (GtkCssSection *parent,
return section; 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 void
_gtk_css_section_end (GtkCssSection *section) _gtk_css_section_end (GtkCssSection *section)
{ {

View File

@ -30,6 +30,8 @@ GtkCssSection * _gtk_css_section_new (GtkCssSection *pa
GtkCssSectionType type, GtkCssSectionType type,
GtkCssParser *parser, GtkCssParser *parser,
GFile *file); GFile *file);
GtkCssSection * _gtk_css_section_new_for_file (GtkCssSectionType type,
GFile *file);
void _gtk_css_section_end (GtkCssSection *section); void _gtk_css_section_end (GtkCssSection *section);

View File

@ -108,7 +108,6 @@ VOID:STRING,STRING,STRING
VOID:STRING,INT,POINTER VOID:STRING,INT,POINTER
VOID:STRING,UINT,FLAGS VOID:STRING,UINT,FLAGS
VOID:STRING,UINT,FLAGS,UINT VOID:STRING,UINT,FLAGS,UINT
VOID:STRING,UINT,UINT,BOXED
VOID:UINT,FLAGS,BOXED VOID:UINT,FLAGS,BOXED
VOID:UINT,UINT VOID:UINT,UINT
VOID:UINT,STRING VOID:UINT,STRING

View File

@ -134,21 +134,16 @@ append_error_value (GString *string,
static void static void
parsing_error_cb (GtkCssProvider *provider, parsing_error_cb (GtkCssProvider *provider,
const gchar *path, GtkCssSection *section,
guint line, const GError *error,
guint position, GString *errors)
const GError * error,
GString * errors)
{ {
char *basename; char *basename;
g_assert (path); basename = g_file_get_basename (gtk_css_section_get_file (section));
g_assert (line > 0);
basename = g_path_get_basename (path);
g_string_append_printf (errors, g_string_append_printf (errors,
"%s:%u: error: ", "%s:%u: error: ",
basename, line + 1); basename, gtk_css_section_get_end_line (section) + 1);
g_free (basename); g_free (basename);
if (error->domain == GTK_CSS_PROVIDER_ERROR) if (error->domain == GTK_CSS_PROVIDER_ERROR)

View File

@ -49,20 +49,21 @@
static void static void
show_parsing_error (GtkCssProvider *provider, show_parsing_error (GtkCssProvider *provider,
const gchar *path, GtkCssSection *section,
guint line,
guint position,
const GError *error, const GError *error,
GtkTextBuffer *buffer) GtkTextBuffer *buffer)
{ {
GtkTextIter start, end; GtkTextIter start, end;
const char *tag_name; const char *tag_name;
gtk_text_buffer_get_iter_at_line (buffer, &start, line - 1); gtk_text_buffer_get_iter_at_line_index (buffer,
if (gtk_text_buffer_get_line_count (buffer) <= line) &start,
gtk_text_buffer_get_end_iter (buffer, &end); gtk_css_section_get_start_line (section),
else gtk_css_section_get_start_position (section));
gtk_text_buffer_get_iter_at_line (buffer, &end, line); 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)) if (g_error_matches (error, GTK_CSS_PROVIDER_ERROR, GTK_CSS_PROVIDER_ERROR_DEPRECATED))
tag_name = "warning"; tag_name = "warning";