summaryrefslogtreecommitdiff
path: root/gtk/gtkwin32theme.c
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2011-11-28 08:39:15 +0100
committerAlexander Larsson <alexl@redhat.com>2011-11-28 08:58:41 +0100
commit7c092be0cef084fa52ab44ce322b57974d831d00 (patch)
treeb457c47436ce8574527c52d1b636cf922e189aad /gtk/gtkwin32theme.c
parent6898ba4f76c16f815c2f13f8d6e1646518fcd31d (diff)
downloadgtk+-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.c106
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);
}