From 4ed8eb19f573d15b1b0526b2588bf20758b4f374 Mon Sep 17 00:00:00 2001
From: Uros Majstorovic <majstor@majstor.org>
Date: Sat, 6 Jun 2020 22:58:53 +0200
Subject: tile -> window; opverlapping windows added

---
 code/fe310/eos/eve/screen/Makefile |  2 +-
 code/fe310/eos/eve/screen/form.c   | 26 +++++++++----------
 code/fe310/eos/eve/screen/form.h   |  6 ++---
 code/fe310/eos/eve/screen/page.c   | 51 ++++++++++++++++++--------------------
 code/fe310/eos/eve/screen/page.h   | 16 ++++--------
 code/fe310/eos/eve/screen/screen.c | 42 +++++++++++++++++++++++++++----
 code/fe310/eos/eve/screen/screen.h | 21 ++++++++--------
 code/fe310/eos/eve/screen/tile.c   | 32 ------------------------
 code/fe310/eos/eve/screen/tile.h   | 24 ------------------
 code/fe310/eos/eve/screen/window.c | 39 +++++++++++++++++++++++++++++
 code/fe310/eos/eve/screen/window.h | 21 ++++++++++++++++
 code/fe310/eos/eve/widget/page.c   | 12 ++++-----
 code/fe310/eos/eve/widget/page.h   |  4 +--
 code/fe310/eos/eve/widget/text.c   | 49 ++++++++++++++++++------------------
 code/fe310/eos/eve/widget/text.h   |  4 +--
 code/fe310/eos/eve/widget/widget.c | 10 +++-----
 code/fe310/eos/eve/widget/widget.h |  9 +++----
 17 files changed, 195 insertions(+), 173 deletions(-)
 delete mode 100644 code/fe310/eos/eve/screen/tile.c
 delete mode 100644 code/fe310/eos/eve/screen/tile.h
 create mode 100644 code/fe310/eos/eve/screen/window.c
 create mode 100644 code/fe310/eos/eve/screen/window.h

(limited to 'code/fe310/eos/eve')

diff --git a/code/fe310/eos/eve/screen/Makefile b/code/fe310/eos/eve/screen/Makefile
index a579f8f..372cf9e 100644
--- a/code/fe310/eos/eve/screen/Makefile
+++ b/code/fe310/eos/eve/screen/Makefile
@@ -2,7 +2,7 @@ include ../../../common.mk
 
 CFLAGS += -I. -I.. -I../..
 
-obj = font.o screen.o tile.o page.o form.o
+obj = font.o screen.o window.o page.o form.o
 
 
 %.o: %.c %.h
diff --git a/code/fe310/eos/eve/screen/form.c b/code/fe310/eos/eve/screen/form.c
index 10f17ad..41105f6 100644
--- a/code/fe310/eos/eve/screen/form.c
+++ b/code/fe310/eos/eve/screen/form.c
@@ -5,7 +5,7 @@
 #include "eve_kbd.h"
 
 #include "screen.h"
-#include "tile.h"
+#include "window.h"
 #include "page.h"
 #include "form.h"
 
@@ -13,33 +13,33 @@
 
 #define CH_EOF              0x1a
 
