pixbuf-engine: add a GtkRC option for widget direction

Add a GtkRC option to select for an LTR/RTL widget direction in the
pixbuf engine; this will allow the engine to apply different theming
assets according to the text direction, which is useful when theming
e.g. a spinbutton or a combobox entry.
This commit is contained in:
Cosimo Cecchi
2012-07-05 10:08:10 -04:00
parent da324fa2d5
commit 85f2a721cf
3 changed files with 54 additions and 4 deletions

View File

@@ -72,6 +72,10 @@ match_theme_image (GtkStyle *style,
match_data->orientation != image->match_data.orientation) match_data->orientation != image->match_data.orientation)
continue; continue;
if ((flags & THEME_MATCH_DIRECTION) &&
match_data->direction != image->match_data.direction)
continue;
if ((flags & THEME_MATCH_GAP_SIDE) && if ((flags & THEME_MATCH_GAP_SIDE) &&
match_data->gap_side != image->match_data.gap_side) match_data->gap_side != image->match_data.gap_side)
continue; continue;
@@ -126,7 +130,13 @@ draw_simple_image(GtkStyle *style,
else else
match_data->orientation = GTK_ORIENTATION_HORIZONTAL; match_data->orientation = GTK_ORIENTATION_HORIZONTAL;
} }
if (!(match_data->flags & THEME_MATCH_DIRECTION))
{
match_data->flags |= THEME_MATCH_DIRECTION;
match_data->direction = gtk_widget_get_direction (widget);
}
image = match_theme_image (style, match_data); image = match_theme_image (style, match_data);
if (image) if (image)
{ {

View File

@@ -64,6 +64,7 @@ theme_symbols[] =
{ "overlay_stretch", TOKEN_OVERLAY_STRETCH }, { "overlay_stretch", TOKEN_OVERLAY_STRETCH },
{ "arrow_direction", TOKEN_ARROW_DIRECTION }, { "arrow_direction", TOKEN_ARROW_DIRECTION },
{ "orientation", TOKEN_ORIENTATION }, { "orientation", TOKEN_ORIENTATION },
{ "direction", TOKEN_DIRECTION },
{ "expander_style", TOKEN_EXPANDER_STYLE }, { "expander_style", TOKEN_EXPANDER_STYLE },
{ "window_edge", TOKEN_WINDOW_EDGE }, { "window_edge", TOKEN_WINDOW_EDGE },
@@ -130,7 +131,10 @@ theme_symbols[] =
{ "EAST", TOKEN_EAST }, { "EAST", TOKEN_EAST },
{ "SOUTH_WEST", TOKEN_SOUTH_WEST }, { "SOUTH_WEST", TOKEN_SOUTH_WEST },
{ "SOUTH", TOKEN_SOUTH }, { "SOUTH", TOKEN_SOUTH },
{ "SOUTH_EAST", TOKEN_SOUTH_EAST } { "SOUTH_EAST", TOKEN_SOUTH_EAST },
{ "LTR", TOKEN_LTR },
{ "RTL", TOKEN_RTL }
}; };
static GtkRcStyleClass *parent_class; static GtkRcStyleClass *parent_class;
@@ -609,6 +613,34 @@ theme_parse_window_edge(GScanner * scanner,
return G_TOKEN_NONE; return G_TOKEN_NONE;
} }
static guint
theme_parse_direction(GScanner * scanner,
ThemeImage * data)
{
guint token;
token = g_scanner_get_next_token(scanner);
if (token != TOKEN_DIRECTION)
return TOKEN_DIRECTION;
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_LTR)
data->match_data.direction = GTK_TEXT_DIR_LTR;
else if (token == TOKEN_RTL)
data->match_data.direction = GTK_TEXT_DIR_RTL;
else
return TOKEN_LTR;
data->match_data.flags |= THEME_MATCH_DIRECTION;
return G_TOKEN_NONE;
}
static void static void
theme_image_ref (ThemeImage *data) theme_image_ref (ThemeImage *data)
{ {
@@ -741,6 +773,9 @@ theme_parse_image(GtkSettings *settings,
case TOKEN_WINDOW_EDGE: case TOKEN_WINDOW_EDGE:
token = theme_parse_window_edge(scanner, data); token = theme_parse_window_edge(scanner, data);
break; break;
case TOKEN_DIRECTION:
token = theme_parse_direction(scanner, data);
break;
default: default:
g_scanner_get_next_token(scanner); g_scanner_get_next_token(scanner);
token = G_TOKEN_RIGHT_CURLY; token = G_TOKEN_RIGHT_CURLY;

View File

@@ -111,7 +111,10 @@ enum
TOKEN_EAST, TOKEN_EAST,
TOKEN_SOUTH_WEST, TOKEN_SOUTH_WEST,
TOKEN_SOUTH, TOKEN_SOUTH,
TOKEN_SOUTH_EAST TOKEN_SOUTH_EAST,
TOKEN_DIRECTION,
TOKEN_LTR,
TOKEN_RTL
}; };
typedef enum typedef enum
@@ -135,7 +138,8 @@ typedef enum {
THEME_MATCH_SHADOW = 1 << 3, THEME_MATCH_SHADOW = 1 << 3,
THEME_MATCH_ARROW_DIRECTION = 1 << 4, THEME_MATCH_ARROW_DIRECTION = 1 << 4,
THEME_MATCH_EXPANDER_STYLE = 1 << 5, THEME_MATCH_EXPANDER_STYLE = 1 << 5,
THEME_MATCH_WINDOW_EDGE = 1 << 6 THEME_MATCH_WINDOW_EDGE = 1 << 6,
THEME_MATCH_DIRECTION = 1 << 7
} ThemeMatchFlags; } ThemeMatchFlags;
typedef enum { typedef enum {
@@ -170,6 +174,7 @@ struct _ThemeMatchData
GtkArrowType arrow_direction; GtkArrowType arrow_direction;
GtkExpanderStyle expander_style; GtkExpanderStyle expander_style;
GdkWindowEdge window_edge; GdkWindowEdge window_edge;
GtkTextDirection direction;
}; };
struct _ThemeImage struct _ThemeImage