Sun, 12 May 2013 12:45:52 +0200
Request API: fix integer fields, add bounds to them
--- a/finch/gntblist.c Sat May 11 18:04:43 2013 -0400 +++ b/finch/gntblist.c Sun May 12 12:45:52 2013 +0200 @@ -1149,7 +1149,7 @@ const char *str = g_hash_table_lookup(purple_chat_get_components(chat), pce->identifier); if (!str || sscanf(str, "%d", &val) != 1) val = pce->min; - field = purple_request_field_int_new(pce->identifier, pce->label, val); + field = purple_request_field_int_new(pce->identifier, pce->label, val, INT_MIN, INT_MAX); } else { field = purple_request_field_string_new(pce->identifier, pce->label, g_hash_table_lookup(purple_chat_get_components(chat), pce->identifier), FALSE);
--- a/finch/gntplugin.c Sat May 11 18:04:43 2013 -0400 +++ b/finch/gntplugin.c Sun May 12 12:45:52 2013 +0200 @@ -510,7 +510,7 @@ field = purple_request_field_bool_new(name, label, purple_prefs_get_bool(name)); break; case PURPLE_PREF_INT: - field = purple_request_field_int_new(name, label, purple_prefs_get_int(name)); + field = purple_request_field_int_new(name, label, purple_prefs_get_int(name), INT_MIN, INT_MAX); break; case PURPLE_PREF_STRING: field = purple_request_field_string_new(name, label, purple_prefs_get_string(name),
--- a/finch/gntprefs.c Sat May 11 18:04:43 2013 -0400 +++ b/finch/gntprefs.c Sun May 12 12:45:52 2013 +0200 @@ -123,7 +123,7 @@ break; case PURPLE_PREF_INT: field = purple_request_field_int_new(prefs->pref, _(prefs->label), - purple_prefs_get_int(prefs->pref)); + purple_prefs_get_int(prefs->pref), INT_MIN, INT_MAX); break; case PURPLE_PREF_STRING: field = purple_request_field_string_new(prefs->pref, _(prefs->label),
--- a/libpurple/plugins/idle.c Sat May 11 18:04:43 2013 -0400 +++ b/libpurple/plugins/idle.c Sun May 12 12:45:52 2013 +0200 @@ -151,7 +151,7 @@ purple_request_field_account_set_show_all(field, FALSE); purple_request_field_group_add_field(group, field); - field = purple_request_field_int_new("mins", _("Minutes"), 10); + field = purple_request_field_int_new("mins", _("Minutes"), 10, 0, 9999); purple_request_field_group_add_field(group, field); request = purple_request_fields_new(); @@ -211,7 +211,7 @@ group = purple_request_field_group_new(NULL); - field = purple_request_field_int_new("mins", _("Minutes"), 10); + field = purple_request_field_int_new("mins", _("Minutes"), 10, 0, 9999); purple_request_field_group_add_field(group, field); request = purple_request_fields_new();
--- a/libpurple/plugins/perl/common/Request.xs Sat May 11 18:04:43 2013 -0400 +++ b/libpurple/plugins/perl/common/Request.xs Sun May 12 12:45:52 2013 +0200 @@ -327,11 +327,13 @@ PROTOTYPES: ENABLE Purple::Request::Field -purple_request_field_int_new(clas, id, text, default_value = 0) +purple_request_field_int_new(clas, id, text, default_value = 0, lower_bound = INT_MIN, upper_bound = INT_MAX) const char *id const char *text int default_value - C_ARGS: id, text, default_value + int lower_bound + int upper_bound + C_ARGS: id, text, default_value, lower_bound, upper_bound int purple_request_field_int_get_default_value(field)
--- a/libpurple/request.c Sat May 11 18:04:43 2013 -0400 +++ b/libpurple/request.c Sun May 12 12:45:52 2013 +0200 @@ -70,7 +70,8 @@ { int default_value; int value; - + int lower_bound; + int upper_bound; } integer; struct @@ -864,7 +865,7 @@ PurpleRequestField * purple_request_field_int_new(const char *id, const char *text, - int default_value) + int default_value, int lower_bound, int upper_bound) { PurpleRequestField *field; @@ -873,6 +874,8 @@ field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_INTEGER); + purple_request_field_int_set_lower_bound(field, lower_bound); + purple_request_field_int_set_upper_bound(field, upper_bound); purple_request_field_int_set_default_value(field, default_value); purple_request_field_int_set_value(field, default_value); @@ -890,11 +893,37 @@ } void +purple_request_field_int_set_lower_bound(PurpleRequestField *field, + int lower_bound) +{ + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER); + + field->u.integer.lower_bound = lower_bound; +} + +void +purple_request_field_int_set_upper_bound(PurpleRequestField *field, + int upper_bound) +{ + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER); + + field->u.integer.upper_bound = upper_bound; +} + +void purple_request_field_int_set_value(PurpleRequestField *field, int value) { g_return_if_fail(field != NULL); g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER); + if (field->u.integer.value < field->u.integer.lower_bound || + field->u.integer.value > field->u.integer.upper_bound) { + purple_debug_error("request", "Int value out of bounds\n"); + return; + } + field->u.integer.value = value; } @@ -908,6 +937,24 @@ } int +purple_request_field_int_get_lower_bound(const PurpleRequestField *field) +{ + g_return_val_if_fail(field != NULL, 0); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER, 0); + + return field->u.integer.lower_bound; +} + +int +purple_request_field_int_get_upper_bound(const PurpleRequestField *field) +{ + g_return_val_if_fail(field != NULL, 0); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER, 0); + + return field->u.integer.upper_bound; +} + +int purple_request_field_int_get_value(const PurpleRequestField *field) { g_return_val_if_fail(field != NULL, 0); @@ -1522,59 +1569,6 @@ return FALSE; } -gboolean purple_request_field_numeric_validator(PurpleRequestField *field, - gchar **errmsg, void *range_p) -{ - gboolean succ = TRUE; - int value = 0; - int *range = range_p; - - g_return_val_if_fail(field != NULL, FALSE); - g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING || - field->type == PURPLE_REQUEST_FIELD_INTEGER, FALSE); - - if (field->type == PURPLE_REQUEST_FIELD_STRING) - { - const gchar *svalue, *it; - svalue = purple_request_field_string_get_value(field); - if (svalue == NULL || svalue[0] == '\0') - succ = FALSE; - it = svalue; - if (it[0] == '-') - it++; - while (succ && *it) - { - if (!g_ascii_isdigit(*it)) - succ = FALSE; - it++; - } - if (succ) - { - char *endptr; - value = strtol(svalue, &endptr, 10); - succ = (errno != ERANGE && endptr[0] == '\0'); - } - } - // TODO: integer fields doesn't seems to work, so this one needs testing - else if (field->type == PURPLE_REQUEST_FIELD_INTEGER) - value = purple_request_field_int_get_value(field); - else - g_return_val_if_reached(FALSE); - - if (succ && range) - succ = (value >= range[0] && value <= range[1]); - - if (succ) - return TRUE; - - if (errmsg && !range) - *errmsg = g_strdup(_("Invalid number")); - if (errmsg && range) - *errmsg = g_strdup_printf(_("Value is not between %d and %d"), - range[0], range[1]); - return FALSE; -} - /* -- */ void *
--- a/libpurple/request.h Sat May 11 18:04:43 2013 -0400 +++ b/libpurple/request.h Sun May 12 12:45:52 2013 +0200 @@ -739,12 +739,13 @@ * @param id The field ID. * @param text The text label of the field. * @param default_value The default value. + * @param lower_bound The lower bound. + * @param upper_bound The upper bound. * * @return The new field. */ PurpleRequestField *purple_request_field_int_new(const char *id, - const char *text, - int default_value); + const char *text, int default_value, int lower_bound, int upper_bound); /** * Sets the default value in an integer field. @@ -756,6 +757,22 @@ int default_value); /** + * Sets the lower bound in an integer field. + * + * @param field The field. + * @param lower_bound The lower bound. + */ +void purple_request_field_int_set_lower_bound(PurpleRequestField *field, int lower_bound); + +/** + * Sets the upper bound in an integer field. + * + * @param field The field. + * @param upper_bound The upper bound. + */ +void purple_request_field_int_set_upper_bound(PurpleRequestField *field, int lower_bound); + +/** * Sets the value in an integer field. * * @param field The field. @@ -773,6 +790,24 @@ int purple_request_field_int_get_default_value(const PurpleRequestField *field); /** + * Returns the lower bound in an integer field. + * + * @param field The field. + * + * @return The lower bound. + */ +int purple_request_field_int_get_lower_bound(const PurpleRequestField *field); + +/** + * Returns the upper bound in an integer field. + * + * @param field The field. + * + * @return The upper bound. + */ +int purple_request_field_int_get_upper_bound(const PurpleRequestField *field); + +/** * Returns the user-entered value in an integer field. * * @param field The field. @@ -1301,21 +1336,6 @@ gboolean purple_request_field_alphanumeric_validator(PurpleRequestField *field, gchar **errmsg, void *allowed_characters); -/** - * Validates a field which should contain numeric content, within (optional) - * range. - * - * @see purple_request_field_set_validator - * - * @param field The field. - * @param errmsg (Optional) destination for error message. - * @param user_data (Optional) an int[2] array containing specified range. - * - * @return TRUE, if field contains only alphanumeric characters. - */ -gboolean purple_request_field_numeric_validator(PurpleRequestField *field, - gchar **errmsg, void *range); - /*@}*/ /**************************************************************************/
--- a/pidgin/gtkblist.c Sat May 11 18:04:43 2013 -0400 +++ b/pidgin/gtkblist.c Sun May 12 12:45:52 2013 +0200 @@ -701,7 +701,7 @@ const char *str = g_hash_table_lookup(purple_chat_get_components(chat), pce->identifier); if (!str || sscanf(str, "%d", &val) != 1) val = pce->min; - field = purple_request_field_int_new(pce->identifier, pce->label, val); + field = purple_request_field_int_new(pce->identifier, pce->label, val, INT_MIN, INT_MAX); } else { field = purple_request_field_string_new(pce->identifier, pce->label, g_hash_table_lookup(purple_chat_get_components(chat), pce->identifier), FALSE);
--- a/pidgin/gtkrequest.c Sat May 11 18:04:43 2013 -0400 +++ b/pidgin/gtkrequest.c Sun May 12 12:45:52 2013 +0200 @@ -222,16 +222,6 @@ return FALSE; } -static gboolean -field_int_focus_out_cb(GtkEntry *entry, GdkEventFocus *event, - PurpleRequestField *field) -{ - purple_request_field_int_set_value(field, - atoi(gtk_entry_get_text(entry))); - - return FALSE; -} - static void field_bool_cb(GtkToggleButton *button, PurpleRequestField *field) { @@ -757,6 +747,12 @@ static void req_entry_field_changed_cb(GtkWidget *entry, PurpleRequestField *field) { + if (purple_request_field_get_type(field) == PURPLE_REQUEST_FIELD_INTEGER) { + int value = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(entry)); + purple_request_field_int_set_value(field, value); + return; + } + if (purple_request_field_string_is_multiline(field)) { char *text; @@ -921,26 +917,17 @@ int value; GtkWidget *widget; - widget = gtk_entry_new(); + widget = gtk_spin_button_new_with_range( + purple_request_field_int_get_lower_bound(field), + purple_request_field_int_get_upper_bound(field), 1); setup_entry_field(widget, field); value = purple_request_field_int_get_default_value(field); - - if (value != 0) - { - char buf[32]; - - g_snprintf(buf, sizeof(buf), "%d", value); - - gtk_entry_set_text(GTK_ENTRY(widget), buf); - } + gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), value); gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field)); - g_signal_connect(G_OBJECT(widget), "focus-out-event", - G_CALLBACK(field_int_focus_out_cb), field); - return widget; }