From 8fc5ce773902a15e63531ddc21aa0544abd7a2b2 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 4 Feb 2025 22:55:57 +0100 Subject: [PATCH] spinbutton: Fix numeric mode Numeric mode is meant to prevent the user from inserting non-numeric characters into the spin button. This broke when GtkSpinButton was ported to use a GtkText as delegate. Instead of implementing insert_text ourselves, we need to connect to the insert-text signal in the delegate to do the filtering. Fixes: #7311 --- gtk/gtkspinbutton.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/gtk/gtkspinbutton.c b/gtk/gtkspinbutton.c index 2a5396f221b..ea13fe250b2 100644 --- a/gtk/gtkspinbutton.c +++ b/gtk/gtkspinbutton.c @@ -306,7 +306,8 @@ static void gtk_spin_button_snap (GtkSpinButton *spin_button, static void gtk_spin_button_insert_text (GtkEditable *editable, const char *new_text, int new_text_length, - int *position); + int *position, + gpointer data); static void gtk_spin_button_real_spin (GtkSpinButton *spin_button, double step); static void gtk_spin_button_real_change_value (GtkSpinButton *spin, @@ -662,7 +663,6 @@ static void gtk_spin_button_editable_init (GtkEditableInterface *iface) { iface->get_delegate = gtk_spin_button_get_delegate; - iface->insert_text = gtk_spin_button_insert_text; } static gboolean @@ -1087,6 +1087,7 @@ gtk_spin_button_init (GtkSpinButton *spin_button) gtk_widget_set_vexpand (spin_button->entry, TRUE); g_signal_connect (spin_button->entry, "activate", G_CALLBACK (gtk_spin_button_activate), spin_button); g_signal_connect (spin_button->entry, "changed", G_CALLBACK (gtk_spin_button_changed), spin_button); + g_signal_connect (spin_button->entry, "insert-text", G_CALLBACK (gtk_spin_button_insert_text), spin_button); gtk_widget_set_parent (spin_button->entry, GTK_WIDGET (spin_button)); spin_button->down_button = g_object_new (GTK_TYPE_BUTTON, @@ -1579,11 +1580,14 @@ gtk_spin_button_activate (GtkText *entry, static void gtk_spin_button_insert_text (GtkEditable *editable, - const char *new_text, + const char *new_text, int new_text_length, - int *position) + int *position, + gpointer data) { - GtkSpinButton *spin = GTK_SPIN_BUTTON (editable); + GtkSpinButton *spin = GTK_SPIN_BUTTON (data); + + g_signal_stop_emission_by_name (editable, "insert-text"); if (spin->numeric) { @@ -1674,8 +1678,12 @@ gtk_spin_button_insert_text (GtkEditable *editable, } } + g_signal_handlers_block_by_func (editable, gtk_spin_button_insert_text, data); + gtk_editable_insert_text (GTK_EDITABLE (spin->entry), new_text, new_text_length, position); + + g_signal_handlers_unblock_by_func (editable, gtk_spin_button_insert_text, data); } static void -- GitLab