[gtk+/radio-group: 4/9] Convert GtkRadioMenuItem to GtkRadioGroup
- From: Alexander Larsson <alexl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/radio-group: 4/9] Convert GtkRadioMenuItem to GtkRadioGroup
- Date: Fri, 5 Nov 2010 13:34:54 +0000 (UTC)
commit 67ced1e28a8e8b87b5e52dbe5b0c86894f1ebb71
Author: Alexander Larsson <alexl redhat com>
Date: Thu Nov 4 20:52:39 2010 +0100
Convert GtkRadioMenuItem to GtkRadioGroup
demos/gtk-demo/menus.c | 4 +-
gtk/gtkimmulticontext.c | 13 +-
gtk/gtkradiomenuitem.c | 204 +++++++++++++----------------
gtk/gtkradiomenuitem.h | 27 ++--
modules/other/gail/gailradiomenuitem.c | 18 ++-
modules/other/gail/gailradiomenuitem.h | 3 +-
modules/other/gail/gailradiosubmenuitem.c | 18 ++-
modules/other/gail/gailradiosubmenuitem.h | 3 +-
tests/testgtk.c | 6 +-
9 files changed, 141 insertions(+), 155 deletions(-)
---
diff --git a/demos/gtk-demo/menus.c b/demos/gtk-demo/menus.c
index 316e853..3d547a4 100644
--- a/demos/gtk-demo/menus.c
+++ b/demos/gtk-demo/menus.c
@@ -35,7 +35,7 @@ create_menu (gint depth,
{
GtkWidget *menu;
GtkWidget *menuitem;
- GSList *group;
+ GtkRadioGroup *group;
char buf[32];
int i, j;
@@ -52,11 +52,11 @@ create_menu (gint depth,
gtk_widget_show (menuitem);
}
+ group = gtk_radio_group_new ();
for (i = 0, j = 1; i < 5; i++, j++)
{
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);
diff --git a/gtk/gtkimmulticontext.c b/gtk/gtkimmulticontext.c
index a8357ba..3fddde2 100644
--- a/gtk/gtkimmulticontext.c
+++ b/gtk/gtkimmulticontext.c
@@ -580,15 +580,15 @@ gtk_im_multicontext_append_menuitems (GtkIMMulticontext *context,
GtkIMMulticontextPrivate *priv = context->priv;
const GtkIMContextInfo **contexts;
guint n_contexts, i;
- GSList *group = NULL;
+ GtkRadioGroup *group;
GtkWidget *menuitem, *system_menuitem;
const char *system_context_id;
+ group = gtk_radio_group_new ();
system_context_id = _gtk_im_module_get_default_context_id (priv->client_window);
system_menuitem = menuitem = gtk_radio_menu_item_new_with_label (group, C_("input method menu", "System"));
if (!priv->context_id_aux)
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), TRUE);
- group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
g_object_set_data (G_OBJECT (menuitem), I_("gtk-context-id"), NULL);
g_signal_connect (menuitem, "activate", G_CALLBACK (activate_cb), context);
@@ -602,8 +602,7 @@ gtk_im_multicontext_append_menuitems (GtkIMMulticontext *context,
g_signal_connect (menuitem, "activate", G_CALLBACK (activate_cb), context);
gtk_widget_show (menuitem);
gtk_menu_shell_append (menushell, menuitem);
- group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
-
+
menuitem = gtk_separator_menu_item_new ();
gtk_widget_show (menuitem);
gtk_menu_shell_append (menushell, menuitem);
@@ -681,10 +680,8 @@ gtk_im_multicontext_append_menuitems (GtkIMMulticontext *context,
text = g_strdup_printf (C_("input method menu", "System (%s)"), translated_name);
gtk_label_set_text (GTK_LABEL (label), text);
g_free (text);
- }
-
- group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
-
+ }
+
g_object_set_data (G_OBJECT (menuitem), I_("gtk-context-id"),
(char *)contexts[i]->context_id);
g_signal_connect (menuitem, "activate",
diff --git a/gtk/gtkradiomenuitem.c b/gtk/gtkradiomenuitem.c
index e875026..73aabd0 100644
--- a/gtk/gtkradiomenuitem.c
+++ b/gtk/gtkradiomenuitem.c
@@ -28,6 +28,7 @@
#include "gtkaccellabel.h"
#include "gtkmarshalers.h"
#include "gtkradiomenuitem.h"
+#include "gtkradiogroupprivate.h"
#include "gtkactivatable.h"
#include "gtkprivate.h"
#include "gtkintl.h"
@@ -35,7 +36,7 @@
struct _GtkRadioMenuItemPrivate
{
- GSList *group;
+ GtkRadioGroup *group;
};
enum {
@@ -60,7 +61,7 @@ static guint group_changed_signal = 0;
G_DEFINE_TYPE (GtkRadioMenuItem, gtk_radio_menu_item, GTK_TYPE_CHECK_MENU_ITEM)
GtkWidget*
-gtk_radio_menu_item_new (GSList *group)
+gtk_radio_menu_item_new (GtkRadioGroup *group)
{
GtkRadioMenuItem *radio_menu_item;
@@ -83,14 +84,14 @@ gtk_radio_menu_item_set_property (GObject *object,
switch (prop_id)
{
- GSList *slist;
+ GtkRadioGroup *group;
case PROP_GROUP:
if (G_VALUE_HOLDS_OBJECT (value))
- slist = gtk_radio_menu_item_get_group ((GtkRadioMenuItem*) g_value_get_object (value));
+ group = gtk_radio_menu_item_get_group ((GtkRadioMenuItem*) g_value_get_object (value));
else
- slist = NULL;
- gtk_radio_menu_item_set_group (radio_menu_item, slist);
+ group = NULL;
+ gtk_radio_menu_item_set_group (radio_menu_item, group);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -114,60 +115,41 @@ gtk_radio_menu_item_get_property (GObject *object,
void
gtk_radio_menu_item_set_group (GtkRadioMenuItem *radio_menu_item,
- GSList *group)
+ GtkRadioGroup *group)
{
GtkRadioMenuItemPrivate *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_MENU_ITEM (radio_menu_item));
- g_return_if_fail (!g_slist_find (group, radio_menu_item));
priv = radio_menu_item->priv;
- if (priv->group)
- {
- GSList *slist;
+ if (priv->group == group)
+ return;
- priv->group = g_slist_remove (priv->group, radio_menu_item);
+ if (group == NULL)
+ group = gtk_radio_group_new ();
- if (priv->group && !priv->group->next)
- old_group_singleton = g_object_ref (priv->group->data);
+ if (priv->group)
+ {
+ _gtk_radio_group_remove_item (priv->group, G_OBJECT (radio_menu_item));
+ old_group_singleton = _gtk_radio_group_get_singleton (priv->group);
- for (slist = priv->group; slist; slist = slist->next)
- {
- GtkRadioMenuItem *tmp_item;
-
- tmp_item = slist->data;
+ /* 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_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (old_group_active), TRUE);
- tmp_item->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_menu_item);
- if (group)
- {
- GSList *slist;
-
- for (slist = group; slist; slist = slist->next)
- {
- GtkRadioMenuItem *tmp_item;
-
- tmp_item = slist->data;
+ priv->group = g_object_ref_sink (group);
+ new_group_singleton = _gtk_radio_group_get_singleton (group);
- tmp_item->priv->group = priv->group;
- }
- }
- else
- {
- _gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (radio_menu_item), TRUE);
- /* gtk_widget_set_state (GTK_WIDGET (radio_menu_item), GTK_STATE_ACTIVE);
- */
- }
+ _gtk_radio_group_add_item (group, G_OBJECT (radio_menu_item));
g_object_ref (radio_menu_item);
@@ -184,13 +166,18 @@ gtk_radio_menu_item_set_group (GtkRadioMenuItem *radio_menu_item,
g_object_unref (new_group_singleton);
}
+ is_active = gtk_radio_group_get_active_item (group) == G_OBJECT (radio_menu_item);
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (radio_menu_item), is_active);
+ if (is_active)
+ _gtk_radio_group_emit_active_changed (group);
+
g_object_unref (radio_menu_item);
}
/**
* gtk_radio_menu_item_new_with_label:
- * @group: (element-type GtkRadioMenuItem) (transfer full):
+ * @group: a #GtkRadioMenuItem or %NULL
* @label: the text for the label
*
* Creates a new #GtkRadioMenuItem whose child is a simple #GtkLabel.
@@ -198,7 +185,7 @@ gtk_radio_menu_item_set_group (GtkRadioMenuItem *radio_menu_item,
* Returns: (transfer none): A new #GtkRadioMenuItem
*/
GtkWidget*
-gtk_radio_menu_item_new_with_label (GSList *group,
+gtk_radio_menu_item_new_with_label (GtkRadioGroup *group,
const gchar *label)
{
GtkWidget *radio_menu_item;
@@ -227,7 +214,7 @@ gtk_radio_menu_item_new_with_label (GSList *group,
* in @label indicate the mnemonic for the menu item.
**/
GtkWidget*
-gtk_radio_menu_item_new_with_mnemonic (GSList *group,
+gtk_radio_menu_item_new_with_mnemonic (GtkRadioGroup *group,
const gchar *label)
{
GtkWidget *radio_menu_item;
@@ -258,14 +245,14 @@ gtk_radio_menu_item_new_with_mnemonic (GSList *group,
GtkWidget *
gtk_radio_menu_item_new_from_widget (GtkRadioMenuItem *group)
{
- GSList *list = NULL;
-
+ GtkRadioGroup *radio_group = NULL;
+
g_return_val_if_fail (GTK_IS_RADIO_MENU_ITEM (group), NULL);
if (group)
- list = gtk_radio_menu_item_get_group (group);
-
- return gtk_radio_menu_item_new (list);
+ radio_group = gtk_radio_menu_item_get_group (group);
+
+ return gtk_radio_menu_item_new (radio_group);
}
/**
@@ -288,14 +275,14 @@ GtkWidget *
gtk_radio_menu_item_new_with_mnemonic_from_widget (GtkRadioMenuItem *group,
const gchar *label)
{
- GSList *list = NULL;
+ GtkRadioGroup *radio_group = NULL;
g_return_val_if_fail (GTK_IS_RADIO_MENU_ITEM (group), NULL);
if (group)
- list = gtk_radio_menu_item_get_group (group);
+ radio_group = gtk_radio_menu_item_get_group (group);
- return gtk_radio_menu_item_new_with_mnemonic (list, label);
+ return gtk_radio_menu_item_new_with_mnemonic (radio_group, label);
}
/**
@@ -314,30 +301,46 @@ GtkWidget *
gtk_radio_menu_item_new_with_label_from_widget (GtkRadioMenuItem *group,
const gchar *label)
{
- GSList *list = NULL;
+ GtkRadioGroup *radio_group = NULL;
g_return_val_if_fail (GTK_IS_RADIO_MENU_ITEM (group), NULL);
if (group)
- list = gtk_radio_menu_item_get_group (group);
+ radio_group = gtk_radio_menu_item_get_group (group);
- return gtk_radio_menu_item_new_with_label (list, label);
+ return gtk_radio_menu_item_new_with_label (radio_group, label);
}
+static void
+gtk_radio_menu_item_ensure_group (GtkRadioMenuItem *radio_menu_item)
+{
+ GtkRadioMenuItemPrivate *priv = radio_menu_item->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_menu_item));
+ }
+}
+
+
/**
* gtk_radio_menu_item_get_group:
* @radio_menu_item: a #GtkRadioMenuItem
*
- * Returns the group to which the radio menu item belongs, as a #GList of
- * #GtkRadioMenuItem. The list belongs to GTK+ and should not be freed.
+ * Retrieves the group to which the radio menu item belongs.
*
- * Returns: (transfer none): the group of @radio_menu_item
+ * Return value: (transfer none): a #GtkRadioGroup
+ * containing all the radio menu items in the same group
+ * as @radio_menu_button.
*/
-GSList*
+GtkRadioGroup*
gtk_radio_menu_item_get_group (GtkRadioMenuItem *radio_menu_item)
{
g_return_val_if_fail (GTK_IS_RADIO_MENU_ITEM (radio_menu_item), NULL);
+ gtk_radio_menu_item_ensure_group (radio_menu_item);
+
return radio_menu_item->priv->group;
}
@@ -409,7 +412,7 @@ gtk_radio_menu_item_init (GtkRadioMenuItem *radio_menu_item)
GtkRadioMenuItemPrivate);
priv = radio_menu_item->priv;
- priv->group = g_slist_prepend (NULL, radio_menu_item);
+ priv->group = NULL;
gtk_check_menu_item_set_draw_as_radio (GTK_CHECK_MENU_ITEM (radio_menu_item), TRUE);
}
@@ -418,30 +421,20 @@ gtk_radio_menu_item_destroy (GtkWidget *widget)
{
GtkRadioMenuItem *radio_menu_item = GTK_RADIO_MENU_ITEM (widget);
GtkRadioMenuItemPrivate *priv = radio_menu_item->priv;
- GtkWidget *old_group_singleton = NULL;
- GtkRadioMenuItem *tmp_menu_item;
- GSList *tmp_list;
- gboolean was_in_group;
-
- was_in_group = priv->group && priv->group->next;
-
- priv->group = g_slist_remove (priv->group, radio_menu_item);
- if (priv->group && !priv->group->next)
- old_group_singleton = priv->group->data;
-
- tmp_list = priv->group;
+ GObject *old_group_singleton = NULL;
+ gboolean was_in_group = FALSE;
- while (tmp_list)
+ if (priv->group)
{
- tmp_menu_item = tmp_list->data;
- tmp_list = tmp_list->next;
+ _gtk_radio_group_remove_item (priv->group, G_OBJECT (radio_menu_item));
+ was_in_group = !_gtk_radio_group_is_empty (priv->group);
+ old_group_singleton = _gtk_radio_group_get_singleton (priv->group);
- tmp_menu_item->priv->group = priv->group;
+ /* this menu item is no longer in the group */
+ g_object_unref (priv->group);
+ priv->group = NULL;
}
- /* this radio menu item 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)
@@ -456,12 +449,13 @@ gtk_radio_menu_item_activate (GtkMenuItem *menu_item)
GtkRadioMenuItem *radio_menu_item = GTK_RADIO_MENU_ITEM (menu_item);
GtkRadioMenuItemPrivate *priv = radio_menu_item->priv;
GtkCheckMenuItem *check_menu_item = GTK_CHECK_MENU_ITEM (menu_item);
- GtkCheckMenuItem *tmp_menu_item;
GtkAction *action;
- GSList *tmp_list;
+ GObject *active_item;
gboolean active;
gint toggled;
+ gtk_radio_menu_item_ensure_group (radio_menu_item);
+
action = gtk_activatable_get_related_action (GTK_ACTIVATABLE (menu_item));
if (action && gtk_menu_item_get_submenu (menu_item) == NULL)
gtk_action_activate (action);
@@ -471,22 +465,9 @@ gtk_radio_menu_item_activate (GtkMenuItem *menu_item)
active = gtk_check_menu_item_get_active (check_menu_item);
if (active)
{
- tmp_menu_item = NULL;
- tmp_list = priv->group;
-
- while (tmp_list)
- {
- tmp_menu_item = tmp_list->data;
- tmp_list = tmp_list->next;
+ active_item = gtk_radio_group_get_active_item (priv->group);
- if (gtk_check_menu_item_get_active (tmp_menu_item) &&
- tmp_menu_item != check_menu_item)
- break;
-
- tmp_menu_item = NULL;
- }
-
- if (tmp_menu_item)
+ if (active_item != G_OBJECT (menu_item))
{
toggled = TRUE;
_gtk_check_menu_item_set_active (check_menu_item, !active);
@@ -497,24 +478,17 @@ gtk_radio_menu_item_activate (GtkMenuItem *menu_item)
toggled = TRUE;
_gtk_check_menu_item_set_active (check_menu_item, !active);
- tmp_list = priv->group;
- while (tmp_list)
- {
- tmp_menu_item = tmp_list->data;
- tmp_list = tmp_list->next;
-
- if (gtk_check_menu_item_get_active (tmp_menu_item) &&
- tmp_menu_item != check_menu_item)
- {
- gtk_menu_item_activate (GTK_MENU_ITEM (tmp_menu_item));
- break;
- }
- }
+ active_item = gtk_radio_group_get_active_item (priv->group);
+ _gtk_radio_group_set_active_item (priv->group, G_OBJECT (menu_item));
+ if (active_item != G_OBJECT (menu_item))
+ gtk_menu_item_activate (GTK_MENU_ITEM (active_item));
}
if (toggled)
{
gtk_check_menu_item_toggled (check_menu_item);
+ if (gtk_check_menu_item_get_active (check_menu_item))
+ _gtk_radio_group_emit_active_changed (priv->group);
}
gtk_widget_queue_draw (GTK_WIDGET (radio_menu_item));
diff --git a/gtk/gtkradiomenuitem.h b/gtk/gtkradiomenuitem.h
index bab8380..4749143 100644
--- a/gtk/gtkradiomenuitem.h
+++ b/gtk/gtkradiomenuitem.h
@@ -33,6 +33,7 @@
#include <gtk/gtkcheckmenuitem.h>
+#include <gtk/gtkradiogroup.h>
G_BEGIN_DECLS
@@ -74,19 +75,19 @@ struct _GtkRadioMenuItemClass
GType gtk_radio_menu_item_get_type (void) G_GNUC_CONST;
-GtkWidget* gtk_radio_menu_item_new (GSList *group);
-GtkWidget* gtk_radio_menu_item_new_with_label (GSList *group,
- const gchar *label);
-GtkWidget* gtk_radio_menu_item_new_with_mnemonic (GSList *group,
- const gchar *label);
-GtkWidget* gtk_radio_menu_item_new_from_widget (GtkRadioMenuItem *group);
-GtkWidget *gtk_radio_menu_item_new_with_mnemonic_from_widget (GtkRadioMenuItem *group,
- const gchar *label);
-GtkWidget *gtk_radio_menu_item_new_with_label_from_widget (GtkRadioMenuItem *group,
- const gchar *label);
-GSList* gtk_radio_menu_item_get_group (GtkRadioMenuItem *radio_menu_item);
-void gtk_radio_menu_item_set_group (GtkRadioMenuItem *radio_menu_item,
- GSList *group);
+GtkWidget* gtk_radio_menu_item_new (GtkRadioGroup *group);
+GtkWidget* gtk_radio_menu_item_new_with_label (GtkRadioGroup *group,
+ const gchar *label);
+GtkWidget* gtk_radio_menu_item_new_with_mnemonic (GtkRadioGroup *group,
+ const gchar *label);
+GtkWidget* gtk_radio_menu_item_new_from_widget (GtkRadioMenuItem *group);
+GtkWidget * gtk_radio_menu_item_new_with_mnemonic_from_widget (GtkRadioMenuItem *group,
+ const gchar *label);
+GtkWidget * gtk_radio_menu_item_new_with_label_from_widget (GtkRadioMenuItem *group,
+ const gchar *label);
+GtkRadioGroup* gtk_radio_menu_item_get_group (GtkRadioMenuItem *radio_menu_item);
+void gtk_radio_menu_item_set_group (GtkRadioMenuItem *radio_menu_item,
+ GtkRadioGroup *group);
G_END_DECLS
diff --git a/modules/other/gail/gailradiomenuitem.c b/modules/other/gail/gailradiomenuitem.c
index e791346..25035fd 100644
--- a/modules/other/gail/gailradiomenuitem.c
+++ b/modules/other/gail/gailradiomenuitem.c
@@ -62,6 +62,7 @@ static void
gail_radio_menu_item_init (GailRadioMenuItem *radio_menu_item)
{
radio_menu_item->old_group = NULL;
+ radio_menu_item->old_group_size = 0;
}
AtkRelationSet*
@@ -69,7 +70,9 @@ gail_radio_menu_item_ref_relation_set (AtkObject *obj)
{
GtkWidget *widget;
AtkRelationSet *relation_set;
+ GtkRadioGroup *group;
GSList *list;
+ guint list_length;
GailRadioMenuItem *radio_menu_item;
g_return_val_if_fail (GAIL_IS_RADIO_MENU_ITEM (obj), NULL);
@@ -89,9 +92,12 @@ gail_radio_menu_item_ref_relation_set (AtkObject *obj)
/*
* If the radio menu_item'group has changed remove the relation
*/
- list = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (widget));
-
- if (radio_menu_item->old_group != list)
+ group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (widget));
+ list = gtk_radio_group_get_items (group);
+ list_length = g_slist_length (list);
+
+ if (radio_menu_item->old_group != group ||
+ radio_menu_item->old_group_size != list_length)
{
AtkRelation *relation;
@@ -105,15 +111,14 @@ gail_radio_menu_item_ref_relation_set (AtkObject *obj)
* Get the members of the menu_item group
*/
- radio_menu_item->old_group = list;
+ radio_menu_item->old_group = group;
+ radio_menu_item->old_group_size = list_length;
if (list)
{
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)
@@ -135,5 +140,6 @@ gail_radio_menu_item_ref_relation_set (AtkObject *obj)
g_object_unref (relation);
}
}
+ g_slist_free (list);
return relation_set;
}
diff --git a/modules/other/gail/gailradiomenuitem.h b/modules/other/gail/gailradiomenuitem.h
index 8dfa688..ad7b20f 100644
--- a/modules/other/gail/gailradiomenuitem.h
+++ b/modules/other/gail/gailradiomenuitem.h
@@ -38,7 +38,8 @@ struct _GailRadioMenuItem
{
GailCheckMenuItem parent;
- GSList *old_group;
+ GtkRadioGroup *old_group;
+ guint old_group_size;
};
GType gail_radio_menu_item_get_type (void);
diff --git a/modules/other/gail/gailradiosubmenuitem.c b/modules/other/gail/gailradiosubmenuitem.c
index 9360f8f..6999455 100644
--- a/modules/other/gail/gailradiosubmenuitem.c
+++ b/modules/other/gail/gailradiosubmenuitem.c
@@ -58,6 +58,7 @@ static void
gail_radio_sub_menu_item_init (GailRadioSubMenuItem *radio_menu_item)
{
radio_menu_item->old_group = NULL;
+ radio_menu_item->old_group_size = 0;
}
AtkRelationSet*
@@ -65,7 +66,9 @@ gail_radio_sub_menu_item_ref_relation_set (AtkObject *obj)
{
GtkWidget *widget;
AtkRelationSet *relation_set;
+ GtkRadioGroup *group;
GSList *list;
+ guint list_length;
GailRadioSubMenuItem *radio_menu_item;
g_return_val_if_fail (GAIL_IS_RADIO_SUB_MENU_ITEM (obj), NULL);
@@ -85,9 +88,12 @@ gail_radio_sub_menu_item_ref_relation_set (AtkObject *obj)
/*
* If the radio menu_item'group has changed remove the relation
*/
- list = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (widget));
-
- if (radio_menu_item->old_group != list)
+ group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (widget));
+ list = gtk_radio_group_get_items (group);
+ list_length = g_slist_length (list);
+
+ if (radio_menu_item->old_group != group ||
+ radio_menu_item->old_group_size != list_length)
{
AtkRelation *relation;
@@ -101,15 +107,14 @@ gail_radio_sub_menu_item_ref_relation_set (AtkObject *obj)
* Get the members of the menu_item group
*/
- radio_menu_item->old_group = list;
+ radio_menu_item->old_group = group;
+ radio_menu_item->old_group_size = list_length;
if (list)
{
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)
@@ -131,5 +136,6 @@ gail_radio_sub_menu_item_ref_relation_set (AtkObject *obj)
g_object_unref (relation);
}
}
+ g_slist_free (list);
return relation_set;
}
diff --git a/modules/other/gail/gailradiosubmenuitem.h b/modules/other/gail/gailradiosubmenuitem.h
index 2433a3b..3e8a5db 100644
--- a/modules/other/gail/gailradiosubmenuitem.h
+++ b/modules/other/gail/gailradiosubmenuitem.h
@@ -38,7 +38,8 @@ struct _GailRadioSubMenuItem
{
GailCheckSubMenuItem parent;
- GSList *old_group;
+ GtkRadioGroup *old_group;
+ guint old_group_size;
};
GType gail_radio_sub_menu_item_get_type (void);
diff --git a/tests/testgtk.c b/tests/testgtk.c
index dc50da0..91977a8 100644
--- a/tests/testgtk.c
+++ b/tests/testgtk.c
@@ -2928,7 +2928,7 @@ create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
GtkWidget *menu;
GtkWidget *menuitem;
GtkWidget *image;
- GSList *group;
+ GtkRadioGroup *group;
char buf[32];
int i, j;
@@ -2954,13 +2954,13 @@ create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
gtk_widget_show (menuitem);
-
+
+ group = gtk_radio_group_new ();
for (i = 0, j = 1; i < length; i++, j++)
{
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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]