-int eve_form_init(EVEForm *form, EVETile *tile, eve_page_open_t open, eve_page_close_t close, EVEWidget *widget, uint16_t widget_size) {
+int eve_form_init(EVEForm *form, EVEWidget *widget, uint16_t widget_size, eve_page_open_t open, eve_page_close_t close, EVEWindow *window) {
     memset(form, 0, sizeof(EVEForm));
-    eve_page_init(&form->p, tile, eve_form_touch, eve_form_draw, open, close);
+    eve_page_init(&form->p, eve_form_touch, eve_form_draw, open, close, window);
     form->widget = widget;
     form->widget_size = widget_size;
-
 }
-int eve_form_touch(EVECanvas *c, uint8_t tag0, int touch_idx) {
-    EVEForm *form = (EVEForm *)c;
+
+int eve_form_touch(EVEView *v, uint8_t tag0, int touch_idx) {
+    EVEForm *form = (EVEForm *)v;
     EVEWidget *widget = form->widget;
     int a, i, ret = 0;
-    EVEPageFocus focus = {NULL, {0,0,0,0}};
+    EVERect focus = {0,0,0,0};
 
     for (i=0; i<form->widget_size; i++) {
         a = widget->touch(widget, &form->p, tag0, touch_idx, &focus);
         ret = ret || a;
-        if (focus.w && (form->widget_f != focus.w)) {
-            EVEKbd *kbd = eve_screen_get_kbd(form->p.tile->screen);
+        if (focus.w && focus.h && (form->widget_f != widget)) {
+            EVEKbd *kbd = eve_screen_get_kbd(form->p.window->screen);
 
             if (kbd) {
                 if (form->widget_f && form->widget_f->putc) {
-                    eve_screen_hide_kbd(form->p.tile->screen);
+                    eve_screen_hide_kbd(form->p.window->screen);
                     form->widget_f->putc(form->widget_f, CH_EOF);
                 }
                 eve_kbd_set_handler(kbd, widget->putc);
                 if (widget && widget->putc) {
-                    eve_screen_show_kbd(form->p.tile->screen);
+                    eve_screen_show_kbd(form->p.window->screen);
                 }
             }
             form->widget_f = widget;
@@ -51,8 +51,8 @@ int eve_form_touch(EVECanvas *c, uint8_t tag0, int touch_idx) {
     return ret;
 }
 
-uint8_t eve_form_draw(EVECanvas *c, uint8_t tag0) {
-    EVEForm *form = (EVEForm *)c;
+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;
diff --git a/code/fe310/eos/eve/screen/form.h b/code/fe310/eos/eve/screen/form.h
index 3edafe8..e667fc8 100644
--- a/code/fe310/eos/eve/screen/form.h
+++ b/code/fe310/eos/eve/screen/form.h
@@ -9,6 +9,6 @@ typedef struct EVEForm {
     uint16_t widget_size;
 } EVEForm;
 
-int eve_form_init(EVEForm *form, EVETile *tile, eve_page_open_t open, eve_page_close_t close, struct EVEWidget *widget, uint16_t widget_size);
-int eve_form_touch(EVECanvas *c, uint8_t tag0, int touch_idx);
-uint8_t eve_form_draw(EVECanvas *c, uint8_t tag0);
+int eve_form_init(EVEForm *form, struct EVEWidget *widget, uint16_t widget_size, eve_page_open_t open, eve_page_close_t close, EVEWindow *window);
+int eve_form_touch(EVEView *v, uint8_t tag0, int touch_idx);
+uint8_t eve_form_draw(EVEView *v, uint8_t tag0);
diff --git a/code/fe310/eos/eve/screen/page.c b/code/fe310/eos/eve/screen/page.c
index f703bd6..b2ef091 100644
--- a/code/fe310/eos/eve/screen/page.c
+++ b/code/fe310/eos/eve/screen/page.c
@@ -5,54 +5,51 @@
 #include "eve_kbd.h"
 
 #include "screen.h"
-#include "tile.h"
+#include "window.h"
 #include "page.h"
 
 #include "widget/widget.h"
 
-void eve_page_init(EVEPage *page, EVETile *tile, eve_canvas_touch_t touch, eve_canvas_draw_t draw, eve_page_open_t open, eve_page_close_t close) {
+void eve_page_init(EVEPage *page, eve_view_touch_t touch, eve_view_draw_t draw, eve_page_open_t open, eve_page_close_t close, EVEWindow *window) {
     memset(page, 0, sizeof(EVEPage));
-    page->tile = tile;
+    page->v.touch = touch;
+    page->v.draw = draw;
+    page->open = open;
+    page->close = close;
     page->handle_evt = eve_page_handle_evt;
+    page->window = window;
 }
 
-void eve_page_focus(EVEPage *page, EVEPageFocus *focus) {
-    uint16_t tile_w, tile_h;
+void eve_page_focus(EVEPage *page, EVERect *f) {
+    EVERect g;
 
-    if (focus->w == NULL) return;
-    eve_tile_get_pos(page->tile, NULL, NULL, &tile_w, &tile_h);
+    eve_window_get_visible(page->window, &g);
+    g.x -= page->window->g.x;
+    g.y -= page->window->g.y;
 
-    if (focus->f.x < page->win_x) {
-        page->win_x -= page->win_x - focus->f.x;
+    if (f->x < page->win_x + g.x) {
+        page->win_x = f->x - g.x;
     }
-    if (focus->f.y < page->win_y) {
-        page->win_y -= page->win_y - focus->f.y;
+    if (f->y < page->win_y + g.y) {
+        page->win_y = f->y - g.y;
     }
-    if ((focus->f.x + focus->f.w) > (page->win_x + tile_w)) {
-        page->win_x += (focus->f.x + focus->f.w) - (page->win_x + tile_w);
+    if ((f->x + f->w) > (page->win_x + g.x + g.w)) {
+        page->win_x = (f->x + f->w) - (g.x + g.w);
     }
-    if ((focus->f.y + focus->f.h) > (page->win_y + tile_h)) {
-        page->win_y += (focus->f.y + focus->f.h) - (page->win_y + tile_h);
+    if ((f->y + f->h) > (page->win_y + g.y + g.h)) {
+        page->win_y = (f->y + f->h) - (g.y + g.h);
     }
 }
 
-void eve_page_widget_focus(EVEPageFocus *focus, EVEWidget *widget) {
-    focus->w = widget;
-    focus->f.x = widget->x;
-    focus->f.y = widget->y;
-    focus->f.w = widget->w;
-    focus->f.h = widget->h;
-}
-
 int eve_page_widget_visible(EVEPage *page, EVEWidget *widget) {
-    uint16_t tile_w, tile_h;
-    eve_tile_get_pos(page->tile, NULL, NULL, &tile_w, &tile_h);
+    uint16_t w = page->window->g.w;
+    uint16_t h = page->window->g.h;
 
-    if (((widget->x + widget->w) >= page->win_x) && ((widget->y + widget->h) >= page->win_y) && (widget->x <= (page->win_x + tile_w)) && (widget->y <= (page->win_y + tile_h))) return 1;
+    if (((widget->g.x + widget->g.w) >= page->win_x) && ((widget->g.y + widget->g.h) >= page->win_y) && (widget->g.x <= (page->win_x + w)) && (widget->g.y <= (page->win_y + h))) return 1;
     return 0;
 }
 
-void eve_page_handle_evt(EVEPage *page, struct EVEWidget *widget, EVETouch *touch, uint16_t evt, uint8_t tag0, int touch_idx) {
+void eve_page_handle_evt(EVEPage *page, EVEWidget *widget, EVETouch *touch, uint16_t evt, uint8_t tag0, int touch_idx) {
     /*
     if (evt & EVE_TOUCH_ETYPE_TRACK_Y) {
         // do scroll
diff --git a/code/fe310/eos/eve/screen/page.h b/code/fe310/eos/eve/screen/page.h
index 453bfcf..42cae7d 100644
--- a/code/fe310/eos/eve/screen/page.h
+++ b/code/fe310/eos/eve/screen/page.h
@@ -8,22 +8,16 @@ typedef void (*eve_page_close_t) (struct EVEPage *);
 typedef void (*eve_page_evt_handler_t) (struct EVEPage *, struct EVEWidget *, EVETouch *, uint16_t, uint8_t, int);
 
 typedef struct EVEPage {
-    EVECanvas c;
+    EVEView v;
     int16_t win_x;
     int16_t win_y;
-    eve_page_evt_handler_t handle_evt;
     eve_page_open_t open;
     eve_page_close_t close;
-    EVETile *tile;
+    eve_page_evt_handler_t handle_evt;
+    EVEWindow *window;
 } EVEPage;
 
-typedef struct EVEPageFocus {
-    struct EVEWidget *w;
-    EVEWindow f;
-} EVEPageFocus;
-
-void eve_page_init(EVEPage *page, EVETile *tile, eve_canvas_touch_t touch, eve_canvas_draw_t draw, eve_page_open_t open, eve_page_close_t close);
-void eve_page_focus(EVEPage *page, EVEPageFocus *focus);
-void eve_page_widget_focus(EVEPageFocus *focus, struct EVEWidget *widget);
+void eve_page_init(EVEPage *page, eve_view_touch_t touch, eve_view_draw_t draw, eve_page_open_t open, eve_page_close_t close, EVEWindow *window);
+void eve_page_focus(EVEPage *page, EVERect *focus);
 int eve_page_widget_visible(EVEPage *page, struct EVEWidget *widget);
 void eve_page_handle_evt(EVEPage *page, struct EVEWidget *widget, EVETouch *touch, uint16_t evt, uint8_t tag0, int touch_idx);
diff --git a/code/fe310/eos/eve/screen/screen.c b/code/fe310/eos/eve/screen/screen.c
index c65e8fc..52015be 100644
--- a/code/fe310/eos/eve/screen/screen.c
+++ b/code/fe310/eos/eve/screen/screen.c
@@ -5,7 +5,7 @@
 #include "eve_kbd.h"
 
 #include "screen.h"
-#include "tile.h"
+#include "window.h"
 
 int eve_screen_init(EVEScreen *screen, uint16_t w, uint16_t h) {
     memset(screen, 0, sizeof(EVEScreen));
@@ -29,11 +29,43 @@ void eve_screen_hide_kbd(EVEScreen *screen) {
     screen->kbd_active = 0;
 }
 
-void eve_screen_add_tile(EVEScreen *screen, EVETile *tile) {
-    if (screen->tile_size < EVE_MAX_TILES) {
-        screen->tile[screen->tile_size] = tile;
-        screen->tile_size++;
+int eve_screen_win_insert(EVEScreen *screen, EVEWindow *window, int idx) {
+    if (idx) {
+        int i;
+        EVEWindow *h = screen->win_head;
+
+        for (i=1; i<idx; i++) {
+            h = h->next;
+            if (h == NULL) return EVE_ERR;
+        }
+        window->next = h->next;
+        h->next = window;
+    } else {
+        window->next = screen->win_head;
+        screen->win_head = window;
     }
+    if (window->next == NULL) screen->win_tail = window;
+    return EVE_OK;
+}
+
+int eve_screen_win_remove(EVEScreen *screen, EVEWindow *window) {
+    EVEWindow *h = screen->win_head;
+    if (h == NULL) return EVE_ERR;
+    if (h == window) {
+        screen->win_head = window->next;
+        if (screen->win_head == NULL) screen->win_tail = NULL;
+    } else {
+        while (h->next && (h->next != window)) h = h->next;
+        if (h->next == NULL) return EVE_ERR;
+
+        h->next = window->next;
+        if (h->next == NULL) screen->win_tail = h;
+    }
+}
+
+void eve_screen_win_append(EVEScreen *screen, EVEWindow *window) {
+    screen->win_tail->next = window;
+    screen->win_tail = window;
 }
 
 void eve_screen_handle_touch(EVEScreen *screen, uint8_t tag0, int touch_idx) {
diff --git a/code/fe310/eos/eve/screen/screen.h b/code/fe310/eos/eve/screen/screen.h
index 8627517..ff634b4 100644
--- a/code/fe310/eos/eve/screen/screen.h
+++ b/code/fe310/eos/eve/screen/screen.h
@@ -1,22 +1,20 @@
 #include <stdint.h>
 
-#define EVE_MAX_TILES   8
+struct EVEWindow;
 
-struct EVETile;
-
-typedef struct EVEWindow {
-    uint16_t x;
-    uint16_t y;
+typedef struct EVERect {
+    int16_t x;
+    int16_t y;
     uint16_t w;
     uint16_t h;
-} EVEWindow;
+} EVERect;
 
 typedef struct EVEScreen {
     uint16_t w;
     uint16_t h;
     EVEKbd *kbd;
-    struct EVETile *tile[EVE_MAX_TILES];
-    uint8_t tile_size;
+    struct EVEWindow *win_head;
+    struct EVEWindow *win_tail;
     char kbd_active;
 } EVEScreen;
 
@@ -26,5 +24,8 @@ EVEKbd *eve_screen_get_kbd(EVEScreen *screen);
 void eve_screen_show_kbd(EVEScreen *screen);
 void eve_screen_hide_kbd(EVEScreen *screen);
 
-void eve_screen_add_tile(EVEScreen *screen, struct EVETile *tile);
+int eve_screen_win_insert(EVEScreen *screen, struct EVEWindow *window, int idx);
+int eve_screen_win_remove(EVEScreen *screen, struct EVEWindow *window);
+void eve_screen_win_append(EVEScreen *screen, struct EVEWindow *window);
+
 void eve_screen_handle_touch(EVEScreen *screen, uint8_t tag0, int touch_idx);
diff --git a/code/fe310/eos/eve/screen/tile.c b/code/fe310/eos/eve/screen/tile.c
deleted file mode 100644
index 3715f6d..0000000
--- a/code/fe310/eos/eve/screen/tile.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <stdlib.h>
-#include <string.h>
-
-#include "eve.h"
-#include "eve_kbd.h"
-
-#include "screen.h"
-#include "tile.h"
-
-#define MIN(X, Y)           (((X) < (Y)) ? (X) : (Y))
-
-void eve_tile_init(EVETile *tile, EVEScreen *screen, uint16_t x, uint16_t y, uint16_t w, uint16_t h, EVECanvas *canvas) {
-    tile->screen = screen;
-    tile->x = x;
-    tile->y = y;
-    tile->w = w;
-    tile->h = h;
-    tile->canvas = canvas;
-}
-
-void eve_tile_get_pos(EVETile *tile, uint16_t *x, uint16_t *y, uint16_t *w, uint16_t *h) {
-    if (x) *x = tile->x;
-    if (y) *y = tile->y;
-    if (w) *w = tile->w;
-    if (h) *h = MIN(tile->x + tile->h, tile->screen->h - (tile->screen->kbd && tile->screen->kbd_active ? tile->screen->kbd->h : 0));
-}
-
-void eve_canvas_init(EVECanvas *canvas, eve_canvas_touch_t touch, eve_canvas_draw_t draw) {
-    canvas->touch = touch;
-    canvas->draw = draw;
-}
-
diff --git a/code/fe310/eos/eve/screen/tile.h b/code/fe310/eos/eve/screen/tile.h
deleted file mode 100644
index 5fea8bf..0000000
--- a/code/fe310/eos/eve/screen/tile.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#include <stdint.h>
-
-struct EVECanvas;
-
-typedef int (*eve_canvas_touch_t) (struct EVECanvas *, uint8_t, int);
-typedef uint8_t (*eve_canvas_draw_t) (struct EVECanvas *, uint8_t);
-
-typedef struct EVECanvas {
-    eve_canvas_touch_t touch;
-    eve_canvas_draw_t draw;
-} EVECanvas;
-
-typedef struct EVETile {
-    uint16_t x;
-    uint16_t y;
-    uint16_t w;
-    uint16_t h;
-    EVECanvas *canvas;
-    EVEScreen *screen;
-} EVETile;
-
-void eve_tile_init(EVETile *tile, EVEScreen *screen, uint16_t x, uint16_t y, uint16_t w, uint16_t h, EVECanvas *canvas);
-void eve_tile_get_pos(EVETile *tile, uint16_t *x, uint16_t *y, uint16_t *w, uint16_t *h);
-void eve_canvas_init(EVECanvas *canvas, eve_canvas_touch_t touch, eve_canvas_draw_t draw);
diff --git a/code/fe310/eos/eve/screen/window.c b/code/fe310/eos/eve/screen/window.c
new file mode 100644
index 0000000..8341e8a
--- /dev/null
+++ b/code/fe310/eos/eve/screen/window.c
@@ -0,0 +1,39 @@
+#include <stdlib.h>
+#include <string.h>
+
+#include "eve.h"
+#include "eve_kbd.h"
+
+#include "screen.h"
+#include "window.h"
+
+#define MIN(X, Y)           (((X) < (Y)) ? (X) : (Y))
+
+void eve_window_init(EVEWindow *window, EVERect *g, EVEView *view, EVEScreen *screen) {
+    memset(window, 0, sizeof(EVEWindow));
+
+    if (g) window->g = *g;
+    window->view = view;
+    window->screen = screen;
+}
+
+void eve_window_get_visible(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;
+        }
+        w = w->next;
+    }
+}
diff --git a/code/fe310/eos/eve/screen/window.h b/code/fe310/eos/eve/screen/window.h
new file mode 100644
index 0000000..f3a1c77
--- /dev/null
+++ b/code/fe310/eos/eve/screen/window.h
@@ -0,0 +1,21 @@
+#include <stdint.h>
+
+struct EVEView;
+
+typedef int (*eve_view_touch_t) (struct EVEView *, uint8_t, int);
+typedef uint8_t (*eve_view_draw_t) (struct EVEView *, uint8_t);
+
+typedef struct EVEView {
+    eve_view_touch_t touch;
+    eve_view_draw_t draw;
+} EVEView;
+
+typedef struct EVEWindow {
+    EVERect g;
+    EVEView *view;
+    EVEScreen *screen;
+    struct EVEWindow *next;
+} EVEWindow;
+
+void eve_window_init(EVEWindow *window, EVERect *g, EVEView *view, EVEScreen *screen);
+void eve_window_get_visible(EVEWindow *window, EVERect *g);
diff --git a/code/fe310/eos/eve/widget/page.c b/code/fe310/eos/eve/widget/page.c
index 4b78b3b..07a59b4 100644
--- a/code/fe310/eos/eve/widget/page.c
+++ b/code/fe310/eos/eve/widget/page.c
@@ -5,21 +5,21 @@
 #include "eve_kbd.h"
 
 #include "screen/screen.h"
-#include "screen/tile.h"
+#include "screen/window.h"
 #include "screen/page.h"
 
 #include "widget.h"
 #include "page.h"
 
-void eve_pagew_init(EVEPageWidget *widget, int16_t x, int16_t y, uint16_t w, uint16_t h, uint8_t font_id, char *title, EVEPage *page) {
+void eve_pagew_init(EVEPageWidget *widget, EVERect *g, uint8_t font_id, char *title, EVEPage *page) {
     memset(widget, 0, sizeof(EVEPageWidget));
-    eve_widget_init(&widget->w, EVE_WIDGET_TYPE_PAGE, x, y, w, h, eve_pagew_touch, eve_pagew_draw, NULL);
+    eve_widget_init(&widget->w, EVE_WIDGET_TYPE_PAGE, g, eve_pagew_touch, eve_pagew_draw, NULL);
     widget->font_id = font_id;
     widget->title = title;
     widget->page = page;
 }
 
-int eve_pagew_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_idx, EVEPageFocus *focus) {
+int eve_pagew_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_idx, EVERect *focus) {
     EVEPageWidget *widget = (EVEPageWidget *)_widget;
     EVETouch *t;
     uint16_t evt;
@@ -33,7 +33,7 @@ int eve_pagew_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_i
             if (page && page->handle_evt) page->handle_evt(page, _widget, t, evt, tag0, touch_idx);
         } else if (evt & EVE_TOUCH_ETYPE_TAG_UP) {
             widget->page->open(widget->page, page);
-            if (focus) eve_page_widget_focus(focus, _widget);
+            if (focus) *focus = _widget->g;
         }
         ret = 1;
     }
@@ -48,7 +48,7 @@ uint8_t eve_pagew_draw(EVEWidget *_widget, EVEPage *page, uint8_t tag0) {
     if (draw) {
         widget->tag = tag0;
         if (widget->tag) eve_cmd_dl(TAG(widget->tag));
-        eve_cmd(CMD_TEXT, "hhhhs", _widget->x, _widget->y, widget->font_id, 0, widget->title);
+        eve_cmd(CMD_TEXT, "hhhhs", _widget->g.x, _widget->g.y, widget->font_id, 0, widget->title);
     }
 
     return widget->tag;
diff --git a/code/fe310/eos/eve/widget/page.h b/code/fe310/eos/eve/widget/page.h
index 3b6be70..a0b3e02 100644
--- a/code/fe310/eos/eve/widget/page.h
+++ b/code/fe310/eos/eve/widget/page.h
@@ -8,6 +8,6 @@ typedef struct EVEPageWidget {
     uint8_t font_id;
 } EVEPageWidget;
 
-void eve_pagew_init(EVEPageWidget *widget, int16_t x, int16_t y, uint16_t w, uint16_t h, uint8_t font_id, char *title, EVEPage *page);
-int eve_pagew_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_idx, EVEPageFocus *focus);
+void eve_pagew_init(EVEPageWidget *widget, EVERect *g, uint8_t font_id, char *title, EVEPage *page);
+int eve_pagew_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_idx, EVERect *focus);
 uint8_t eve_pagew_draw(EVEWidget *_widget, EVEPage *page, uint8_t tag0);
\ No newline at end of file
diff --git a/code/fe310/eos/eve/widget/text.c b/code/fe310/eos/eve/widget/text.c
index ecdfb32..2d80bbc 100644
--- a/code/fe310/eos/eve/widget/text.c
+++ b/code/fe310/eos/eve/widget/text.c
@@ -5,7 +5,7 @@
 #include "eve_kbd.h"
 
 #include "screen/screen.h"
-#include "screen/tile.h"
+#include "screen/window.h"
 #include "screen/page.h"
 #include "screen/font.h"
 
@@ -26,9 +26,9 @@
 
 #define PAGE_WIN_X(p)       (p ? p->win_x : 0)
 
-void eve_textw_init(EVETextWidget *widget, int16_t x, int16_t y, uint16_t w, uint16_t h, EVEFont *font, char *text, uint64_t text_size, uint16_t *line, uint16_t line_size) {
+void eve_textw_init(EVETextWidget *widget, EVERect *g, EVEFont *font, char *text, uint64_t text_size, uint16_t *line, uint16_t line_size) {
     memset(widget, 0, sizeof(EVETextWidget));
-    eve_widget_init(&widget->w, EVE_WIDGET_TYPE_TEXT, x, y, w, h, eve_textw_touch, eve_textw_draw, eve_textw_putc);
+    eve_widget_init(&widget->w, EVE_WIDGET_TYPE_TEXT, g, eve_textw_touch, eve_textw_draw, eve_textw_putc);
     widget->text = text;
     widget->text_size = text_size;
     widget->line = line;
@@ -39,7 +39,7 @@ void eve_textw_init(EVETextWidget *widget, int16_t x, int16_t y, uint16_t w, uin
 
 static EVETextCursor *cursor_prox(EVETextWidget *widget, EVETextCursor *cursor, EVEPage *page, EVETouch *t, short *dx, short *dl) {
     EVEWidget *_widget = (EVEWidget *)widget;
-    int x = t->x0 + PAGE_WIN_X(page) - _widget->x;
+    int x = t->x0 + PAGE_WIN_X(page) - _widget->g.x;
     int l = (int)t->tag0 - widget->tag0 + widget->line0;
     int _dx, _dl;
 
@@ -52,7 +52,7 @@ static EVETextCursor *cursor_prox(EVETextWidget *widget, EVETextCursor *cursor,
     return NULL;
 }
 
-int eve_textw_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_idx, EVEPageFocus *focus) {
+int eve_textw_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_idx, EVERect *focus) {
     EVETextWidget *widget = (EVETextWidget *)_widget;
     EVETouch *t;
     uint16_t evt;
@@ -123,11 +123,10 @@ int eve_textw_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_i
         ret = 1;
     }
     if (widget->cursor_f && focus) {
-        focus->f.x = _widget->x;
-        focus->f.y = _widget->y + widget->cursor_f->line * widget->font->h;
-        focus->f.w = _widget->w;
-        focus->f.h = 2 * widget->font->h;
-        focus->w = _widget;
+        focus->x = _widget->g.x;
+        focus->y = _widget->g.y + widget->cursor_f->line * widget->font->h;
+        focus->w = _widget->g.w;
+        focus->h = 2 * widget->font->h;
         widget->cursor_f = NULL;
     }
     return ret;
@@ -143,12 +142,12 @@ static void _draw_line(EVETextWidget *widget, uint16_t l, uint16_t ch, uint16_t
         }
         eve_cmd_dl(BEGIN(EVE_RECTS));
         if (!s) eve_cmd_dl(COLOR_MASK(0 ,0 ,0 ,0));
-        eve_cmd_dl(VERTEX2F(_widget->x + x1, _widget->y + l * widget->font->h));
-        eve_cmd_dl(VERTEX2F(_widget->x + x2, _widget->y + (l + 1) * widget->font->h));
+        eve_cmd_dl(VERTEX2F(_widget->g.x + x1, _widget->g.y + l * widget->font->h));
+        eve_cmd_dl(VERTEX2F(_widget->g.x + x2, _widget->g.y + (l + 1) * widget->font->h));
         if (!s) eve_cmd_dl(COLOR_MASK(1 ,1 ,1 ,1));
         if (len) {
             if (s) eve_cmd_dl(COLOR_RGB(0, 0, 0));
-            eve_cmd(CMD_TEXT, "hhhhpb", _widget->x, _widget->y + l * widget->font->h, widget->font->id, 0, widget->text + ch, len, 0);
+            eve_cmd(CMD_TEXT, "hhhhpb", _widget->g.x, _widget->g.y + l * widget->font->h, widget->font->id, 0, widget->text + ch, len, 0);
             if (s) eve_cmd_dl(COLOR_RGB(255, 255, 255));
         }
     }
@@ -158,8 +157,8 @@ static void _draw_cursor(EVETextWidget *widget, EVETextCursor *cursor) {
     uint16_t x, y;
     EVEWidget *_widget = (EVEWidget *)widget;
 
-    x = _widget->x + cursor->x;
-    y = _widget->y + cursor->line * widget->font->h;
+    x = _widget->g.x + cursor->x;
+    y = _widget->g.y + cursor->line * widget->font->h;
     eve_cmd_dl(BEGIN(EVE_LINES));
     eve_cmd_dl(VERTEX2F(x, y));
     eve_cmd_dl(VERTEX2F(x, y + widget->font->h));
@@ -189,8 +188,8 @@ uint8_t eve_textw_draw(EVEWidget *_widget, EVEPage *page, uint8_t tag0) {
     if (page) {
         int _line0, _lineN;
 
-        _line0 = line0 = ((int)page->win_y - _widget->y) / widget->font->h;
-        _lineN = lineN = ((int)page->win_y + page->tile->h - _widget->y) / widget->font->h + 1;
+        _line0 = line0 = ((int)page->win_y - _widget->g.y) / widget->font->h;
+        _lineN = lineN = ((int)page->win_y + page->window->g.h - _widget->g.y) / widget->font->h + 1;
         if (line0 < 0) line0 = 0;
         if (lineN < 0) lineN = 0;
         if (line0 > widget->line_len) line0 = widget->line_len;
@@ -226,9 +225,9 @@ uint8_t eve_textw_draw(EVEWidget *_widget, EVEPage *page, uint8_t tag0) {
                 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->w : c2->x, 1);
+            _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->w, 0);
+                _draw_line(widget, i, c2->ch, l3, c2->x, _widget->g.w, 0);
                 c1 = NULL;
                 c2 = NULL;
             }
@@ -237,12 +236,12 @@ uint8_t eve_textw_draw(EVEWidget *_widget, EVEPage *page, uint8_t tag0) {
             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->w, 0);
+            _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->w, s);
+            _draw_line(widget, i, LINE_START(widget, i), LINE_LEN(widget, i), 0, _widget->g.w, s);
         }
         if (widget->tagN && (widget->tagN < 0xfe)) widget->tagN++;
     }
@@ -250,7 +249,7 @@ uint8_t eve_textw_draw(EVEWidget *_widget, EVEPage *page, uint8_t tag0) {
         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->w, 0);
+            _draw_line(widget, lineN, 0, 0, 0, _widget->g.w, 0);
         } else if (widget->tagN) {
             widget->tagN--;
         }
@@ -365,7 +364,7 @@ int eve_textw_update(EVETextWidget *widget, uint16_t line) {
         } else {
             return EVE_ERR_TEXT;
         }
-        if ((line_w > _widget->w) && (line_b != LINE_EMPTY)) {
+        if ((line_w > _widget->g.w) && (line_b != LINE_EMPTY)) {
             if (widget->line[line] == line_b) return line;
             widget->line[line] = line_b;
             line++;
@@ -383,7 +382,7 @@ int eve_textw_update(EVETextWidget *widget, uint16_t line) {
     widget->text_len = i;
 
     widget->line_len = line;
-    _widget->h = (line + 1) * widget->font->h;
+    _widget->g.h = (line + 1) * widget->font->h;
     for (i=line; i<widget->line_size; i++) {
         widget->line[i] = LINE_EMPTY;
     }
@@ -417,7 +416,7 @@ void eve_textw_cursor_set(EVETextWidget *widget, EVETextCursor *cursor, uint8_t
         return;
     }
 
-    x -= _widget->x;
+    x -= _widget->g.x;
     _x = 0;
     _d = x;
     for (i=LINE_START(widget, cursor->line); i<LINE_END(widget, cursor->line); i++) {
diff --git a/code/fe310/eos/eve/widget/text.h b/code/fe310/eos/eve/widget/text.h
index 83b131d..57798ee 100644
--- a/code/fe310/eos/eve/widget/text.h
+++ b/code/fe310/eos/eve/widget/text.h
@@ -30,8 +30,8 @@ typedef struct EVETextWidget {
     } track;
 } EVETextWidget;
 
-void eve_textw_init(EVETextWidget *widget, int16_t x, int16_t y, uint16_t w, uint16_t h, EVEFont *font, char *text, uint64_t text_size, uint16_t *line, uint16_t line_size);
-int eve_textw_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_idx, EVEPageFocus *focus);
+void eve_textw_init(EVETextWidget *widget, EVERect *g, EVEFont *font, char *text, uint64_t text_size, uint16_t *line, uint16_t line_size);
+int eve_textw_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_idx, EVERect *focus);
 uint8_t eve_textw_draw(EVEWidget *_widget, EVEPage *page, uint8_t tag0);
 void eve_textw_putc(void *_w, int c);
 int eve_textw_update(EVETextWidget *widget, uint16_t line);
diff --git a/code/fe310/eos/eve/widget/widget.c b/code/fe310/eos/eve/widget/widget.c
index 44de4c6..79a1b25 100644
--- a/code/fe310/eos/eve/widget/widget.c
+++ b/code/fe310/eos/eve/widget/widget.c
@@ -1,10 +1,11 @@
 #include <stdlib.h>
+#include <string.h>
 
 #include "eve.h"
 #include "eve_kbd.h"
 
 #include "screen/screen.h"
-#include "screen/tile.h"
+#include "screen/window.h"
 #include "screen/page.h"
 #include "screen/font.h"
 
@@ -18,12 +19,9 @@ static const size_t _eve_wsize[] = {
     sizeof(EVEPageWidget)
 };
 
-void eve_widget_init(EVEWidget *widget, uint8_t type, int16_t x, int16_t y, uint16_t w, uint16_t h, eve_widget_touch_t touch, eve_widget_draw_t draw, eve_kbd_input_handler_t putc) {
+void eve_widget_init(EVEWidget *widget, uint8_t type, EVERect *g, eve_widget_touch_t touch, eve_widget_draw_t draw, eve_kbd_input_handler_t putc) {
     widget->type = type;
-    widget->x = x;
-    widget->y = y;
-    widget->w = w;
-    widget->h = h;
+    if (g) widget->g = *g;
     widget->touch = touch;
     widget->draw = draw;
     widget->putc = putc;
diff --git a/code/fe310/eos/eve/widget/widget.h b/code/fe310/eos/eve/widget/widget.h
index 8960e63..e6ea7a7 100644
--- a/code/fe310/eos/eve/widget/widget.h
+++ b/code/fe310/eos/eve/widget/widget.h
@@ -5,19 +5,16 @@
 
 struct EVEWidget;
 
-typedef int (*eve_widget_touch_t) (struct EVEWidget *, EVEPage *, uint8_t, int, EVEPageFocus *);
+typedef int (*eve_widget_touch_t) (struct EVEWidget *, EVEPage *, uint8_t, int, EVERect *);
 typedef uint8_t (*eve_widget_draw_t) (struct EVEWidget *, EVEPage *, uint8_t);
 
 typedef struct EVEWidget {
     uint8_t type;
-    int16_t x;
-    int16_t y;
-    uint16_t w;
-    uint16_t h;
+    EVERect g;
     eve_widget_touch_t touch;
     eve_widget_draw_t draw;
     eve_kbd_input_handler_t putc;
 } EVEWidget;
 
-void eve_widget_init(EVEWidget *widget, uint8_t type, int16_t x, int16_t y, uint16_t w, uint16_t h, eve_widget_touch_t touch, eve_widget_draw_t draw, eve_kbd_input_handler_t putc);
+void eve_widget_init(EVEWidget *widget, uint8_t type, EVERect *g, eve_widget_touch_t touch, eve_widget_draw_t draw, eve_kbd_input_handler_t putc);
 EVEWidget *eve_widget_next(EVEWidget *widget);
-- 
cgit v1.2.3