mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-10 02:40:11 +00:00
Add error func to node deserialization
This commit is contained in:
parent
5530331b35
commit
dde69802cd
@ -387,12 +387,13 @@ gsk_render_node_write_to_file (GskRenderNode *node,
|
|||||||
* error.
|
* error.
|
||||||
**/
|
**/
|
||||||
GskRenderNode *
|
GskRenderNode *
|
||||||
gsk_render_node_deserialize (GBytes *bytes,
|
gsk_render_node_deserialize (GBytes *bytes,
|
||||||
GError **error)
|
GskParseErrorFunc error_func,
|
||||||
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
GskRenderNode *node = NULL;
|
GskRenderNode *node = NULL;
|
||||||
|
|
||||||
node = gsk_render_node_deserialize_from_bytes (bytes, error);
|
node = gsk_render_node_deserialize_from_bytes (bytes, error_func, user_data);
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
#include <gsk/gskroundedrect.h>
|
#include <gsk/gskroundedrect.h>
|
||||||
#include <gsk/gsktypes.h>
|
#include <gsk/gsktypes.h>
|
||||||
|
#include <gtk/css/gtkcss.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
@ -52,6 +53,10 @@ struct _GskShadow
|
|||||||
float radius;
|
float radius;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef void (* GskParseErrorFunc) (const GtkCssSection *section,
|
||||||
|
const GError *error,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_ALL
|
GDK_AVAILABLE_IN_ALL
|
||||||
GType gsk_render_node_get_type (void) G_GNUC_CONST;
|
GType gsk_render_node_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
@ -81,8 +86,9 @@ gboolean gsk_render_node_write_to_file (GskRenderNode *
|
|||||||
const char *filename,
|
const char *filename,
|
||||||
GError **error);
|
GError **error);
|
||||||
GDK_AVAILABLE_IN_ALL
|
GDK_AVAILABLE_IN_ALL
|
||||||
GskRenderNode * gsk_render_node_deserialize (GBytes *bytes,
|
GskRenderNode * gsk_render_node_deserialize (GBytes *bytes,
|
||||||
GError **error);
|
GskParseErrorFunc error_func,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_ALL
|
GDK_AVAILABLE_IN_ALL
|
||||||
GskRenderNode * gsk_debug_node_new (GskRenderNode *child,
|
GskRenderNode * gsk_debug_node_new (GskRenderNode *child,
|
||||||
|
@ -1072,28 +1072,34 @@ gsk_render_node_parser_error (GtkCssParser *parser,
|
|||||||
const GError *error,
|
const GError *error,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
GString **error_string = user_data;
|
struct {
|
||||||
|
GskParseErrorFunc error_func;
|
||||||
|
gpointer user_data;
|
||||||
|
} *error_func_pair = user_data;
|
||||||
|
|
||||||
if (!*error_string)
|
if (error_func_pair->error_func)
|
||||||
*error_string = g_string_new (NULL);
|
{
|
||||||
|
GtkCssSection *section = gtk_css_section_new (gtk_css_parser_get_file (parser), start, end);
|
||||||
|
|
||||||
g_string_append_printf (*error_string,
|
error_func_pair->error_func (section, error, error_func_pair->user_data);
|
||||||
"ERROR: %zu:%zu: %s\n",
|
gtk_css_section_unref (section);
|
||||||
start->lines + 1,
|
}
|
||||||
start->line_chars,
|
|
||||||
error->message);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GskRenderNode *
|
GskRenderNode *
|
||||||
gsk_render_node_deserialize_from_bytes (GBytes *bytes,
|
gsk_render_node_deserialize_from_bytes (GBytes *bytes,
|
||||||
GError **error)
|
GskParseErrorFunc error_func,
|
||||||
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
GskRenderNode *root = NULL;
|
GskRenderNode *root = NULL;
|
||||||
GtkCssParser *parser;
|
GtkCssParser *parser;
|
||||||
GString *error_string = NULL;
|
struct {
|
||||||
|
GskParseErrorFunc error_func;
|
||||||
|
gpointer user_data;
|
||||||
|
} error_func_pair = { error_func, user_data };
|
||||||
|
|
||||||
parser = gtk_css_parser_new_for_bytes (bytes, NULL, NULL, gsk_render_node_parser_error,
|
parser = gtk_css_parser_new_for_bytes (bytes, NULL, NULL, gsk_render_node_parser_error,
|
||||||
&error_string, NULL);
|
&error_func_pair, NULL);
|
||||||
root = parse_container_node (parser);
|
root = parse_container_node (parser);
|
||||||
|
|
||||||
if (root && gsk_container_node_get_n_children (root) == 1)
|
if (root && gsk_container_node_get_n_children (root) == 1)
|
||||||
@ -1107,12 +1113,6 @@ gsk_render_node_deserialize_from_bytes (GBytes *bytes,
|
|||||||
|
|
||||||
gtk_css_parser_unref (parser);
|
gtk_css_parser_unref (parser);
|
||||||
|
|
||||||
if (error_string != NULL)
|
|
||||||
{
|
|
||||||
*error = g_error_new_literal (GTK_CSS_PARSER_ERROR, 0, error_string->str);
|
|
||||||
g_string_free (error_string, TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,8 +4,9 @@
|
|||||||
|
|
||||||
#include "gskrendernode.h"
|
#include "gskrendernode.h"
|
||||||
|
|
||||||
GskRenderNode * gsk_render_node_deserialize_from_bytes (GBytes *bytes,
|
GskRenderNode * gsk_render_node_deserialize_from_bytes (GBytes *bytes,
|
||||||
GError **error);
|
GskParseErrorFunc error_func,
|
||||||
|
gpointer user_data);
|
||||||
char * gsk_render_node_serialize_to_string (GskRenderNode *root);
|
char * gsk_render_node_serialize_to_string (GskRenderNode *root);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -13,6 +13,19 @@ static GOptionEntry options[] = {
|
|||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
deserialize_error_func (const GtkCssSection *section,
|
||||||
|
const GError *error,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
char *section_str = gtk_css_section_to_string (section);
|
||||||
|
|
||||||
|
g_warning ("Error at %s: %s", section_str, error->message);
|
||||||
|
|
||||||
|
free (section_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -66,7 +79,7 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
start = g_get_monotonic_time ();
|
start = g_get_monotonic_time ();
|
||||||
node = gsk_render_node_deserialize (bytes, &error);
|
node = gsk_render_node_deserialize (bytes, deserialize_error_func, NULL);
|
||||||
end = g_get_monotonic_time ();
|
end = g_get_monotonic_time ();
|
||||||
if (benchmark)
|
if (benchmark)
|
||||||
{
|
{
|
||||||
@ -78,8 +91,6 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
if (node == NULL)
|
if (node == NULL)
|
||||||
{
|
{
|
||||||
g_printerr ("Invalid node file: %s\n", error->message);
|
|
||||||
g_clear_error (&error);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,6 +108,18 @@ gtk_node_view_class_init (GtkNodeViewClass *klass)
|
|||||||
widget_class->snapshot = gtk_node_view_snapshot;
|
widget_class->snapshot = gtk_node_view_snapshot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
deserialize_error_func (const GtkCssSection *section,
|
||||||
|
const GError *error,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
char *section_str = gtk_css_section_to_string (section);
|
||||||
|
|
||||||
|
g_warning ("Error at %s: %s", section_str, error->message);
|
||||||
|
|
||||||
|
free (section_str);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char **argv)
|
main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -152,7 +164,7 @@ main (int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bytes = g_bytes_new_take (contents, len);
|
bytes = g_bytes_new_take (contents, len);
|
||||||
GTK_NODE_VIEW (nodeview)->node = gsk_render_node_deserialize (bytes, &error);
|
GTK_NODE_VIEW (nodeview)->node = gsk_render_node_deserialize (bytes, deserialize_error_func, NULL);
|
||||||
g_bytes_unref (bytes);
|
g_bytes_unref (bytes);
|
||||||
|
|
||||||
if (GTK_NODE_VIEW (nodeview)->node == NULL)
|
if (GTK_NODE_VIEW (nodeview)->node == NULL)
|
||||||
|
@ -54,6 +54,18 @@ save_image (cairo_surface_t *surface,
|
|||||||
g_free (filename);
|
g_free (filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
deserialize_error_func (const GtkCssSection *section,
|
||||||
|
const GError *error,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
char *section_str = gtk_css_section_to_string (section);
|
||||||
|
|
||||||
|
g_error ("Error at %s: %s", section_str, error->message);
|
||||||
|
|
||||||
|
free (section_str);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
* 1) .node file to compare
|
* 1) .node file to compare
|
||||||
@ -101,7 +113,7 @@ main (int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bytes = g_bytes_new_take (contents, len);
|
bytes = g_bytes_new_take (contents, len);
|
||||||
node = gsk_render_node_deserialize (bytes, &error);
|
node = gsk_render_node_deserialize (bytes, deserialize_error_func, NULL);
|
||||||
g_bytes_unref (bytes);
|
g_bytes_unref (bytes);
|
||||||
|
|
||||||
g_assert_no_error (error);
|
g_assert_no_error (error);
|
||||||
|
@ -1,5 +1,19 @@
|
|||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
static void
|
||||||
|
deserialize_error_func (const GtkCssSection *section,
|
||||||
|
const GError *error,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
char *section_str = gtk_css_section_to_string (section);
|
||||||
|
|
||||||
|
/* We want to parse invalid node files in this test and simply assert that the
|
||||||
|
* parser doesn't crash. So, just g_message() here instead of a warning or error. */
|
||||||
|
g_message ("Error at %s: %s", section_str, error->message);
|
||||||
|
|
||||||
|
free (section_str);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char **argv)
|
main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -17,7 +31,7 @@ main (int argc, char **argv)
|
|||||||
g_assert_no_error (error);
|
g_assert_no_error (error);
|
||||||
g_assert (bytes != NULL);
|
g_assert (bytes != NULL);
|
||||||
|
|
||||||
node = gsk_render_node_deserialize (bytes, &error);
|
node = gsk_render_node_deserialize (bytes, deserialize_error_func, NULL);
|
||||||
if (error)
|
if (error)
|
||||||
g_test_message ("Error: %s\n", error->message);
|
g_test_message ("Error: %s\n", error->message);
|
||||||
|
|
||||||
|
@ -1,5 +1,17 @@
|
|||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
static void
|
||||||
|
deserialize_error_func (const GtkCssSection *section,
|
||||||
|
const GError *error,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
char *section_str = gtk_css_section_to_string (section);
|
||||||
|
|
||||||
|
g_error ("Error at %s: %s", section_str, error->message);
|
||||||
|
|
||||||
|
free (section_str);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char **argv)
|
main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -18,14 +30,14 @@ main (int argc, char **argv)
|
|||||||
g_assert_no_error (error);
|
g_assert_no_error (error);
|
||||||
g_assert (bytes != NULL);
|
g_assert (bytes != NULL);
|
||||||
|
|
||||||
node = gsk_render_node_deserialize (bytes, &error);
|
node = gsk_render_node_deserialize (bytes, deserialize_error_func, NULL);
|
||||||
g_assert_no_error (error);
|
g_assert_no_error (error);
|
||||||
|
|
||||||
/* Now serialize */
|
/* Now serialize */
|
||||||
g_bytes_unref (bytes);
|
g_bytes_unref (bytes);
|
||||||
bytes = gsk_render_node_serialize (node);
|
bytes = gsk_render_node_serialize (node);
|
||||||
/* and deserialize again... */
|
/* and deserialize again... */
|
||||||
deserialized = gsk_render_node_deserialize (bytes, &error);
|
deserialized = gsk_render_node_deserialize (bytes, deserialize_error_func, NULL);
|
||||||
if (error)
|
if (error)
|
||||||
g_message ("OUTPUT:\n%.*s", (int)g_bytes_get_size (bytes), (char *)g_bytes_get_data (bytes, NULL));
|
g_message ("OUTPUT:\n%.*s", (int)g_bytes_get_size (bytes), (char *)g_bytes_get_data (bytes, NULL));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user