diff --git a/libmalcontent-ui/user-controls.c b/libmalcontent-ui/user-controls.c index ffeebcc..ad6a3a8 100644 --- a/libmalcontent-ui/user-controls.c +++ b/libmalcontent-ui/user-controls.c @@ -711,6 +711,31 @@ list_box_header_func (GtkListBoxRow *row, } } +static gboolean +on_keynav_failed (GtkWidget *listbox, + GtkDirectionType direction, + gpointer user_data) +{ + MctUserControls *self = MCT_USER_CONTROLS (user_data); + GtkWidget *new_widget = NULL; + + /* There are currently two listboxes, so don’t over-complicate this function. */ + if (listbox == GTK_WIDGET (self->application_usage_permissions_listbox) && + direction == GTK_DIR_DOWN) + new_widget = GTK_WIDGET (self->software_installation_permissions_listbox); + else if (listbox == GTK_WIDGET (self->software_installation_permissions_listbox) && + direction == GTK_DIR_UP) + new_widget = GTK_WIDGET (self->application_usage_permissions_listbox); + + if (new_widget != NULL) + { + gtk_widget_child_focus (new_widget, direction); + return TRUE; + } + + return FALSE; +} + /* GObject overrides */ static void @@ -1031,6 +1056,7 @@ mct_user_controls_class_init (MctUserControlsClass *klass) gtk_widget_class_bind_template_callback (widget_class, on_restrict_applications_dialog_delete_event_cb); gtk_widget_class_bind_template_callback (widget_class, on_restrict_applications_dialog_response_cb); gtk_widget_class_bind_template_callback (widget_class, on_application_usage_permissions_listbox_activated_cb); + gtk_widget_class_bind_template_callback (widget_class, on_keynav_failed); } static void diff --git a/libmalcontent-ui/user-controls.ui b/libmalcontent-ui/user-controls.ui index 2155777..b699871 100644 --- a/libmalcontent-ui/user-controls.ui +++ b/libmalcontent-ui/user-controls.ui @@ -39,6 +39,7 @@ none True + True @@ -252,6 +253,7 @@ True none False + diff --git a/malcontent-control/application.c b/malcontent-control/application.c index 8762981..d226a83 100644 --- a/malcontent-control/application.c +++ b/malcontent-control/application.c @@ -415,7 +415,7 @@ update_main_stack (MctApplication *self) mct_user_controls_set_user (self->user_controls, selected_user); new_page_name = "controls"; - new_focus_widget = GTK_WIDGET (self->user_selector); + new_focus_widget = GTK_WIDGET (self->user_controls); } else { @@ -427,7 +427,12 @@ update_main_stack (MctApplication *self) gtk_stack_set_visible_child_name (self->main_stack, new_page_name); if (new_focus_widget != NULL && !g_str_equal (old_page_name, new_page_name)) - gtk_widget_grab_focus (new_focus_widget); + { + if (gtk_widget_get_can_focus (new_focus_widget)) + gtk_widget_grab_focus (new_focus_widget); + else + gtk_widget_child_focus (new_focus_widget, GTK_DIR_TAB_FORWARD); + } } static void