summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/gui/skin_engine/skin_parser.c5
-rw-r--r--apps/gui/skin_engine/skin_render.c30
-rw-r--r--apps/gui/skin_engine/wps_internals.h3
3 files changed, 18 insertions, 20 deletions
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index 50dad6feee..9475e5feb5 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -572,8 +572,6 @@ static int parse_timeout_tag(struct skin_element *element,
else
val = element->params[0].data.number;
token->value.i = val * TIMEOUT_UNIT;
- if (token->type == SKIN_TOKEN_SUBLINE_TIMEOUT)
- curr_line->timeout = token->value.i;
return 0;
}
@@ -1457,7 +1455,6 @@ static int skin_element_callback(struct skin_element* element, void* data)
struct line *line =
(struct line *)skin_buffer_alloc(sizeof(struct line));
line->update_mode = SKIN_REFRESH_STATIC;
- line->timeout = DEFAULT_SUBLINE_TIME_MULTIPLIER * TIMEOUT_UNIT;
curr_line = line;
element->data = line;
}
@@ -1468,7 +1465,7 @@ static int skin_element_callback(struct skin_element* element, void* data)
(struct line_alternator *)skin_buffer_alloc(sizeof(struct line_alternator));
alternator->current_line = 0;
#ifndef __PCTOOL__
- alternator->last_change_tick = current_tick;
+ alternator->next_change_tick = current_tick;
#endif
element->data = alternator;
}
diff --git a/apps/gui/skin_engine/skin_render.c b/apps/gui/skin_engine/skin_render.c
index baa1f82b43..304ebf140e 100644
--- a/apps/gui/skin_engine/skin_render.c
+++ b/apps/gui/skin_engine/skin_render.c
@@ -482,9 +482,13 @@ static int get_subline_timeout(struct gui_wps *gwps, struct skin_element* line)
{
struct skin_element *element=line;
struct wps_token *token;
- int retval = -1;
+ int retval = DEFAULT_SUBLINE_TIME_MULTIPLIER*TIMEOUT_UNIT;
if (element->type == LINE)
+ {
+ if (element->children_count == 0)
+ return retval; /* empty line, so force redraw */
element = element->children[0];
+ }
while (element)
{
if (element->type == TAG &&
@@ -517,27 +521,21 @@ bool skin_render_alternator(struct skin_element* element, struct skin_draw_info
unsigned old_refresh = info->refresh_type;
if (info->refresh_type == SKIN_REFRESH_ALL)
{
- alternator->current_line = 0;
- alternator->last_change_tick = current_tick;
+ alternator->current_line = element->children_count-1;
changed_lines = true;
}
- else
+ else if (TIME_AFTER(current_tick, alternator->next_change_tick))
{
- struct skin_element *current_line = element->children[alternator->current_line];
- struct line *line = (struct line *)current_line->data;
- int next_change = alternator->last_change_tick + line->timeout;
- if (TIME_AFTER(current_tick, next_change))
- {
- alternator->last_change_tick = current_tick;
- changed_lines = true;
- }
+ changed_lines = true;
}
+
if (changed_lines)
{
struct skin_element *current_line = element->children[alternator->current_line];
int start = alternator->current_line;
int try_line = start;
bool suitable = false;
+ int rettimeout = DEFAULT_SUBLINE_TIME_MULTIPLIER*TIMEOUT_UNIT;
/* find a subline which has at least one token in it,
* and that line doesnt have a timeout set to 0 through conditionals */
@@ -548,8 +546,9 @@ bool skin_render_alternator(struct skin_element* element, struct skin_draw_info
if (element->children[try_line]->children_count != 0)
{
current_line = element->children[try_line];
- if ((current_line->children[0]->type != CONDITIONAL) ||
- get_subline_timeout(info->gwps, current_line->children[0]) > 0)
+ rettimeout = get_subline_timeout(info->gwps,
+ current_line->children[0]);
+ if (rettimeout > 0)
{
suitable = true;
}
@@ -558,7 +557,10 @@ bool skin_render_alternator(struct skin_element* element, struct skin_draw_info
while (try_line != start && !suitable);
if (suitable)
+ {
alternator->current_line = try_line;
+ alternator->next_change_tick = current_tick + rettimeout;
+ }
info->refresh_type = SKIN_REFRESH_ALL;
info->force_redraw = true;
diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h
index 5c3d953fdb..7bd74b5636 100644
--- a/apps/gui/skin_engine/wps_internals.h
+++ b/apps/gui/skin_engine/wps_internals.h
@@ -227,13 +227,12 @@ struct skin_albumart {
struct line {
- int timeout; /* if inside a line alternator */
unsigned update_mode;
};
struct line_alternator {
int current_line;
- unsigned long last_change_tick;
+ unsigned long next_change_tick;
};
struct conditional {