diff options
| author | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2022-09-26 02:24:46 +0200 |
|---|---|---|
| committer | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2022-09-26 02:24:46 +0200 |
| commit | e00ed40c9cec2c25704263adedbeac5cedb60170 (patch) | |
| tree | 12e641a2079aee6e11018a3783773a38b2b67c6b /src | |
| parent | f5c7e88b2657076b3b17d6e21e056df7add446e8 (diff) | |
| download | jancity-e00ed40c9cec2c25704263adedbeac5cedb60170.tar.gz | |
gui/line_edit: Allow setting input filters
Diffstat (limited to 'src')
| -rw-r--r-- | src/gui/inc/gui/line_edit.h | 9 | ||||
| -rw-r--r-- | src/gui/src/line_edit.c | 15 |
2 files changed, 23 insertions, 1 deletions
diff --git a/src/gui/inc/gui/line_edit.h b/src/gui/inc/gui/line_edit.h index 3a0f027..d461a10 100644 --- a/src/gui/inc/gui/line_edit.h +++ b/src/gui/inc/gui/line_edit.h @@ -13,6 +13,13 @@ extern "C" { #endif +enum gui_line_edit_filter +{ + GUI_LINE_EDIT_FILTER_NONE, + GUI_LINE_EDIT_FILTER_ALPHA = 1 << 1, + GUI_LINE_EDIT_FILTER_NUM = 1 << 2 +}; + struct gui_line_edit { struct gui_common common; @@ -22,6 +29,8 @@ struct gui_line_edit unsigned blt; char *text; size_t i, sz; + /* Use with gui_line_edit_filter. */ + int filters; }; void gui_line_edit_init(struct gui_line_edit *l, char *buf, size_t sz); diff --git a/src/gui/src/line_edit.c b/src/gui/src/line_edit.c index a5c01a7..ef37708 100644 --- a/src/gui/src/line_edit.c +++ b/src/gui/src/line_edit.c @@ -8,6 +8,7 @@ #include <mouse.h> #include <pad.h> #include <peripheral.h> +#include <ctype.h> #include <string.h> struct sprite gui_line_edit_sprites[MAX_GUI_LINE_EDIT_SPRITES]; @@ -115,8 +116,20 @@ static void get_dim(const struct gui_common *const g, static void on_char(const char ch, void *const user) { struct gui_line_edit *const l = user; + bool allowed = false; - if (l->i + 1 < l->sz) + if (l->filters) + { + if (((l->filters & GUI_LINE_EDIT_FILTER_ALPHA) + && isalpha((unsigned char)ch)) + || ((l->filters & GUI_LINE_EDIT_FILTER_NUM) + && isdigit((unsigned char)ch))) + allowed = true; + } + else + allowed = true; + + if (allowed && l->i + 1 < l->sz) l->text[l->i++] = ch; } |
