diff --git a/gtk/gtkmenusectionbox.c b/gtk/gtkmenusectionbox.c index 7439345373..ee1dd1b553 100644 --- a/gtk/gtkmenusectionbox.c +++ b/gtk/gtkmenusectionbox.c @@ -454,8 +454,7 @@ gtk_menu_section_box_new_submenu (GtkMenuTrackerItem *item, button = g_object_new (GTK_TYPE_MODEL_BUTTON, "menu-name", name, - "inverted", TRUE, - "centered", TRUE, + "role", GTK_BUTTON_ROLE_TITLE, NULL); g_object_bind_property (item, "label", button, "text", G_BINDING_SYNC_CREATE); diff --git a/gtk/gtkmodelbutton.c b/gtk/gtkmodelbutton.c index 25dbbe6748..6de73b6e05 100644 --- a/gtk/gtkmodelbutton.c +++ b/gtk/gtkmodelbutton.c @@ -196,13 +196,15 @@ gtk_model_button_update_state (GtkModelButton *button) { GtkStateFlags state; GtkStateFlags indicator_state; - GtkCssImageBuiltinType image_type = GTK_CSS_IMAGE_BUILTIN_NONE; + GtkCssImageBuiltinType image_type; state = gtk_widget_get_state_flags (GTK_WIDGET (button)); indicator_state = state; + image_type = GTK_CSS_IMAGE_BUILTIN_NONE; - if (button->role == GTK_BUTTON_ROLE_CHECK) + switch (button->role) { + case GTK_BUTTON_ROLE_CHECK: if (button->active && !button->menu_name) { indicator_state |= GTK_STATE_FLAG_CHECKED; @@ -212,9 +214,9 @@ gtk_model_button_update_state (GtkModelButton *button) { indicator_state &= ~GTK_STATE_FLAG_CHECKED; } - } - if (button->role == GTK_BUTTON_ROLE_RADIO) - { + break; + + case GTK_BUTTON_ROLE_RADIO: if (button->active && !button->menu_name) { indicator_state |= GTK_STATE_FLAG_CHECKED; @@ -224,14 +226,28 @@ gtk_model_button_update_state (GtkModelButton *button) { indicator_state &= ~GTK_STATE_FLAG_CHECKED; } - } + break; - if (button->menu_name) - { - if (indicator_is_left (GTK_WIDGET (button))) - image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_LEFT; - else - image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_RIGHT; + case GTK_BUTTON_ROLE_TITLE: + g_object_set (button, + "inverted", TRUE, + "centered", TRUE, + NULL); + /* fall through */ + + case GTK_BUTTON_ROLE_NORMAL: + if (button->menu_name != NULL) + { + if (indicator_is_left (GTK_WIDGET (button))) + image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_LEFT; + else + image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_RIGHT; + } + + break; + + default: + g_assert_not_reached (); } gtk_icon_set_image (GTK_ICON (button->indicator_widget), image_type); @@ -305,6 +321,7 @@ update_node_name (GtkModelButton *button) switch (button->role) { case GTK_BUTTON_ROLE_NORMAL: + case GTK_BUTTON_ROLE_TITLE: a11y_role = ATK_ROLE_PUSH_BUTTON; if (button->menu_name) { @@ -353,8 +370,8 @@ gtk_model_button_set_role (GtkModelButton *button, button->role = role; update_node_name (button); - gtk_model_button_update_state (button); + gtk_widget_queue_draw (GTK_WIDGET (button)); g_object_notify_by_pspec (G_OBJECT (button), properties[PROP_ROLE]); } diff --git a/gtk/gtkmodelbutton.h b/gtk/gtkmodelbutton.h index c5590460a0..dde881da08 100644 --- a/gtk/gtkmodelbutton.h +++ b/gtk/gtkmodelbutton.h @@ -41,13 +41,15 @@ typedef struct _GtkModelButton GtkModelButton; * @GTK_BUTTON_ROLE_NORMAL: A plain button * @GTK_BUTTON_ROLE_CHECK: A check button * @GTK_BUTTON_ROLE_RADIO: A radio button + * @GTK_BUTTON_ROLE_TITLE: The title for a submenu * * The role specifies the desired appearance of a #GtkModelButton. */ typedef enum { GTK_BUTTON_ROLE_NORMAL, GTK_BUTTON_ROLE_CHECK, - GTK_BUTTON_ROLE_RADIO + GTK_BUTTON_ROLE_RADIO, + GTK_BUTTON_ROLE_TITLE } GtkButtonRole; GDK_AVAILABLE_IN_ALL