X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkmenu.c;h=79bde09ab0686f4fd643d437724058a47320fe66;hb=bb3c56abe2e7916126bd4f8234dee080b5381941;hp=ec7bb1f40c892f4634390ce79f30c10a0f3b7a56;hpb=10fa09137ef8cffdbcdb429b511e6e270ca379b2;p=~andy%2Fgtk diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c index ec7bb1f40..79bde09ab 100644 --- a/gtk/gtkmenu.c +++ b/gtk/gtkmenu.c @@ -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,6 +1313,8 @@ 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); @@ -2506,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)); @@ -2532,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; @@ -2562,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); @@ -2578,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) @@ -2634,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); @@ -2650,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); } @@ -2664,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; @@ -2686,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; @@ -2704,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) { @@ -2766,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)); @@ -2779,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)); @@ -2794,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) @@ -2933,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)); @@ -3133,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; @@ -3222,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; @@ -3273,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); @@ -3864,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; @@ -3874,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); @@ -4279,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); @@ -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 @@ -5777,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; +}