* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#define _GNU_SOURCE
-
+#if defined(HAVE_CONFIG_H)
#include "config.h"
+#endif
#include <linux/input.h> /* This must be included before ncurses.h */
#if defined HAVE_NCURSESW_CURSES_H
#include <log/log.h>
#include <util/util.h>
-#include "config.h"
#include "nc-cui.h"
#include "nc-widgets.h"
void (*widget_focus)(struct nc_widget *, void *);
void *widget_focus_arg;
FIELD *cur_field;
+
+ /* custom validators */
+ FIELDTYPE *ipv4_multi_type;
};
struct nc_widget {
};
struct nc_widget_textbox {
+ struct nc_widgetset *set;
struct nc_widget widget;
};
static void widgetset_add_field(struct nc_widgetset *set, FIELD *field);
static void widgetset_remove_field(struct nc_widgetset *set, FIELD *field);
+static bool key_is_select(int key)
+{
+ return key == ' ' || key == '\r' || key == '\n' || key == KEY_ENTER;
+}
+
static bool process_key_nop(struct nc_widget *widget __attribute__((unused)),
FORM *form __attribute((unused)),
int key __attribute__((unused)))
{
struct nc_widget_checkbox *checkbox = to_checkbox(widget);
- if (key != ' ')
+ if (!key_is_select(key))
return false;
checkbox->checked = !checkbox->checked;
FIELD *f;
textbox = talloc_zero(set, struct nc_widget_textbox);
+ textbox->set = set;
textbox->widget.height = 1;
textbox->widget.width = len;
textbox->widget.x = x;
return textbox;
}
+void widget_textbox_set_validator_integer(struct nc_widget_textbox *textbox,
+ long min, long max)
+{
+ set_field_type(textbox->widget.field, TYPE_INTEGER, 1, min, max);
+}
+
+void widget_textbox_set_validator_ipv4(struct nc_widget_textbox *textbox)
+{
+ set_field_type(textbox->widget.field, TYPE_IPV4);
+}
+
+static bool check_ipv4_multi_char(int c,
+ const void *arg __attribute__((unused)))
+{
+ return isdigit(c) || c == '.' || c == ' ';
+}
+
+static bool check_ipv4_multi_field(FIELD *field,
+ const void *arg __attribute__((unused)))
+{
+ char *buf = field_buffer(field, 0);
+ unsigned int ip[4];
+ int n, len;
+
+ while (*buf != '\0') {
+ n = sscanf(buf, "%u.%u.%u.%u%n",
+ &ip[0], &ip[1], &ip[2], &ip[3], &len);
+ if (n != 4)
+ return false;
+
+ if (ip[0] > 255 || ip[1] > 255 || ip[2] > 255 || ip[3] > 255)
+ return false;
+
+ for (buf += len; *buf != '\0'; buf++) {
+ if (isspace(*buf))
+ continue;
+ else if (isdigit(*buf))
+ break;
+ else
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void widget_textbox_set_validator_ipv4_multi(struct nc_widget_textbox *textbox)
+{
+ if (!textbox->set->ipv4_multi_type) {
+ textbox->set->ipv4_multi_type = new_fieldtype(
+ check_ipv4_multi_field,
+ check_ipv4_multi_char);
+ }
+ set_field_type(textbox->widget.field, textbox->set->ipv4_multi_type);
+}
+
static void select_option_change(struct select_option *opt, bool selected)
{
const char *str;
int i, new_idx;
FIELD *field;
- switch (key) {
- case ' ':
- case KEY_ENTER:
- break;
- default:
+ if (!key_is_select(key))
return false;
- }
field = current_field(form);
new_opt = NULL;
if (!button->click)
return false;
- switch (key) {
- case ' ':
- case '\r':
- case '\n':
- button->click(button->arg);
- return true;
- }
+ if (!key_is_select(key))
+ return false;
- return false;
+ button->click(button->arg);
+ return true;
}
static int button_destructor(void *ptr)
{
struct nc_widgetset *set = ptr;
free_form(set->form);
+ if (set->ipv4_multi_type)
+ free_fieldtype(set->ipv4_multi_type);
return 0;
}