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:
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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";
|
||||||
|
Reference in New Issue
Block a user