diff options
Diffstat (limited to 'fw/fe310/eos/eve/widget/strw.c')
-rw-r--r-- | fw/fe310/eos/eve/widget/strw.c | 47 |
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; |