From 86624ce8fdddd33e6181cb39c4ae1981d5ad5a20 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Sun, 21 Dec 2014 12:32:55 -0200 Subject: [PATCH] date-selector: validate entries' input --- src/gcal-date-selector.c | 58 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/gcal-date-selector.c b/src/gcal-date-selector.c index e1edb831..5a794742 100644 --- a/src/gcal-date-selector.c +++ b/src/gcal-date-selector.c @@ -62,6 +62,12 @@ enum static guint signals[NUM_SIGNALS] = { 0, }; +static void text_inserted (GtkEditable *editable, + gchar *new_text, + gint new_text_length, + gint *position, + gpointer user_data); + static void set_date (GcalDateSelector *selector, gint day, gint month, @@ -71,6 +77,54 @@ static void gcal_date_selector_constructed (GObject G_DEFINE_TYPE_WITH_PRIVATE (GcalDateSelector, gcal_date_selector, GTK_TYPE_TOGGLE_BUTTON); +static void +text_inserted (GtkEditable *editable, + gchar *new_text, + gint new_text_length, + gint *position, + gpointer user_data) +{ + GtkEntryBuffer *buffer; + gchar* new_label; + gint i; + gint current_length, max_length; + gboolean valid; + + valid = TRUE; + buffer = gtk_entry_get_buffer (GTK_ENTRY (editable)); + current_length = gtk_entry_buffer_get_length (buffer); + max_length = gtk_entry_get_max_length (GTK_ENTRY (editable)); + + /* honor max length property */ + if (current_length + new_text_length > max_length) + return; + + /* stop the default implementation */ + g_signal_stop_emission (editable, g_signal_lookup ("insert-text", GTK_TYPE_ENTRY), 0); + + for (i = 0; i < new_text_length; i++) + { + gchar c; + c = *(new_text + i); + + /* trying to insert a non-numeric char */ + if (c < '0' || c > '9') + { + valid = FALSE; + break; + } + } + + if (!valid) + return; + + new_label = g_strdup_printf ("%s%s", gtk_entry_buffer_get_text (buffer), new_text); + gtk_entry_buffer_set_text (buffer, new_label, current_length + new_text_length); + *position = *position + new_text_length; + + g_free (new_label); +} + static void set_date (GcalDateSelector *selector, gint day, @@ -301,6 +355,10 @@ gcal_date_selector_constructed (GObject *object) gtk_container_add (GTK_CONTAINER (priv->popover), grid); g_object_bind_property (priv->popover, "visible", object, "active", G_BINDING_BIDIRECTIONAL); + g_signal_connect (priv->entries[DAY], "insert-text", G_CALLBACK (text_inserted), object); + g_signal_connect (priv->entries[MONTH], "insert-text", G_CALLBACK (text_inserted), object); + g_signal_connect (priv->entries[YEAR], "insert-text", G_CALLBACK (text_inserted), object); + g_object_unref (builder); }