diff options
author | Alexander Larsson <alexl@redhat.com> | 2011-11-28 08:39:15 +0100 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2011-11-28 08:58:41 +0100 |
commit | 7c092be0cef084fa52ab44ce322b57974d831d00 (patch) | |
tree | b457c47436ce8574527c52d1b636cf922e189aad /gtk/gtkwin32theme.c | |
parent | 6898ba4f76c16f815c2f13f8d6e1646518fcd31d (diff) | |
download | gtk+-7c092be0cef084fa52ab44ce322b57974d831d00.tar.gz |
win32-theme: Make syntax for mixing theme parts more regular
This lets us extend the argument list better
Diffstat (limited to 'gtk/gtkwin32theme.c')
-rw-r--r-- | gtk/gtkwin32theme.c | 106 |
1 files changed, 54 insertions, 52 deletions
diff --git a/gtk/gtkwin32theme.c b/gtk/gtkwin32theme.c index 35d07bdfae..f76c1983b3 100644 --- a/gtk/gtkwin32theme.c +++ b/gtk/gtkwin32theme.c @@ -192,18 +192,14 @@ G_DEFINE_BOXED_TYPE_WITH_CODE (GtkWin32ThemePart, _gtk_win32_theme_part, _gtk_win32_theme_part_ref, _gtk_win32_theme_part_unref, _gtk_win32_theme_init() ) -typedef enum { - RENDER_OVER, - RENDER_MIX -} ThemePartRenderOps; - struct _GtkWin32ThemePart { HTHEME theme; int part; int state; + + double over_alpha; int part2; int state2; - ThemePartRenderOps op; gint ref_count; }; @@ -212,7 +208,7 @@ GtkWin32ThemePart * _gtk_win32_theme_part_new (const char *class, int xp_part, int state, int xp_part2, int state2, - ThemePartRenderOps op) + double over_alpha) { GtkWin32ThemePart *part; @@ -224,7 +220,7 @@ _gtk_win32_theme_part_new (const char *class, part->state = state; part->part2 = xp_part2; part->state2 = state2; - part->op = op; + part->over_alpha = over_alpha; return part; } @@ -259,7 +255,7 @@ _gtk_win32_theme_part_parse (GtkCssParser *parser, { char *class; int xp_part, state, xp_part2, state2; - ThemePartRenderOps op; + double over_alpha; GtkWin32ThemePart *theme_part; if (!_gtk_css_parser_try (parser, "-gtk-win32-theme-part", TRUE)) @@ -306,33 +302,54 @@ _gtk_win32_theme_part_parse (GtkCssParser *parser, _gtk_css_parser_error (parser, "Expected a valid integer value"); return 0; } - op = RENDER_OVER; + + + over_alpha = 1.0; xp_part2 = -1; state2 = -1; + if ( _gtk_css_parser_try (parser, ",", TRUE)) { if ( _gtk_css_parser_try (parser, "over", TRUE)) { - op = RENDER_OVER; - } - else if ( _gtk_css_parser_try (parser, "mix", TRUE)) - { - op = RENDER_MIX; - } - - if (!_gtk_css_parser_try_int (parser, &xp_part2)) - { - g_free (class); - _gtk_css_parser_error (parser, "Expected a valid integer value"); - return 0; - } - - if (!_gtk_css_parser_try_int (parser, &state2)) - { - g_free (class); - _gtk_css_parser_error (parser, "Expected a valid integer value"); - return 0; + if (!_gtk_css_parser_try (parser, "(", TRUE)) + { + _gtk_css_parser_error (parser, + "Expected '(' after 'over'"); + return 0; + } + + if (!_gtk_css_parser_try_int (parser, &xp_part2)) + { + g_free (class); + _gtk_css_parser_error (parser, "Expected a valid integer value"); + return 0; + } + + if (!_gtk_css_parser_try_int (parser, &state2)) + { + g_free (class); + _gtk_css_parser_error (parser, "Expected a valid integer value"); + return 0; + } + + if ( _gtk_css_parser_try (parser, ",", TRUE)) + { + if (!_gtk_css_parser_try_double (parser, &over_alpha)) + { + g_free (class); + _gtk_css_parser_error (parser, "Expected a valid double value"); + return 0; + } + } + + if (!_gtk_css_parser_try (parser, ")", TRUE)) + { + _gtk_css_parser_error (parser, + "Expected ')' at end of 'over'"); + return 0; + } } } @@ -348,7 +365,7 @@ _gtk_win32_theme_part_parse (GtkCssParser *parser, theme_part = _gtk_win32_theme_part_new (class, xp_part, state, xp_part2, state2, - op); + over_alpha); g_free (class); g_value_take_boxed (value, theme_part); @@ -403,30 +420,15 @@ _gtk_win32_theme_part_render (GtkWin32ThemePart *part, width, height); - if (part->op == RENDER_MIX) - { - cr = cairo_create (surface); - - pattern = cairo_pattern_create_for_surface (surface2); - cairo_set_source (cr, pattern); - cairo_set_operator (cr, CAIRO_OPERATOR_OVER); - cairo_paint_with_alpha (cr, 0.5); - - cairo_destroy (cr); - cairo_pattern_destroy (pattern); - } - else /* OVER */ - { - cr = cairo_create (surface); + cr = cairo_create (surface); - pattern = cairo_pattern_create_for_surface (surface2); - cairo_set_source (cr, pattern); - cairo_set_operator (cr, CAIRO_OPERATOR_OVER); - cairo_paint (cr); + pattern = cairo_pattern_create_for_surface (surface2); + cairo_set_source (cr, pattern); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_paint_with_alpha (cr, part->over_alpha); - cairo_destroy (cr); - cairo_pattern_destroy (pattern); - } + cairo_destroy (cr); + cairo_pattern_destroy (pattern); cairo_surface_destroy (surface2); } |