From 156b0bc6146eb69a42189907593f4aa4e45775db Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Mon, 28 Feb 2011 11:19:59 +0000 Subject: Add the option of linking the %Tl (last touch) tag to a specific touchregion. Both tags now accept an optional label param as the first param. %Tl([label,][timeout]) %T([label,] x, y, width, height, action) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29459 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/skin_engine/skin_parser.c | 80 ++++++++++++++++++++++++++++---- apps/gui/skin_engine/skin_tokens.c | 6 ++- apps/gui/skin_engine/skin_touchsupport.c | 3 ++ apps/gui/skin_engine/wps_internals.h | 7 +++ 4 files changed, 86 insertions(+), 10 deletions(-) (limited to 'apps/gui') diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c index 31dd89d0bb..261a900cd1 100644 --- a/apps/gui/skin_engine/skin_parser.c +++ b/apps/gui/skin_engine/skin_parser.c @@ -547,6 +547,7 @@ static int parse_logical_if(struct skin_element *element, return 0; } + static int parse_timeout_tag(struct skin_element *element, struct wps_token *token, struct wps_data *wps_data) @@ -562,7 +563,6 @@ static int parse_timeout_tag(struct skin_element *element, case SKIN_TOKEN_BUTTON_VOLUME: case SKIN_TOKEN_TRACK_STARTING: case SKIN_TOKEN_TRACK_ENDING: - case SKIN_TOKEN_LASTTOUCH: val = 10; break; default: @@ -878,6 +878,47 @@ static int parse_albumart_load(struct skin_element* element, #endif /* HAVE_ALBUMART */ #ifdef HAVE_TOUCHSCREEN +struct touchregion* find_touchregion(const char *label, + struct wps_data *data) +{ + struct skin_token_list *list = data->touchregions; + while (list) + { + struct touchregion *tr = + (struct touchregion *)list->token->value.data; + if (tr->label && !strcmp(tr->label, label)) + return tr; + list = list->next; + } + return NULL; +} + +static int parse_lasttouch(struct skin_element *element, + struct wps_token *token, + struct wps_data *wps_data) +{ + struct touchregion_lastpress *data = + (struct touchregion_lastpress*)skin_buffer_alloc( + sizeof(struct touchregion_lastpress)); + int i; + if (!data) + return WPS_ERROR_INVALID_PARAM; + data->region = NULL; + data->timeout = 10; + + for (i=0; iparams_count; i++) + { + if (element->params[i].type == STRING) + data->region = find_touchregion( + element->params[i].data.text, wps_data); + else if (element->params[i].type == INTEGER) + data->timeout = element->params[i].data.number; + } + + data->timeout *= TIMEOUT_UNIT; + token->value.data = data; + return 0; +} struct touchaction {const char* s; int action;}; static const struct touchaction touchactions[] = { @@ -917,6 +958,7 @@ static int parse_touchregion(struct skin_element *element, { (void)token; unsigned i, imax; + int p; struct touchregion *region = NULL; const char *action; const char pb_string[] = "progressbar"; @@ -951,15 +993,33 @@ static int parse_touchregion(struct skin_element *element, /* should probably do some bounds checking here with the viewport... but later */ region->action = ACTION_NONE; - region->x = element->params[0].data.number; - region->y = element->params[1].data.number; - region->width = element->params[2].data.number; - region->height = element->params[3].data.number; + + if (element->params[0].type == STRING) + { + region->label = element->params[0].data.text; + p = 1; + /* "[SI]III[SI]|S" is the param list. There MUST be 4 numbers + * followed by at least one string. Verify that here */ + if (element->params_count < 6 || + element->params[4].type != INTEGER) + return WPS_ERROR_INVALID_PARAM; + } + else + { + region->label = NULL; + p = 0; + } + + region->x = element->params[p++].data.number; + region->y = element->params[p++].data.number; + region->width = element->params[p++].data.number; + region->height = element->params[p++].data.number; region->wvp = curr_vp; region->armed = false; region->reverse_bar = false; region->data = NULL; - action = element->params[4].data.text; + region->last_press = 0xffff; + action = element->params[p++].data.text; strcpy(temp, action); action = temp; @@ -996,13 +1056,13 @@ static int parse_touchregion(struct skin_element *element, if (region->action == ACTION_SETTINGS_INC || region->action == ACTION_SETTINGS_DEC) { - if (element->params_count < 6) + if (element->params_count < p+1) { return WPS_ERROR_INVALID_PARAM; } else { - char *name = element->params[5].data.text; + char *name = element->params[p].data.text; int j; /* Find the setting */ for (j=0; jvalue.data; + if (data->region) + last_touch = data->region->last_press; + if (last_touch != 0xffff && - TIME_BEFORE(current_tick, token->value.i + last_touch)) + TIME_BEFORE(current_tick, data->timeout + last_touch)) return "t"; #endif } diff --git a/apps/gui/skin_engine/skin_touchsupport.c b/apps/gui/skin_engine/skin_touchsupport.c index 850c1c0647..e5a39cddc5 100644 --- a/apps/gui/skin_engine/skin_touchsupport.c +++ b/apps/gui/skin_engine/skin_touchsupport.c @@ -89,7 +89,10 @@ int skin_get_touchaction(struct wps_data *data, int* edge_offset, *retregion = r; } if (pressed) + { r->armed = true; + r->last_press = current_tick; + } break; default: if (edge_offset) diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h index 83e94b6f8d..28697c8b69 100644 --- a/apps/gui/skin_engine/wps_internals.h +++ b/apps/gui/skin_engine/wps_internals.h @@ -182,6 +182,7 @@ struct viewport_colour { }; #ifdef HAVE_TOUCHSCREEN struct touchregion { + char* label; /* label to identify this region */ struct skin_viewport* wvp;/* The viewport this region is in */ short int x; /* x-pos */ short int y; /* y-pos */ @@ -201,6 +202,12 @@ struct touchregion { void* data; int value; }; + long last_press; /* last tick this was pressed */ +}; + +struct touchregion_lastpress { + struct touchregion *region; + long timeout; }; #endif -- cgit v1.2.3