Convert GtkRadioButton and GtkRadioToolButton to use GtkRadioGroup
This changes the API by changing the GSList group in the constructors and the _set_group/_get_group calls to a GtkRadioGroup.
This commit is contained in:
@@ -690,7 +690,7 @@ load_stock_items (GtkToolPalette *palette)
|
||||
static void
|
||||
load_toggle_items (GtkToolPalette *palette)
|
||||
{
|
||||
GSList *toggle_group = NULL;
|
||||
GtkRadioGroup *toggle_group;
|
||||
GtkToolItem *item;
|
||||
GtkWidget *group;
|
||||
char *label;
|
||||
@@ -699,6 +699,7 @@ load_toggle_items (GtkToolPalette *palette)
|
||||
group = gtk_tool_item_group_new ("Radio Item");
|
||||
gtk_container_add (GTK_CONTAINER (palette), group);
|
||||
|
||||
toggle_group = gtk_radio_group_new ();
|
||||
for (i = 1; i <= 10; ++i)
|
||||
{
|
||||
label = g_strdup_printf ("#%d", i);
|
||||
@@ -707,7 +708,6 @@ load_toggle_items (GtkToolPalette *palette)
|
||||
g_free (label);
|
||||
|
||||
gtk_tool_item_group_insert (GTK_TOOL_ITEM_GROUP (group), item, -1);
|
||||
toggle_group = gtk_radio_tool_button_get_group (GTK_RADIO_TOOL_BUTTON (item));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ int main( int argc,
|
||||
GtkWidget *box2;
|
||||
GtkWidget *button;
|
||||
GtkWidget *separator;
|
||||
GSList *group;
|
||||
GtkRadioGroup *group;
|
||||
|
||||
gtk_init (&argc, &argv);
|
||||
|
||||
@@ -40,11 +40,11 @@ int main( int argc,
|
||||
gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
|
||||
gtk_widget_show (box2);
|
||||
|
||||
button = gtk_radio_button_new_with_label (NULL, "button1");
|
||||
group = gtk_radio_group_new ();
|
||||
button = gtk_radio_button_new_with_label (group, "button1");
|
||||
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
|
||||
gtk_widget_show (button);
|
||||
|
||||
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
|
||||
button = gtk_radio_button_new_with_label (group, "button2");
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
|
||||
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
|
||||
|
||||
@@ -549,7 +549,7 @@ gtk_mount_operation_ask_password (GMountOperation *mount_op,
|
||||
{
|
||||
GtkWidget *anon_box;
|
||||
GtkWidget *choice;
|
||||
GSList *group;
|
||||
GtkRadioGroup *group;
|
||||
|
||||
anon_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), anon_box,
|
||||
@@ -622,7 +622,7 @@ gtk_mount_operation_ask_password (GMountOperation *mount_op,
|
||||
{
|
||||
GtkWidget *choice;
|
||||
GtkWidget *remember_box;
|
||||
GSList *group;
|
||||
GtkRadioGroup *group;
|
||||
GPasswordSave password_save;
|
||||
|
||||
remember_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
|
||||
@@ -650,7 +650,6 @@ gtk_mount_operation_ask_password (GMountOperation *mount_op,
|
||||
G_CALLBACK (remember_button_toggled), operation);
|
||||
gtk_box_pack_start (GTK_BOX (remember_box), choice, FALSE, FALSE, 0);
|
||||
|
||||
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (choice));
|
||||
choice = gtk_radio_button_new_with_mnemonic (group, _("Remember _forever"));
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (choice),
|
||||
password_save == G_PASSWORD_SAVE_PERMANENTLY);
|
||||
|
||||
@@ -860,7 +860,7 @@ page_name_func (GtkCellLayout *cell_layout,
|
||||
}
|
||||
|
||||
static GtkWidget *
|
||||
create_radio_button (GSList *group,
|
||||
create_radio_button (GtkRadioGroup *group,
|
||||
const gchar *stock_id)
|
||||
{
|
||||
GtkWidget *radio_button, *image, *label, *hbox;
|
||||
|
||||
@@ -645,12 +645,12 @@ alternative_set (GtkWidget *box,
|
||||
(gpointer) value);
|
||||
}
|
||||
|
||||
static GSList *
|
||||
static GtkRadioGroup *
|
||||
alternative_append (GtkWidget *box,
|
||||
const gchar *label,
|
||||
const gchar *value,
|
||||
GtkPrinterOptionWidget *widget,
|
||||
GSList *group)
|
||||
GtkRadioGroup *group)
|
||||
{
|
||||
GtkWidget *button;
|
||||
|
||||
@@ -672,7 +672,7 @@ construct_widgets (GtkPrinterOptionWidget *widget)
|
||||
GtkPrinterOption *source;
|
||||
char *text;
|
||||
int i;
|
||||
GSList *group;
|
||||
GtkRadioGroup *group;
|
||||
|
||||
source = priv->source;
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "gtklabel.h"
|
||||
#include "gtkmarshalers.h"
|
||||
#include "gtkradiobutton.h"
|
||||
#include "gtkradiogroupprivate.h"
|
||||
#include "gtkprivate.h"
|
||||
#include "gtkintl.h"
|
||||
|
||||
@@ -105,7 +106,7 @@
|
||||
|
||||
struct _GtkRadioButtonPrivate
|
||||
{
|
||||
GSList *group;
|
||||
GtkRadioGroup *group;
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -211,7 +212,7 @@ gtk_radio_button_init (GtkRadioButton *radio_button)
|
||||
|
||||
GTK_BUTTON (radio_button)->depress_on_activate = FALSE;
|
||||
|
||||
priv->group = g_slist_prepend (NULL, radio_button);
|
||||
priv->group = NULL;
|
||||
|
||||
_gtk_button_set_depressed (GTK_BUTTON (radio_button), TRUE);
|
||||
gtk_widget_set_state (GTK_WIDGET (radio_button), GTK_STATE_ACTIVE);
|
||||
@@ -229,17 +230,17 @@ gtk_radio_button_set_property (GObject *object,
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
GSList *slist;
|
||||
GtkRadioGroup *group;
|
||||
GtkRadioButton *button;
|
||||
|
||||
case PROP_GROUP:
|
||||
button = g_value_get_object (value);
|
||||
|
||||
if (button)
|
||||
slist = gtk_radio_button_get_group (button);
|
||||
group = gtk_radio_button_get_group (button);
|
||||
else
|
||||
slist = NULL;
|
||||
gtk_radio_button_set_group (radio_button, slist);
|
||||
group = NULL;
|
||||
gtk_radio_button_set_group (radio_button, group);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
@@ -261,11 +262,23 @@ gtk_radio_button_get_property (GObject *object,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_radio_button_ensure_group (GtkRadioButton *radio_button)
|
||||
{
|
||||
GtkRadioButtonPrivate *priv = radio_button->priv;
|
||||
|
||||
if (priv->group == NULL)
|
||||
{
|
||||
priv->group = g_object_ref_sink (gtk_radio_group_new ());
|
||||
_gtk_radio_group_add_item (priv->group, G_OBJECT (radio_button));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_radio_button_set_group:
|
||||
* @radio_button: a #GtkRadioButton.
|
||||
* @group: (transfer none) (element-type GtkRadioButton): an existing radio
|
||||
* button group, such as one returned from gtk_radio_button_get_group().
|
||||
* @group: (allow-none): an existing #GtkRadioGroup or %NULL
|
||||
* to remove the radio button from its current group
|
||||
*
|
||||
* Sets a #GtkRadioButton's group. It should be noted that this does not change
|
||||
* the layout of your interface in any way, so if you are changing the group,
|
||||
@@ -274,57 +287,44 @@ gtk_radio_button_get_property (GObject *object,
|
||||
*/
|
||||
void
|
||||
gtk_radio_button_set_group (GtkRadioButton *radio_button,
|
||||
GSList *group)
|
||||
GtkRadioGroup *group)
|
||||
{
|
||||
GtkRadioButtonPrivate *priv;
|
||||
GtkWidget *old_group_singleton = NULL;
|
||||
GtkWidget *new_group_singleton = NULL;
|
||||
GObject *old_group_singleton = NULL;
|
||||
GObject *new_group_singleton;
|
||||
GObject *old_group_active;
|
||||
gboolean is_active;
|
||||
|
||||
g_return_if_fail (GTK_IS_RADIO_BUTTON (radio_button));
|
||||
g_return_if_fail (!g_slist_find (group, radio_button));
|
||||
|
||||
priv = radio_button->priv;
|
||||
|
||||
if (priv->group == group)
|
||||
return;
|
||||
|
||||
if (group == NULL)
|
||||
group = gtk_radio_group_new ();
|
||||
|
||||
if (priv->group)
|
||||
{
|
||||
GSList *slist;
|
||||
_gtk_radio_group_remove_item (priv->group, G_OBJECT (radio_button));
|
||||
old_group_singleton = _gtk_radio_group_get_singleton (priv->group);
|
||||
|
||||
priv->group = g_slist_remove (priv->group, radio_button);
|
||||
/* Ensure some widget is active in the old group */
|
||||
old_group_active = gtk_radio_group_get_active_item (priv->group);
|
||||
if (old_group_active)
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (old_group_active), TRUE);
|
||||
|
||||
if (priv->group && !priv->group->next)
|
||||
old_group_singleton = g_object_ref (priv->group->data);
|
||||
|
||||
for (slist = priv->group; slist; slist = slist->next)
|
||||
{
|
||||
GtkRadioButton *tmp_button;
|
||||
|
||||
tmp_button = slist->data;
|
||||
|
||||
tmp_button->priv->group = priv->group;
|
||||
}
|
||||
g_object_unref (priv->group);
|
||||
}
|
||||
|
||||
if (group && !group->next)
|
||||
new_group_singleton = g_object_ref (group->data);
|
||||
|
||||
priv->group = g_slist_prepend (group, radio_button);
|
||||
priv->group = g_object_ref_sink (group);
|
||||
new_group_singleton = _gtk_radio_group_get_singleton (group);
|
||||
|
||||
if (group)
|
||||
{
|
||||
GSList *slist;
|
||||
|
||||
for (slist = group; slist; slist = slist->next)
|
||||
{
|
||||
GtkRadioButton *tmp_button;
|
||||
|
||||
tmp_button = slist->data;
|
||||
|
||||
tmp_button->priv->group = priv->group;
|
||||
}
|
||||
}
|
||||
_gtk_radio_group_add_item (group, G_OBJECT (radio_button));
|
||||
|
||||
g_object_ref (radio_button);
|
||||
|
||||
|
||||
g_object_notify (G_OBJECT (radio_button), "group");
|
||||
g_signal_emit (radio_button, group_changed_signal, 0);
|
||||
if (old_group_singleton)
|
||||
@@ -338,7 +338,11 @@ gtk_radio_button_set_group (GtkRadioButton *radio_button,
|
||||
g_object_unref (new_group_singleton);
|
||||
}
|
||||
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button), group == NULL);
|
||||
is_active = gtk_radio_group_get_active_item (group) == G_OBJECT (radio_button);
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button),
|
||||
is_active);
|
||||
if (is_active)
|
||||
_gtk_radio_group_emit_active_changed (group);
|
||||
|
||||
g_object_unref (radio_button);
|
||||
}
|
||||
@@ -379,17 +383,8 @@ gtk_radio_button_join_group (GtkRadioButton *radio_button,
|
||||
|
||||
if (group_source)
|
||||
{
|
||||
GSList *group;
|
||||
GtkRadioGroup *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
|
||||
@@ -408,7 +403,7 @@ gtk_radio_button_join_group (GtkRadioButton *radio_button,
|
||||
* Returns: a new radio button
|
||||
*/
|
||||
GtkWidget*
|
||||
gtk_radio_button_new (GSList *group)
|
||||
gtk_radio_button_new (GtkRadioGroup *group)
|
||||
{
|
||||
GtkRadioButton *radio_button;
|
||||
|
||||
@@ -431,7 +426,7 @@ gtk_radio_button_new (GSList *group)
|
||||
* Returns: (transfer full): a new radio button.
|
||||
*/
|
||||
GtkWidget*
|
||||
gtk_radio_button_new_with_label (GSList *group,
|
||||
gtk_radio_button_new_with_label (GtkRadioGroup *group,
|
||||
const gchar *label)
|
||||
{
|
||||
GtkWidget *radio_button;
|
||||
@@ -459,7 +454,7 @@ gtk_radio_button_new_with_label (GSList *group,
|
||||
* Returns: (transfer full): a new #GtkRadioButton
|
||||
*/
|
||||
GtkWidget*
|
||||
gtk_radio_button_new_with_mnemonic (GSList *group,
|
||||
gtk_radio_button_new_with_mnemonic (GtkRadioGroup *group,
|
||||
const gchar *label)
|
||||
{
|
||||
GtkWidget *radio_button;
|
||||
@@ -488,10 +483,10 @@ gtk_radio_button_new_with_mnemonic (GSList *group,
|
||||
GtkWidget*
|
||||
gtk_radio_button_new_from_widget (GtkRadioButton *radio_group_member)
|
||||
{
|
||||
GSList *l = NULL;
|
||||
GtkRadioGroup *group = NULL;
|
||||
if (radio_group_member)
|
||||
l = gtk_radio_button_get_group (radio_group_member);
|
||||
return gtk_radio_button_new (l);
|
||||
group = gtk_radio_button_get_group (radio_group_member);
|
||||
return gtk_radio_button_new (group);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -508,10 +503,10 @@ GtkWidget*
|
||||
gtk_radio_button_new_with_label_from_widget (GtkRadioButton *radio_group_member,
|
||||
const gchar *label)
|
||||
{
|
||||
GSList *l = NULL;
|
||||
GtkRadioGroup *group = NULL;
|
||||
if (radio_group_member)
|
||||
l = gtk_radio_button_get_group (radio_group_member);
|
||||
return gtk_radio_button_new_with_label (l, label);
|
||||
group = gtk_radio_button_get_group (radio_group_member);
|
||||
return gtk_radio_button_new_with_label (group, label);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -530,10 +525,10 @@ GtkWidget*
|
||||
gtk_radio_button_new_with_mnemonic_from_widget (GtkRadioButton *radio_group_member,
|
||||
const gchar *label)
|
||||
{
|
||||
GSList *l = NULL;
|
||||
GtkRadioGroup *group = NULL;
|
||||
if (radio_group_member)
|
||||
l = gtk_radio_button_get_group (radio_group_member);
|
||||
return gtk_radio_button_new_with_mnemonic (l, label);
|
||||
group = gtk_radio_button_get_group (radio_group_member);
|
||||
return gtk_radio_button_new_with_mnemonic (group, label);
|
||||
}
|
||||
|
||||
|
||||
@@ -543,16 +538,17 @@ gtk_radio_button_new_with_mnemonic_from_widget (GtkRadioButton *radio_group_memb
|
||||
*
|
||||
* Retrieves the group assigned to a radio button.
|
||||
*
|
||||
* Return value: (element-type GtkRadioButton) (transfer none): a linked list
|
||||
* Return value: (transfer none): a #GtkRadioGroup
|
||||
* containing all the radio buttons in the same group
|
||||
* as @radio_button. The returned list is owned by the radio button
|
||||
* and must not be modified or freed.
|
||||
* as @radio_button.
|
||||
*/
|
||||
GSList*
|
||||
GtkRadioGroup *
|
||||
gtk_radio_button_get_group (GtkRadioButton *radio_button)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_RADIO_BUTTON (radio_button), NULL);
|
||||
|
||||
gtk_radio_button_ensure_group (radio_button);
|
||||
|
||||
return radio_button->priv->group;
|
||||
}
|
||||
|
||||
@@ -560,32 +556,22 @@ gtk_radio_button_get_group (GtkRadioButton *radio_button)
|
||||
static void
|
||||
gtk_radio_button_destroy (GtkWidget *widget)
|
||||
{
|
||||
GtkWidget *old_group_singleton = NULL;
|
||||
GObject *old_group_singleton = NULL;
|
||||
GtkRadioButton *radio_button = GTK_RADIO_BUTTON (widget);
|
||||
GtkRadioButtonPrivate *priv = radio_button->priv;
|
||||
GtkRadioButton *tmp_button;
|
||||
GSList *tmp_list;
|
||||
gboolean was_in_group;
|
||||
gboolean was_in_group = FALSE;
|
||||
|
||||
was_in_group = priv->group && priv->group->next;
|
||||
|
||||
priv->group = g_slist_remove (priv->group, radio_button);
|
||||
if (priv->group && !priv->group->next)
|
||||
old_group_singleton = priv->group->data;
|
||||
|
||||
tmp_list = priv->group;
|
||||
|
||||
while (tmp_list)
|
||||
if (priv->group)
|
||||
{
|
||||
tmp_button = tmp_list->data;
|
||||
tmp_list = tmp_list->next;
|
||||
_gtk_radio_group_remove_item (priv->group, G_OBJECT (radio_button));
|
||||
was_in_group = !_gtk_radio_group_is_empty (priv->group);
|
||||
old_group_singleton = _gtk_radio_group_get_singleton (priv->group);
|
||||
|
||||
tmp_button->priv->group = priv->group;
|
||||
/* this button is no longer in the group */
|
||||
g_object_unref (priv->group);
|
||||
priv->group = NULL;
|
||||
}
|
||||
|
||||
/* this button is no longer in the group */
|
||||
priv->group = NULL;
|
||||
|
||||
if (old_group_singleton)
|
||||
g_signal_emit (old_group_singleton, group_changed_signal, 0);
|
||||
if (was_in_group)
|
||||
@@ -647,14 +633,15 @@ gtk_radio_button_focus (GtkWidget *widget,
|
||||
{
|
||||
GtkRadioButton *radio_button = GTK_RADIO_BUTTON (widget);
|
||||
GtkRadioButtonPrivate *priv = radio_button->priv;
|
||||
GSList *tmp_slist;
|
||||
|
||||
/* Radio buttons with draw_indicator unset focus "normally", since
|
||||
* they look like buttons to the user.
|
||||
*/
|
||||
if (!gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
|
||||
return GTK_WIDGET_CLASS (gtk_radio_button_parent_class)->focus (widget, direction);
|
||||
|
||||
|
||||
gtk_radio_button_ensure_group (radio_button);
|
||||
|
||||
if (gtk_widget_is_focus (widget))
|
||||
{
|
||||
GtkSettings *settings = gtk_widget_get_settings (widget);
|
||||
@@ -668,12 +655,12 @@ gtk_radio_button_focus (GtkWidget *widget,
|
||||
{
|
||||
case GTK_DIR_LEFT:
|
||||
case GTK_DIR_RIGHT:
|
||||
focus_list = g_slist_copy (priv->group);
|
||||
focus_list = gtk_radio_group_get_items (priv->group);
|
||||
focus_list = g_slist_sort_with_data (focus_list, left_right_compare, toplevel);
|
||||
break;
|
||||
case GTK_DIR_UP:
|
||||
case GTK_DIR_DOWN:
|
||||
focus_list = g_slist_copy (priv->group);
|
||||
focus_list = gtk_radio_group_get_items (priv->group);
|
||||
focus_list = g_slist_sort_with_data (focus_list, up_down_compare, toplevel);
|
||||
break;
|
||||
case GTK_DIR_TAB_FORWARD:
|
||||
@@ -756,22 +743,15 @@ gtk_radio_button_focus (GtkWidget *widget,
|
||||
}
|
||||
else
|
||||
{
|
||||
GtkRadioButton *selected_button = NULL;
|
||||
|
||||
GObject *selected_button;
|
||||
|
||||
/* We accept the focus if, we don't have the focus and
|
||||
* - we are the currently active button in the group
|
||||
* - there is no currently active radio button.
|
||||
*/
|
||||
|
||||
tmp_slist = priv->group;
|
||||
while (tmp_slist)
|
||||
{
|
||||
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (tmp_slist->data)))
|
||||
selected_button = tmp_slist->data;
|
||||
tmp_slist = tmp_slist->next;
|
||||
}
|
||||
|
||||
if (selected_button && selected_button != radio_button)
|
||||
|
||||
selected_button = gtk_radio_group_get_active_item (priv->group);
|
||||
if (selected_button && selected_button != G_OBJECT (radio_button))
|
||||
return FALSE;
|
||||
|
||||
gtk_widget_grab_focus (widget);
|
||||
@@ -785,34 +765,22 @@ gtk_radio_button_clicked (GtkButton *button)
|
||||
GtkRadioButton *radio_button = GTK_RADIO_BUTTON (button);
|
||||
GtkRadioButtonPrivate *priv = radio_button->priv;
|
||||
GtkToggleButton *toggle_button = GTK_TOGGLE_BUTTON (button);
|
||||
GtkToggleButton *tmp_button;
|
||||
GObject *active_item;
|
||||
GtkStateType new_state;
|
||||
GSList *tmp_list;
|
||||
gint toggled;
|
||||
gboolean depressed;
|
||||
|
||||
gtk_radio_button_ensure_group (radio_button);
|
||||
|
||||
toggled = FALSE;
|
||||
|
||||
g_object_ref (GTK_WIDGET (button));
|
||||
|
||||
if (gtk_toggle_button_get_active (toggle_button))
|
||||
{
|
||||
tmp_button = NULL;
|
||||
tmp_list = priv->group;
|
||||
active_item = gtk_radio_group_get_active_item (priv->group);
|
||||
|
||||
while (tmp_list)
|
||||
{
|
||||
tmp_button = tmp_list->data;
|
||||
tmp_list = tmp_list->next;
|
||||
|
||||
if (tmp_button != toggle_button &&
|
||||
gtk_toggle_button_get_active (tmp_button))
|
||||
break;
|
||||
|
||||
tmp_button = NULL;
|
||||
}
|
||||
|
||||
if (!tmp_button)
|
||||
if (active_item == NULL || active_item == G_OBJECT (button))
|
||||
{
|
||||
new_state = (button->in_button ? GTK_STATE_PRELIGHT : GTK_STATE_ACTIVE);
|
||||
}
|
||||
@@ -830,18 +798,10 @@ gtk_radio_button_clicked (GtkButton *button)
|
||||
_gtk_toggle_button_set_active (toggle_button,
|
||||
!gtk_toggle_button_get_active (toggle_button));
|
||||
|
||||
tmp_list = priv->group;
|
||||
while (tmp_list)
|
||||
{
|
||||
tmp_button = tmp_list->data;
|
||||
tmp_list = tmp_list->next;
|
||||
|
||||
if (gtk_toggle_button_get_active (tmp_button) && (tmp_button != toggle_button))
|
||||
{
|
||||
gtk_button_clicked (GTK_BUTTON (tmp_button));
|
||||
break;
|
||||
}
|
||||
}
|
||||
active_item = gtk_radio_group_get_active_item (priv->group);
|
||||
_gtk_radio_group_set_active_item (priv->group, G_OBJECT (toggle_button));
|
||||
if (active_item != G_OBJECT (toggle_button))
|
||||
gtk_button_clicked (GTK_BUTTON (active_item));
|
||||
|
||||
new_state = (button->in_button ? GTK_STATE_PRELIGHT : GTK_STATE_ACTIVE);
|
||||
}
|
||||
@@ -861,6 +821,9 @@ gtk_radio_button_clicked (GtkButton *button)
|
||||
gtk_toggle_button_toggled (toggle_button);
|
||||
|
||||
g_object_notify (G_OBJECT (toggle_button), "active");
|
||||
|
||||
if (gtk_toggle_button_get_active (toggle_button))
|
||||
_gtk_radio_group_emit_active_changed (priv->group);
|
||||
}
|
||||
|
||||
_gtk_button_set_depressed (button, depressed);
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
|
||||
|
||||
#include <gtk/gtkcheckbutton.h>
|
||||
#include <gtk/gtkradiogroup.h>
|
||||
|
||||
|
||||
G_BEGIN_DECLS
|
||||
@@ -74,21 +75,22 @@ struct _GtkRadioButtonClass
|
||||
|
||||
GType gtk_radio_button_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GtkWidget* gtk_radio_button_new (GSList *group);
|
||||
GtkWidget* gtk_radio_button_new_from_widget (GtkRadioButton *radio_group_member);
|
||||
GtkWidget* gtk_radio_button_new_with_label (GSList *group,
|
||||
const gchar *label);
|
||||
GtkWidget* gtk_radio_button_new_with_label_from_widget (GtkRadioButton *radio_group_member,
|
||||
const gchar *label);
|
||||
GtkWidget* gtk_radio_button_new_with_mnemonic (GSList *group,
|
||||
const gchar *label);
|
||||
GtkWidget* gtk_radio_button_new_with_mnemonic_from_widget (GtkRadioButton *radio_group_member,
|
||||
const gchar *label);
|
||||
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);
|
||||
GtkWidget* gtk_radio_button_new (GtkRadioGroup *group);
|
||||
GtkWidget* gtk_radio_button_new_from_widget (GtkRadioButton *radio_group_member);
|
||||
GtkWidget* gtk_radio_button_new_with_label (GtkRadioGroup *group,
|
||||
const gchar *label);
|
||||
GtkWidget* gtk_radio_button_new_with_label_from_widget (GtkRadioButton *radio_group_member,
|
||||
const gchar *label);
|
||||
GtkWidget* gtk_radio_button_new_with_mnemonic (GtkRadioGroup *group,
|
||||
const gchar *label);
|
||||
GtkWidget* gtk_radio_button_new_with_mnemonic_from_widget (GtkRadioButton *radio_group_member,
|
||||
const gchar *label);
|
||||
GtkRadioGroup *gtk_radio_button_get_group (GtkRadioButton *radio_button);
|
||||
void gtk_radio_button_set_group (GtkRadioButton *radio_button,
|
||||
GtkRadioGroup *group);
|
||||
void gtk_radio_button_join_group (GtkRadioButton *radio_button,
|
||||
GtkRadioButton *group_source);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_RADIO_BUTTON_H__ */
|
||||
|
||||
@@ -91,13 +91,13 @@ gtk_radio_tool_button_set_property (GObject *object,
|
||||
case PROP_GROUP:
|
||||
{
|
||||
GtkRadioToolButton *arg;
|
||||
GSList *slist = NULL;
|
||||
if (G_VALUE_HOLDS_OBJECT (value))
|
||||
GtkRadioGroup *group = NULL;
|
||||
if (G_VALUE_HOLDS_OBJECT (value))
|
||||
{
|
||||
arg = GTK_RADIO_TOOL_BUTTON (g_value_get_object (value));
|
||||
if (arg)
|
||||
slist = gtk_radio_tool_button_get_group (arg);
|
||||
gtk_radio_tool_button_set_group (button, slist);
|
||||
group = gtk_radio_tool_button_get_group (arg);
|
||||
gtk_radio_tool_button_set_group (button, group);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -118,7 +118,7 @@ gtk_radio_tool_button_set_property (GObject *object,
|
||||
* Since: 2.4
|
||||
**/
|
||||
GtkToolItem *
|
||||
gtk_radio_tool_button_new (GSList *group)
|
||||
gtk_radio_tool_button_new (GtkRadioGroup *group)
|
||||
{
|
||||
GtkRadioToolButton *button;
|
||||
|
||||
@@ -144,7 +144,7 @@ gtk_radio_tool_button_new (GSList *group)
|
||||
* Since: 2.4
|
||||
**/
|
||||
GtkToolItem *
|
||||
gtk_radio_tool_button_new_from_stock (GSList *group,
|
||||
gtk_radio_tool_button_new_from_stock (GtkRadioGroup *group,
|
||||
const gchar *stock_id)
|
||||
{
|
||||
GtkRadioToolButton *button;
|
||||
@@ -174,14 +174,14 @@ gtk_radio_tool_button_new_from_stock (GSList *group,
|
||||
GtkToolItem *
|
||||
gtk_radio_tool_button_new_from_widget (GtkRadioToolButton *group)
|
||||
{
|
||||
GSList *list = NULL;
|
||||
GtkRadioGroup *radio_group = NULL;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_RADIO_TOOL_BUTTON (group), NULL);
|
||||
|
||||
if (group)
|
||||
list = gtk_radio_tool_button_get_group (GTK_RADIO_TOOL_BUTTON (group));
|
||||
radio_group = gtk_radio_tool_button_get_group (GTK_RADIO_TOOL_BUTTON (group));
|
||||
|
||||
return gtk_radio_tool_button_new (list);
|
||||
return gtk_radio_tool_button_new (radio_group);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -201,14 +201,14 @@ GtkToolItem *
|
||||
gtk_radio_tool_button_new_with_stock_from_widget (GtkRadioToolButton *group,
|
||||
const gchar *stock_id)
|
||||
{
|
||||
GSList *list = NULL;
|
||||
GtkRadioGroup *radio_group = NULL;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_RADIO_TOOL_BUTTON (group), NULL);
|
||||
|
||||
if (group)
|
||||
list = gtk_radio_tool_button_get_group (group);
|
||||
radio_group = gtk_radio_tool_button_get_group (group);
|
||||
|
||||
return gtk_radio_tool_button_new_from_stock (list, stock_id);
|
||||
return gtk_radio_tool_button_new_from_stock (radio_group, stock_id);
|
||||
}
|
||||
|
||||
static GtkRadioButton *
|
||||
@@ -227,7 +227,7 @@ get_radio_button (GtkRadioToolButton *button)
|
||||
*
|
||||
* Since: 2.4
|
||||
*/
|
||||
GSList *
|
||||
GtkRadioGroup *
|
||||
gtk_radio_tool_button_get_group (GtkRadioToolButton *button)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_RADIO_TOOL_BUTTON (button), NULL);
|
||||
@@ -246,7 +246,7 @@ gtk_radio_tool_button_get_group (GtkRadioToolButton *button)
|
||||
**/
|
||||
void
|
||||
gtk_radio_tool_button_set_group (GtkRadioToolButton *button,
|
||||
GSList *group)
|
||||
GtkRadioGroup *group)
|
||||
{
|
||||
g_return_if_fail (GTK_IS_RADIO_TOOL_BUTTON (button));
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#define __GTK_RADIO_TOOL_BUTTON_H__
|
||||
|
||||
#include <gtk/gtktoggletoolbutton.h>
|
||||
#include <gtk/gtkradiogroup.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
@@ -59,15 +60,15 @@ struct _GtkRadioToolButtonClass
|
||||
|
||||
GType gtk_radio_tool_button_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GtkToolItem *gtk_radio_tool_button_new (GSList *group);
|
||||
GtkToolItem *gtk_radio_tool_button_new_from_stock (GSList *group,
|
||||
const gchar *stock_id);
|
||||
GtkToolItem *gtk_radio_tool_button_new_from_widget (GtkRadioToolButton *group);
|
||||
GtkToolItem *gtk_radio_tool_button_new_with_stock_from_widget (GtkRadioToolButton *group,
|
||||
const gchar *stock_id);
|
||||
GSList * gtk_radio_tool_button_get_group (GtkRadioToolButton *button);
|
||||
void gtk_radio_tool_button_set_group (GtkRadioToolButton *button,
|
||||
GSList *group);
|
||||
GtkToolItem * gtk_radio_tool_button_new (GtkRadioGroup *group);
|
||||
GtkToolItem * gtk_radio_tool_button_new_from_stock (GtkRadioGroup *group,
|
||||
const gchar *stock_id);
|
||||
GtkToolItem * gtk_radio_tool_button_new_from_widget (GtkRadioToolButton *group);
|
||||
GtkToolItem * gtk_radio_tool_button_new_with_stock_from_widget (GtkRadioToolButton *group,
|
||||
const gchar *stock_id);
|
||||
GtkRadioGroup *gtk_radio_tool_button_get_group (GtkRadioToolButton *button);
|
||||
void gtk_radio_tool_button_set_group (GtkRadioToolButton *button,
|
||||
GtkRadioGroup *group);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
||||
@@ -44,6 +44,7 @@ static void
|
||||
gail_radio_button_init (GailRadioButton *radio_button)
|
||||
{
|
||||
radio_button->old_group = NULL;
|
||||
radio_button->old_group_size = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -60,7 +61,9 @@ gail_radio_button_ref_relation_set (AtkObject *obj)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
AtkRelationSet *relation_set;
|
||||
GtkRadioGroup *group;
|
||||
GSList *list;
|
||||
guint list_length;
|
||||
GailRadioButton *radio_button;
|
||||
|
||||
g_return_val_if_fail (GAIL_IS_RADIO_BUTTON (obj), NULL);
|
||||
@@ -80,9 +83,12 @@ gail_radio_button_ref_relation_set (AtkObject *obj)
|
||||
/*
|
||||
* If the radio button'group has changed remove the relation
|
||||
*/
|
||||
list = gtk_radio_button_get_group (GTK_RADIO_BUTTON (widget));
|
||||
|
||||
if (radio_button->old_group != list)
|
||||
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (widget));
|
||||
list = gtk_radio_group_get_items (group);
|
||||
list_length = g_slist_length (list);
|
||||
|
||||
if (radio_button->old_group != group ||
|
||||
radio_button->old_group_size != list_length)
|
||||
{
|
||||
AtkRelation *relation;
|
||||
|
||||
@@ -96,15 +102,14 @@ gail_radio_button_ref_relation_set (AtkObject *obj)
|
||||
* Get the members of the button group
|
||||
*/
|
||||
|
||||
radio_button->old_group = list;
|
||||
if (list)
|
||||
radio_button->old_group = group;
|
||||
radio_button->old_group_size = list_length;
|
||||
if (group)
|
||||
{
|
||||
AtkObject **accessible_array;
|
||||
guint list_length;
|
||||
AtkRelation* relation;
|
||||
gint i = 0;
|
||||
|
||||
list_length = g_slist_length (list);
|
||||
accessible_array = (AtkObject**) g_malloc (sizeof (AtkObject *) *
|
||||
list_length);
|
||||
while (list != NULL)
|
||||
@@ -126,5 +131,6 @@ gail_radio_button_ref_relation_set (AtkObject *obj)
|
||||
g_object_unref (relation);
|
||||
}
|
||||
}
|
||||
g_slist_free (list);
|
||||
return relation_set;
|
||||
}
|
||||
|
||||
@@ -38,7 +38,8 @@ struct _GailRadioButton
|
||||
{
|
||||
GailToggleButton parent;
|
||||
|
||||
GSList *old_group;
|
||||
GtkRadioGroup *old_group;
|
||||
guint old_group_size;
|
||||
};
|
||||
|
||||
GType gail_radio_button_get_type (void);
|
||||
|
||||
@@ -515,8 +515,8 @@ main (gint argc, gchar **argv)
|
||||
GtkWidget *button;
|
||||
GtkWidget *label;
|
||||
GIcon *gicon;
|
||||
GSList *group;
|
||||
|
||||
GtkRadioGroup *group;
|
||||
|
||||
gtk_init (&argc, &argv);
|
||||
|
||||
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||
@@ -671,9 +671,9 @@ main (gint argc, gchar **argv)
|
||||
gtk_tool_item_set_expand (item, TRUE);
|
||||
gtk_separator_tool_item_set_draw (GTK_SEPARATOR_TOOL_ITEM (item), FALSE);
|
||||
g_assert (gtk_toolbar_get_nth_item (GTK_TOOLBAR (toolbar), 0) != 0);
|
||||
|
||||
item = gtk_radio_tool_button_new_from_stock (NULL, GTK_STOCK_JUSTIFY_LEFT);
|
||||
group = gtk_radio_tool_button_get_group (GTK_RADIO_TOOL_BUTTON (item));
|
||||
|
||||
group = gtk_radio_group_new ();
|
||||
item = gtk_radio_tool_button_new_from_stock (group, GTK_STOCK_JUSTIFY_LEFT);
|
||||
add_item_to_list (store, item, "Left");
|
||||
gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
|
||||
|
||||
@@ -681,7 +681,6 @@ main (gint argc, gchar **argv)
|
||||
item = gtk_radio_tool_button_new_from_stock (group, GTK_STOCK_JUSTIFY_CENTER);
|
||||
make_prop_editor (G_OBJECT (item));
|
||||
|
||||
group = gtk_radio_tool_button_get_group (GTK_RADIO_TOOL_BUTTON (item));
|
||||
add_item_to_list (store, item, "Center");
|
||||
gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user