[gtk+] GtkEntry: Make has-frame use style classes



commit 17679c168a2360ad600d7c24e8631487cb759e78
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Jun 25 22:08:27 2014 -0400

    GtkEntry: Make has-frame use style classes
    
    Instead of code that internally does weird things, use the FLAT style
    class if has-frame is FALSE and remove it otherwise.
    Based on a patch by Benjamin Otte.
    https://bugzilla.gnome.org/show_bug.cgi?id=732256
    
    fixup entry

 gtk/gtkentry.c |   58 ++++++++++++++++++++++++++-----------------------------
 1 files changed, 27 insertions(+), 31 deletions(-)
---
diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c
index b27e25e..f438887 100644
--- a/gtk/gtkentry.c
+++ b/gtk/gtkentry.c
@@ -209,7 +209,6 @@ struct _GtkEntryPrivate
   guint         change_count            : 8;
   guint         cursor_visible          : 1;
   guint         editing_canceled        : 1; /* Only used by GtkCellRendererText */
-  guint         has_frame               : 1;
   guint         in_click                : 1; /* Flag so we don't select all when clicking in entry to focus 
in */
   guint         is_cell_renderer        : 1;
   guint         invisible_char_set      : 1;
@@ -2400,7 +2399,7 @@ gtk_entry_get_property (GObject         *object,
       break;
 
     case PROP_HAS_FRAME:
-      g_value_set_boolean (value, priv->has_frame);
+      g_value_set_boolean (value, gtk_entry_get_has_frame (entry));
       break;
 
     case PROP_INNER_BORDER:
@@ -2681,7 +2680,6 @@ gtk_entry_init (GtkEntry *entry)
   priv->max_width_chars = -1;
   priv->is_cell_renderer = FALSE;
   priv->editing_canceled = FALSE;
-  priv->has_frame = TRUE;
   priv->truncate_multiline = FALSE;
   priv->shadow_type = GTK_SHADOW_IN;
   priv->xalign = 0.0;
@@ -3383,27 +3381,22 @@ void
 _gtk_entry_get_borders (GtkEntry *entry,
                         GtkBorder *border_out)
 {
-  GtkEntryPrivate *priv = entry->priv;
   GtkWidget *widget = GTK_WIDGET (entry);
-  GtkBorder tmp = { 0, 0, 0, 0 };
+  GtkBorder padding, border;
   GtkStyleContext *context;
 
   context = gtk_widget_get_style_context (widget);
-  gtk_style_context_get_padding (context, 0, &tmp);
-
-  if (priv->has_frame)
-    {
-      GtkBorder border;
 
-      gtk_style_context_get_border (context, 0, &border);
-      tmp.top += border.top;
-      tmp.right += border.right;
-      tmp.bottom += border.bottom;
-      tmp.left += border.left;
-    }
+  gtk_style_context_get_padding (context, 0, &padding);
+  gtk_style_context_get_border (context, 0, &border);
 
   if (border_out != NULL)
-    *border_out = tmp;
+    {
+      border_out->top = padding.top + border.top;
+      border_out->bottom = padding.bottom + border.bottom;
+      border_out->left = padding.left + border.left;
+      border_out->right = padding.right + border.right;
+    }
 }
 
 static void
@@ -3793,8 +3786,6 @@ gtk_entry_draw_frame (GtkWidget       *widget,
                       GtkStyleContext *context,
                       cairo_t         *cr)
 {
-  GtkEntry *entry = GTK_ENTRY (widget);
-  GtkEntryPrivate *priv = entry->priv;
   gint x = 0, y = 0, width, height;
   gint frame_x, frame_y;
 
@@ -3806,7 +3797,8 @@ gtk_entry_draw_frame (GtkWidget       *widget,
 
   /* Fix a problem with some themes which assume that entry->text_area's
    * width equals widget->window's width
-   * http://bugzilla.gnome.org/show_bug.cgi?id=466000 */
+   * http://bugzilla.gnome.org/show_bug.cgi?id=466000
+   */
   if (GTK_IS_SPIN_BUTTON (widget))
     {
       GtkBorder borders;
@@ -3820,10 +3812,8 @@ gtk_entry_draw_frame (GtkWidget       *widget,
 
   gtk_render_background (context, cr,
                          x, y, width, height);
-
-  if (priv->has_frame)
-    gtk_render_frame (context, cr,
-                     x, y, width, height);
+  gtk_render_frame (context, cr,
+                   x, y, width, height);
 
   gtk_entry_draw_progress (widget, context, cr);
 
@@ -8084,19 +8074,21 @@ void
 gtk_entry_set_has_frame (GtkEntry *entry,
                          gboolean  setting)
 {
-  GtkEntryPrivate *priv;
+  GtkStyleContext *context;
 
   g_return_if_fail (GTK_IS_ENTRY (entry));
 
-  priv = entry->priv;
-
   setting = (setting != FALSE);
 
-  if (priv->has_frame == setting)
+  if (setting == gtk_entry_get_has_frame (entry))
     return;
 
-  gtk_widget_queue_resize (GTK_WIDGET (entry));
-  priv->has_frame = setting;
+  context = gtk_widget_get_style_context (GTK_WIDGET (entry));
+  if (setting)
+    gtk_style_context_remove_class (context, GTK_STYLE_CLASS_FLAT);
+  else
+    gtk_style_context_add_class (context, GTK_STYLE_CLASS_FLAT);
+  gtk_widget_queue_draw (GTK_WIDGET (entry));
   g_object_notify (G_OBJECT (entry), "has-frame");
 }
 
@@ -8111,9 +8103,13 @@ gtk_entry_set_has_frame (GtkEntry *entry,
 gboolean
 gtk_entry_get_has_frame (GtkEntry *entry)
 {
+  GtkStyleContext *context;
+
   g_return_val_if_fail (GTK_IS_ENTRY (entry), FALSE);
 
-  return entry->priv->has_frame;
+  context = gtk_widget_get_style_context (GTK_WIDGET (entry));
+
+  return !gtk_style_context_has_class (context, GTK_STYLE_CLASS_FLAT);
 }
 
 /**


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