diff options
Diffstat (limited to 'code/fe310/eos')
-rw-r--r-- | code/fe310/eos/eve/eve.h | 9 | ||||
-rw-r--r-- | code/fe310/eos/eve/eve_kbd.c | 61 | ||||
-rw-r--r-- | code/fe310/eos/eve/eve_kbd.h | 7 | ||||
-rw-r--r-- | code/fe310/eos/eve/eve_text.c | 29 | ||||
-rw-r--r-- | code/fe310/eos/eve/eve_text.h | 5 | ||||
-rw-r--r-- | code/fe310/eos/eve/eve_touch.c | 35 | ||||
-rw-r--r-- | code/fe310/eos/eve/eve_touch.h | 2 | ||||
-rw-r--r-- | code/fe310/eos/eve/screen/form.c | 24 | ||||
-rw-r--r-- | code/fe310/eos/eve/screen/page.c | 2 | ||||
-rw-r--r-- | code/fe310/eos/eve/screen/screen.c | 20 | ||||
-rw-r--r-- | code/fe310/eos/eve/screen/screen.h | 9 | ||||
-rw-r--r-- | code/fe310/eos/eve/screen/window.c | 34 | ||||
-rw-r--r-- | code/fe310/eos/eve/screen/window.h | 3 | ||||
-rw-r--r-- | code/fe310/eos/eve/widget/page.c | 12 | ||||
-rw-r--r-- | code/fe310/eos/eve/widget/text.c | 131 |
15 files changed, 214 insertions, 169 deletions
diff --git a/code/fe310/eos/eve/eve.h b/code/fe310/eos/eve/eve.h index 2ac93a2..c27d81f 100644 --- a/code/fe310/eos/eve/eve.h +++ b/code/fe310/eos/eve/eve.h @@ -13,6 +13,15 @@ #define EVE_PSTATE_STANDBY 1 #define EVE_PSTATE_SLEEP 3 +#define EVE_TAG_NOTAG 0 + +typedef struct EVERect { + int16_t x; + int16_t y; + uint16_t w; + uint16_t h; +} EVERect; + void eve_command(uint8_t command, uint8_t parameter); uint8_t eve_read8(uint32_t addr); diff --git a/code/fe310/eos/eve/eve_kbd.c b/code/fe310/eos/eve/eve_kbd.c index aa8406f..59cfa23 100644 --- a/code/fe310/eos/eve/eve_kbd.c +++ b/code/fe310/eos/eve/eve_kbd.c @@ -1,36 +1,41 @@ #include <stdlib.h> +#include <string.h> #include "eve.h" #include "eve_kbd.h" -#define KBD_X 0 -#define KBD_Y 575 -#define KBD_W 480 -#define KBD_H 225 +#define KBD_X 0 +#define KBD_Y 575 +#define KBD_W 480 +#define KBD_H 225 -#define KEY_SPACERX 3 -#define KEY_SPACERY 5 -#define KEY_FONT 29 -#define MOD_FONT 21 +#define KEY_SPACERX 3 +#define KEY_SPACERY 5 +#define KEY_FONT 29 +#define MOD_FONT 21 -#define KEY_BS 0x08 -#define KEY_RET 0x0a +#define KEY_BS 0x08 +#define KEY_RET 0x0a -#define FLAG_SHIFT 0x01 -#define FLAG_CTRL 0x02 -#define FLAG_FN 0x04 +#define FLAG_SHIFT 0x01 +#define FLAG_CTRL 0x02 +#define FLAG_FN 0x04 -#define TAG_SHIFT 0x11 -#define TAG_CTRL 0x12 -#define TAG_FN 0x13 +#define TAG_SHIFT 0x11 +#define TAG_CTRL 0x12 +#define TAG_FN 0x13 -void eve_kbd_init(EVEKbd *kbd, uint32_t mem_addr, uint32_t *mem_next) { +void eve_kbd_init(EVEKbd *kbd, EVERect *g, uint32_t mem_addr, uint32_t *mem_next) { uint16_t mem_size; - kbd->x = KBD_X; - kbd->y = KBD_Y; - kbd->w = KBD_W; - kbd->h = KBD_H; + if (g) { + kbd->g = *g; + } else { + kbd->g.x = KBD_X; + kbd->g.y = KBD_Y; + kbd->g.w = KBD_W; + kbd->g.h = KBD_H; + } kbd->mem_addr = mem_addr; kbd->key_modifier = 0; kbd->key_count = 0; @@ -60,7 +65,7 @@ int eve_kbd_touch(EVEKbd *kbd, uint8_t tag0, int touch_idx) { EVETouch *t; uint16_t evt; - t = eve_touch_evt(tag0, touch_idx, 1, 0x7e, &evt); + t = eve_touch_evt(tag0, touch_idx, 1, 126, &evt); if (t && evt) { if (evt & EVE_TOUCH_ETYPE_TAG) { uint8_t _tag = t->tag; @@ -116,15 +121,16 @@ int eve_kbd_touch(EVEKbd *kbd, uint8_t tag0, int touch_idx) { } else { kbd->active = 0; } + return kbd->active; } uint8_t eve_kbd_draw(EVEKbd *kbd) { if (kbd->active) { - int x = kbd->x; - int y = kbd->y; - int w = kbd->w; - int row_h = kbd->h / 5; + int x = kbd->g.x; + int y = kbd->g.y; + int w = kbd->g.w; + int row_h = kbd->g.h / 5; int key_w = (w - 9 * KEY_SPACERX) / 10 + 1; int mod_w = key_w + key_w / 2; int key_h = row_h - KEY_SPACERY; @@ -151,5 +157,6 @@ uint8_t eve_kbd_draw(EVEKbd *kbd) { } else { eve_cmd(CMD_APPEND, "ww", kbd->mem_addr, kbd->mem_size); } - return 0x7e; + + return 0x80; } diff --git a/code/fe310/eos/eve/eve_kbd.h b/code/fe310/eos/eve/eve_kbd.h index 4711421..b27f54d 100644 --- a/code/fe310/eos/eve/eve_kbd.h +++ b/code/fe310/eos/eve/eve_kbd.h @@ -3,10 +3,7 @@ typedef void (*eve_kbd_input_handler_t) (void *, int); typedef struct EVEKbd { - int16_t x; - int16_t y; - uint16_t w; - uint16_t h; + EVERect g; uint32_t mem_addr; uint16_t mem_size; uint8_t key_count; @@ -19,7 +16,7 @@ typedef struct EVEKbd { void *param; } EVEKbd; -void eve_kbd_init(EVEKbd *kbd, uint32_t mem_addr, uint32_t *mem_next); +void eve_kbd_init(EVEKbd *kbd, EVERect *g, uint32_t mem_addr, uint32_t *mem_next); void eve_kbd_set_handler(EVEKbd *kbd, eve_kbd_input_handler_t putc, void *param); int eve_kbd_touch(EVEKbd *kbd, uint8_t tag0, int touch_idx); uint8_t eve_kbd_draw(EVEKbd *kbd); diff --git a/code/fe310/eos/eve/eve_text.c b/code/fe310/eos/eve/eve_text.c index 5510f80..2ad4f6f 100644 --- a/code/fe310/eos/eve/eve_text.c +++ b/code/fe310/eos/eve/eve_text.c @@ -1,3 +1,6 @@ +#include <stdlib.h> +#include <string.h> + #include "eve.h" #include "eve_text.h" @@ -17,14 +20,24 @@ static void scroll1(EVEText *box) { box->dirty = 1; } -void eve_text_init(EVEText *box, int16_t x, int16_t y, uint16_t w, uint16_t h, double scale_x, double scale_y, uint8_t tag, uint16_t line_size, uint32_t mem_addr, uint32_t *mem_next) { - box->x = x; - box->y = y; +void eve_text_init(EVEText *box, EVERect *g, uint16_t w, uint16_t h, uint8_t tag, uint16_t line_size, uint32_t mem_addr, uint32_t *mem_next) { + double scale_x, scale_y; + + if (g->w == 0) { + g->w = w * 8; + } + if (g->h == 0) { + g->h = h * 16; + } + + scale_x = (double)g->w / (w * 8); + scale_y = (double)g->h / (h * 16); + box->g = *g; box->w = w; box->h = h; box->tag = tag; - box->transform_a = 256/scale_x; - box->transform_e = 256/scale_y; + box->transform_a = 256 / scale_x; + box->transform_e = 256 / scale_y; box->ch_w = scale_x * 8; box->ch_h = scale_y * 16; box->dl_size = 17; @@ -55,7 +68,7 @@ int eve_text_touch(EVEText *box, uint8_t tag0, int touch_idx) { uint16_t evt; int ret = 0; - t = eve_touch_evt(tag0, touch_idx, box->tag, box->tag, &evt); + t = eve_touch_evt(tag0, touch_idx, box->tag, 1, &evt); if (t && evt) { if ((evt & EVE_TOUCH_ETYPE_TRACK_START) && (box->line_top < 0)) { box->line_top = box->line0; @@ -145,14 +158,14 @@ void eve_text_update(EVEText *box) { eve_dl_write(BITMAP_LAYOUT(EVE_TEXTVGA, box->w * 2, text_h1)); eve_dl_write(BITMAP_SIZE(EVE_NEAREST, EVE_BORDER, EVE_BORDER, box->w * box->ch_w, text_h1 * box->ch_h)); eve_dl_write(BITMAP_SIZE_H(box->w * box->ch_w, text_h1 * box->ch_h)); - eve_dl_write(VERTEX2F(box->x, box->y)); + eve_dl_write(VERTEX2F(box->g.x, box->g.y)); if (text_h2) { eve_dl_write(BITMAP_SOURCE(box->mem_addr)); eve_dl_write(BITMAP_LAYOUT(EVE_TEXTVGA, box->w * 2, text_h2)); eve_dl_write(BITMAP_SIZE(EVE_NEAREST, EVE_BORDER, EVE_BORDER, box->w * box->ch_w, text_h2 * box->ch_h)); eve_dl_write(BITMAP_SIZE_H(box->w * box->ch_w, text_h2 * box->ch_h)); - eve_dl_write(VERTEX2F(box->x, box->y + text_h1 * box->ch_h)); + eve_dl_write(VERTEX2F(box->g.x, box->g.y + text_h1 * box->ch_h)); } else { eve_dl_write(NOP()); eve_dl_write(NOP()); diff --git a/code/fe310/eos/eve/eve_text.h b/code/fe310/eos/eve/eve_text.h index 0ccf62a..141816c 100644 --- a/code/fe310/eos/eve/eve_text.h +++ b/code/fe310/eos/eve/eve_text.h @@ -1,8 +1,7 @@ #include <stdint.h> typedef struct EVEText { - int16_t x; - int16_t y; + EVERect g; uint16_t w; uint16_t h; uint32_t mem_addr; @@ -20,7 +19,7 @@ typedef struct EVEText { char dirty; } EVEText; -void eve_text_init(EVEText *box, int16_t x, int16_t y, uint16_t w, uint16_t h, double scale_x, double scale_y, uint8_t tag, uint16_t line_size, uint32_t mem_addr, uint32_t *mem_next); +void eve_text_init(EVEText *box, EVERect *g, uint16_t w, uint16_t h, uint8_t tag, uint16_t line_size, uint32_t mem_addr, uint32_t *mem_next); int eve_text_touch(EVEText *box, uint8_t tag0, int touch_idx); uint8_t eve_text_draw(EVEText *box); int eve_text_putc(EVEText *box, int c); diff --git a/code/fe310/eos/eve/eve_touch.c b/code/fe310/eos/eve/eve_touch.c index 34cb79a..fb570bf 100644 --- a/code/fe310/eos/eve/eve_touch.c +++ b/code/fe310/eos/eve/eve_touch.c @@ -12,7 +12,6 @@ #define EVE_NOTOUCH 0x80000000 #define EVE_MAX_TOUCH 5 -#define EVE_TAG_SCREEN 0xff static int _intr_mask = EVE_INT_TAG | EVE_INT_TOUCH; static int _multitouch; @@ -24,7 +23,7 @@ static EVEExtTracker _ext_tracker; static eve_touch_handler_t _touch_handler; static void *_touch_handler_param; -static uint8_t _tag_opt[255]; +static uint8_t _tag_opt[256]; static const uint32_t _reg_touch[] = { REG_CTOUCH_TOUCH0_XY, @@ -166,20 +165,18 @@ void eve_handle_touch(void) { touch->tag0 = touch_tag; if (_tag_opt[touch_tag] & EVE_TOUCH_OPT_TRACK_MASK) { touch->tracker.tag = touch_tag; - } else if (_tag_opt[EVE_TAG_SCREEN] & EVE_TOUCH_OPT_TRACK_MASK) { - touch->tracker.tag = EVE_TAG_SCREEN; } if (touch->tracker.tag && !(_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_XY)) { touch->tracker.track = 1; touch->evt |= EVE_TOUCH_ETYPE_TRACK_START; touch->t = now; } - if (!_tag0 && ((_tag_opt[touch_tag] | _tag_opt[EVE_TAG_SCREEN]) & EVE_TOUCH_OPT_TIMER_MASK)) { - uint8_t _tag = _tag_opt[touch_tag] & EVE_TOUCH_OPT_TIMER_MASK ? touch_tag : EVE_TAG_SCREEN; + if (!_tag0 && (_tag_opt[touch_tag] & EVE_TOUCH_OPT_TIMER_MASK)) { uint16_t _evt = 0; - if (_tag_opt[_tag] & EVE_TOUCH_OPT_LPRESS) _evt |= EVE_TOUCH_ETYPE_LPRESS; - if (_tag_opt[_tag] & EVE_TOUCH_OPT_DTAP) _evt |= EVE_TOUCH_ETYPE_TAP1; - _touch_timer_set(_tag, 0, _evt, 0, 0, EVE_TIMEOUT_TAP); + + if (_tag_opt[touch_tag] & EVE_TOUCH_OPT_LPRESS) _evt |= EVE_TOUCH_ETYPE_LPRESS; + if (_tag_opt[touch_tag] & EVE_TOUCH_OPT_DTAP) _evt |= EVE_TOUCH_ETYPE_TAP1; + _touch_timer_set(touch_tag, 0, _evt, 0, 0, EVE_TIMEOUT_TAP); } } if (!_tag0) _tag0 = tag0 = touch_tag; @@ -312,15 +309,19 @@ void eve_touch_set_handler(eve_touch_handler_t handler, void *param) { _touch_handler_param = param; } -EVETouch *eve_touch_evt(uint8_t tag0, int touch_idx, uint8_t tag_min, uint8_t tag_max, uint16_t *evt) { +EVETouch *eve_touch_evt(uint8_t tag0, int touch_idx, uint8_t tag_min, uint8_t tag_n, uint16_t *evt) { + int tag_max; uint8_t _tag; uint16_t _evt; EVETouch *ret = NULL; *evt = 0; + if ((touch_idx < 0) || (touch_idx > 4)) return ret; - if ((tag_min == 0) || (tag_max == 0)) return ret; - if ((tag0 < tag_min) || (tag0 > tag_max)) return ret; + if (tag_min == EVE_TAG_NOTAG) return ret; + + tag_max = tag_min + tag_n; + if ((tag0 < tag_min) || (tag0 >= tag_max)) return ret; ret = &_touch[touch_idx]; _evt = ret->evt; @@ -328,23 +329,23 @@ EVETouch *eve_touch_evt(uint8_t tag0, int touch_idx, uint8_t tag_min, uint8_t ta *evt |= _evt & EVE_TOUCH_ETYPE_POINT_MASK; if (_evt & EVE_TOUCH_ETYPE_TAG) { _tag = ret->tag; - if ((_tag >= tag_min) && (_tag <= tag_max)) *evt |= EVE_TOUCH_ETYPE_TAG; + if ((_tag >= tag_min) && (_tag < tag_max)) *evt |= EVE_TOUCH_ETYPE_TAG; } if (_evt & EVE_TOUCH_ETYPE_TAG_UP) { _tag = ret->tag_up; - if ((_tag >= tag_min) && (_tag <= tag_max)) *evt |= EVE_TOUCH_ETYPE_TAG_UP; + if ((_tag >= tag_min) && (_tag < tag_max)) *evt |= EVE_TOUCH_ETYPE_TAG_UP; } if (_evt & EVE_TOUCH_ETYPE_TRACK_REG) { _tag = ret->tracker.tag; - if ((_tag >= tag_min) && (_tag <= tag_max)) *evt |= EVE_TOUCH_ETYPE_TRACK_REG; + if ((_tag >= tag_min) && (_tag < tag_max)) *evt |= EVE_TOUCH_ETYPE_TRACK_REG; } if (_evt & EVE_TOUCH_ETYPE_TRACK_MASK) { _tag = ret->tracker.tag; - if ((_tag >= tag_min) && (_tag <= tag_max)) *evt |= _evt & (EVE_TOUCH_ETYPE_TRACK_MASK | EVE_TOUCH_ETYPE_TRACK_XY); + if ((_tag >= tag_min) && (_tag < tag_max)) *evt |= _evt & (EVE_TOUCH_ETYPE_TRACK_MASK | EVE_TOUCH_ETYPE_TRACK_XY); } if (_evt & (EVE_TOUCH_ETYPE_LPRESS | EVE_TOUCH_ETYPE_TAP1 | EVE_TOUCH_ETYPE_TAP2)) { _tag = _touch_timer.tag; - if ((_tag >= tag_min) && (_tag <= tag_max)) *evt |= _evt & (EVE_TOUCH_ETYPE_LPRESS | EVE_TOUCH_ETYPE_TAP1 | EVE_TOUCH_ETYPE_TAP2); + if ((_tag >= tag_min) && (_tag < tag_max)) *evt |= _evt & (EVE_TOUCH_ETYPE_LPRESS | EVE_TOUCH_ETYPE_TAP1 | EVE_TOUCH_ETYPE_TAP2); } return ret; diff --git a/code/fe310/eos/eve/eve_touch.h b/code/fe310/eos/eve/eve_touch.h index 656dd2f..1d9d751 100644 --- a/code/fe310/eos/eve/eve_touch.h +++ b/code/fe310/eos/eve/eve_touch.h @@ -79,7 +79,7 @@ void eve_handle_time(void); void eve_touch_init(void); void eve_touch_set_handler(eve_touch_handler_t handler, void *handler_param); -EVETouch *eve_touch_evt(uint8_t tag0, int touch_idx, uint8_t tag_min, uint8_t tag_max, uint16_t *evt); +EVETouch *eve_touch_evt(uint8_t tag0, int touch_idx, uint8_t tag_min, uint8_t tag_n, uint16_t *evt); void eve_touch_set_opt(uint8_t tag, uint8_t opt); uint8_t eve_touch_get_opt(uint8_t tag); void eve_touch_clear_opt(void); diff --git a/code/fe310/eos/eve/screen/form.c b/code/fe310/eos/eve/screen/form.c index bdf910a..ae381e6 100644 --- a/code/fe310/eos/eve/screen/form.c +++ b/code/fe310/eos/eve/screen/form.c @@ -45,6 +45,7 @@ int eve_form_touch(EVEView *v, uint8_t tag0, int touch_idx) { form->widget_f = widget; } widget = eve_widget_next(widget); + memset(&focus, 0, sizeof(focus)); } eve_page_focus(&form->p, &focus); @@ -54,24 +55,17 @@ int eve_form_touch(EVEView *v, uint8_t tag0, int touch_idx) { uint8_t eve_form_draw(EVEView *v, uint8_t tag0) { EVEForm *form = (EVEForm *)v; EVEWidget *widget = form->widget; - int i, j; - uint8_t tagN, _tagN = 0; + int i; + uint8_t tagN = tag0; for (i=0; i<form->widget_size; i++) { - tagN = widget->draw(widget, &form->p, tag0); - if (tagN) { - for (j=tag0; j<=tagN; j++) { - eve_touch_set_opt(j, eve_touch_get_opt(j) | EVE_TOUCH_OPT_TRACK | EVE_TOUCH_OPT_TRACK_XY | EVE_TOUCH_OPT_TRACK_EXT); - } - if (tagN < 0xfe) { - tag0 = tagN + 1; - } else { - tag0 = 0; - } - _tagN = tagN; - } + tagN = widget->draw(widget, &form->p, tagN); widget = eve_widget_next(widget); } - return _tagN; + for (i=tag0; i<tagN; i++) { + eve_touch_set_opt(i, eve_touch_get_opt(i) | EVE_TOUCH_OPT_TRACK | EVE_TOUCH_OPT_TRACK_XY | EVE_TOUCH_OPT_TRACK_EXT); + } + + return tagN; } diff --git a/code/fe310/eos/eve/screen/page.c b/code/fe310/eos/eve/screen/page.c index 66c7c13..fbd9327 100644 --- a/code/fe310/eos/eve/screen/page.c +++ b/code/fe310/eos/eve/screen/page.c @@ -23,7 +23,7 @@ void eve_page_init(EVEPage *page, eve_view_touch_t touch, eve_view_draw_t draw, void eve_page_focus(EVEPage *page, EVERect *f) { EVERect g; - eve_window_get_visible(page->window, &g); + eve_window_visible_g(page->window, &g); g.x -= page->window->g.x; g.y -= page->window->g.y; diff --git a/code/fe310/eos/eve/screen/screen.c b/code/fe310/eos/eve/screen/screen.c index 9827323..d31cd2c 100644 --- a/code/fe310/eos/eve/screen/screen.c +++ b/code/fe310/eos/eve/screen/screen.c @@ -22,11 +22,11 @@ EVEKbd *eve_screen_get_kbd(EVEScreen *screen) { } void eve_screen_show_kbd(EVEScreen *screen) { - screen->kbd_active = 1; + if (screen->kbd && screen->kbd_win) screen->kbd_win->g.y = screen->h - screen->kbd->g.h; } void eve_screen_hide_kbd(EVEScreen *screen) { - screen->kbd_active = 0; + if (screen->kbd && screen->kbd_win) screen->kbd_win->g.y = screen->h; } int eve_screen_win_insert(EVEScreen *screen, EVEWindow *window, int idx) { @@ -69,5 +69,21 @@ void eve_screen_win_append(EVEScreen *screen, EVEWindow *window) { } void eve_screen_handle_touch(EVEScreen *screen, uint8_t tag0, int touch_idx) { + EVEWindow *w; + int a; + uint8_t tagN = 0x80; + eve_touch_clear_opt(); + + w = screen->win_head; + while(w) { + if (eve_window_visible(w)) a = w->view->touch(w->view, tag0, touch_idx); + w = w->next; + } + + w = screen->win_head; + while(w) { + if (eve_window_visible(w)) tagN = w->view->draw(w->view, tagN); + w = w->next; + } } diff --git a/code/fe310/eos/eve/screen/screen.h b/code/fe310/eos/eve/screen/screen.h index 9fa155a..d6bc5e8 100644 --- a/code/fe310/eos/eve/screen/screen.h +++ b/code/fe310/eos/eve/screen/screen.h @@ -2,20 +2,13 @@ struct EVEWindow; -typedef struct EVERect { - int16_t x; - int16_t y; - uint16_t w; - uint16_t h; -} EVERect; - typedef struct EVEScreen { uint16_t w; uint16_t h; struct EVEWindow *win_head; struct EVEWindow *win_tail; EVEKbd *kbd; - char kbd_active; + struct EVEWindow *kbd_win; } EVEScreen; int eve_screen_init(EVEScreen *screen, uint16_t w, uint16_t h); diff --git a/code/fe310/eos/eve/screen/window.c b/code/fe310/eos/eve/screen/window.c index 8341e8a..5c329a9 100644 --- a/code/fe310/eos/eve/screen/window.c +++ b/code/fe310/eos/eve/screen/window.c @@ -17,22 +17,32 @@ void eve_window_init(EVEWindow *window, EVERect *g, EVEView *view, EVEScreen *sc window->screen = screen; } -void eve_window_get_visible(EVEWindow *window, EVERect *g) { +int eve_window_visible(EVEWindow *window) { + if (window->g.x >= window->screen->w) return 0; + if (window->g.y >= window->screen->h) return 0; + if ((window->g.x + window->g.w) <= 0) return 0; + if ((window->g.y + window->g.h) <= 0) return 0; + return 1; +} + +void eve_window_visible_g(EVEWindow *window, EVERect *g) { EVEWindow *w = window->next; *g = window->g; while (w) { - if (w->g.x > g->x) g->w = MIN(g->w, w->g.x - g->x); - if (w->g.y > g->y) g->h = MIN(g->h, w->g.y - g->y); - if (w->g.x + w->g.w < g->x + g->w) { - uint16_t x0 = g->w - MIN(g->w, (g->x + g->w) - (w->g.x + w->g.w)); - g->x += x0; - g->w -= x0; - } - if (w->g.y + w->g.h < g->y + g->h) { - uint16_t y0 = g->h - MIN(g->h, (g->y + g->h) - (w->g.y + w->g.h)); - g->y += y0; - g->h -= y0; + if (eve_window_visible(w)) { + if (w->g.x > g->x) g->w = MIN(g->w, w->g.x - g->x); + if (w->g.y > g->y) g->h = MIN(g->h, w->g.y - g->y); + if (w->g.x + w->g.w < g->x + g->w) { + uint16_t x0 = g->w - MIN(g->w, (g->x + g->w) - (w->g.x + w->g.w)); + g->x += x0; + g->w -= x0; + } + if (w->g.y + w->g.h < g->y + g->h) { + uint16_t y0 = g->h - MIN(g->h, (g->y + g->h) - (w->g.y + w->g.h)); + g->y += y0; + g->h -= y0; + } } w = w->next; } diff --git a/code/fe310/eos/eve/screen/window.h b/code/fe310/eos/eve/screen/window.h index f3a1c77..78aabde 100644 --- a/code/fe310/eos/eve/screen/window.h +++ b/code/fe310/eos/eve/screen/window.h @@ -18,4 +18,5 @@ typedef struct EVEWindow { } EVEWindow; void eve_window_init(EVEWindow *window, EVERect *g, EVEView *view, EVEScreen *screen); -void eve_window_get_visible(EVEWindow *window, EVERect *g); +int eve_window_visible(EVEWindow *window); +void eve_window_visible_g(EVEWindow *window, EVERect *g); diff --git a/code/fe310/eos/eve/widget/page.c b/code/fe310/eos/eve/widget/page.c index 07a59b4..89177ec 100644 --- a/code/fe310/eos/eve/widget/page.c +++ b/code/fe310/eos/eve/widget/page.c @@ -27,7 +27,7 @@ int eve_pagew_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_i if (touch_idx > 0) return 0; - t = eve_touch_evt(tag0, touch_idx, widget->tag, widget->tag, &evt); + t = eve_touch_evt(tag0, touch_idx, widget->tag, 1, &evt); if (t && evt) { if (evt & EVE_TOUCH_ETYPE_TRACK_MASK) { if (page && page->handle_evt) page->handle_evt(page, _widget, t, evt, tag0, touch_idx); @@ -44,12 +44,14 @@ uint8_t eve_pagew_draw(EVEWidget *_widget, EVEPage *page, uint8_t tag0) { EVEPageWidget *widget = (EVEPageWidget *)_widget; char draw = page ? eve_page_widget_visible(page, _widget) : 1; - widget->tag = 0; + widget->tag = tag0; if (draw) { - widget->tag = tag0; - if (widget->tag) eve_cmd_dl(TAG(widget->tag)); + if (tag0 != EVE_TAG_NOTAG) { + eve_cmd_dl(TAG(tag0)); + tag0++; + } eve_cmd(CMD_TEXT, "hhhhs", _widget->g.x, _widget->g.y, widget->font_id, 0, widget->title); } - return widget->tag; + return tag0; } diff --git a/code/fe310/eos/eve/widget/text.c b/code/fe310/eos/eve/widget/text.c index 8b3fcdb..f098a5b 100644 --- a/code/fe310/eos/eve/widget/text.c +++ b/code/fe310/eos/eve/widget/text.c @@ -48,6 +48,7 @@ static EVETextCursor *cursor_prox(EVETextWidget *widget, EVETextCursor *cursor, _dx = *dx < 0 ? -(*dx) : *dx; _dl = *dl < 0 ? -(*dl) : *dl; + if ((_dx <= widget->font->h) && (_dl <= 1)) return cursor; return NULL; } @@ -60,7 +61,7 @@ int eve_textw_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_i if (touch_idx > 0) return 0; - t = eve_touch_evt(tag0, touch_idx, widget->tag0, widget->tagN, &evt); + t = eve_touch_evt(tag0, touch_idx, widget->tag0, widget->tagN - widget->tag0, &evt); if (t && evt) { EVETextCursor *t_cursor = NULL; short dx, dl; @@ -136,9 +137,9 @@ static void _draw_line(EVETextWidget *widget, uint16_t l, uint16_t ch, uint16_t EVEWidget *_widget = (EVEWidget *)widget; if (x1 != x2) { - if (widget->tagN) { + if (widget->tagN != EVE_TAG_NOTAG) { eve_cmd_dl(TAG(widget->tagN)); - eve_touch_set_opt(widget->tagN, EVE_TOUCH_OPT_TRACK | EVE_TOUCH_OPT_TRACK_XY | EVE_TOUCH_OPT_LPRESS); + eve_touch_set_opt(widget->tagN, EVE_TOUCH_OPT_LPRESS); } eve_cmd_dl(BEGIN(EVE_RECTS)); if (!s) eve_cmd_dl(COLOR_MASK(0 ,0 ,0 ,0)); @@ -166,24 +167,9 @@ static void _draw_cursor(EVETextWidget *widget, EVETextCursor *cursor) { } uint8_t eve_textw_draw(EVEWidget *_widget, EVEPage *page, uint8_t tag0) { - int i; int line0, lineN; - char s, w, lineNvisible; + char lineNvisible; EVETextWidget *widget = (EVETextWidget *)_widget; - EVETextCursor *c1, *c2; - - if (widget->cursor2.on) { - if (widget->cursor1.ch <= widget->cursor2.ch) { - c1 = &widget->cursor1; - c2 = &widget->cursor2; - } else { - c1 = &widget->cursor2; - c2 = &widget->cursor1; - } - } else { - c1 = NULL; - c2 = NULL; - } if (page) { int _line0, _lineN; @@ -200,66 +186,84 @@ uint8_t eve_textw_draw(EVEWidget *_widget, EVEPage *page, uint8_t tag0) { lineN = widget->line_len; lineNvisible = 1; } - widget->line0 = line0; - widget->tag0 = tag0; - widget->tagN = tag0; - s = 0; - w = lineNvisible || (line0 < lineN); - if (w) { + if (lineNvisible || (line0 < lineN)) { + int i; + char s = 0; + EVETextCursor *c1, *c2; + + widget->line0 = line0; + widget->tag0 = tag0; + widget->tagN = tag0; + + if (widget->cursor2.on) { + if (widget->cursor1.ch <= widget->cursor2.ch) { + c1 = &widget->cursor1; + c2 = &widget->cursor2; + } else { + c1 = &widget->cursor2; + c2 = &widget->cursor1; + } + } else { + c1 = NULL; + c2 = NULL; + } + eve_cmd_dl(SAVE_CONTEXT()); eve_cmd_dl(VERTEX_FORMAT(0)); eve_cmd_dl(LINE_WIDTH(1)); - } - for (i=line0; i<lineN; i++) { - if (c1 && !s && (c1->line == i)) { - int l1, l2, l3; - - l1 = c1->ch - LINE_START(widget, i); - if (c2->line == i) { - l2 = c2->ch - c1->ch; - l3 = LINE_START(widget, i) + LINE_LEN(widget, i) - c2->ch; - } else { - l2 = LINE_START(widget, i) + LINE_LEN(widget, i) - c1->ch; - l3 = 0; - s = 1; - } - _draw_line(widget, i, LINE_START(widget, i), l1, 0, c1->x, 0); - _draw_line(widget, i, c1->ch, l2, c1->x, s ? _widget->g.w : c2->x, 1); - if (!s) { - _draw_line(widget, i, c2->ch, l3, c2->x, _widget->g.w, 0); + + for (i=line0; i<lineN; i++) { + if (c1 && !s && (c1->line == i)) { + int l1, l2, l3; + + l1 = c1->ch - LINE_START(widget, i); + if (c2->line == i) { + l2 = c2->ch - c1->ch; + l3 = LINE_START(widget, i) + LINE_LEN(widget, i) - c2->ch; + } else { + l2 = LINE_START(widget, i) + LINE_LEN(widget, i) - c1->ch; + l3 = 0; + s = 1; + } + _draw_line(widget, i, LINE_START(widget, i), l1, 0, c1->x, 0); + _draw_line(widget, i, c1->ch, l2, c1->x, s ? _widget->g.w : c2->x, 1); + if (!s) { + _draw_line(widget, i, c2->ch, l3, c2->x, _widget->g.w, 0); + c1 = NULL; + c2 = NULL; + } + } else if (s && (c2->line == i)) { + int l1 = c2->ch - LINE_START(widget, i); + int l2 = LINE_START(widget, i) + LINE_LEN(widget, i) - c2->ch; + + _draw_line(widget, i, LINE_START(widget, i), l1, 0, c2->x, 1); + _draw_line(widget, i, c2->ch, l2, c2->x, _widget->g.w, 0); c1 = NULL; c2 = NULL; + s = 0; + } else { + _draw_line(widget, i, LINE_START(widget, i), LINE_LEN(widget, i), 0, _widget->g.w, s); } - } else if (s && (c2->line == i)) { - int l1 = c2->ch - LINE_START(widget, i); - int l2 = LINE_START(widget, i) + LINE_LEN(widget, i) - c2->ch; - - _draw_line(widget, i, LINE_START(widget, i), l1, 0, c2->x, 1); - _draw_line(widget, i, c2->ch, l2, c2->x, _widget->g.w, 0); - c1 = NULL; - c2 = NULL; - s = 0; - } else { - _draw_line(widget, i, LINE_START(widget, i), LINE_LEN(widget, i), 0, _widget->g.w, s); + if (widget->tagN != EVE_TAG_NOTAG) widget->tagN++; } - if (widget->tagN && (widget->tagN < 0xfe)) widget->tagN++; - } - if (w) { + if (widget->cursor1.on && (widget->cursor1.line >= line0) && (widget->cursor1.line < lineN)) _draw_cursor(widget, &widget->cursor1); if (widget->cursor2.on && (widget->cursor2.line >= line0) && (widget->cursor2.line < lineN)) _draw_cursor(widget, &widget->cursor2); if (lineNvisible) { _draw_line(widget, lineN, 0, 0, 0, _widget->g.w, 0); - } else if (widget->tagN) { - widget->tagN--; + if (widget->tagN != EVE_TAG_NOTAG) widget->tagN++; } eve_cmd_dl(RESTORE_CONTEXT()); + + return widget->tagN; } else { widget->line0 = 0; - widget->tag0 = 0; - widget->tagN = 0; + widget->tag0 = EVE_TAG_NOTAG; + widget->tagN = EVE_TAG_NOTAG; + + return tag0; } - return widget->tagN; } void eve_textw_putc(void *_w, int c) { @@ -406,8 +410,7 @@ void eve_textw_cursor_set(EVETextWidget *widget, EVETextCursor *cursor, uint8_t uint16_t c_line = LINE_EMPTY; EVEWidget *_widget = (EVEWidget *)widget; - if (widget->tag0 == 0) return; - if ((tag >= widget->tag0 && tag <= widget->tagN)) c_line = tag - widget->tag0 + widget->line0; + if ((tag >= widget->tag0) && ((widget->tagN == EVE_TAG_NOTAG) || (tag < widget->tagN))) c_line = tag - widget->tag0 + widget->line0; if (c_line < widget->line_len) { cursor->line = c_line; } else if (c_line == widget->line_len) { |