summaryrefslogtreecommitdiff
path: root/fw/fe310/eos/eve/widget/freew.c
diff options
context:
space:
mode:
Diffstat (limited to 'fw/fe310/eos/eve/widget/freew.c')
-rw-r--r--fw/fe310/eos/eve/widget/freew.c60
1 files changed, 46 insertions, 14 deletions
diff --git a/fw/fe310/eos/eve/widget/freew.c b/fw/fe310/eos/eve/widget/freew.c
index 11b8e50..f88f81e 100644
--- a/fw/fe310/eos/eve/widget/freew.c
+++ b/fw/fe310/eos/eve/widget/freew.c
@@ -10,22 +10,28 @@
#include "widget.h"
-void eve_freew_init(EVEFreeWidget *widget, EVERect *g, EVEPage *page, eve_freew_draw_t draw, eve_freew_touch_t touch, eve_kbd_input_handler_t putc) {
+int eve_freew_init(EVEFreeWidget *widget, EVERect *g, EVEPage *page, eve_freew_draw_t draw, eve_freew_touch_t touch, eve_kbd_input_handler_t putc) {
EVEWidget *_widget = &widget->w;
memset(widget, 0, sizeof(EVEFreeWidget));
eve_widget_init(_widget, EVE_WIDGET_TYPE_FREE, g, page, eve_freew_draw, eve_freew_touch, putc);
widget->_draw = draw;
widget->_touch = touch;
+
+ return EVE_OK;
+}
+
+void eve_freew_set_uievt_handler(EVEFreeWidget *widget, eve_freew_uievt_t handler) {
+ widget->_uievt = handler;
}
int eve_freew_create(EVEWidget *_widget, EVEWidgetSpec *spec, EVEPage *page) {
EVEFreeWidget *widget = (EVEFreeWidget *)_widget;
EVEFreeSpec *tspec = &spec->tspec.free;
+ int rv;
- eve_freew_init(widget, &spec->g, page, tspec->draw, tspec->touch, tspec->putc);
-
- return EVE_OK;
+ rv = eve_freew_init(widget, &spec->g, page, tspec->draw, tspec->touch, tspec->putc);
+ return rv;
}
uint8_t eve_freew_draw(EVEWidget *_widget, uint8_t tag0) {
@@ -42,27 +48,53 @@ uint8_t eve_freew_draw(EVEWidget *_widget, uint8_t tag0) {
int eve_freew_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
EVEFreeWidget *widget = (EVEFreeWidget *)_widget;
- int ret;
+ int rv;
+
+ /* widget received non-touch event */
+ if (evt & EVE_TOUCH_ETYPE_EXT) {
+ evt &= ~EVE_TOUCH_ETYPE_EXT;
+ if (widget->_uievt) widget->_uievt(widget, evt);
- ret = widget->_touch(widget, touch, evt);
- return ret;
+ /* always return 0 for non-touch events */
+ return 0;
+ }
+
+ rv = widget->_touch(widget, touch, evt);
+ return rv;
}
-uint8_t eve_freew_tag(EVEFreeWidget *widget) {
+uint8_t eve_freew_tag0(EVEFreeWidget *widget) {
+ EVEWidget *_widget = &widget->w;
+
+ return _widget->tag0;
+}
+
+void eve_freew_tag(EVEFreeWidget *widget, uint8_t tag_opt) {
EVEWidget *_widget = &widget->w;
- uint8_t ret = EVE_NOTAG;
if (_widget->tagN != EVE_NOTAG) {
- ret = _widget->tagN;
- eve_cmd_dl(TAG(ret));
+ eve_tag_set_opt(_widget->tagN, tag_opt);
+ eve_cmd_dl(TAG(_widget->tagN));
_widget->tagN++;
}
+}
- return ret;
+void eve_freew_tag_idx(EVEFreeWidget *widget, uint8_t i) {
+ EVEWidget *_widget = &widget->w;
+ uint8_t tag = _widget->tag0;
+
+ if (tag != EVE_NOTAG) {
+ tag += i;
+
+ /* prevents overflow */
+ if ((tag >= _widget->tag0) && (tag < _widget->tagN)) {
+ eve_cmd_dl(TAG(tag));
+ }
+ }
}
-uint8_t eve_widget_tag_index(EVEFreeWidget *widget, uint8_t tag) {
+uint8_t eve_freew_get_tag_idx(EVEFreeWidget *widget, uint8_t tag) {
EVEWidget *_widget = &widget->w;
return tag - _widget->tag0;
-} \ No newline at end of file
+}