summaryrefslogtreecommitdiff
path: root/gtk/gtktreemenu.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2013-11-21 16:24:27 +0100
committerBenjamin Otte <otte@redhat.com>2013-11-25 03:49:35 +0100
commit46ed450a2995c98c44305077d3edcd10d6fd2bc3 (patch)
tree4aef84c2713c47ecb4bf2567806d63a83f8c5ded /gtk/gtktreemenu.c
parent9d7a442b8b76fc01c51864549b34ee9b85931f21 (diff)
downloadgtk+-46ed450a2995c98c44305077d3edcd10d6fd2bc3.tar.gz
treemenu: Implement height-for-width properly
Diffstat (limited to 'gtk/gtktreemenu.c')
-rw-r--r--gtk/gtktreemenu.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/gtk/gtktreemenu.c b/gtk/gtktreemenu.c
index 5bdf729159..cc025070a5 100644
--- a/gtk/gtktreemenu.c
+++ b/gtk/gtktreemenu.c
@@ -73,6 +73,14 @@ static void gtk_tree_menu_get_preferred_width (GtkWidget
static void gtk_tree_menu_get_preferred_height (GtkWidget *widget,
gint *minimum_size,
gint *natural_size);
+static void gtk_tree_menu_get_preferred_width_for_height (GtkWidget *widget,
+ gint for_height,
+ gint *minimum_size,
+ gint *natural_size);
+static void gtk_tree_menu_get_preferred_height_for_width (GtkWidget *widget,
+ gint for_width,
+ gint *minimum_size,
+ gint *natural_size);
/* GtkCellLayoutIface */
static void gtk_tree_menu_cell_layout_init (GtkCellLayoutIface *iface);
@@ -227,6 +235,8 @@ _gtk_tree_menu_class_init (GtkTreeMenuClass *class)
widget_class->get_preferred_width = gtk_tree_menu_get_preferred_width;
widget_class->get_preferred_height = gtk_tree_menu_get_preferred_height;
+ widget_class->get_preferred_width_for_height = gtk_tree_menu_get_preferred_width_for_height;
+ widget_class->get_preferred_height_for_width = gtk_tree_menu_get_preferred_height_for_width;
/*
* GtkTreeMenu::menu-activate:
@@ -617,6 +627,49 @@ gtk_tree_menu_get_preferred_height (GtkWidget *widget,
g_signal_handler_unblock (priv->context, priv->size_changed_id);
}
+static void
+gtk_tree_menu_get_preferred_width_for_height (GtkWidget *widget,
+ gint for_height,
+ gint *minimum_size,
+ gint *natural_size)
+{
+ GtkTreeMenu *menu = GTK_TREE_MENU (widget);
+ GtkTreeMenuPrivate *priv = menu->priv;
+
+ /* We leave the requesting work up to the cellviews which operate in the same
+ * context, reserving space for the submenu indicator if any of the items have
+ * submenus ensures that every cellview will receive the same allocated width.
+ *
+ * Since GtkMenu does hieght-for-width correctly, we know that the width of
+ * every cell will be requested before the height-for-widths are requested.
+ */
+ g_signal_handler_block (priv->context, priv->size_changed_id);
+
+ sync_reserve_submenu_size (menu);
+
+ GTK_WIDGET_CLASS (_gtk_tree_menu_parent_class)->get_preferred_width_for_height (widget, for_height, minimum_size, natural_size);
+
+ g_signal_handler_unblock (priv->context, priv->size_changed_id);
+}
+
+static void
+gtk_tree_menu_get_preferred_height_for_width (GtkWidget *widget,
+ gint for_width,
+ gint *minimum_size,
+ gint *natural_size)
+{
+ GtkTreeMenu *menu = GTK_TREE_MENU (widget);
+ GtkTreeMenuPrivate *priv = menu->priv;
+
+ g_signal_handler_block (priv->context, priv->size_changed_id);
+
+ sync_reserve_submenu_size (menu);
+
+ GTK_WIDGET_CLASS (_gtk_tree_menu_parent_class)->get_preferred_height_for_width (widget, for_width, minimum_size, natural_size);
+
+ g_signal_handler_unblock (priv->context, priv->size_changed_id);
+}
+
/****************************************************************
* GtkCellLayoutIface *
****************************************************************/