mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-27 06:00:22 +00:00
Apply a patch by Alexander Nedotsukov to support customized drawing of
2006-01-16 Matthias Clasen <mclasen@redhat.com> * pixbuf-draw.c: * pixbuf-rc-style.c: * pixbuf.h: Apply a patch by Alexander Nedotsukov to support customized drawing of expanders and resize grips. (#325289).
This commit is contained in:
parent
7f9b4a9615
commit
2ff662e7e2
@ -1,5 +1,11 @@
|
||||
2006-01-16 Matthias Clasen <mclasen@redhat.com>
|
||||
|
||||
* pixbuf-draw.c:
|
||||
* pixbuf-rc-style.c:
|
||||
* pixbuf.h: Apply a patch by Alexander Nedotsukov to
|
||||
support customized drawing of expanders and resize
|
||||
grips. (#325289).
|
||||
|
||||
* pixbuf-draw.c (draw_gap_image): Silence the
|
||||
compiler.
|
||||
|
||||
|
@ -76,6 +76,14 @@ match_theme_image (GtkStyle *style,
|
||||
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))
|
||||
@ -983,6 +991,83 @@ draw_handle (GtkStyle *style,
|
||||
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
|
||||
@ -1036,4 +1121,6 @@ pixbuf_style_class_init (PixbufStyleClass *klass)
|
||||
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;
|
||||
}
|
||||
|
@ -64,6 +64,8 @@ theme_symbols[] =
|
||||
{ "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 },
|
||||
@ -88,6 +90,8 @@ theme_symbols[] =
|
||||
{ "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 },
|
||||
@ -110,8 +114,23 @@ theme_symbols[] =
|
||||
{ "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;
|
||||
@ -332,7 +351,7 @@ theme_parse_function(GScanner * scanner,
|
||||
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;
|
||||
@ -521,6 +540,76 @@ theme_parse_orientation(GScanner * scanner,
|
||||
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)
|
||||
{
|
||||
@ -648,6 +737,12 @@ theme_parse_image(GtkSettings *settings,
|
||||
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;
|
||||
|
@ -52,6 +52,8 @@ enum
|
||||
TOKEN_OVERLAY_BORDER,
|
||||
TOKEN_OVERLAY_STRETCH,
|
||||
TOKEN_ARROW_DIRECTION,
|
||||
TOKEN_EXPANDER_STYLE,
|
||||
TOKEN_WINDOW_EDGE,
|
||||
TOKEN_D_HLINE,
|
||||
TOKEN_D_VLINE,
|
||||
TOKEN_D_SHADOW,
|
||||
@ -75,6 +77,8 @@ enum
|
||||
TOKEN_D_ENTRY,
|
||||
TOKEN_D_HANDLE,
|
||||
TOKEN_D_STEPPER,
|
||||
TOKEN_D_EXPANDER,
|
||||
TOKEN_D_RESIZE_GRIP,
|
||||
TOKEN_TRUE,
|
||||
TOKEN_FALSE,
|
||||
TOKEN_TOP,
|
||||
@ -95,7 +99,19 @@ enum
|
||||
TOKEN_ETCHED_OUT,
|
||||
TOKEN_ORIENTATION,
|
||||
TOKEN_HORIZONTAL,
|
||||
TOKEN_VERTICAL
|
||||
TOKEN_VERTICAL,
|
||||
TOKEN_COLLAPSED,
|
||||
TOKEN_SEMI_COLLAPSED,
|
||||
TOKEN_SEMI_EXPANDED,
|
||||
TOKEN_EXPANDED,
|
||||
TOKEN_NORTH_WEST,
|
||||
TOKEN_NORTH,
|
||||
TOKEN_NORTH_EAST,
|
||||
TOKEN_WEST,
|
||||
TOKEN_EAST,
|
||||
TOKEN_SOUTH_WEST,
|
||||
TOKEN_SOUTH,
|
||||
TOKEN_SOUTH_EAST
|
||||
};
|
||||
|
||||
typedef enum
|
||||
@ -117,7 +133,9 @@ typedef enum {
|
||||
THEME_MATCH_ORIENTATION = 1 << 1,
|
||||
THEME_MATCH_STATE = 1 << 2,
|
||||
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_WINDOW_EDGE = 1 << 6
|
||||
} ThemeMatchFlags;
|
||||
|
||||
typedef enum {
|
||||
@ -140,16 +158,18 @@ struct _ThemePixbuf
|
||||
|
||||
struct _ThemeMatchData
|
||||
{
|
||||
guint function; /* Mandatory */
|
||||
gchar *detail;
|
||||
guint function; /* Mandatory */
|
||||
gchar *detail;
|
||||
|
||||
ThemeMatchFlags flags;
|
||||
ThemeMatchFlags flags;
|
||||
|
||||
GtkPositionType gap_side;
|
||||
GtkOrientation orientation;
|
||||
GtkStateType state;
|
||||
GtkShadowType shadow;
|
||||
GtkArrowType arrow_direction;
|
||||
GtkPositionType gap_side;
|
||||
GtkOrientation orientation;
|
||||
GtkStateType state;
|
||||
GtkShadowType shadow;
|
||||
GtkArrowType arrow_direction;
|
||||
GtkExpanderStyle expander_style;
|
||||
GdkWindowEdge window_edge;
|
||||
};
|
||||
|
||||
struct _ThemeImage
|
||||
|
Loading…
Reference in New Issue
Block a user