CSS provider: Add a way to emit errors

Currently, GtkCssProvider can emit ::parsing-error only during
the actual parsing, although the documentation hints that it might
happen at other times.

This commit adds a emit_error method to the GtkStyleProviderPrivate
interface that will let us emit errors from the compute() implementations
as well, which can be useful (e.g. if an image fails to load).
This commit is contained in:
Matthias Clasen 2016-01-29 22:45:21 -05:00
parent 63bf90ae71
commit 2c7fdf6432
3 changed files with 37 additions and 10 deletions

View File

@ -142,6 +142,9 @@ static void gtk_css_provider_finalize (GObject *object);
static void gtk_css_style_provider_iface_init (GtkStyleProviderIface *iface);
static void gtk_css_style_provider_private_iface_init (GtkStyleProviderPrivateInterface *iface);
static void widget_property_value_list_free (WidgetPropertyValue *head);
static void gtk_css_style_provider_emit_error (GtkStyleProviderPrivate *provider,
GtkCssSection *section,
const GError *error);
static gboolean
gtk_css_provider_load_internal (GtkCssProvider *css_provider,
@ -405,13 +408,22 @@ gtk_css_scanner_destroy (GtkCssScanner *scanner)
g_slice_free (GtkCssScanner, scanner);
}
static void
gtk_css_style_provider_emit_error (GtkStyleProviderPrivate *provider,
GtkCssSection *section,
const GError *error)
{
g_signal_emit (provider, css_provider_signals[PARSING_ERROR], 0, section, error);
}
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 != NULL ? scanner->section : NULL, error);
gtk_css_style_provider_emit_error (GTK_STYLE_PROVIDER_PRIVATE (provider),
scanner ? scanner->section : NULL,
error);
}
static void
@ -421,9 +433,7 @@ gtk_css_scanner_parser_error (GtkCssParser *parser,
{
GtkCssScanner *scanner = user_data;
gtk_css_provider_emit_error (scanner->provider,
scanner,
error);
gtk_css_provider_emit_error (scanner->provider, scanner, error);
}
static GtkCssScanner *
@ -785,6 +795,7 @@ gtk_css_style_provider_private_iface_init (GtkStyleProviderPrivateInterface *ifa
iface->get_color = gtk_css_style_provider_get_color;
iface->get_keyframes = gtk_css_style_provider_get_keyframes;
iface->lookup = gtk_css_style_provider_lookup;
iface->emit_error = gtk_css_style_provider_emit_error;
}
static void
@ -834,10 +845,7 @@ gtk_css_provider_take_error (GtkCssProvider *provider,
GtkCssScanner *scanner,
GError *error)
{
gtk_css_provider_emit_error (provider,
scanner,
error);
gtk_css_provider_emit_error (provider, scanner, error);
g_error_free (error);
}

View File

@ -142,3 +142,16 @@ _gtk_style_provider_private_get_scale (GtkStyleProviderPrivate *provider)
return iface->get_scale (provider);
}
void
_gtk_style_provider_private_emit_error (GtkStyleProviderPrivate *provider,
GtkCssSection *section,
GError *error)
{
GtkStyleProviderPrivateInterface *iface;
iface = GTK_STYLE_PROVIDER_PRIVATE_GET_INTERFACE (provider);
if (iface->emit_error)
iface->emit_error (provider, section, error);
}

View File

@ -49,7 +49,9 @@ struct _GtkStyleProviderPrivateInterface
const GtkCssMatcher *matcher,
GtkCssLookup *lookup,
GtkCssChange *out_change);
void (* emit_error) (GtkStyleProviderPrivate *provider,
GtkCssSection *section,
const GError *error);
/* signal */
void (* changed) (GtkStyleProviderPrivate *provider);
};
@ -69,6 +71,10 @@ void _gtk_style_provider_private_lookup (GtkStyleProvid
void _gtk_style_provider_private_changed (GtkStyleProviderPrivate *provider);
void _gtk_style_provider_private_emit_error (GtkStyleProviderPrivate *provider,
GtkCssSection *section,
GError *error);
G_END_DECLS
#endif /* __GTK_STYLE_PROVIDER_PRIVATE_H__ */