]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkmenu.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / gtk / gtkmenu.c
index f52d110c0b3df04533515049a7bf9ffad16e7228..79bde09ab0686f4fd643d437724058a47320fe66 100644 (file)
@@ -35,7 +35,7 @@
  * #GtkMenuItem in a #GtkMenuBar or popped up by activating a
  * #GtkMenuItem in another #GtkMenu.
  *
- * A #GtkMenu can also be popped up by activating a #GtkOptionMenu.
+ * A #GtkMenu can also be popped up by activating a #GtkComboBox.
  * Other composite widgets such as the #GtkNotebook can pop up a
  * #GtkMenu as well.
  *
@@ -641,15 +641,6 @@ gtk_menu_class_init (GtkMenuClass *class)
                                                      -1, G_MAXINT, -1,
                                                      GTK_PARAM_READWRITE));
 
-  gtk_widget_class_install_style_property (widget_class,
-                                           g_param_spec_int ("vertical-padding",
-                                                             P_("Vertical Padding"),
-                                                             P_("Extra space at the top and bottom of the menu"),
-                                                             0,
-                                                             G_MAXINT,
-                                                             1,
-                                                             GTK_PARAM_READABLE));
-
   /**
    * GtkMenu:reserve-toggle-size:
    *
@@ -671,6 +662,15 @@ gtk_menu_class_init (GtkMenuClass *class)
                                                          TRUE,
                                                          GTK_PARAM_READWRITE));
 
+  /**
+   * GtkMenu:horizontal-padding:
+   *
+   * Extra space at the left and right edges of the menu.
+   *
+   * Deprecated: 3.8: use the standard padding CSS property (through objects
+   *   like #GtkStyleContext and #GtkCssProvider); the value of this style
+   *   property is ignored.
+   */
   gtk_widget_class_install_style_property (widget_class,
                                            g_param_spec_int ("horizontal-padding",
                                                              P_("Horizontal Padding"),
@@ -678,7 +678,27 @@ gtk_menu_class_init (GtkMenuClass *class)
                                                              0,
                                                              G_MAXINT,
                                                              0,
-                                                             GTK_PARAM_READABLE));
+                                                             GTK_PARAM_READABLE |
+                                                             G_PARAM_DEPRECATED));
+
+  /**
+   * GtkMenu:vertical-padding:
+   *
+   * Extra space at the top and bottom of the menu.
+   *
+   * Deprecated: 3.8: use the standard padding CSS property (through objects
+   *   like #GtkStyleContext and #GtkCssProvider); the value of this style
+   *   property is ignored.
+   */
+  gtk_widget_class_install_style_property (widget_class,
+                                           g_param_spec_int ("vertical-padding",
+                                                             P_("Vertical Padding"),
+                                                             P_("Extra space at the top and bottom of the menu"),
+                                                             0,
+                                                             G_MAXINT,
+                                                             1,
+                                                             GTK_PARAM_READABLE |
+                                                             G_PARAM_DEPRECATED));
 
   gtk_widget_class_install_style_property (widget_class,
                                            g_param_spec_int ("vertical-offset",
@@ -1214,12 +1234,11 @@ gtk_menu_attach_to_widget (GtkMenu           *menu,
   g_object_set_data_full (G_OBJECT (attach_widget), I_(ATTACHED_MENUS), list,
                           (GDestroyNotify) g_list_free);
 
-  if (gtk_widget_get_state_flags (GTK_WIDGET (menu)) != 0)
-    gtk_widget_set_state_flags (GTK_WIDGET (menu), 0, TRUE);
-
   /* Attach the widget to the toplevel window. */
   gtk_window_set_attached_to (GTK_WINDOW (menu->priv->toplevel), attach_widget);
 
+  _gtk_widget_update_parent_muxer (GTK_WIDGET (menu));
+
   /* Fallback title for menu comes from attach widget */
   gtk_menu_update_title (menu);
 
@@ -1294,9 +1313,12 @@ gtk_menu_detach (GtkMenu *menu)
 
   g_slice_free (GtkMenuAttachData, data);
 
+  _gtk_widget_update_parent_muxer (GTK_WIDGET (menu));
+
   /* Fallback title for menu comes from attach widget */
   gtk_menu_update_title (menu);
 
+  g_object_notify (G_OBJECT (menu), "attach-widget");
   g_object_unref (menu);
 }
 
@@ -1719,7 +1741,7 @@ gtk_menu_popup_for_device (GtkMenu             *menu,
  *     triggering menu item, or %NULL
  * @parent_menu_item: (allow-none): the menu item whose activation
  *     triggered the popup, or %NULL
- * @func: (allow-none): a user supplied function used to position
+ * @func: (scope async) (allow-none): a user supplied function used to position
  *     the menu, or %NULL
  * @data: user supplied data to be passed to @func.
  * @button: the mouse button which was pressed to initiate the event.
@@ -1863,7 +1885,7 @@ gtk_menu_popdown (GtkMenu *menu)
  * @menu: a #GtkMenu
  *
  * Returns the selected menu item from the menu.  This is used by the
- * #GtkOptionMenu.
+ * #GtkComboBox.
  *
  * Returns: (transfer none): the #GtkMenuItem that was last selected
  *          in the menu.  If a selection has not yet been made, the
@@ -1908,7 +1930,7 @@ gtk_menu_get_active (GtkMenu *menu)
  *         from 0 to n-1
  *
  * Selects the specified menu item within the menu.  This is used by
- * the #GtkOptionMenu and should not be used by anyone else.
+ * the #GtkComboBox and should not be used by anyone else.
  */
 void
 gtk_menu_set_active (GtkMenu *menu,
@@ -2505,8 +2527,6 @@ gtk_menu_realize (GtkWidget *widget)
   gint border_width;
   GtkWidget *child;
   GList *children;
-  guint vertical_padding;
-  guint horizontal_padding;
   GtkBorder arrow_border, padding;
 
   g_return_if_fail (GTK_IS_MENU (widget));
@@ -2531,25 +2551,20 @@ gtk_menu_realize (GtkWidget *widget)
   window = gdk_window_new (gtk_widget_get_parent_window (widget),
                            &attributes, attributes_mask);
   gtk_widget_set_window (widget, window);
-  gdk_window_set_user_data (window, widget);
+  gtk_widget_register_window (widget, window);
 
   get_menu_padding (widget, &padding);
   border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
   context = gtk_widget_get_style_context (widget);
 
-  gtk_widget_style_get (GTK_WIDGET (menu),
-                        "vertical-padding", &vertical_padding,
-                        "horizontal-padding", &horizontal_padding,
-                        NULL);
-
   gtk_widget_get_allocation (widget, &allocation);
 
-  attributes.x = border_width + padding.left + horizontal_padding;
-  attributes.y = border_width + padding.top + vertical_padding;
+  attributes.x = border_width + padding.left;
+  attributes.y = border_width + padding.top;
   attributes.width = allocation.width -
-    (2 * (border_width + horizontal_padding)) - padding.left - padding.right;
+    (2 * border_width) - padding.left - padding.right;
   attributes.height = allocation.height -
-    (2 * (border_width + vertical_padding)) - padding.top - padding.bottom;
+    (2 * border_width) - padding.top - padding.bottom;
 
   get_arrows_border (menu, &arrow_border);
   attributes.y += arrow_border.top;
@@ -2561,15 +2576,15 @@ gtk_menu_realize (GtkWidget *widget)
 
   priv->view_window = gdk_window_new (window,
                                       &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->view_window, menu);
+  gtk_widget_register_window (widget, priv->view_window);
 
   gtk_widget_get_allocation (widget, &allocation);
 
   attributes.x = 0;
   attributes.y = 0;
-  attributes.width = allocation.width + (2 * (border_width + horizontal_padding)) +
+  attributes.width = allocation.width + (2 * border_width) +
     padding.left + padding.right;
-  attributes.height = priv->requested_height - (2 * (border_width + vertical_padding)) +
+  attributes.height = priv->requested_height - (2 * border_width) +
     padding.top + padding.bottom;
 
   attributes.width = MAX (1, attributes.width);
@@ -2577,7 +2592,7 @@ gtk_menu_realize (GtkWidget *widget)
 
   priv->bin_window = gdk_window_new (priv->view_window,
                                      &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->bin_window, menu);
+  gtk_widget_register_window (widget, priv->bin_window);
 
   children = GTK_MENU_SHELL (menu)->priv->children;
   while (children)
@@ -2633,7 +2648,7 @@ menu_grab_transfer_window_get (GtkMenu *menu)
 
       window = gdk_window_new (gtk_widget_get_root_window (GTK_WIDGET (menu)),
                                &attributes, attributes_mask);
-      gdk_window_set_user_data (window, menu);
+      gtk_widget_register_window (GTK_WIDGET (menu), window);
 
       gdk_window_show (window);
 
@@ -2649,7 +2664,7 @@ menu_grab_transfer_window_destroy (GtkMenu *menu)
   GdkWindow *window = g_object_get_data (G_OBJECT (menu), "gtk-menu-transfer-window");
   if (window)
     {
-      gdk_window_set_user_data (window, NULL);
+      gtk_widget_unregister_window (GTK_WIDGET (menu), window);
       gdk_window_destroy (window);
       g_object_set_data (G_OBJECT (menu), I_("gtk-menu-transfer-window"), NULL);
     }
@@ -2663,11 +2678,11 @@ gtk_menu_unrealize (GtkWidget *widget)
 
   menu_grab_transfer_window_destroy (menu);
 
-  gdk_window_set_user_data (priv->view_window, NULL);
+  gtk_widget_unregister_window (widget, priv->view_window);
   gdk_window_destroy (priv->view_window);
   priv->view_window = NULL;
 
-  gdk_window_set_user_data (priv->bin_window, NULL);
+  gtk_widget_unregister_window (widget, priv->bin_window);
   gdk_window_destroy (priv->bin_window);
   priv->bin_window = NULL;
 
@@ -2685,7 +2700,6 @@ calculate_line_heights (GtkMenu *menu,
   GtkMenuShell   *menu_shell;
   GtkWidget      *child, *widget;
   GList          *children;
-  guint           horizontal_padding;
   guint           border_width;
   guint           n_columns;
   gint            n_heights;
@@ -2703,13 +2717,10 @@ calculate_line_heights (GtkMenu *menu,
   n_columns    = gtk_menu_get_n_columns (menu);
   avail_width  = for_width - (2 * priv->toggle_size + priv->accel_size) * n_columns;
 
-  gtk_widget_style_get (GTK_WIDGET (menu),
-                        "horizontal-padding", &horizontal_padding,
-                        NULL);
   get_menu_padding (widget, &padding);
 
   border_width = gtk_container_get_border_width (GTK_CONTAINER (menu));
-  avail_width -= (border_width + horizontal_padding) * 2 + padding.left + padding.right;
+  avail_width -= (border_width) * 2 + padding.left + padding.right;
 
   for (children = menu_shell->priv->children; children; children = children->next)
     {
@@ -2765,8 +2776,6 @@ gtk_menu_size_allocate (GtkWidget     *widget,
   gint x, y, i;
   gint width, height;
   guint border_width;
-  guint vertical_padding;
-  guint horizontal_padding;
   GtkBorder padding;
 
   g_return_if_fail (GTK_IS_MENU (widget));
@@ -2778,11 +2787,6 @@ gtk_menu_size_allocate (GtkWidget     *widget,
 
   gtk_widget_set_allocation (widget, allocation);
 
-  gtk_widget_style_get (GTK_WIDGET (menu),
-                        "vertical-padding", &vertical_padding,
-                        "horizontal-padding", &horizontal_padding,
-                        NULL);
-
   get_menu_padding (widget, &padding);
   border_width = gtk_container_get_border_width (GTK_CONTAINER (menu));
 
@@ -2793,16 +2797,15 @@ gtk_menu_size_allocate (GtkWidget     *widget,
                                                  NULL);
 
   /* refresh our cached height request */
-  priv->requested_height = (2 * (border_width + vertical_padding)) +
-    padding.top + padding.bottom;
+  priv->requested_height = (2 * border_width) + padding.top + padding.bottom;
   for (i = 0; i < priv->heights_length; i++)
     priv->requested_height += priv->heights[i];
 
-  x = border_width + padding.left + horizontal_padding;
-  y = border_width + padding.top + vertical_padding;
-  width = allocation->width - (2 * (border_width + horizontal_padding)) -
+  x = border_width + padding.left;
+  y = border_width + padding.top;
+  width = allocation->width - (2 * border_width) -
     padding.left - padding.right;
-  height = allocation->height - (2 * (border_width + vertical_padding)) -
+  height = allocation->height - (2 * border_width) -
     padding.top - padding.bottom;
 
   if (menu_shell->priv->active)
@@ -2932,22 +2935,18 @@ get_arrows_visible_area (GtkMenu      *menu,
   GtkArrowPlacement arrow_placement;
   GtkWidget *widget = GTK_WIDGET (menu);
   guint border_width;
-  guint vertical_padding;
-  guint horizontal_padding;
   gint scroll_arrow_height;
   GtkBorder menu_padding;
 
   gtk_widget_style_get (widget,
-                        "vertical-padding", &vertical_padding,
-                        "horizontal-padding", &horizontal_padding,
                         "scroll-arrow-vlength", &scroll_arrow_height,
                         "arrow-placement", &arrow_placement,
                         NULL);
 
   get_menu_padding (widget, &menu_padding);
   border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
-  border->x = border_width + menu_padding.left + horizontal_padding;
-  border->y = border_width + menu_padding.top + vertical_padding;
+  border->x = border_width + menu_padding.left;
+  border->y = border_width + menu_padding.top;
   border->width = gdk_window_get_width (gtk_widget_get_window (widget));
   border->height = gdk_window_get_height (gtk_widget_get_window (widget));
 
@@ -3132,7 +3131,6 @@ gtk_menu_get_preferred_width (GtkWidget *widget,
   GList          *children;
   guint           max_toggle_size;
   guint           max_accel_width;
-  guint           horizontal_padding;
   guint           border_width;
   gint            child_min, child_nat;
   gint            min_width, nat_width;
@@ -3198,7 +3196,7 @@ gtk_menu_get_preferred_width (GtkWidget *widget,
       context = gtk_style_context_new ();
 
       /* Create a GtkCheckMenuItem path, only to query indicator spacing */
-      check_path = gtk_widget_path_copy (gtk_widget_get_path (widget));
+      check_path = _gtk_widget_create_path (widget);
       gtk_widget_path_append_type (check_path, GTK_TYPE_CHECK_MENU_ITEM);
 
       gtk_style_context_set_path (context, check_path);
@@ -3221,16 +3219,10 @@ gtk_menu_get_preferred_width (GtkWidget *widget,
   nat_width += 2 * max_toggle_size + max_accel_width;
   nat_width *= gtk_menu_get_n_columns (menu);
 
-  gtk_widget_style_get (GTK_WIDGET (menu),
-                        "horizontal-padding", &horizontal_padding,
-                        NULL);
-
   get_menu_padding (widget, &padding);
   border_width = gtk_container_get_border_width (GTK_CONTAINER (menu));
-  min_width   += (2 * (border_width + horizontal_padding)) +
-    padding.left + padding.right;
-  nat_width   += (2 * (border_width + horizontal_padding)) +
-    padding.left + padding.right;
+  min_width   += (2 * border_width) + padding.left + padding.right;
+  nat_width   += (2 * border_width) + padding.left + padding.right;
 
   priv->toggle_size = max_toggle_size;
   priv->accel_size  = max_accel_width;
@@ -3272,16 +3264,14 @@ gtk_menu_get_preferred_height_for_width (GtkWidget *widget,
   GtkMenu        *menu = GTK_MENU (widget);
   GtkMenuPrivate *priv = menu->priv;
   guint          *min_heights, *nat_heights;
-  guint           vertical_padding, border_width;
+  guint           border_width;
   gint            n_heights, i;
   gint            min_height, nat_height;
 
-  gtk_widget_style_get (widget, "vertical-padding", &vertical_padding, NULL);
   border_width = gtk_container_get_border_width (GTK_CONTAINER (menu));
   get_menu_padding (widget, &padding);
 
-  min_height = nat_height = (border_width + vertical_padding) * 2 +
-         padding.top + padding.bottom;
+  min_height = nat_height = (2 * border_width) + padding.top + padding.bottom;
 
   n_heights =
     calculate_line_heights (menu, for_size, &min_heights, &nat_heights);
@@ -3863,7 +3853,6 @@ get_arrows_sensitive_area (GtkMenu      *menu,
   GdkWindow *window;
   gint width, height;
   guint border;
-  guint vertical_padding;
   gint win_x, win_y;
   gint scroll_arrow_height;
   GtkBorder padding;
@@ -3873,12 +3862,11 @@ get_arrows_sensitive_area (GtkMenu      *menu,
   height = gdk_window_get_height (window);
 
   gtk_widget_style_get (widget,
-                        "vertical-padding", &vertical_padding,
                         "scroll-arrow-vlength", &scroll_arrow_height,
                         "arrow-placement", &arrow_placement,
                         NULL);
 
-  border = gtk_container_get_border_width (GTK_CONTAINER (menu)) + vertical_padding;
+  border = gtk_container_get_border_width (GTK_CONTAINER (menu));
   get_menu_padding (widget, &padding);
 
   gdk_window_get_position (window, &win_x, &win_y);
@@ -4278,7 +4266,7 @@ gtk_menu_captured_event (GtkWidget *widget,
   menu = GTK_MENU (widget);
   priv = menu->priv;
 
-  if (!priv->upper_arrow_visible && !priv->lower_arrow_visible)
+  if (!priv->upper_arrow_visible && !priv->lower_arrow_visible && priv->drag_start_y < 0)
     return retval;
 
   source_device = gdk_event_get_source_device (event);
@@ -4313,8 +4301,7 @@ gtk_menu_captured_event (GtkWidget *widget,
       break;
     case GDK_TOUCH_UPDATE:
     case GDK_MOTION_NOTIFY:
-      if ((!gdk_event_get_state (event, &state) || (state & GDK_BUTTON1_MASK) 
-!= 0) &&
+      if ((!gdk_event_get_state (event, &state) || (state & GDK_BUTTON1_MASK) != 0) &&
           gdk_device_get_source (source_device) == GDK_SOURCE_TOUCHSCREEN)
         {
           if (!priv->drag_already_pressed)
@@ -4352,7 +4339,10 @@ gtk_menu_captured_event (GtkWidget *widget,
               if (priv->lower_arrow_visible)
                 view_height -= arrow_border.bottom;
 
-              offset = CLAMP (offset, 0, priv->requested_height - view_height);
+              offset = CLAMP (offset,
+                              MIN (priv->scroll_offset, 0),
+                              MAX (priv->scroll_offset, priv->requested_height - view_height));
+
               gtk_menu_scroll_to (menu, offset);
 
               retval = TRUE;
@@ -4838,8 +4828,6 @@ gtk_menu_scroll_to (GtkMenu *menu,
   gint view_width, view_height;
   gint border_width;
   gint menu_height;
-  guint vertical_padding;
-  guint horizontal_padding;
   gboolean double_arrows;
 
   widget = GTK_WIDGET (menu);
@@ -4851,23 +4839,17 @@ gtk_menu_scroll_to (GtkMenu *menu,
   view_width = gtk_widget_get_allocated_width (widget);
   view_height = gtk_widget_get_allocated_height (widget);
 
-  gtk_widget_style_get (GTK_WIDGET (menu),
-                        "vertical-padding", &vertical_padding,
-                        "horizontal-padding", &horizontal_padding,
-                        NULL);
-
   get_menu_padding (widget, &padding);
   double_arrows = get_double_arrows (menu);
 
   border_width = gtk_container_get_border_width (GTK_CONTAINER (menu));
 
-  view_width -= (2 * (border_width + horizontal_padding)) + padding.left + padding.right;
-  view_height -= (2 * (border_width + vertical_padding)) + padding.top + padding.bottom;
-  menu_height = priv->requested_height - (2 * (border_width + vertical_padding)) -
-    padding.top - padding.bottom;
+  view_width -= (2 * border_width) + padding.left + padding.right;
+  view_height -= (2 * border_width) + padding.top + padding.bottom;
+  menu_height = priv->requested_height - (2 * border_width) - padding.top - padding.bottom;
 
-  x = border_width + padding.left + horizontal_padding;
-  y = border_width + padding.top + vertical_padding;
+  x = border_width + padding.left;
+  y = border_width + padding.top;
 
   if (double_arrows && !priv->tearoff_active)
     {
@@ -4998,10 +4980,10 @@ gtk_menu_scroll_to (GtkMenu *menu,
 
   /* Scroll the menu: */
   if (gtk_widget_get_realized (widget))
-    gdk_window_move (priv->bin_window, 0, -offset);
-
-  if (gtk_widget_get_realized (widget))
-    gdk_window_move_resize (priv->view_window, x, y, view_width, view_height);
+    {
+      gdk_window_move (priv->bin_window, 0, -offset);
+      gdk_window_move_resize (priv->view_window, x, y, view_width, view_height);
+    }
 
   priv->scroll_offset = offset;
 }
@@ -5064,23 +5046,18 @@ gtk_menu_scroll_item_visible (GtkMenuShell *menu_shell,
   if (compute_child_offset (menu, menu_item,
                             &child_offset, &child_height, &last_child))
     {
-      guint vertical_padding;
       gboolean double_arrows;
       GtkBorder padding;
 
       y = priv->scroll_offset;
       height = gdk_window_get_height (gtk_widget_get_window (widget));
 
-      gtk_widget_style_get (widget,
-                            "vertical-padding", &vertical_padding,
-                            NULL);
-
       double_arrows = get_double_arrows (menu);
       get_menu_padding (widget, &padding);
 
       height -= 2 * gtk_container_get_border_width (GTK_CONTAINER (menu)) +
-                padding.top + padding.bottom +
-                2 * vertical_padding;
+        padding.top + padding.bottom;
+
       if (child_offset < y)
         {
           /* Ignore the enter event we might get if the pointer
@@ -5528,15 +5505,13 @@ static gint
 get_menu_height (GtkMenu *menu)
 {
   GtkMenuPrivate *priv = menu->priv;
-  GtkAllocation allocation;
   GtkWidget *widget = GTK_WIDGET (menu);
   GtkBorder padding;
   gint height;
 
-  gtk_widget_get_allocation (widget, &allocation);
   get_menu_padding (widget, &padding);
 
-  height = allocation.height;
+  height = priv->requested_height;
   height -= (gtk_container_get_border_width (GTK_CONTAINER (widget)) * 2) +
     padding.top + padding.bottom;
 
@@ -5600,6 +5575,7 @@ gtk_menu_real_move_scroll (GtkMenu       *menu,
             GtkWidget *new_child;
             gboolean new_upper_arrow_visible = priv->upper_arrow_visible && !priv->tearoff_active;
             GtkBorder arrow_border;
+
             get_arrows_border (menu, &arrow_border);
 
             if (priv->scroll_offset != old_offset)
@@ -5616,13 +5592,11 @@ gtk_menu_real_move_scroll (GtkMenu       *menu,
     case GTK_SCROLL_START:
       /* Ignore the enter event we might get if the pointer is on the menu */
       menu_shell->priv->ignore_enter = TRUE;
-      gtk_menu_scroll_to (menu, 0);
       gtk_menu_shell_select_first (menu_shell, TRUE);
       break;
     case GTK_SCROLL_END:
       /* Ignore the enter event we might get if the pointer is on the menu */
       menu_shell->priv->ignore_enter = TRUE;
-      gtk_menu_scroll_to (menu, end_position - page_size);
       _gtk_menu_shell_select_last (menu_shell, TRUE);
       break;
     default:
@@ -5780,3 +5754,32 @@ gtk_menu_get_reserve_toggle_size (GtkMenu *menu)
 
   return !menu->priv->no_toggle_size;
 }
+
+/**
+ * gtk_menu_new_from_model:
+ * @model: a #GMenuModel
+ *
+ * Creates a #GtkMenu and populates it with menu items and
+ * submenus according to @model.
+ *
+ * The created menu items are connected to actions found in the
+ * #GtkApplicationWindow to which the menu belongs - typically
+ * by means of being attached to a widget (see gtk_menu_attach_to_widget())
+ * that is contained within the #GtkApplicationWindows widget hierarchy.
+ *
+ * Returns: a new #GtkMenu
+ *
+ * Since: 3.4
+ */
+GtkWidget *
+gtk_menu_new_from_model (GMenuModel *model)
+{
+  GtkWidget *menu;
+
+  g_return_val_if_fail (G_IS_MENU_MODEL (model), NULL);
+
+  menu = gtk_menu_new ();
+  gtk_menu_shell_bind_model (GTK_MENU_SHELL (menu), model, NULL, TRUE);
+
+  return menu;
+}