[gtk+] GtkButton: Use FLAT style class



commit 598777166fc6d86fedbe1fa0df6b2afed73378e3
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Jun 26 21:59:06 2014 -0400

    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

 gtk/gtkbutton.c        |   69 ++++++++++++++++++++++++-----------------------
 gtk/gtkbutton.h        |    2 +-
 gtk/gtkbuttonprivate.h |    1 -
 gtk/gtkenums.h         |    2 +-
 4 files changed, 37 insertions(+), 37 deletions(-)
---
diff --git a/gtk/gtkbutton.c b/gtk/gtkbutton.c
index 7e70261..77143f2 100644
--- a/gtk/gtkbutton.c
+++ b/gtk/gtkbutton.c
@@ -626,7 +626,6 @@ gtk_button_init (GtkButton *button)
   priv->constructed = FALSE;
   priv->in_button = FALSE;
   priv->button_down = FALSE;
-  priv->relief = GTK_RELIEF_NORMAL;
   priv->use_stock = FALSE;
   priv->use_underline = FALSE;
   priv->depressed = FALSE;
@@ -851,7 +850,7 @@ gtk_button_get_property (GObject         *object,
       g_value_set_boolean (value, gtk_button_get_always_show_image (button));
       break;
     case PROP_RELIEF:
-      g_value_set_enum (value, priv->relief);
+      g_value_set_enum (value, gtk_button_get_relief (button));
       break;
     case PROP_USE_UNDERLINE:
       g_value_set_boolean (value, priv->use_underline);
@@ -1477,28 +1476,35 @@ gtk_button_leave (GtkButton *button)
 
 /**
  * gtk_button_set_relief:
- * @button: The #GtkButton you want to set relief styles of.
- * @newstyle: The GtkReliefStyle as described above.
+ * @button: The #GtkButton you want to set relief styles of
+ * @relief: The GtkReliefStyle as described above
  *
  * Sets the relief style of the edges of the given #GtkButton widget.
- * Three styles exist, GTK_RELIEF_NORMAL, GTK_RELIEF_HALF, GTK_RELIEF_NONE.
- * The default style is, as one can guess, GTK_RELIEF_NORMAL.
+ * Two styles exist, %GTK_RELIEF_NORMAL and %GTK_RELIEF_NONE.
+ * 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
-gtk_button_set_relief (GtkButton *button,
-                      GtkReliefStyle newrelief)
+gtk_button_set_relief (GtkButton      *button,
+                      GtkReliefStyle  relief)
 {
-  GtkButtonPrivate *priv;
+  GtkStyleContext *context;
+  GtkReliefStyle old_relief;
 
   g_return_if_fail (GTK_IS_BUTTON (button));
 
-  priv = button->priv;
-
-  if (newrelief != priv->relief)
+  old_relief = gtk_button_get_relief (button);
+  if (old_relief != relief)
     {
-       priv->relief = newrelief;
-       g_object_notify_by_pspec (G_OBJECT (button), props[PROP_RELIEF]);
-       gtk_widget_queue_draw (GTK_WIDGET (button));
+      context = gtk_widget_get_style_context (GTK_WIDGET (button));
+      if (relief == GTK_RELIEF_NONE)
+        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,
 GtkReliefStyle
 gtk_button_get_relief (GtkButton *button)
 {
+  GtkStyleContext *context;
+
   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
@@ -1787,27 +1799,24 @@ gtk_button_draw (GtkWidget *widget,
   GtkButton *button = GTK_BUTTON (widget);
   GtkButtonPrivate *priv = button->priv;
   gint x, y;
+  gint width, height;
   GtkBorder default_border;
   GtkBorder default_outside_border;
-  GtkAllocation allocation;
   GtkStyleContext *context;
   GtkStateFlags state;
-  gboolean draw_focus;
-  gint width, height;
 
   context = gtk_widget_get_style_context (widget);
   state = gtk_style_context_get_state (context);
 
   gtk_button_get_props (button, &default_border, &default_outside_border, NULL, NULL);
-  gtk_widget_get_allocation (widget, &allocation);
 
   x = 0;
   y = 0;
-  width = allocation.width;
-  height = allocation.height;
+  width = gtk_widget_get_allocated_width (widget);
+  height = gtk_widget_get_allocated_height (widget);
 
   if (gtk_widget_has_default (widget) &&
-      priv->relief == GTK_RELIEF_NORMAL)
+      gtk_button_get_relief (button) == GTK_RELIEF_NORMAL)
     {
       x += default_border.left;
       y += default_border.top;
@@ -1822,18 +1831,10 @@ gtk_button_draw (GtkWidget *widget,
       height -= default_outside_border.top + default_outside_border.bottom;
     }
 
-  draw_focus = gtk_widget_has_visible_focus (widget);
-
-  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);
-    }
+  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_y;
diff --git a/gtk/gtkbutton.h b/gtk/gtkbutton.h
index 2617722..99b19ba 100644
--- a/gtk/gtkbutton.h
+++ b/gtk/gtkbutton.h
@@ -116,7 +116,7 @@ void           gtk_button_leave             (GtkButton      *button);
 
 GDK_AVAILABLE_IN_ALL
 void                  gtk_button_set_relief         (GtkButton      *button,
-                                                    GtkReliefStyle  newstyle);
+                                                    GtkReliefStyle  relief);
 GDK_AVAILABLE_IN_ALL
 GtkReliefStyle        gtk_button_get_relief         (GtkButton      *button);
 GDK_AVAILABLE_IN_ALL
diff --git a/gtk/gtkbuttonprivate.h b/gtk/gtkbuttonprivate.h
index 069789a..55e277c 100644
--- a/gtk/gtkbuttonprivate.h
+++ b/gtk/gtkbuttonprivate.h
@@ -58,7 +58,6 @@ struct _GtkButtonPrivate
   guint          focus_on_click        : 1;
   guint          image_is_stock        : 1;
   guint          in_button             : 1;
-  guint          relief                : 2;
   guint          use_action_appearance : 1;
   guint          use_stock             : 1;
   guint          use_underline         : 1;
diff --git a/gtk/gtkenums.h b/gtk/gtkenums.h
index 9bd617f..3c9bd12 100644
--- a/gtk/gtkenums.h
+++ b/gtk/gtkenums.h
@@ -380,7 +380,7 @@ typedef enum
 /**
  * GtkReliefStyle:
  * @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.
  *
  * Indicated the relief to be drawn around a #GtkButton.


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]