summaryrefslogtreecommitdiff
path: root/fw/fe310/eos/eve/widget/strw.c
diff options
context:
space:
mode:
Diffstat (limited to 'fw/fe310/eos/eve/widget/strw.c')
-rw-r--r--fw/fe310/eos/eve/widget/strw.c47
1 files changed, 28 insertions, 19 deletions
diff --git a/fw/fe310/eos/eve/widget/strw.c b/fw/fe310/eos/eve/widget/strw.c
index cd1f51d..873e017 100644
--- a/fw/fe310/eos/eve/widget/strw.c
+++ b/fw/fe310/eos/eve/widget/strw.c
@@ -30,35 +30,38 @@
void eve_strw_init(EVEStrWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *str, uint16_t str_size) {
EVEWidget *_widget = &widget->w;
size_t str_len;
- int rv;
+ int str_w, rv;
memset(widget, 0, sizeof(EVEStrWidget));
eve_widget_init(_widget, EVE_WIDGET_TYPE_STR, g, page, eve_strw_draw, eve_strw_touch, eve_strw_putc);
widget->font = font;
+
rv = utf8_verify(str, str_size, &str_len);
- if (rv != UTF_OK) {
- if (str_len >= str_size) str_len = 0;
- str[str_len] = '\0';
- }
+ if (rv) str[str_len] = '\0';
+
+ rv = eve_font_str_w(font, str, &str_w, &str_len);
+ if (rv) str[str_len] = '\0';
+
widget->str = str;
widget->str_size = str_size;
widget->str_len = str_len;
- widget->str_g.w = eve_font_str_w(widget->font, str);
+ widget->str_g.w = str_w;
if (_widget->g.h == 0) _widget->g.h = eve_font_h(widget->font);
}
int eve_strw_update(EVEStrWidget *widget) {
size_t str_len;
- int rv;
+ int str_w, rv;
rv = utf8_verify(widget->str, widget->str_size, &str_len);
- if (rv != UTF_OK) {
- if (str_len >= widget->str_size) str_len = 0;
- widget->str[str_len] = '\0';
- }
+ if (rv) widget->str[str_len] = '\0';
+
+ rv = eve_font_str_w(widget->font, widget->str, &str_w, &str_len);
+ if (rv) widget->str[str_len] = '\0';
+
widget->str_len = str_len;
- widget->str_g.w = eve_font_str_w(widget->font, widget->str);
- return (rv == UTF_OK) ? EVE_OK : EVE_ERR;
+ widget->str_g.w = str_w;
+ return EVE_OK;
}
int eve_strw_create(EVEWidget *_widget, EVEWidgetSpec *spec, EVEPage *page) {
@@ -360,18 +363,23 @@ void eve_strw_putc(void *w, int c) {
} else {
c1 = cursor2;
}
+ }
+ str = widget->str + c1->ch;
+
+ if (cursor2->on) {
del_c = c2->ch - c1->ch;
- del_w = eve_font_buf_w(widget->font, str, del_c);
+ eve_font_buf_w(widget->font, str, del_c, &del_w, NULL);
if ((c == CH_CTRLX) || (c == CH_CTRLC)) {
eve_clipb_push(str, del_c);
if (c == CH_CTRLC) return;
}
}
- str = widget->str + c1->ch;
if (CHAR_VALID_INPUT(c)) {
ins_c = utf8_enc(c, utf8_buf);
+ if (ins_c < 0) return;
ins_w = eve_font_ch_w(widget->font, c);
+ if (ins_w < 0) return;
} else if (c == CH_CTRLV) {
size_t clipb_len = 0;
int rv;
@@ -379,13 +387,14 @@ void eve_strw_putc(void *w, int c) {
clipb = eve_clipb_get();
if (clipb) {
rv = utf8_verify(clipb, EVE_CLIPB_SIZE_BUF, &clipb_len);
- if (rv != UTF_OK) {
+ if (!rv) rv = eve_font_str_w(widget->font, clipb, &ins_w, NULL);
+ if (rv) {
clipb = NULL;
clipb_len = 0;
+ ins_w = 0;
}
}
ins_c = clipb_len;
- ins_w = eve_font_str_w(widget->font, clipb);
}
if (widget->str_len + ins_c >= widget->str_size + del_c) {
ins_c = 0;
@@ -417,8 +426,8 @@ void eve_strw_cursor_set(EVEStrWidget *widget, EVEStrCursor *cursor, int16_t x)
int i;
int16_t _x, _d;
ucp_t ch;
- uint8_t ch_w;
- uint8_t ch_l;
+ int ch_w;
+ int ch_l;
EVEWidget *_widget = &widget->w;
x = x - _widget->g.x + widget->str_g.x;