From c3d5c777ece88d79e218015701b303922d0403fe Mon Sep 17 00:00:00 2001 From: Hari Rana Date: Fri, 24 Apr 2026 08:54:57 -0400 Subject: [PATCH] event-editor/multi-choice: Port from GtkEventControllerKey to shortcuts Since we wrap the values all the time now, this also removes the `gtk_widget_error_bell()` call. Part-of: --- src/gui/event-editor/gcal-multi-choice.blp | 8 +- src/gui/event-editor/gcal-multi-choice.c | 99 ++++------------------ 2 files changed, 20 insertions(+), 87 deletions(-) diff --git a/src/gui/event-editor/gcal-multi-choice.blp b/src/gui/event-editor/gcal-multi-choice.blp index e692642f..11c9043c 100644 --- a/src/gui/event-editor/gcal-multi-choice.blp +++ b/src/gui/event-editor/gcal-multi-choice.blp @@ -12,7 +12,7 @@ template $GcalMultiChoice: Widget { Button down_button { icon-name: "pan-start-symbolic"; - clicked => $button_clicked_cb(); + action-name: "multi-choice.down"; can-focus: false; tooltip-text: bind template.previous-button-tooltip; @@ -34,10 +34,6 @@ template $GcalMultiChoice: Widget { "popup", ] - EventControllerKey { - key-pressed => $key_pressed_cb(template); - } - Stack stack { hexpand: true; vexpand: true; @@ -58,7 +54,7 @@ template $GcalMultiChoice: Widget { Button up_button { icon-name: "pan-end-symbolic"; - clicked => $button_clicked_cb(); + action-name: "multi-choice.up"; can-focus: false; tooltip-text: bind template.next-button-tooltip; diff --git a/src/gui/event-editor/gcal-multi-choice.c b/src/gui/event-editor/gcal-multi-choice.c index b2ad4609..2d538932 100644 --- a/src/gui/event-editor/gcal-multi-choice.c +++ b/src/gui/event-editor/gcal-multi-choice.c @@ -23,6 +23,7 @@ #include "config.h" #include "gcal-multi-choice.h" +#include "gcal-utils.h" struct _GcalMultiChoice { @@ -155,13 +156,13 @@ set_value (GcalMultiChoice *self, } static void -go_up (GcalMultiChoice *self) +up_action_activated (GcalMultiChoice *self) { gboolean wrapped = FALSE; gint value; value = self->next_cb ? self->next_cb (self->value) : self->value + 1; - g_assert_cmpint (value, > ,self->value); + g_assert_cmpint (value, >, self->value); if (value > self->max_value) { @@ -173,16 +174,18 @@ go_up (GcalMultiChoice *self) if (wrapped) g_signal_emit (self, signals[WRAPPED], 0); + + gtk_widget_grab_focus (GTK_WIDGET (self)); } static void -go_down (GcalMultiChoice *self) +down_action_activated (GcalMultiChoice *self) { gint value; gboolean wrapped = FALSE; value = self->prev_cb ? self->prev_cb (self->value) : self->value - 1; - g_assert_cmpint (value, < , self->value); + g_assert_cmpint (value, <, self->value); if (value < self->min_value) { @@ -194,6 +197,8 @@ go_down (GcalMultiChoice *self) if (wrapped) g_signal_emit (self, signals[WRAPPED], 0); + + gtk_widget_grab_focus (GTK_WIDGET (self)); } static void @@ -217,72 +222,6 @@ update_sensitivity (GcalMultiChoice *self) GTK_ACCESSIBLE_RELATION_CONTROLS); } -static void -button_clicked_cb (GtkWidget *button, - GcalMultiChoice *self) -{ - GtkStateFlags state_flags; - - state_flags = gtk_widget_get_state_flags (button); - - if (button == self->down_button) - go_down (self); - else if (button == self->up_button) - go_up (self); - else - g_assert_not_reached (); - - if (!gtk_widget_grab_focus (GTK_WIDGET (self))) - g_assert_not_reached (); - - gtk_widget_set_state_flags (button, state_flags, TRUE); -} - -static gboolean -key_pressed_cb (GcalMultiChoice *self, - guint keyval, - guint keycode, - GdkModifierType state, - GtkEventControllerKey *event_controller) -{ - gboolean is_active; - gint old_value; - - g_assert (GCAL_IS_MULTI_CHOICE (self)); - g_assert (GTK_IS_EVENT_CONTROLLER_KEY (event_controller)); - - switch (keyval) - { - case GDK_KEY_space: - case GDK_KEY_KP_Space: - case GDK_KEY_Return: - case GDK_KEY_ISO_Enter: - case GDK_KEY_KP_Enter: - is_active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->button)); - if (gtk_popover_bin_get_popover (self->popover_bin)) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->button), !is_active); - return TRUE; - - case GDK_KEY_Up: - case GDK_KEY_KP_Up: - old_value = self->value; - go_up (self); - if (old_value == self->value) - gtk_widget_error_bell (GTK_WIDGET (self)); - return TRUE; - - case GDK_KEY_Down: - case GDK_KEY_KP_Down: - old_value = self->value; - go_down (self); - if (old_value == self->value) - gtk_widget_error_bell (GTK_WIDGET (self)); - return TRUE; - } - - return FALSE; -} - static void button_toggled_cb (GcalMultiChoice *self) { @@ -583,16 +522,14 @@ gcal_multi_choice_class_init (GcalMultiChoiceClass *class) NULL, NULL, NULL, G_TYPE_NONE, 0); - signals[ACTIVATE] = - g_signal_new ("activate", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, - 0, - NULL, NULL, - NULL, - G_TYPE_NONE, 0); - gtk_widget_class_set_activate_signal (widget_class, signals[ACTIVATE]); + gtk_widget_class_install_action (widget_class, "multi-choice.up", NULL, (GtkWidgetActionActivateFunc) up_action_activated); + gtk_widget_class_install_action (widget_class, "multi-choice.down", NULL, (GtkWidgetActionActivateFunc) down_action_activated); + + gtk_widget_class_add_binding_action (widget_class, GDK_KEY_Up, 0, "multi-choice.up", NULL); + gtk_widget_class_add_binding_action (widget_class, GDK_KEY_Down, 0, "multi-choice.down", NULL); + + signals[ACTIVATE] = gcal_util_create_activate_signal_and_shortcuts (widget_class, GCAL_TYPE_MULTI_CHOICE); gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/calendar/ui/event-editor/gcal-multi-choice.ui"); @@ -604,10 +541,8 @@ gcal_multi_choice_class_init (GcalMultiChoiceClass *class) gtk_widget_class_bind_template_child (widget_class, GcalMultiChoice, label2); gtk_widget_class_bind_template_child (widget_class, GcalMultiChoice, popover_bin); - gtk_widget_class_bind_template_callback (widget_class, button_clicked_cb); gtk_widget_class_bind_template_callback (widget_class, button_toggled_cb); gtk_widget_class_bind_template_callback (widget_class, button_state_flags_changed_cb); - gtk_widget_class_bind_template_callback (widget_class, key_pressed_cb); gtk_widget_class_set_css_name (widget_class, "navigator"); @@ -632,6 +567,8 @@ gcal_multi_choice_init (GcalMultiChoice *self) gtk_widget_init_template (GTK_WIDGET (self)); update_sensitivity (self); + + g_signal_connect_swapped (self, "activate", (GCallback) button_toggled_cb, self); } /*