[gtk+] treemenu: Implement height-for-width properly
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] treemenu: Implement height-for-width properly
- Date: Mon, 25 Nov 2013 02:56:37 +0000 (UTC)
commit 46ed450a2995c98c44305077d3edcd10d6fd2bc3
Author: Benjamin Otte <otte redhat com>
Date: Thu Nov 21 16:24:27 2013 +0100
treemenu: Implement height-for-width properly
gtk/gtktreemenu.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 53 insertions(+), 0 deletions(-)
---
diff --git a/gtk/gtktreemenu.c b/gtk/gtktreemenu.c
index 5bdf729..cc02507 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 *
****************************************************************/
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]