diff --git a/demos/gtk-demo/menus.c b/demos/gtk-demo/menus.c index 7fd95538e9..44b352f4c9 100644 --- a/demos/gtk-demo/menus.c +++ b/demos/gtk-demo/menus.c @@ -33,8 +33,7 @@ static GtkWidget * create_menu (gint depth) { GtkWidget *menu; - GtkWidget *menuitem; - GSList *group; + GtkRadioMenuItem *last_item; char buf[32]; int i, j; @@ -42,20 +41,24 @@ create_menu (gint depth) return NULL; menu = gtk_menu_new (); - group = NULL; + last_item = NULL; for (i = 0, j = 1; i < 5; i++, j++) { + GtkWidget *menu_item; + sprintf (buf, "item %2d - %d", depth, j); - menuitem = gtk_radio_menu_item_new_with_label (group, buf); - group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem)); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); - gtk_widget_show (menuitem); + menu_item = gtk_radio_menu_item_new_with_label_from_widget (NULL, buf); + gtk_radio_menu_item_join_group (GTK_RADIO_MENU_ITEM (menu_item), last_item); + last_item = GTK_RADIO_MENU_ITEM (menu_item); + + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); + gtk_widget_show (menu_item); if (i == 3) - gtk_widget_set_sensitive (menuitem, FALSE); + gtk_widget_set_sensitive (menu_item, FALSE); - gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (depth - 1)); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), create_menu (depth - 1)); } return menu; diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt index e2d04358af..fb6ffd7d81 100644 --- a/docs/reference/gtk/gtk3-sections.txt +++ b/docs/reference/gtk/gtk3-sections.txt @@ -2771,6 +2771,7 @@ gtk_radio_menu_item_new_with_label_from_widget gtk_radio_menu_item_new_with_mnemonic_from_widget gtk_radio_menu_item_set_group gtk_radio_menu_item_get_group +gtk_radio_menu_item_join_group GTK_RADIO_MENU_ITEM GTK_IS_RADIO_MENU_ITEM diff --git a/gtk/gtkradiomenuitem.c b/gtk/gtkradiomenuitem.c index da37120431..27320f0078 100644 --- a/gtk/gtkradiomenuitem.c +++ b/gtk/gtkradiomenuitem.c @@ -558,3 +558,59 @@ gtk_radio_menu_item_activate (GtkMenuItem *menu_item) gtk_widget_queue_draw (GTK_WIDGET (radio_menu_item)); } + +/** + * gtk_radio_menu_item_join_group: + * @radio_menu_item: a #GtkRadioMenuItem + * @group_source: (allow-none): a #GtkRadioMenuItem whose group we are + * joining, or %NULL to remove the @radio_menu_item from its current + * group + * + * Joins a #GtkRadioMenuItem object to the group of another #GtkRadioMenuItem + * object. + * + * This function should be used by language bindings to avoid the memory + * manangement of the opaque #GSList of gtk_radio_menu_item_get_group() + * and gtk_radio_menu_item_set_group(). + * + * A common way to set up a group of #GtkRadioMenuItem instances is: + * + * |[ + * GtkRadioMenuItem *last_item = NULL; + * + * while ( ...more items to add... ) + * { + * GtkRadioMenuItem *radio_item; + * + * radio_item = gtk_radio_menu_item_new (...); + * + * gtk_radio_menu_item_join_group (radio_item, last_item); + * last_item = radio_item; + * } + * ]| + * + * Since: 3.18 + */ +void +gtk_radio_menu_item_join_group (GtkRadioMenuItem *radio_menu_item, + GtkRadioMenuItem *group_source) +{ + g_return_if_fail (GTK_IS_RADIO_MENU_ITEM (radio_menu_item)); + g_return_if_fail (group_source == NULL || GTK_IS_RADIO_MENU_ITEM (group_source)); + + if (group_source != NULL) + { + GSList *group = gtk_radio_menu_item_get_group (group_source); + + if (group == NULL) + { + /* if the group source does not have a group, we force one */ + gtk_radio_menu_item_set_group (group_source, NULL); + group = gtk_radio_menu_item_get_group (group_source); + } + + gtk_radio_menu_item_set_group (radio_menu_item, group); + } + else + gtk_radio_menu_item_set_group (radio_menu_item, NULL); +} diff --git a/gtk/gtkradiomenuitem.h b/gtk/gtkradiomenuitem.h index fc29be8501..b3fe9908e1 100644 --- a/gtk/gtkradiomenuitem.h +++ b/gtk/gtkradiomenuitem.h @@ -95,6 +95,10 @@ GDK_AVAILABLE_IN_ALL void gtk_radio_menu_item_set_group (GtkRadioMenuItem *radio_menu_item, GSList *group); +GDK_AVAILABLE_IN_3_18 +void gtk_radio_menu_item_join_group (GtkRadioMenuItem *radio_menu_item, + GtkRadioMenuItem *group_source); + G_END_DECLS #endif /* __GTK_RADIO_MENU_ITEM_H__ */