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);
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)
}
}
+ 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)
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;