summaryrefslogtreecommitdiff
path: root/fw/fe310/eos/eve/widget/textw.c
diff options
context:
space:
mode:
Diffstat (limited to 'fw/fe310/eos/eve/widget/textw.c')
-rw-r--r--fw/fe310/eos/eve/widget/textw.c90
1 files changed, 51 insertions, 39 deletions
diff --git a/fw/fe310/eos/eve/widget/textw.c b/fw/fe310/eos/eve/widget/textw.c
index 7998e75..0a6a700 100644
--- a/fw/fe310/eos/eve/widget/textw.c
+++ b/fw/fe310/eos/eve/widget/textw.c
@@ -12,7 +12,7 @@
#include "widget.h"
-#define TEXTW_TOUCH_OPT EVE_TOUCH_OPT_TRACK | EVE_TOUCH_OPT_TRACK_XY | EVE_TOUCH_OPT_TRACK_EXT_XY | EVE_TOUCH_OPT_LPRESS
+#define TEXTW_TOUCH_OPT EVE_TOUCH_OPT_TRACK_XY | EVE_TOUCH_OPT_TRACK_EXT_XY | EVE_TOUCH_OPT_LPRESS
#define CH_BS 0x08
#define CH_DEL 0x7f
@@ -30,20 +30,17 @@
#define DIVC(x,y) ((x) / (y) + ((x) % (y) != 0))
-void eve_textw_init(EVETextWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *text, uint16_t text_size, uint16_t *line, uint16_t line_size) {
+int eve_textw_init(EVETextWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *text, uint16_t text_size, uint16_t *line, uint16_t line_size) {
EVEWidget *_widget = &widget->w;
size_t text_len;
int rv;
+ rv = eve_font_verify(font, text, text_size, NULL, &text_len);
+ if (rv) return rv;
+
memset(widget, 0, sizeof(EVETextWidget));
eve_widget_init(_widget, EVE_WIDGET_TYPE_TEXT, g, page, eve_textw_draw, eve_textw_touch, eve_textw_putc);
- rv = utf8_verify(text, text_size, &text_len);
- if (rv) text[text_len] = '\0';
-
- rv = eve_font_verify(font, text, NULL, &text_len);
- if (rv) text[text_len] = '\0';
-
widget->font = font;
widget->text = text;
widget->text_size = text_size;
@@ -52,17 +49,16 @@ void eve_textw_init(EVETextWidget *widget, EVERect *g, EVEPage *page, EVEFont *f
widget->line_size = line_size;
memset(widget->line, 0xff, line_size * sizeof(uint16_t));
eve_textw_text_update(widget, 0, 0);
+
+ return EVE_OK;
}
int eve_textw_update(EVETextWidget *widget) {
size_t text_len;
int rv;
- rv = utf8_verify(widget->text, widget->text_size, &text_len);
- if (rv) widget->text[text_len] = '\0';
-
- rv = eve_font_verify(widget->font, widget->text, NULL, &text_len);
- if (rv) widget->text[text_len] = '\0';
+ rv = eve_font_verify(widget->font, widget->text, widget->text_size, NULL, &text_len);
+ if (rv) return rv;
widget->text_len = text_len;
memset(widget->line, 0xff, widget->line_size * sizeof(uint16_t));
@@ -77,6 +73,7 @@ int eve_textw_create(EVEWidget *_widget, EVEWidgetSpec *spec, EVEPage *page) {
EVEFont *font = tspec->font ? tspec->font : eve_window_font(page->v.window);
utf8_t *text;
uint16_t *line;
+ int rv;
text = eve_malloc(tspec->text_size);
if (text == NULL) {
@@ -89,9 +86,12 @@ int eve_textw_create(EVEWidget *_widget, EVEWidgetSpec *spec, EVEPage *page) {
return EVE_ERR_NOMEM;
}
- eve_textw_init(widget, &spec->g, page, font, text, tspec->text_size, line, tspec->line_size);
-
- return EVE_OK;
+ rv = eve_textw_init(widget, &spec->g, page, font, text, tspec->text_size, line, tspec->line_size);
+ if (rv) {
+ eve_free(line);
+ eve_free(text);
+ }
+ return rv;
}
void eve_textw_destroy(EVEWidget *_widget) {
@@ -214,7 +214,7 @@ uint8_t eve_textw_draw(EVEWidget *_widget, uint8_t tag0) {
for (i=line0; i<lineN; i++) {
if (_widget->tagN != EVE_NOTAG) {
eve_cmd_dl(TAG(_widget->tagN));
- eve_touch_set_opt(_widget->tagN, TEXTW_TOUCH_OPT);
+ eve_tag_set_opt(_widget->tagN, TEXTW_TOUCH_OPT);
_widget->tagN++;
}
if (!s && c1 && (c1->line == i)) {
@@ -257,7 +257,7 @@ uint8_t eve_textw_draw(EVEWidget *_widget, uint8_t tag0) {
if (lineNvisible) {
if (_widget->tagN != EVE_NOTAG) {
eve_cmd_dl(TAG(_widget->tagN));
- eve_touch_set_opt(_widget->tagN, TEXTW_TOUCH_OPT);
+ eve_tag_set_opt(_widget->tagN, TEXTW_TOUCH_OPT);
_widget->tagN++;
}
draw_line(widget, lineN, 0, 0, 0, _widget->g.w, 0);
@@ -276,7 +276,27 @@ int eve_textw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
EVEPage *page = _widget->page;
EVETextCursor *t_cursor = NULL;
short dx, dl;
- int ret = 0;
+ int rv = 0;
+
+ /* widget received non-touch event */
+ if (evt & EVE_TOUCH_ETYPE_EXT) {
+ evt &= ~EVE_TOUCH_ETYPE_EXT;
+ switch (evt) {
+ case EVE_UIEVT_WIDGET_FOCUS_IN: {
+ if (widget->cursor1.on) show_rect(widget, &widget->cursor1);
+ break;
+ }
+
+ case EVE_UIEVT_WIDGET_FOCUS_OUT: {
+ if (widget->cursor1.on) eve_textw_cursor_clear(widget, &widget->cursor1);
+ if (widget->cursor2.on) eve_textw_cursor_clear(widget, &widget->cursor2);
+ break;
+ }
+ }
+
+ /* always return 0 for non-touch events */
+ return 0;
+ }
if (evt & (EVE_TOUCH_ETYPE_LPRESS | EVE_TOUCH_ETYPE_TRACK_START)) {
if (widget->cursor2.on) {
@@ -294,7 +314,7 @@ int eve_textw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
if (widget->track.cursor) {
if (evt & EVE_TOUCH_ETYPE_TRACK) eve_textw_cursor_set(widget, widget->track.cursor, touch->tag + widget->track.dl, eve_page_x(page, touch->x) + widget->track.dx);
- ret = 1;
+ rv = 1;
} else {
if (evt & EVE_TOUCH_ETYPE_LPRESS) {
if (widget->cursor2.on) {
@@ -308,13 +328,12 @@ int eve_textw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
} else {
// select
}
- ret = 1;
+ rv = 1;
}
- if ((evt & EVE_TOUCH_ETYPE_TAG_UP) && !(touch->eevt & (EVE_TOUCH_EETYPE_TRACK_XY | EVE_TOUCH_EETYPE_ABORT | EVE_TOUCH_EETYPE_LPRESS))) {
+ if ((evt & EVE_TOUCH_ETYPE_TAG_UP) && !(touch->eevt & (EVE_TOUCH_EETYPE_TRACK_XY | EVE_TOUCH_EETYPE_TRACK_ABORT | EVE_TOUCH_EETYPE_LPRESS))) {
eve_textw_cursor_set(widget, &widget->cursor1, touch->tag_up, eve_page_x(page, touch->x0));
if (widget->cursor2.on) eve_textw_cursor_clear(widget, &widget->cursor2);
- show_rect(widget, &widget->cursor1);
- ret = 1;
+ rv = 1;
}
}
@@ -324,7 +343,7 @@ int eve_textw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
widget->track.dl = 0;
}
- return ret;
+ return rv;
}
void eve_textw_putc(void *w, int c) {
@@ -334,16 +353,10 @@ void eve_textw_putc(void *w, int c) {
EVETextCursor *cursor2 = &widget->cursor2;
utf8_t *text;
utf8_t *clipb = NULL;
- int i, r;
+ int i, line;
int ins_c = 0, del_c = 0;
int ch_w = 0;
- if (c == EVE_PAGE_KBDCH_CLOSE) {
- if (cursor1->on) eve_textw_cursor_clear(widget, cursor1);
- if (cursor2->on) eve_textw_cursor_clear(widget, cursor2);
- return;
- }
-
if (!cursor1->on) return;
if (!cursor2->on && ((c == CH_BS) || (c == CH_DEL))) {
@@ -401,9 +414,8 @@ void eve_textw_putc(void *w, int c) {
clipb = eve_clipb_get();
if (clipb) {
- rv = utf8_verify(clipb, EVE_CLIPB_SIZE_BUF, &clipb_len);
- if (!rv) ch_w = eve_font_str_w(widget->font, clipb);
- if (rv || (ch_w < 0)) {
+ rv = eve_font_verify(widget->font, clipb, EVE_CLIPB_SIZE_BUF, &ch_w, &clipb_len);
+ if (rv) {
clipb = NULL;
clipb_len = 0;
ch_w = 0;
@@ -437,9 +449,9 @@ void eve_textw_putc(void *w, int c) {
widget->line[i] += ins_c - del_c;
}
- r = cursor1->line;
- if (cursor1->line) r = eve_textw_text_update(widget, cursor1->line - 1, 1);
- if (r == cursor1->line) eve_textw_text_update(widget, cursor1->line, 1);
+ line = cursor1->line;
+ if (cursor1->line) line = eve_textw_text_update(widget, cursor1->line - 1, 1);
+ if (line == cursor1->line) eve_textw_text_update(widget, cursor1->line, 1);
if (cursor1->line && (cursor1->ch < LINE_START(widget, cursor1->line))) {
while (cursor1->line && (cursor1->ch < LINE_START(widget, cursor1->line))) cursor1->line--;
@@ -449,7 +461,7 @@ void eve_textw_putc(void *w, int c) {
while ((cursor1->line != widget->line_len - 1) && (cursor1->ch > LINE_END(widget, cursor1->line))) cursor1->line++;
eve_textw_cursor_update(widget, cursor1);
show_rect(widget, cursor1);
- } else if ((cursor1->line) && (r != cursor1->line)) {
+ } else if ((cursor1->line) && (line != cursor1->line)) {
eve_textw_cursor_update(widget, cursor1);
} else {
cursor1->x += ch_w;