Commit 59877716 authored by Matthias Clasen's avatar Matthias Clasen

GtkButton: Use FLAT style class

This commit makes button always draw background and frame.
Buttons with relief none get a new style class, FLAT, which
allows themes to style these buttons as they like.

We also (finally) mark GTK_RELIEF_HALF as deprecated. It
has never done anything different from GTK_RELIEF_NORMAL.

https://bugzilla.gnome.org/show_bug.cgi?id=732256
parent e6341a0b
...@@ -626,7 +626,6 @@ gtk_button_init (GtkButton *button) ...@@ -626,7 +626,6 @@ gtk_button_init (GtkButton *button)
priv->constructed = FALSE; priv->constructed = FALSE;
priv->in_button = FALSE; priv->in_button = FALSE;
priv->button_down = FALSE; priv->button_down = FALSE;
priv->relief = GTK_RELIEF_NORMAL;
priv->use_stock = FALSE; priv->use_stock = FALSE;
priv->use_underline = FALSE; priv->use_underline = FALSE;
priv->depressed = FALSE; priv->depressed = FALSE;
...@@ -851,7 +850,7 @@ gtk_button_get_property (GObject *object, ...@@ -851,7 +850,7 @@ gtk_button_get_property (GObject *object,
g_value_set_boolean (value, gtk_button_get_always_show_image (button)); g_value_set_boolean (value, gtk_button_get_always_show_image (button));
break; break;
case PROP_RELIEF: case PROP_RELIEF:
g_value_set_enum (value, priv->relief); g_value_set_enum (value, gtk_button_get_relief (button));
break; break;
case PROP_USE_UNDERLINE: case PROP_USE_UNDERLINE:
g_value_set_boolean (value, priv->use_underline); g_value_set_boolean (value, priv->use_underline);
...@@ -1477,28 +1476,35 @@ gtk_button_leave (GtkButton *button) ...@@ -1477,28 +1476,35 @@ gtk_button_leave (GtkButton *button)
/** /**
* gtk_button_set_relief: * gtk_button_set_relief:
* @button: The #GtkButton you want to set relief styles of. * @button: The #GtkButton you want to set relief styles of
* @newstyle: The GtkReliefStyle as described above. * @relief: The GtkReliefStyle as described above
* *
* Sets the relief style of the edges of the given #GtkButton widget. * Sets the relief style of the edges of the given #GtkButton widget.
* Three styles exist, GTK_RELIEF_NORMAL, GTK_RELIEF_HALF, GTK_RELIEF_NONE. * Two styles exist, %GTK_RELIEF_NORMAL and %GTK_RELIEF_NONE.
* The default style is, as one can guess, GTK_RELIEF_NORMAL. * The default style is, as one can guess, %GTK_RELIEF_NORMAL.
* The deprecated value %GTK_RELIEF_HALF behaves the same as
* %GTK_RELIEF_NORMAL.
*/ */
void void
gtk_button_set_relief (GtkButton *button, gtk_button_set_relief (GtkButton *button,
GtkReliefStyle newrelief) GtkReliefStyle relief)
{ {
GtkButtonPrivate *priv; GtkStyleContext *context;
GtkReliefStyle old_relief;
g_return_if_fail (GTK_IS_BUTTON (button)); g_return_if_fail (GTK_IS_BUTTON (button));
priv = button->priv; old_relief = gtk_button_get_relief (button);
if (old_relief != relief)
if (newrelief != priv->relief)
{ {
priv->relief = newrelief; context = gtk_widget_get_style_context (GTK_WIDGET (button));
g_object_notify_by_pspec (G_OBJECT (button), props[PROP_RELIEF]); if (relief == GTK_RELIEF_NONE)
gtk_widget_queue_draw (GTK_WIDGET (button)); gtk_style_context_add_class (context, GTK_STYLE_CLASS_FLAT);
else
gtk_style_context_remove_class (context, GTK_STYLE_CLASS_FLAT);
g_object_notify_by_pspec (G_OBJECT (button), props[PROP_RELIEF]);
gtk_widget_queue_draw (GTK_WIDGET (button));
} }
} }
...@@ -1513,9 +1519,15 @@ gtk_button_set_relief (GtkButton *button, ...@@ -1513,9 +1519,15 @@ gtk_button_set_relief (GtkButton *button,
GtkReliefStyle GtkReliefStyle
gtk_button_get_relief (GtkButton *button) gtk_button_get_relief (GtkButton *button)
{ {
GtkStyleContext *context;
g_return_val_if_fail (GTK_IS_BUTTON (button), GTK_RELIEF_NORMAL); g_return_val_if_fail (GTK_IS_BUTTON (button), GTK_RELIEF_NORMAL);
return button->priv->relief; context = gtk_widget_get_style_context (GTK_WIDGET (button));
if (gtk_style_context_has_class (context, GTK_STYLE_CLASS_FLAT))
return GTK_RELIEF_NONE;
else
return GTK_RELIEF_NORMAL;
} }
static void static void
...@@ -1787,27 +1799,24 @@ gtk_button_draw (GtkWidget *widget, ...@@ -1787,27 +1799,24 @@ gtk_button_draw (GtkWidget *widget,
GtkButton *button = GTK_BUTTON (widget); GtkButton *button = GTK_BUTTON (widget);
GtkButtonPrivate *priv = button->priv; GtkButtonPrivate *priv = button->priv;
gint x, y; gint x, y;
gint width, height;
GtkBorder default_border; GtkBorder default_border;
GtkBorder default_outside_border; GtkBorder default_outside_border;
GtkAllocation allocation;
GtkStyleContext *context; GtkStyleContext *context;
GtkStateFlags state; GtkStateFlags state;
gboolean draw_focus;
gint width, height;
context = gtk_widget_get_style_context (widget); context = gtk_widget_get_style_context (widget);
state = gtk_style_context_get_state (context); state = gtk_style_context_get_state (context);
gtk_button_get_props (button, &default_border, &default_outside_border, NULL, NULL); gtk_button_get_props (button, &default_border, &default_outside_border, NULL, NULL);
gtk_widget_get_allocation (widget, &allocation);
x = 0; x = 0;
y = 0; y = 0;
width = allocation.width; width = gtk_widget_get_allocated_width (widget);
height = allocation.height; height = gtk_widget_get_allocated_height (widget);
if (gtk_widget_has_default (widget) && if (gtk_widget_has_default (widget) &&
priv->relief == GTK_RELIEF_NORMAL) gtk_button_get_relief (button) == GTK_RELIEF_NORMAL)
{ {
x += default_border.left; x += default_border.left;
y += default_border.top; y += default_border.top;
...@@ -1822,18 +1831,10 @@ gtk_button_draw (GtkWidget *widget, ...@@ -1822,18 +1831,10 @@ gtk_button_draw (GtkWidget *widget,
height -= default_outside_border.top + default_outside_border.bottom; height -= default_outside_border.top + default_outside_border.bottom;
} }
draw_focus = gtk_widget_has_visible_focus (widget); gtk_render_background (context, cr, x, y, width, height);
gtk_render_frame (context, cr, x, y, width, height);
if (priv->relief != GTK_RELIEF_NONE || priv->depressed ||
state & GTK_STATE_FLAG_PRELIGHT)
{
gtk_render_background (context, cr,
x, y, width, height);
gtk_render_frame (context, cr,
x, y, width, height);
}
if (draw_focus) if (gtk_widget_has_visible_focus (widget))
{ {
gint child_displacement_x; gint child_displacement_x;
gint child_displacement_y; gint child_displacement_y;
......
...@@ -116,7 +116,7 @@ void gtk_button_leave (GtkButton *button); ...@@ -116,7 +116,7 @@ void gtk_button_leave (GtkButton *button);
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
void gtk_button_set_relief (GtkButton *button, void gtk_button_set_relief (GtkButton *button,
GtkReliefStyle newstyle); GtkReliefStyle relief);
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
GtkReliefStyle gtk_button_get_relief (GtkButton *button); GtkReliefStyle gtk_button_get_relief (GtkButton *button);
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
......
...@@ -58,7 +58,6 @@ struct _GtkButtonPrivate ...@@ -58,7 +58,6 @@ struct _GtkButtonPrivate
guint focus_on_click : 1; guint focus_on_click : 1;
guint image_is_stock : 1; guint image_is_stock : 1;
guint in_button : 1; guint in_button : 1;
guint relief : 2;
guint use_action_appearance : 1; guint use_action_appearance : 1;
guint use_stock : 1; guint use_stock : 1;
guint use_underline : 1; guint use_underline : 1;
......
...@@ -380,7 +380,7 @@ typedef enum ...@@ -380,7 +380,7 @@ typedef enum
/** /**
* GtkReliefStyle: * GtkReliefStyle:
* @GTK_RELIEF_NORMAL: Draw a normal relief. * @GTK_RELIEF_NORMAL: Draw a normal relief.
* @GTK_RELIEF_HALF: A half relief. * @GTK_RELIEF_HALF: A half relief. Deprecated in 3.14, does the same as @GTK_RELIEF_NORMAL
* @GTK_RELIEF_NONE: No relief. * @GTK_RELIEF_NONE: No relief.
* *
* Indicated the relief to be drawn around a #GtkButton. * Indicated the relief to be drawn around a #GtkButton.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment