diff options
author | Benjamin Otte <otte@redhat.com> | 2016-04-03 04:00:17 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2016-04-08 16:18:32 +0200 |
commit | 58aa294970ae5a4b8bf1484a0096000234781b34 (patch) | |
tree | cf8a7e281387616a2a81cc840ce3619aa5f5cd3b | |
parent | 55e3a1927d232f3fbbc235fceda3411c7936c57e (diff) | |
download | gtk+-58aa294970ae5a4b8bf1484a0096000234781b34.tar.gz |
cssimage: Make the win32 image parser have a token parser
-rw-r--r-- | gtk/gtkcssimagewin32.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/gtk/gtkcssimagewin32.c b/gtk/gtkcssimagewin32.c index d03fababcd..ca76785213 100644 --- a/gtk/gtkcssimagewin32.c +++ b/gtk/gtkcssimagewin32.c @@ -22,6 +22,7 @@ #include "gtkcssimagewin32private.h" #include "gtkcssprovider.h" +#include "gtkcssnumbervalueprivate.h" G_DEFINE_TYPE (GtkCssImageWin32, _gtk_css_image_win32, GTK_TYPE_CSS_IMAGE) @@ -212,6 +213,134 @@ gtk_css_image_win32_parse (GtkCssImage *image, return TRUE; } +static guint +gtk_css_image_win32_token_parse_over_argument (GtkCssTokenSource *source, + guint arg, + gpointer data) +{ + GtkCssImageWin32 *wimage = GTK_CSS_IMAGE_WIN32 (data); + + if (arg == 0) + { + if (!gtk_css_token_source_consume_integer (source, &wimage->part2)) + return 0; + return 1; + } + else if (arg == 1) + { + if (!gtk_css_token_source_consume_integer (source, &wimage->state2)) + return 0; + return 1; + } + else if (arg == 2) + { + if (!gtk_css_token_source_consume_number (source, &wimage->over_alpha)) + return 0; + return 1; + } + else + { + g_assert_not_reached (); + return 0; + } +} + +static guint +gtk_css_image_win32_token_parse_margins_argument (GtkCssTokenSource *source, + guint arg, + gpointer data) +{ + GtkCssImageWin32 *wimage = GTK_CSS_IMAGE_WIN32 (data); + guint i; + + for (i = 0; i < 4; i++) + { + if (i > 0 && !gtk_css_number_value_check_token (gtk_css_token_source_get_token (source))) + break; + + if (!gtk_css_token_source_consume_integer (source, &wimage->margins[i])) + return 0; + } + + for (; i < 4; i++) + wimage->margins[i] = wimage->margins[i - 1]; + + return 1; +} + +static guint +gtk_css_image_win32_token_parse_argument (GtkCssTokenSource *source, + guint arg, + gpointer data) +{ + GtkCssImageWin32 *wimage = GTK_CSS_IMAGE_WIN32 (data); + + if (arg == 0) + { + wimage->theme = gtk_win32_theme_token_parse (source); + if (wimage->theme == NULL) + return 0; + return 1; + } + else if (arg == 1) + { + if (!gtk_css_token_source_consume_integer (source, &wimage->part)) + return 0; + return 1; + } + else if (arg == 2) + { + if (!gtk_css_token_source_consume_integer (source, &wimage->state)) + return 0; + return 1; + } + else + { + const GtkCssToken *token; + + token = gtk_css_token_source_get_token (source); + if (gtk_css_token_is_function (token, "over")) + { + return gtk_css_token_source_consume_function (source, + 2, 3, + gtk_css_image_win32_token_parse_over_argument, + wimage) ? 1 : 0; + } + else if (gtk_css_token_is_function (token, "margins")) + { + return gtk_css_token_source_consume_function (source, + 1, 1, + gtk_css_image_win32_token_parse_margins_argument, + wimage) ? 1 : 0; + } + else + { + gtk_css_token_source_error (source, "Expected over() or margins()"); + return 0; + } + } +} + +static gboolean +gtk_css_image_win32_token_parse (GtkCssImage *image, + GtkCssTokenSource *source) +{ + const GtkCssToken *token; + + token = gtk_css_token_source_get_token (source); + if (!gtk_css_token_is_function (token, "-gtk-win32-theme-part")) + { + gtk_css_token_source_error (source, "Expected '-gtk-win32-theme-part('"); + gtk_css_token_source_consume_all (source); + return FALSE; + } + + return gtk_css_token_source_consume_function (source, + 3, G_MAXUINT, + gtk_css_image_win32_token_parse_argument, + image); +} + static void gtk_css_image_win32_print (GtkCssImage *image, GString *string) @@ -244,6 +373,7 @@ _gtk_css_image_win32_class_init (GtkCssImageWin32Class *klass) image_class->draw = gtk_css_image_win32_draw; image_class->parse = gtk_css_image_win32_parse; + image_class->token_parse = gtk_css_image_win32_token_parse; image_class->print = gtk_css_image_win32_print; } |