From 8a210673fb6f05abaa4ea05b7dcd17b06c7aca68 Mon Sep 17 00:00:00 2001 From: "John (J5) Palmieri" Date: Mon, 6 Sep 2010 22:55:03 -0400 Subject: [PATCH] add gtk_radio_button_join_group method for bindings * this mirrors the committed change for gtk_radio_action_join_group in commit 85b53969b24d318b219663841e678943516f443a * Due to object ownership issues it is impossible to correctly use get_group/set_group from a GI binding * join_group is safer because at the binding level it works with individual GtkRadioButton objects and not with the list of objects that gets modified in the library https://bugzilla.gnome.org/show_bug.cgi?id=628935 --- gtk/gtkradiobutton.c | 55 ++++++++++++++++++++++++++++++++++++++++++++ gtk/gtkradiobutton.h | 3 ++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/gtk/gtkradiobutton.c b/gtk/gtkradiobutton.c index fc78eadb4..6881e105c 100644 --- a/gtk/gtkradiobutton.c +++ b/gtk/gtkradiobutton.c @@ -346,6 +346,61 @@ gtk_radio_button_set_group (GtkRadioButton *radio_button, g_object_unref (radio_button); } +/** + * gtk_radio_button_join_group: + * @radio_button: the #GtkRadioButton object + * @group_source: (allow-none): a radio button object whos group we are + * joining, or %NULL to remove the radio button from its group + * + * Joins a #GtkRadioButton object to the group of another #GtkRadioButton object + * + * Use this in language bindings instead of the gtk_radio_button_get_group() + * and gtk_radio_button_set_group() methods + * + * A common way to set up a group of radio buttons is the following: + * |[ + * GtkRadioButton *radio_button; + * GtkRadioButton *last_button; + * + * while (/* more buttons to add */) + * { + * radio_button = gtk_radio_button_new (...); + * + * gtk_radio_button_join_group (radio_button, last_button); + * last_button = radio_button; + * } + * ]| + * + * Since: 3.0 + */ +void +gtk_radio_button_join_group (GtkRadioButton *radio_button, + GtkRadioButton *group_source) +{ + g_return_if_fail (GTK_IS_RADIO_BUTTON (radio_button)); + g_return_if_fail (group_source == NULL || GTK_IS_RADIO_BUTTON (group_source)); + + if (group_source) + { + GSList *group; + group = gtk_radio_button_get_group (group_source); + + if (!group) + { + /* if we are not already part of a group we need to set up a new one + and then get the newly created group */ + gtk_radio_button_set_group (group_source, NULL); + group = gtk_radio_button_get_group (group_source); + } + + gtk_radio_button_set_group (radio_button, group); + } + else + { + gtk_radio_button_set_group (radio_button, NULL); + } +} + /** * gtk_radio_button_new: * @group: an existing radio button group, or %NULL if you are creating a new group. diff --git a/gtk/gtkradiobutton.h b/gtk/gtkradiobutton.h index 84e704282..20f91cfcd 100644 --- a/gtk/gtkradiobutton.h +++ b/gtk/gtkradiobutton.h @@ -86,7 +86,8 @@ GtkWidget* gtk_radio_button_new_with_mnemonic_from_widget (GtkRadioButton *radio GSList* gtk_radio_button_get_group (GtkRadioButton *radio_button); void gtk_radio_button_set_group (GtkRadioButton *radio_button, GSList *group); - +void gtk_radio_button_join_group (GtkRadioButton *radio_button, + GtkRadioButton *group_source); G_END_DECLS #endif /* __GTK_RADIO_BUTTON_H__ */ -- 2.43.2