- GtkMenuItem *menu_item;
- GtkBin *bin;
- GtkStyle *style;
- GtkWidget *child, *widget = GTK_WIDGET (request);
- GtkWidget *parent;
- guint horizontal_padding;
- guint border_width;
- GtkPackDirection pack_dir;
- GtkPackDirection child_pack_dir;
- gint min_height, nat_height;
- gint avail_size;
-
- min_height = nat_height = 0;
-
- style = gtk_widget_get_style (widget);
-
- gtk_widget_style_get (widget,
- "horizontal-padding", &horizontal_padding,
- NULL);
-
- bin = GTK_BIN (widget);
- menu_item = GTK_MENU_ITEM (widget);
- parent = gtk_widget_get_parent (widget);
-
- if (GTK_IS_MENU_BAR (parent))
- {
- pack_dir = gtk_menu_bar_get_pack_direction (GTK_MENU_BAR (parent));
- child_pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
- }
- else
- {
- pack_dir = GTK_PACK_DIRECTION_LTR;
- child_pack_dir = GTK_PACK_DIRECTION_LTR;
- }
-
- border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
- min_height = (border_width + style->ythickness) * 2;
-
- avail_size = for_size;
- avail_size -= (border_width + style->xthickness) * 2;
-
- if ((pack_dir == GTK_PACK_DIRECTION_TTB || pack_dir == GTK_PACK_DIRECTION_BTT) &&
- (child_pack_dir == GTK_PACK_DIRECTION_TTB || child_pack_dir == GTK_PACK_DIRECTION_BTT))
- min_height += 2 * horizontal_padding;
-
- if ((pack_dir == GTK_PACK_DIRECTION_LTR || pack_dir == GTK_PACK_DIRECTION_RTL) &&
- (child_pack_dir == GTK_PACK_DIRECTION_LTR || child_pack_dir == GTK_PACK_DIRECTION_RTL))
- avail_size -= 2 * horizontal_padding;
-
- nat_height = min_height;
-
- child = gtk_bin_get_child (bin);
-
- if (child != NULL && gtk_widget_get_visible (child))
- {
- gint child_min, child_nat;
- gint arrow_size = 0;
-
- if (menu_item->submenu && menu_item->show_submenu_indicator)
- {
-
- guint arrow_spacing;
-
- gtk_widget_style_get (widget,
- "arrow-spacing", &arrow_spacing,
- NULL);
-
- get_arrow_size (widget, child, &arrow_size);
-
- avail_size -= arrow_size;
- avail_size -= arrow_spacing;
- }
-
- gtk_size_request_get_height_for_width (GTK_SIZE_REQUEST (child), avail_size, &child_min, &child_nat);
-
- min_height += child_min;
- nat_height += child_nat;
-
- if (menu_item->submenu && menu_item->show_submenu_indicator)
- {
- min_height = MAX (min_height, arrow_size);
- nat_height = MAX (nat_height, arrow_size);
- }
- }
- else /* separator item */
- {
- gboolean wide_separators;
- gint separator_height;
-
- gtk_widget_style_get (widget,
- "wide-separators", &wide_separators,
- "separator-height", &separator_height,
- NULL);
-
- if (wide_separators)
- min_height += separator_height + style->ythickness;
- else
- min_height += style->ythickness * 2;
-
- nat_height = min_height;
- }
-
- if (minimum_size)
- *minimum_size = min_height;