]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkradiobutton.c
Fixed a warning from g_object_set (radiobutton, "group", NULL, NULL).
[~andy/gtk] / gtk / gtkradiobutton.c
index cac8a94954754382a6e3fa6c8244196d24ef7d7a..7e3c349a67dde94516f3e08fbb163f4a568e300c 100644 (file)
@@ -144,10 +144,13 @@ gtk_radio_button_set_property (GObject      *object,
   switch (prop_id)
     {
       GSList *slist;
+      GtkRadioButton *button;
 
     case PROP_GROUP:
-      if (G_VALUE_HOLDS_OBJECT (value))
-       slist = gtk_radio_button_get_group ((GtkRadioButton*) g_value_get_object (value));
+        button = g_value_get_object (value);
+
+      if (button)
+       slist = gtk_radio_button_get_group (button);
       else
        slist = NULL;
       gtk_radio_button_set_group (radio_button, slist);
@@ -445,25 +448,30 @@ gtk_radio_button_focus (GtkWidget         *widget,
   
   if (gtk_widget_is_focus (widget))
     {
+      GtkSettings *settings = gtk_widget_get_settings (widget);
       GSList *focus_list, *tmp_list;
       GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
       GtkWidget *new_focus = NULL;
+      gboolean cursor_only;
+      gboolean wrap_around;
 
-      focus_list = g_slist_copy (radio_button->group);
-      
       switch (direction)
        {
-       case GTK_DIR_TAB_FORWARD:
-       case GTK_DIR_TAB_BACKWARD:
-         return FALSE;
        case GTK_DIR_LEFT:
        case GTK_DIR_RIGHT:
+         focus_list = g_slist_copy (radio_button->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 (radio_button->group);
          focus_list = g_slist_sort_with_data (focus_list, up_down_compare, toplevel);
          break;
+       case GTK_DIR_TAB_FORWARD:
+       case GTK_DIR_TAB_BACKWARD:
+          /* fall through */
+        default:
+         return FALSE;
        }
 
       if (direction == GTK_DIR_LEFT || direction == GTK_DIR_UP)
@@ -489,8 +497,26 @@ gtk_radio_button_focus (GtkWidget         *widget,
            }
        }
 
+      g_object_get (settings,
+                    "gtk-keynav-cursor-only", &cursor_only,
+                    "gtk-keynav-wrap-around", &wrap_around,
+                    NULL);
+
       if (!new_focus)
        {
+          if (cursor_only)
+            {
+              g_slist_free (focus_list);
+              return FALSE;
+            }
+
+          if (!wrap_around)
+            {
+              g_slist_free (focus_list);
+              gtk_widget_error_bell (widget);
+              return TRUE;
+            }
+
          tmp_list = focus_list;
 
          while (tmp_list)
@@ -512,7 +538,9 @@ gtk_radio_button_focus (GtkWidget         *widget,
       if (new_focus)
        {
          gtk_widget_grab_focus (new_focus);
-         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (new_focus), TRUE);
+
+          if (!cursor_only)
+            gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (new_focus), TRUE);
        }
 
       return TRUE;