summaryrefslogtreecommitdiff
path: root/gtk/gtkmenubar.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2011-04-30 06:31:01 +0200
committerBenjamin Otte <otte@redhat.com>2011-05-01 04:44:56 +0200
commit3091a90538e10425e1e405e75fb6b43baa52e571 (patch)
treeba98c916591dc01e3c64fc22d9f2c0b1da9386e2 /gtk/gtkmenubar.c
parent923fcaa9283e4203a22c65ec48d8a5f499cc78d5 (diff)
downloadgtk+-3091a90538e10425e1e405e75fb6b43baa52e571.tar.gz
menubar: Query only the necessary size from the child
The get_preferred_size() function was compied form elsewhere. We should really make that a common API.
Diffstat (limited to 'gtk/gtkmenubar.c')
-rw-r--r--gtk/gtkmenubar.c52
1 files changed, 32 insertions, 20 deletions
diff --git a/gtk/gtkmenubar.c b/gtk/gtkmenubar.c
index da116d4833..35741484f6 100644
--- a/gtk/gtkmenubar.c
+++ b/gtk/gtkmenubar.c
@@ -291,6 +291,25 @@ gtk_menu_bar_get_property (GObject *object,
}
static void
+get_preferred_size_for_size (GtkWidget *widget,
+ GtkOrientation orientation,
+ gint size,
+ gint *minimum,
+ gint *natural)
+{
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ if (size < 0)
+ gtk_widget_get_preferred_width (widget, minimum, natural);
+ else
+ gtk_widget_get_preferred_width_for_height (widget, size, minimum, natural);
+ else
+ if (size < 0)
+ gtk_widget_get_preferred_height (widget, minimum, natural);
+ else
+ gtk_widget_get_preferred_height_for_width (widget, size, minimum, natural);
+}
+
+static void
gtk_menu_bar_size_request (GtkWidget *widget,
GtkOrientation orientation,
gint *minimum,
@@ -301,11 +320,10 @@ gtk_menu_bar_size_request (GtkWidget *widget,
GtkMenuShell *menu_shell;
GtkWidget *child;
GList *children;
- GtkRequisition child_requisition;
gint ipadding;
guint border_width;
- gboolean use_toggle_size;
- gint size = 0;
+ gboolean use_toggle_size, use_maximize;
+ gint child_size, size = 0;
menu_bar = GTK_MENU_BAR (widget);
menu_shell = GTK_MENU_SHELL (widget);
@@ -319,6 +337,12 @@ gtk_menu_bar_size_request (GtkWidget *widget,
else
use_toggle_size = (orientation == GTK_ORIENTATION_VERTICAL);
+ if (priv->pack_direction == GTK_PACK_DIRECTION_LTR ||
+ priv->pack_direction == GTK_PACK_DIRECTION_RTL)
+ use_maximize = (orientation == GTK_ORIENTATION_VERTICAL);
+ else
+ use_maximize = (orientation == GTK_ORIENTATION_HORIZONTAL);
+
while (children)
{
child = children->data;
@@ -326,7 +350,7 @@ gtk_menu_bar_size_request (GtkWidget *widget,
if (gtk_widget_get_visible (child))
{
- gtk_widget_get_preferred_size (child, &child_requisition, NULL);
+ get_preferred_size_for_size (child, orientation, -1, &child_size, NULL);
if (use_toggle_size)
{
@@ -335,25 +359,13 @@ gtk_menu_bar_size_request (GtkWidget *widget,
gtk_menu_item_toggle_size_request (GTK_MENU_ITEM (child),
&toggle_size);
- child_requisition.width += toggle_size;
- child_requisition.height += toggle_size;
+ child_size += toggle_size;
}
- if (priv->pack_direction == GTK_PACK_DIRECTION_LTR ||
- priv->pack_direction == GTK_PACK_DIRECTION_RTL)
- {
- if (orientation == GTK_ORIENTATION_HORIZONTAL)
- size += child_requisition.width;
- else
- size = MAX (size, child_requisition.height);
- }
+ if (use_maximize)
+ size = MAX (size, child_size);
else
- {
- if (orientation == GTK_ORIENTATION_HORIZONTAL)
- size = MAX (size, child_requisition.width);
- else
- size += child_requisition.height;
- }
+ size += child_size;
}
}