]> Pileus Git - ~andy/gtk/commitdiff
Make GtkToolbar honour css border and padding
authorPaolo Borelli <pborelli@gnome.org>
Sat, 4 Aug 2012 15:22:38 +0000 (17:22 +0200)
committerPaolo Borelli <pborelli@gnome.org>
Sun, 5 Aug 2012 10:52:36 +0000 (12:52 +0200)
The widget is already calling gtk_render_frame, but is not measuring css
border and padding when negotiating its size. This patch replaces the
already existing get_internal_padding static helper with a function that
sums the old internal-padding value with the values specified via css.

gtk/gtktoolbar.c

index 3a389bd9771f00f126894a9951c37867917c7f10..6bef947309c5262019ad604d60cd54428800c126 100644 (file)
@@ -252,7 +252,6 @@ static gboolean   gtk_toolbar_popup_menu           (GtkWidget           *toolbar
 static void       gtk_toolbar_reconfigured         (GtkToolbar          *toolbar);
 
 static GtkReliefStyle       get_button_relief    (GtkToolbar *toolbar);
-static gint                 get_internal_padding (GtkToolbar *toolbar);
 static gint                 get_max_child_expand (GtkToolbar *toolbar);
 static GtkShadowType        get_shadow_type      (GtkToolbar *toolbar);
 
@@ -885,6 +884,29 @@ gtk_toolbar_draw (GtkWidget *widget,
   return FALSE;
 }
 
+static void
+get_widget_padding_and_border (GtkWidget *widget,
+                               GtkBorder *padding)
+{
+  GtkStyleContext *context;
+  GtkStateFlags state;
+  GtkBorder tmp;
+  gint ipadding = 0;
+
+  context = gtk_widget_get_style_context (widget);
+  state = gtk_style_context_get_state (context);
+
+  gtk_style_context_get_padding (context, state, padding);
+  gtk_style_context_get_border (context, state, &tmp);
+
+  gtk_widget_style_get (widget, "internal-padding", &ipadding, NULL);
+
+  padding->top += tmp.top + ipadding;
+  padding->right += tmp.right + ipadding;
+  padding->bottom += tmp.bottom + ipadding;
+  padding->left += tmp.left + ipadding;
+}
+
 static void
 gtk_toolbar_size_request (GtkWidget      *widget,
                          GtkRequisition *requisition)
@@ -899,7 +921,7 @@ gtk_toolbar_size_request (GtkWidget      *widget,
   gint homogeneous_size;
   gint long_req;
   gint pack_front_size;
-  gint ipadding;
+  GtkBorder padding;
   guint border_width;
   GtkRequisition arrow_requisition;
   
@@ -993,14 +1015,14 @@ gtk_toolbar_size_request (GtkWidget      *widget,
       requisition->height = long_req;
       requisition->width = MAX (max_child_width, arrow_requisition.width);
     }
-  
-  /* Extra spacing */
-  ipadding = get_internal_padding (toolbar);
 
+  /* Extra spacing */
+  get_widget_padding_and_border (widget, &padding);
   border_width = gtk_container_get_border_width (GTK_CONTAINER (toolbar));
-  requisition->width += 2 * (ipadding + border_width);
-  requisition->height += 2 * (ipadding + border_width);
-  
+
+  requisition->width += 2 * border_width + padding.left + padding.right;
+  requisition->height += 2 * border_width + padding.top + padding.bottom;
+
   if (get_shadow_type (toolbar) != GTK_SHADOW_NONE)
     {
       GtkStyleContext *context;
@@ -1241,13 +1263,11 @@ gtk_toolbar_begin_sliding (GtkToolbar *toolbar)
   GtkAllocation allocation;
   GtkWidget *widget = GTK_WIDGET (toolbar);
   GtkToolbarPrivate *priv = toolbar->priv;
-  GtkStyleContext *context;
-  GtkStateFlags state;
-  GtkBorder padding;
   GList *list;
   gint cur_x;
   gint cur_y;
   gint border_width;
+  GtkBorder padding;
   gboolean rtl;
   gboolean vertical;
   
@@ -1265,14 +1285,13 @@ gtk_toolbar_begin_sliding (GtkToolbar *toolbar)
     priv->idle_id = gdk_threads_add_idle (slide_idle_handler, toolbar);
 
   gtk_widget_get_allocation (widget, &allocation);
-  context = gtk_widget_get_style_context (widget);
-  state = gtk_widget_get_state_flags (widget);
-  gtk_style_context_get_padding (context, state, &padding);
 
   rtl = (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL);
   vertical = (priv->orientation == GTK_ORIENTATION_VERTICAL);
-  border_width = get_internal_padding (toolbar) + gtk_container_get_border_width (GTK_CONTAINER (toolbar));
-  
+
+  border_width = gtk_container_get_border_width (GTK_CONTAINER (toolbar));
+  get_widget_padding_and_border (GTK_WIDGET (toolbar), &padding);
+
   if (rtl)
     {
       cur_x = allocation.width - border_width - padding.right;
@@ -1479,8 +1498,6 @@ gtk_toolbar_size_allocate (GtkWidget     *widget,
   GtkAllocation *allocations;
   ItemState *new_states;
   GtkAllocation arrow_allocation;
-  GtkStyleContext *context;
-  GtkStateFlags state;
   GtkBorder padding;
   gint arrow_size;
   gint size, pos, short_size;
@@ -1498,10 +1515,6 @@ gtk_toolbar_size_allocate (GtkWidget     *widget,
   GtkAllocation item_area;
   GtkShadowType shadow_type;
 
-  context = gtk_widget_get_style_context (widget);
-  state = gtk_widget_get_state_flags (widget);
-  gtk_style_context_get_padding (context, state, &padding);
-
   gtk_widget_get_allocation (widget, &widget_allocation);
   size_changed = FALSE;
   if (widget_allocation.x != allocation->x ||
@@ -1526,17 +1539,18 @@ gtk_toolbar_size_allocate (GtkWidget     *widget,
                             allocation->width - border_width * 2,
                             allocation->height - border_width * 2);
 
-  border_width += get_internal_padding (toolbar);
 
   gtk_widget_get_preferred_size (priv->arrow_button,
                                  &arrow_requisition, NULL);
 
   shadow_type = get_shadow_type (toolbar);
 
+  get_widget_padding_and_border (widget, &padding);
+
   if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
     {
-      available_size = size = allocation->width - 2 * border_width;
-      short_size = allocation->height - 2 * border_width;
+      available_size = size = allocation->width - 2 * border_width - padding.left - padding.right;
+      short_size = allocation->height - 2 * border_width - padding.top - padding.bottom;
       arrow_size = arrow_requisition.width;
 
       if (shadow_type != GTK_SHADOW_NONE)
@@ -1547,8 +1561,8 @@ gtk_toolbar_size_allocate (GtkWidget     *widget,
     }
   else
     {
-      available_size = size = allocation->height - 2 * border_width;
-      short_size = allocation->width - 2 * border_width;
+      available_size = size = allocation->height - 2 * border_width - padding.top - padding.bottom;
+      short_size = allocation->width - 2 * border_width - padding.left - padding.right;
       arrow_size = arrow_requisition.height;
 
       if (shadow_type != GTK_SHADOW_NONE)
@@ -1672,7 +1686,7 @@ gtk_toolbar_size_allocate (GtkWidget     *widget,
     }
 
   /* position items */
-  pos = border_width;
+  pos = border_width + padding.left;
   for (list = priv->content, i = 0; list != NULL; list = list->next, ++i)
     {
       /* Both NORMAL and OVERFLOWN items get a position.
@@ -1681,7 +1695,7 @@ gtk_toolbar_size_allocate (GtkWidget     *widget,
       if (new_states[i] == NORMAL || new_states[i] == OVERFLOWN)
         {
           allocations[i].x = pos;
-          allocations[i].y = border_width;
+          allocations[i].y = border_width + padding.top;
           allocations[i].height = short_size;
 
           pos += allocations[i].width;
@@ -1691,12 +1705,12 @@ gtk_toolbar_size_allocate (GtkWidget     *widget,
   /* position arrow */
   if (need_arrow)
     {
-      arrow_allocation.x = available_size - border_width - arrow_allocation.width;
-      arrow_allocation.y = border_width;
+      arrow_allocation.x = available_size - border_width - padding.left - arrow_allocation.width;
+      arrow_allocation.y = border_width + padding.top;
     }
 
-  item_area.x = border_width;
-  item_area.y = border_width;
+  item_area.x = border_width + padding.left;
+  item_area.y = border_width + padding.top;
   item_area.width = available_size - (need_arrow? arrow_size : 0);
   item_area.height = short_size;
 
@@ -3649,18 +3663,6 @@ get_button_relief (GtkToolbar *toolbar)
   return button_relief;
 }
 
-static gint
-get_internal_padding (GtkToolbar *toolbar)
-{
-  gint ipadding = 0;
-  
-  gtk_widget_style_get (GTK_WIDGET (toolbar),
-                       "internal-padding", &ipadding,
-                       NULL);
-  
-  return ipadding;
-}
-
 static gint
 get_max_child_expand (GtkToolbar *toolbar)
 {