From f3a6c93245a67acda141a57a79a0628da968cac0 Mon Sep 17 00:00:00 2001 From: Hari Rana Date: Sat, 21 Feb 2026 09:05:33 -0500 Subject: [PATCH] views/month-popover: Cycle focus through widgets Part-of: --- src/gui/views/gcal-month-popover.c | 42 ++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/gui/views/gcal-month-popover.c b/src/gui/views/gcal-month-popover.c index b2d0572d..7aadcd1e 100644 --- a/src/gui/views/gcal-month-popover.c +++ b/src/gui/views/gcal-month-popover.c @@ -190,6 +190,23 @@ sort_func (GtkListBoxRow *a, return gcal_event_widget_sort_events (event_a, event_b); } +static gboolean +repeat_direction (GtkWidget *widget, + GtkDirectionType direction) +{ + GtkWidget *child; + + do + { + child = gtk_widget_get_focus_child (widget); + + g_assert (child != NULL); + } + while (gtk_widget_child_focus (child, direction)); + + return TRUE; +} + /* * Callbacks @@ -330,6 +347,30 @@ gcal_month_popover_size_allocate (GtkWidget *widget, } } +static gboolean +gcal_month_popover_focus (GtkWidget *widget, + GtkDirectionType direction) +{ + GtkWidget *child = gtk_widget_get_focus_child (widget); + + g_assert (child != NULL); + + if (gtk_widget_child_focus (child, direction)) + return TRUE; + + switch (direction) + { + case GTK_DIR_DOWN: + case GTK_DIR_TAB_FORWARD: + return repeat_direction (widget, GTK_DIR_TAB_BACKWARD); + case GTK_DIR_UP: + case GTK_DIR_TAB_BACKWARD: + return repeat_direction (widget, GTK_DIR_TAB_FORWARD); + default: + return gtk_widget_keynav_failed (widget, direction); + } +} + /* * GObject overrides @@ -397,6 +438,7 @@ gcal_month_popover_class_init (GcalMonthPopoverClass *klass) widget_class->measure = gcal_month_popover_measure; widget_class->size_allocate = gcal_month_popover_size_allocate; + widget_class->focus = gcal_month_popover_focus; properties [PROP_CONTEXT] = g_param_spec_object ("context", "Context",