match_data->gap_side != image->match_data.gap_side)
continue;
+ if ((flags & THEME_MATCH_EXPANDER_STYLE) &&
+ match_data->expander_style != image->match_data.expander_style)
+ continue;
+
+ if ((flags & THEME_MATCH_WINDOW_EDGE) &&
+ match_data->window_edge != image->match_data.window_edge)
+ continue;
+
if (image->match_data.detail &&
(!match_data->detail ||
strcmp (match_data->detail, image->match_data.detail) != 0))
x, y, width, height, orientation);
}
+static void
+draw_expander (GtkStyle *style,
+ GdkWindow *window,
+ GtkStateType state,
+ GdkRectangle *area,
+ GtkWidget *widget,
+ const gchar *detail,
+ gint x,
+ gint y,
+ GtkExpanderStyle expander_style)
+{
+#define DEFAULT_EXPANDER_SIZE 12
+
+ ThemeMatchData match_data;
+ gint expander_size;
+ gint radius;
+
+ g_return_if_fail (style != NULL);
+ g_return_if_fail (window != NULL);
+
+ if (widget &&
+ gtk_widget_class_find_style_property (GTK_WIDGET_GET_CLASS (widget),
+ "expander-size"))
+ {
+ gtk_widget_style_get (widget,
+ "expander-size", &expander_size,
+ NULL);
+ }
+ else
+ expander_size = DEFAULT_EXPANDER_SIZE;
+
+ radius = expander_size/2;
+
+ match_data.function = TOKEN_D_EXPANDER;
+ match_data.detail = (gchar *)detail;
+ match_data.flags = (THEME_MATCH_STATE |
+ THEME_MATCH_EXPANDER_STYLE);
+ match_data.state = state;
+ match_data.expander_style = expander_style;
+
+ if (!draw_simple_image (style, window, area, widget, &match_data, TRUE, TRUE,
+ x - radius, y - radius, expander_size, expander_size))
+ parent_class->draw_expander (style, window, state, area, widget, detail,
+ x, y, expander_style);
+}
+
+static void
+draw_resize_grip (GtkStyle *style,
+ GdkWindow *window,
+ GtkStateType state,
+ GdkRectangle *area,
+ GtkWidget *widget,
+ const gchar *detail,
+ GdkWindowEdge edge,
+ gint x,
+ gint y,
+ gint width,
+ gint height)
+{
+ ThemeMatchData match_data;
+
+ g_return_if_fail (style != NULL);
+ g_return_if_fail (window != NULL);
+
+ match_data.function = TOKEN_D_RESIZE_GRIP;
+ match_data.detail = (gchar *)detail;
+ match_data.flags = (THEME_MATCH_STATE |
+ THEME_MATCH_WINDOW_EDGE);
+ match_data.state = state;
+ match_data.window_edge = edge;
+
+ if (!draw_simple_image (style, window, area, widget, &match_data, TRUE, TRUE,
+ x, y, width, height))
+ parent_class->draw_resize_grip (style, window, state, area, widget, detail,
+ edge, x, y, width, height);
+}
+
GType pixbuf_type_style = 0;
void
style_class->draw_focus = draw_focus;
style_class->draw_slider = draw_slider;
style_class->draw_handle = draw_handle;
+ style_class->draw_expander = draw_expander;
+ style_class->draw_resize_grip = draw_resize_grip;
}
{ "overlay_stretch", TOKEN_OVERLAY_STRETCH },
{ "arrow_direction", TOKEN_ARROW_DIRECTION },
{ "orientation", TOKEN_ORIENTATION },
+ { "expander_style", TOKEN_EXPANDER_STYLE },
+ { "window_edge", TOKEN_WINDOW_EDGE },
{ "HLINE", TOKEN_D_HLINE },
{ "VLINE", TOKEN_D_VLINE },
{ "ENTRY", TOKEN_D_ENTRY },
{ "HANDLE", TOKEN_D_HANDLE },
{ "STEPPER", TOKEN_D_STEPPER },
+ { "EXPANDER", TOKEN_D_EXPANDER },
+ { "RESIZE_GRIP", TOKEN_D_RESIZE_GRIP },
{ "TRUE", TOKEN_TRUE },
{ "FALSE", TOKEN_FALSE },
{ "OUT", TOKEN_OUT },
{ "ETCHED_IN", TOKEN_ETCHED_IN },
{ "ETCHED_OUT", TOKEN_ETCHED_OUT },
+
{ "HORIZONTAL", TOKEN_HORIZONTAL },
{ "VERTICAL", TOKEN_VERTICAL },
+
+ { "COLLAPSED", TOKEN_COLLAPSED },
+ { "SEMI_COLLAPSED", TOKEN_SEMI_COLLAPSED },
+ { "SEMI_EXPANDED", TOKEN_SEMI_EXPANDED },
+ { "EXPANDED", TOKEN_EXPANDED },
+
+ { "NORTH_WEST", TOKEN_NORTH_WEST },
+ { "NORTH", TOKEN_NORTH },
+ { "NORTH_EAST", TOKEN_NORTH_EAST },
+ { "WEST", TOKEN_WEST },
+ { "EAST", TOKEN_EAST },
+ { "SOUTH_WEST", TOKEN_SOUTH_WEST },
+ { "SOUTH", TOKEN_SOUTH },
+ { "SOUTH_EAST", TOKEN_SOUTH_EAST }
};
static GtkRcStyleClass *parent_class;
return G_TOKEN_EQUAL_SIGN;
token = g_scanner_get_next_token(scanner);
- if ((token >= TOKEN_D_HLINE) && (token <= TOKEN_D_STEPPER))
+ if ((token >= TOKEN_D_HLINE) && (token <= TOKEN_D_RESIZE_GRIP))
data->match_data.function = token;
return G_TOKEN_NONE;
return G_TOKEN_NONE;
}
+static guint
+theme_parse_expander_style(GScanner * scanner,
+ ThemeImage * data)
+{
+ guint token;
+
+ token = g_scanner_get_next_token(scanner);
+ if (token != TOKEN_EXPANDER_STYLE)
+ return TOKEN_EXPANDER_STYLE;
+
+ token = g_scanner_get_next_token(scanner);
+ if (token != G_TOKEN_EQUAL_SIGN)
+ return G_TOKEN_EQUAL_SIGN;
+
+ token = g_scanner_get_next_token(scanner);
+ if (token == TOKEN_COLLAPSED)
+ data->match_data.expander_style = GTK_EXPANDER_COLLAPSED;
+ else if (token == TOKEN_SEMI_COLLAPSED)
+ data->match_data.expander_style = GTK_EXPANDER_SEMI_COLLAPSED;
+ else if (token == TOKEN_SEMI_EXPANDED)
+ data->match_data.expander_style = GTK_EXPANDER_SEMI_EXPANDED;
+ else if (token == TOKEN_EXPANDED)
+ data->match_data.expander_style = GTK_EXPANDER_EXPANDED;
+ else
+ return TOKEN_COLLAPSED;
+
+ data->match_data.flags |= THEME_MATCH_EXPANDER_STYLE;
+
+ return G_TOKEN_NONE;
+}
+
+static guint
+theme_parse_window_edge(GScanner * scanner,
+ ThemeImage * data)
+{
+ guint token;
+
+ token = g_scanner_get_next_token(scanner);
+ if (token != TOKEN_WINDOW_EDGE)
+ return TOKEN_WINDOW_EDGE;
+
+ token = g_scanner_get_next_token(scanner);
+ if (token != G_TOKEN_EQUAL_SIGN)
+ return G_TOKEN_EQUAL_SIGN;
+
+ token = g_scanner_get_next_token(scanner);
+ if (token == TOKEN_NORTH_WEST)
+ data->match_data.window_edge = GDK_WINDOW_EDGE_NORTH_WEST;
+ else if (token == TOKEN_NORTH)
+ data->match_data.window_edge = GDK_WINDOW_EDGE_NORTH;
+ else if (token == TOKEN_NORTH_EAST)
+ data->match_data.window_edge = GDK_WINDOW_EDGE_NORTH_EAST;
+ else if (token == TOKEN_WEST)
+ data->match_data.window_edge = GDK_WINDOW_EDGE_WEST;
+ else if (token == TOKEN_EAST)
+ data->match_data.window_edge = GDK_WINDOW_EDGE_EAST;
+ else if (token == TOKEN_SOUTH_WEST)
+ data->match_data.window_edge = GDK_WINDOW_EDGE_SOUTH_WEST;
+ else if (token == TOKEN_SOUTH)
+ data->match_data.window_edge = GDK_WINDOW_EDGE_SOUTH;
+ else if (token == TOKEN_SOUTH_EAST)
+ data->match_data.window_edge = GDK_WINDOW_EDGE_SOUTH_EAST;
+ else
+ return TOKEN_NORTH_WEST;
+
+ data->match_data.flags |= THEME_MATCH_WINDOW_EDGE;
+
+ return G_TOKEN_NONE;
+}
+
static void
theme_image_ref (ThemeImage *data)
{
case TOKEN_OVERLAY_STRETCH:
token = theme_parse_stretch(scanner, &data->overlay);
break;
+ case TOKEN_EXPANDER_STYLE:
+ token = theme_parse_expander_style(scanner, data);
+ break;
+ case TOKEN_WINDOW_EDGE:
+ token = theme_parse_window_edge(scanner, data);
+ break;
default:
g_scanner_get_next_token(scanner);
token = G_TOKEN_RIGHT_CURLY;