diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c index 2c76616..4773c0e 100644 --- a/apps/gui/skin_engine/skin_parser.c +++ b/apps/gui/skin_engine/skin_parser.c @@ -1330,6 +1330,9 @@ static int skin_element_callback(struct skin_element* element, void* data) case SKIN_TOKEN_ALIGN_LANGDIRECTION: follow_lang_direction = 2; break; + case SKIN_TOKEN_VOICE: + token->value.data = current_tick; + break; case SKIN_TOKEN_LOGICAL_IF: function = parse_logical_if; break; diff --git a/apps/gui/skin_engine/skin_render.c b/apps/gui/skin_engine/skin_render.c index 0c18848..a602725 100644 --- a/apps/gui/skin_engine/skin_render.c +++ b/apps/gui/skin_engine/skin_render.c @@ -46,6 +46,8 @@ #include "playlist.h" #include "root_menu.h" #include "misc.h" +#include "talk.h" +#include "lang.h" #define MAX_LINE 1024 @@ -78,6 +80,44 @@ static void skin_render_playlistviewer(struct playlistviewer* viewer, unsigned long refresh_type); #endif +static void skin_do_talking_tags(struct gui_wps *gwps, struct skin_draw_info *info, + struct skin_element *element) +{ + int i, val; + char buf[128]; + const char* out; + struct wps_token *token; + for (i=0; iparams_count; i++) + { + struct skin_tag_parameter *param = &element->params[i]; + switch (param->type) + { + case DEFAULT: + if (i==0) + talk_shutup(); + else + talk_id(VOICE_PAUSE, true); + break; + case STRING: + talk_spell(param->data.text, true); + break; + case CODE: + val = TOKEN_VALUE_ONLY; + token = param->data.code->data; + out = get_token_value(gwps, token, 0, + buf, sizeof buf, &val); + if (val != -1 || token->type == SKIN_TOKEN_VOLUME) + talk_number(val, true); + else + talk_spell(out, true); + break; + default: + break; + } + } + +} + static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info, struct skin_element *element, struct viewport* vp) { @@ -89,6 +129,14 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info, bool do_refresh = (element->tag->flags & info->refresh_type) > 0; switch (token->type) { + case SKIN_TOKEN_VOICE: + if (TIME_AFTER(current_tick, token->value.data+HZ)) + { + printf("%d %d\n", current_tick, token->value.data); + skin_do_talking_tags(gwps, info, element); + } + token->value.data = current_tick; + break; #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) case SKIN_TOKEN_VIEWPORT_FGCOLOUR: { diff --git a/lib/skin_parser/tag_table.c b/lib/skin_parser/tag_table.c index 9c0b51d..4418ff1 100644 --- a/lib/skin_parser/tag_table.c +++ b/lib/skin_parser/tag_table.c @@ -191,6 +191,9 @@ static const struct tag_info legal_tags[] = { SKIN_TOKEN_UIVIEWPORT_LOAD, "Vi" , "sIIiii", 0 }, { SKIN_TOKEN_VIEWPORT_LOAD, "V" , "IIiii", 0 }, + { SKIN_TOKEN_VOICE, "Vx", "|[sT][sT][sT][sT][sT][sT][sT][sT]", + SKIN_REFRESH_STATIC|NOBREAK }, + { SKIN_TOKEN_IMAGE_BACKDROP, "X" , "f", SKIN_REFRESH_STATIC|NOBREAK }, { SKIN_TOKEN_SETTING, "St" , "S", SKIN_REFRESH_DYNAMIC }, diff --git a/lib/skin_parser/tag_table.h b/lib/skin_parser/tag_table.h index f16709d..670ca98 100644 --- a/lib/skin_parser/tag_table.h +++ b/lib/skin_parser/tag_table.h @@ -210,6 +210,8 @@ enum skin_token_type { SKIN_TOKEN_LOAD_FONT, + SKIN_TOKEN_VOICE, + /* buttons */ SKIN_TOKEN_BUTTON_VOLUME, SKIN_TOKEN_LASTTOUCH,