Index: lib/skin_parser/tag_table.c =================================================================== --- lib/skin_parser/tag_table.c (revision 28779) +++ lib/skin_parser/tag_table.c (working copy) @@ -31,6 +31,7 @@ { SKIN_TOKEN_ALIGN_LEFT_RTL, "aL", "", 0 }, { SKIN_TOKEN_ALIGN_RIGHT, "ar", "", 0 }, { SKIN_TOKEN_ALIGN_RIGHT_RTL, "aR", "", 0 }, + { SKIN_TOKEN_ALIGN_SHADOW, "as", "I", 0 }, { SKIN_TOKEN_ALIGN_LANGDIRECTION, "ax", "", 0 }, { SKIN_TOKEN_LOGICAL_IF, "if", "TS[ITS]|D", SKIN_REFRESH_DYNAMIC }, Index: lib/skin_parser/tag_table.h =================================================================== --- lib/skin_parser/tag_table.h (revision 28779) +++ lib/skin_parser/tag_table.h (working copy) @@ -64,6 +64,7 @@ SKIN_TOKEN_ALIGN_CENTER, SKIN_TOKEN_ALIGN_RIGHT, SKIN_TOKEN_ALIGN_RIGHT_RTL, + SKIN_TOKEN_ALIGN_SHADOW, SKIN_TOKEN_ALIGN_LANGDIRECTION, Index: apps/gui/skin_engine/skin_display.h =================================================================== --- apps/gui/skin_engine/skin_display.h (revision 28779) +++ apps/gui/skin_engine/skin_display.h (working copy) @@ -51,7 +51,8 @@ void write_line(struct screen *display, struct align_pos *format_align, int line, - bool scroll); + bool scroll, + int shadow); void draw_peakmeters(struct gui_wps *gwps, int line_number, struct viewport *viewport); #endif Index: apps/gui/skin_engine/skin_parser.c =================================================================== --- apps/gui/skin_engine/skin_parser.c (revision 28779) +++ apps/gui/skin_engine/skin_parser.c (working copy) @@ -429,7 +429,7 @@ } colour->vp = &curr_vp->vp; token->value.data = colour; - if (element->line == curr_viewport_element->line) + //if (element->line == curr_viewport_element->line) { if (token->type == SKIN_TOKEN_VIEWPORT_FGCOLOUR) { Index: apps/gui/skin_engine/skin_render.c =================================================================== --- apps/gui/skin_engine/skin_render.c (revision 28779) +++ apps/gui/skin_engine/skin_render.c (working copy) @@ -60,6 +60,7 @@ struct align_pos align; bool no_line_break; bool line_scrolls; + int line_shadow; bool force_redraw; char *buf; @@ -433,7 +434,8 @@ info->no_line_break = true; if (child->tag->type == SKIN_TOKEN_SUBLINE_SCROLL) info->line_scrolls = true; - + if (child->tag->type == SKIN_TOKEN_ALIGN_SHADOW) + info->line_shadow = child->params[0].data.number; fix_line_alignment(info, child); if (!child->data) @@ -581,6 +583,7 @@ .line_number = 0, .no_line_break = false, .line_scrolls = false, + .line_shadow = 0, .refresh_type = refresh_type, .skin_vp = skin_viewport, .offset = 0 @@ -604,6 +607,7 @@ linebuf[0] = '\0'; info.no_line_break = false; info.line_scrolls = false; + info.line_shadow = 0; info.force_redraw = false; info.cur_align_start = info.buf; @@ -637,10 +641,10 @@ /* if the line is a scrolling one we don't want to update too often, so that it has the time to scroll */ if ((refresh_type & SKIN_REFRESH_SCROLL) || info.force_redraw) - write_line(display, align, info.line_number, true); + write_line(display, align, info.line_number, true, info.line_shadow); } else - write_line(display, align, info.line_number, false); + write_line(display, align, info.line_number, false, info.line_shadow); } if (!info.no_line_break) info.line_number++; @@ -658,7 +662,6 @@ struct skin_element* viewport = data->tree; struct skin_viewport* skin_viewport; - int old_refresh_mode = refresh_mode; #ifdef HAVE_LCD_CHARCELLS @@ -798,10 +801,10 @@ /* if the line is a scrolling one we don't want to update too often, so that it has the time to scroll */ if ((refresh_type & SKIN_REFRESH_SCROLL) || info.force_redraw) - write_line(display, align, info.line_number, true); + write_line(display, align, info.line_number, true, info.line_shadow); } else - write_line(display, align, info.line_number, false); + write_line(display, align, info.line_number, false, info.line_shadow); } info.line_number++; info.offset++; Index: apps/gui/skin_engine/skin_display.c =================================================================== --- apps/gui/skin_engine/skin_display.c (revision 28779) +++ apps/gui/skin_engine/skin_display.c (working copy) @@ -421,7 +421,8 @@ void write_line(struct screen *display, struct align_pos *format_align, int line, - bool scroll) + bool scroll, + int shadow) { int left_width = 0, left_xpos; int center_width = 0, center_xpos; @@ -556,6 +557,27 @@ which will reset the scroller for that line */ display->puts_scroll(0, line, (unsigned char *)""); + /* print aligned strings' shadows */ + int fg = display->get_foreground(); + display->set_foreground(display->get_background()); + display->set_drawmode(DRMODE_FG); + if (left_width != 0 && shadow) + { + display->putsxy(left_xpos+shadow, ypos+shadow, + (unsigned char *)format_align->left); + } + if (center_width != 0 && shadow) + { + display->putsxy(center_xpos+shadow, ypos+shadow, + (unsigned char *)format_align->center); + } + if (right_width != 0 && shadow) + { + display->putsxy(right_xpos+shadow, ypos+shadow, + (unsigned char *)format_align->right); + } + display->set_foreground(fg); + /* print aligned strings */ if (left_width != 0) {