[gtk+/radio-group: 4/9] Convert GtkRadioMenuItem to GtkRadioGroup



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]