summaryrefslogtreecommitdiff
path: root/apps/gui
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui')
-rw-r--r--apps/gui/skin_engine/skin_display.c57
-rw-r--r--apps/gui/skin_engine/skin_engine.h2
-rw-r--r--apps/gui/skin_engine/skin_parser.c42
-rw-r--r--apps/gui/skin_engine/wps_internals.h13
-rw-r--r--apps/gui/statusbar-skinned.c152
-rw-r--r--apps/gui/statusbar-skinned.h51
-rw-r--r--apps/gui/statusbar.c3
-rw-r--r--apps/gui/statusbar.h3
-rw-r--r--apps/gui/viewport.c101
-rw-r--r--apps/gui/viewport.h20
-rw-r--r--apps/gui/wps.c26
11 files changed, 355 insertions, 115 deletions
diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c
index 8abbcddb39..66675ce95a 100644
--- a/apps/gui/skin_engine/skin_display.c
+++ b/apps/gui/skin_engine/skin_display.c
@@ -64,6 +64,7 @@
64 64
65#include "wps_internals.h" 65#include "wps_internals.h"
66#include "skin_engine.h" 66#include "skin_engine.h"
67#include "statusbar-skinned.h"
67 68
68static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode); 69static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode);
69 70
@@ -83,7 +84,6 @@ bool gui_wps_display(struct gui_wps *gwps)
83 vp->bg_pattern = display->get_background(); 84 vp->bg_pattern = display->get_background();
84 } 85 }
85#endif 86#endif
86 display->clear_display();
87 display->backdrop_show(BACKDROP_SKIN_WPS); 87 display->backdrop_show(BACKDROP_SKIN_WPS);
88 return skin_redraw(gwps, WPS_REFRESH_ALL); 88 return skin_redraw(gwps, WPS_REFRESH_ALL);
89} 89}
@@ -115,28 +115,30 @@ void skin_statusbar_changed(struct gui_wps *skin)
115 return; 115 return;
116 struct wps_data *data = skin->data; 116 struct wps_data *data = skin->data;
117 const struct screen *display = skin->display; 117 const struct screen *display = skin->display;
118 const int screen = display->screen_type;
118 119
119 struct viewport *vp = &find_viewport(VP_DEFAULT_LABEL, data)->vp; 120 struct viewport *vp = &find_viewport(VP_DEFAULT_LABEL, data)->vp;
120 viewport_set_fullscreen(vp, display->screen_type); 121 viewport_set_fullscreen(vp, screen);
121 122
122 if (data->wps_sb_tag) 123 if (data->wps_sb_tag)
123 { /* fix up the default viewport */ 124 { /* fix up the default viewport */
124 if (data->show_sb_on_wps) 125 if (data->show_sb_on_wps)
125 { 126 {
126 bool bar_at_top = 127 if (statusbar_position(screen) != STATUSBAR_OFF)
127 statusbar_position(display->screen_type) != STATUSBAR_BOTTOM; 128 return; /* vp is fixed already */
128 129
129 vp->y = bar_at_top?STATUSBAR_HEIGHT:0; 130 vp->y = STATUSBAR_HEIGHT;
130 vp->height = display->lcdheight - STATUSBAR_HEIGHT; 131 vp->height = display->lcdheight - STATUSBAR_HEIGHT;
131 } 132 }
132 else 133 else
133 { 134 {
134 vp->y = 0; 135 if (statusbar_position(screen) == STATUSBAR_OFF)
136 return; /* vp is fixed already */
137 vp->y = vp->x = 0;
135 vp->height = display->lcdheight; 138 vp->height = display->lcdheight;
139 vp->width = display->lcdwidth;
136 } 140 }
137 } 141 }
138
139
140} 142}
141 143
142static void draw_progressbar(struct gui_wps *gwps, 144static void draw_progressbar(struct gui_wps *gwps,
@@ -168,7 +170,7 @@ static void draw_progressbar(struct gui_wps *gwps,
168 elapsed = 0; 170 elapsed = 0;
169 length = 0; 171 length = 0;
170 } 172 }
171 173
172 if (pb->have_bitmap_pb) 174 if (pb->have_bitmap_pb)
173 gui_bitmap_scrollbar_draw(display, pb->bm, 175 gui_bitmap_scrollbar_draw(display, pb->bm,
174 pb->x, y, pb->width, pb->bm.height, 176 pb->x, y, pb->width, pb->bm.height,
@@ -256,7 +258,7 @@ static void wps_display_images(struct gui_wps *gwps, struct viewport* vp)
256 } 258 }
257#ifdef HAVE_ALBUMART 259#ifdef HAVE_ALBUMART
258 /* now draw the AA */ 260 /* now draw the AA */
259 if (data->albumart && data->albumart->vp == vp 261 if (data->albumart && data->albumart->vp == vp
260 && data->albumart->draw) 262 && data->albumart->draw)
261 { 263 {
262 draw_album_art(gwps, playback_current_aa_hid(data->playback_aa_slot), 264 draw_album_art(gwps, playback_current_aa_hid(data->playback_aa_slot),
@@ -496,6 +498,7 @@ static bool evaluate_conditional(struct gui_wps *gwps, int *token_index)
496 498
497 return true; 499 return true;
498} 500}
501
499#ifdef HAVE_LCD_BITMAP 502#ifdef HAVE_LCD_BITMAP
500struct gui_img* find_image(char label, struct wps_data *data) 503struct gui_img* find_image(char label, struct wps_data *data)
501{ 504{
@@ -946,15 +949,19 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
946 if (refresh_mode == WPS_REFRESH_ALL) 949 if (refresh_mode == WPS_REFRESH_ALL)
947 { 950 {
948 struct skin_line *line; 951 struct skin_line *line;
952 struct skin_viewport *skin_viewport = find_viewport(VP_DEFAULT_LABEL, data);
949 953
950 display->set_viewport(&find_viewport(VP_DEFAULT_LABEL, data)->vp); 954 if (!(skin_viewport->hidden_flags & VP_NEVER_VISIBLE))
951 display->clear_viewport(); 955 {
956 display->set_viewport(&skin_viewport->vp);
957 display->clear_viewport();
958 }
952 959
953 for (viewport_list = data->viewports; 960 for (viewport_list = data->viewports;
954 viewport_list; viewport_list = viewport_list->next) 961 viewport_list; viewport_list = viewport_list->next)
955 { 962 {
956 struct skin_viewport *skin_viewport = 963 skin_viewport =
957 (struct skin_viewport *)viewport_list->token->value.data; 964 (struct skin_viewport *)viewport_list->token->value.data;
958 for(line = skin_viewport->lines; line; line = line->next) 965 for(line = skin_viewport->lines; line; line = line->next)
959 { 966 {
960 line->curr_subline = NULL; 967 line->curr_subline = NULL;
@@ -977,6 +984,10 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
977 { 984 {
978 struct skin_viewport *skin_viewport = 985 struct skin_viewport *skin_viewport =
979 (struct skin_viewport *)viewport_list->token->value.data; 986 (struct skin_viewport *)viewport_list->token->value.data;
987 if (skin_viewport->hidden_flags&VP_NEVER_VISIBLE)
988 {
989 continue;
990 }
980 if (skin_viewport->hidden_flags&VP_DRAW_HIDEABLE) 991 if (skin_viewport->hidden_flags&VP_DRAW_HIDEABLE)
981 { 992 {
982 if (skin_viewport->hidden_flags&VP_DRAW_HIDDEN) 993 if (skin_viewport->hidden_flags&VP_DRAW_HIDDEN)
@@ -992,8 +1003,11 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
992 struct skin_viewport *skin_viewport = 1003 struct skin_viewport *skin_viewport =
993 (struct skin_viewport *)viewport_list->token->value.data; 1004 (struct skin_viewport *)viewport_list->token->value.data;
994 unsigned vp_refresh_mode = refresh_mode; 1005 unsigned vp_refresh_mode = refresh_mode;
1006
995 display->set_viewport(&skin_viewport->vp); 1007 display->set_viewport(&skin_viewport->vp);
996 1008
1009 int hidden_vp = 0;
1010
997#ifdef HAVE_LCD_BITMAP 1011#ifdef HAVE_LCD_BITMAP
998 /* Set images to not to be displayed */ 1012 /* Set images to not to be displayed */
999 struct skin_token_list *imglist = data->images; 1013 struct skin_token_list *imglist = data->images;
@@ -1005,7 +1019,11 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
1005 } 1019 }
1006#endif 1020#endif
1007 /* dont redraw the viewport if its disabled */ 1021 /* dont redraw the viewport if its disabled */
1008 if ((skin_viewport->hidden_flags&VP_DRAW_HIDDEN)) 1022 if (skin_viewport->hidden_flags&VP_NEVER_VISIBLE)
1023 { /* don't draw anything into this one */
1024 vp_refresh_mode = 0; hidden_vp = true;
1025 }
1026 else if ((skin_viewport->hidden_flags&VP_DRAW_HIDDEN))
1009 { 1027 {
1010 if (!(skin_viewport->hidden_flags&VP_DRAW_WASHIDDEN)) 1028 if (!(skin_viewport->hidden_flags&VP_DRAW_WASHIDDEN))
1011 display->scroll_stop(&skin_viewport->vp); 1029 display->scroll_stop(&skin_viewport->vp);
@@ -1019,6 +1037,7 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
1019 vp_refresh_mode = WPS_REFRESH_ALL; 1037 vp_refresh_mode = WPS_REFRESH_ALL;
1020 skin_viewport->hidden_flags = VP_DRAW_HIDEABLE; 1038 skin_viewport->hidden_flags = VP_DRAW_HIDEABLE;
1021 } 1039 }
1040
1022 if (vp_refresh_mode == WPS_REFRESH_ALL) 1041 if (vp_refresh_mode == WPS_REFRESH_ALL)
1023 { 1042 {
1024 display->clear_viewport(); 1043 display->clear_viewport();
@@ -1040,7 +1059,7 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
1040 flags = line->curr_subline->line_type; 1059 flags = line->curr_subline->line_type;
1041 1060
1042 if (vp_refresh_mode == WPS_REFRESH_ALL || (flags & vp_refresh_mode) 1061 if (vp_refresh_mode == WPS_REFRESH_ALL || (flags & vp_refresh_mode)
1043 || new_subline_refresh) 1062 || new_subline_refresh || hidden_vp)
1044 { 1063 {
1045 /* get_line tells us if we need to update the line */ 1064 /* get_line tells us if we need to update the line */
1046 update_line = get_line(gwps, subline, 1065 update_line = get_line(gwps, subline,
@@ -1086,7 +1105,7 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
1086 } 1105 }
1087#endif 1106#endif
1088 1107
1089 if (update_line && 1108 if (update_line && !hidden_vp &&
1090 /* conditionals clear the line which means if the %Vd is put into the default 1109 /* conditionals clear the line which means if the %Vd is put into the default
1091 viewport there will be a blank line. 1110 viewport there will be a blank line.
1092 To get around this we dont allow any actual drawing to happen in the 1111 To get around this we dont allow any actual drawing to happen in the
@@ -1105,7 +1124,6 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
1105 write_line(display, &align, line_count, false); 1124 write_line(display, &align, line_count, false);
1106 } 1125 }
1107 } 1126 }
1108
1109#ifdef HAVE_LCD_BITMAP 1127#ifdef HAVE_LCD_BITMAP
1110 /* progressbar */ 1128 /* progressbar */
1111 if (vp_refresh_mode & WPS_REFRESH_PLAYER_PROGRESS) 1129 if (vp_refresh_mode & WPS_REFRESH_PLAYER_PROGRESS)
@@ -1116,7 +1134,8 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
1116 } 1134 }
1117 } 1135 }
1118 /* Now display any images in this viewport */ 1136 /* Now display any images in this viewport */
1119 wps_display_images(gwps, &skin_viewport->vp); 1137 if (!hidden_vp)
1138 wps_display_images(gwps, &skin_viewport->vp);
1120#endif 1139#endif
1121 } 1140 }
1122 1141
diff --git a/apps/gui/skin_engine/skin_engine.h b/apps/gui/skin_engine/skin_engine.h
index c52f720d06..704a7851c2 100644
--- a/apps/gui/skin_engine/skin_engine.h
+++ b/apps/gui/skin_engine/skin_engine.h
@@ -27,7 +27,6 @@
27 27
28#include "wps_internals.h" /* TODO: remove this line.. shoudlnt be needed */ 28#include "wps_internals.h" /* TODO: remove this line.. shoudlnt be needed */
29 29
30
31#ifdef HAVE_TOUCHSCREEN 30#ifdef HAVE_TOUCHSCREEN
32int wps_get_touchaction(struct wps_data *data); 31int wps_get_touchaction(struct wps_data *data);
33#endif 32#endif
@@ -44,7 +43,6 @@ bool skin_update(struct gui_wps *gwps, unsigned int update_type);
44 * or from a skinfile (isfile = true) 43 * or from a skinfile (isfile = true)
45 */ 44 */
46bool skin_data_load(struct wps_data *wps_data, 45bool skin_data_load(struct wps_data *wps_data,
47 struct screen *display,
48 const char *buf, 46 const char *buf,
49 bool isfile); 47 bool isfile);
50 48
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index fa35ed994f..434e7c9fa5 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -683,8 +683,15 @@ static int parse_viewport(const char *wps_bufptr,
683 curr_line = NULL; 683 curr_line = NULL;
684 if (!skin_start_new_line(skin_vp, wps_data->num_tokens)) 684 if (!skin_start_new_line(skin_vp, wps_data->num_tokens))
685 return WPS_ERROR_INVALID_PARAM; 685 return WPS_ERROR_INVALID_PARAM;
686 686
687 if (*ptr == 'l') 687
688 if (*ptr == 'i')
689 {
690 skin_vp->label = VP_INFO_LABEL;
691 skin_vp->hidden_flags = VP_NEVER_VISIBLE;
692 ++ptr;
693 }
694 else if (*ptr == 'l')
688 { 695 {
689 if (*(ptr+1) == '|') 696 if (*(ptr+1) == '|')
690 { 697 {
@@ -1674,7 +1681,6 @@ static bool load_skin_bmp(struct wps_data *wps_data, struct bitmap *bitmap, char
1674 else 1681 else
1675 { 1682 {
1676 /* Abort if we can't load an image */ 1683 /* Abort if we can't load an image */
1677 DEBUGF("ERR: Failed to load image - %s\n",img_path);
1678 loaded = false; 1684 loaded = false;
1679 } 1685 }
1680 return loaded; 1686 return loaded;
@@ -1733,7 +1739,6 @@ static bool load_skin_bitmaps(struct wps_data *wps_data, char *bmpdir)
1733/* to setup up the wps-data from a format-buffer (isfile = false) 1739/* to setup up the wps-data from a format-buffer (isfile = false)
1734 from a (wps-)file (isfile = true)*/ 1740 from a (wps-)file (isfile = true)*/
1735bool skin_data_load(struct wps_data *wps_data, 1741bool skin_data_load(struct wps_data *wps_data,
1736 struct screen *display,
1737 const char *buf, 1742 const char *buf,
1738 bool isfile) 1743 bool isfile)
1739{ 1744{
@@ -1755,6 +1760,7 @@ bool skin_data_load(struct wps_data *wps_data,
1755 1760
1756 skin_data_reset(wps_data); 1761 skin_data_reset(wps_data);
1757 1762
1763 /* alloc default viewport, will be fixed up later */
1758 curr_vp = skin_buffer_alloc(sizeof(struct skin_viewport)); 1764 curr_vp = skin_buffer_alloc(sizeof(struct skin_viewport));
1759 if (!curr_vp) 1765 if (!curr_vp)
1760 return false; 1766 return false;
@@ -1766,9 +1772,6 @@ bool skin_data_load(struct wps_data *wps_data,
1766 1772
1767 /* Initialise the first (default) viewport */ 1773 /* Initialise the first (default) viewport */
1768 curr_vp->label = VP_DEFAULT_LABEL; 1774 curr_vp->label = VP_DEFAULT_LABEL;
1769 curr_vp->vp.x = 0;
1770 curr_vp->vp.width = display->getwidth();
1771 curr_vp->vp.height = display->getheight();
1772 curr_vp->pb = NULL; 1775 curr_vp->pb = NULL;
1773 curr_vp->hidden_flags = 0; 1776 curr_vp->hidden_flags = 0;
1774 curr_vp->lines = NULL; 1777 curr_vp->lines = NULL;
@@ -1777,31 +1780,6 @@ bool skin_data_load(struct wps_data *wps_data,
1777 if (!skin_start_new_line(curr_vp, 0)) 1780 if (!skin_start_new_line(curr_vp, 0))
1778 return false; 1781 return false;
1779 1782
1780 switch (statusbar_position(display->screen_type))
1781 {
1782 case STATUSBAR_OFF:
1783 curr_vp->vp.y = 0;
1784 break;
1785 case STATUSBAR_TOP:
1786 curr_vp->vp.y = STATUSBAR_HEIGHT;
1787 curr_vp->vp.height -= STATUSBAR_HEIGHT;
1788 break;
1789 case STATUSBAR_BOTTOM:
1790 curr_vp->vp.y = 0;
1791 curr_vp->vp.height -= STATUSBAR_HEIGHT;
1792 break;
1793 }
1794#ifdef HAVE_LCD_BITMAP
1795 curr_vp->vp.font = FONT_UI;
1796 curr_vp->vp.drawmode = DRMODE_SOLID;
1797#endif
1798#if LCD_DEPTH > 1
1799 if (display->depth > 1)
1800 {
1801 curr_vp->vp.fg_pattern = display->get_foreground();
1802 curr_vp->vp.bg_pattern = display->get_background();
1803 }
1804#endif
1805 if (!isfile) 1783 if (!isfile)
1806 { 1784 {
1807 return wps_parse(wps_data, buf, false); 1785 return wps_parse(wps_data, buf, false);
diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h
index e0e2882556..3dbf4e0087 100644
--- a/apps/gui/skin_engine/wps_internals.h
+++ b/apps/gui/skin_engine/wps_internals.h
@@ -191,11 +191,14 @@ struct skin_line {
191 struct skin_line *next; 191 struct skin_line *next;
192}; 192};
193 193
194#define VP_DRAW_HIDEABLE 0x1 194#define VP_DRAW_HIDEABLE 0x1
195#define VP_DRAW_HIDDEN 0x2 195#define VP_DRAW_HIDDEN 0x2
196#define VP_DRAW_WASHIDDEN 0x4 196#define VP_DRAW_WASHIDDEN 0x4
197#define VP_DEFAULT_LABEL '|' 197/* these are never drawn, nor cleared, i.e. just ignored */
198#define VP_NO_LABEL '-' 198#define VP_NEVER_VISIBLE 0x8
199#define VP_DEFAULT_LABEL '|'
200#define VP_NO_LABEL '-'
201#define VP_INFO_LABEL '_'
199struct skin_viewport { 202struct skin_viewport {
200 struct viewport vp; /* The LCD viewport struct */ 203 struct viewport vp; /* The LCD viewport struct */
201 struct progressbar *pb; 204 struct progressbar *pb;
diff --git a/apps/gui/statusbar-skinned.c b/apps/gui/statusbar-skinned.c
new file mode 100644
index 0000000000..1cb6aa3623
--- /dev/null
+++ b/apps/gui/statusbar-skinned.c
@@ -0,0 +1,152 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2009 Thomas Martitz
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22#include "config.h"
23
24#include "system.h"
25#include "settings.h"
26#include "appevents.h"
27#include "screens.h"
28#include "screen_access.h"
29#include "skin_engine/skin_engine.h"
30#include "skin_engine/wps_internals.h"
31#include "viewport.h"
32#include "statusbar.h"
33#include "statusbar-skinned.h"
34#include "debug.h"
35
36
37/* currently only one wps_state is needed */
38extern struct wps_state wps_state; /* from wps.c */
39static struct gui_wps sb_skin[NB_SCREENS] = {{ .data = NULL }};
40static struct wps_data sb_skin_data[NB_SCREENS] = {{ .wps_loaded = 0 }};
41
42/* initial setup of wps_data */
43static void sb_skin_update(void*);
44static bool loaded_ok[NB_SCREENS] = { false };
45static int skinbars = 0;
46static int update_delay = DEFAULT_UPDATE_DELAY;
47
48
49void sb_skin_data_load(enum screen_type screen, const char *buf, bool isfile)
50{
51 struct wps_data *data = sb_skin[screen].data;
52
53 int success;
54 success = buf && skin_data_load(data, buf, isfile);
55
56 if (success)
57 { /* hide the sb's default viewport because it has nasty effect with stuff
58 * not part of the statusbar,
59 * hence .sbs's without any other vps are unsupported*/
60 struct skin_viewport *vp = find_viewport(VP_DEFAULT_LABEL, data);
61 struct skin_token_list *next_vp = data->viewports->next;
62
63 if (!next_vp)
64 { /* no second viewport, let parsing fail */
65 success = false;
66 }
67 /* hide this viewport, forever */
68 vp->hidden_flags = VP_NEVER_VISIBLE;
69 }
70
71 if (!success)
72 remove_event(GUI_EVENT_ACTIONUPDATE, sb_skin_update);
73
74#ifdef HAVE_REMOVE_LCD
75 data->remote_wps = !(screen == SCREEN_MAIN);
76#endif
77 loaded_ok[screen] = success;
78}
79
80struct viewport *sb_skin_get_info_vp(enum screen_type screen)
81{
82 return &find_viewport(VP_INFO_LABEL, sb_skin[screen].data)->vp;
83}
84
85inline bool sb_skin_get_state(enum screen_type screen)
86{
87 return loaded_ok[screen] && (skinbars & VP_SB_ONSCREEN(screen));
88}
89
90void sb_skin_set_state(int state, enum screen_type screen)
91{
92 sb_skin[screen].state->do_full_update = true;
93 if (state)
94 {
95 skinbars |= VP_SB_ONSCREEN(screen);
96 }
97 else
98 {
99 skinbars &= ~VP_SB_ONSCREEN(screen);
100 }
101
102 if (skinbars)
103 add_event(GUI_EVENT_ACTIONUPDATE, false, sb_skin_update);
104 else
105 remove_event(GUI_EVENT_ACTIONUPDATE, sb_skin_update);
106}
107
108static void sb_skin_update(void* param)
109{
110 static long next_update = 0;
111 int i;
112 int forced_draw = param || sb_skin[SCREEN_MAIN].state->do_full_update;
113 if (TIME_AFTER(current_tick, next_update) || forced_draw)
114 {
115 FOR_NB_SCREENS(i)
116 {
117 if (sb_skin_get_state(i))
118 {
119 skin_update(&sb_skin[i], forced_draw?
120 WPS_REFRESH_ALL : WPS_REFRESH_NON_STATIC);
121 }
122 }
123 next_update = current_tick + update_delay; /* don't update too often */
124 sb_skin[SCREEN_MAIN].state->do_full_update = false;
125 }
126}
127
128void sb_skin_set_update_delay(int delay)
129{
130 update_delay = delay;
131}
132
133void sb_skin_init(void)
134{
135 int i;
136 FOR_NB_SCREENS(i)
137 {
138#ifdef HAVE_ALBUMART
139 sb_skin_data[i].albumart = NULL;
140 sb_skin_data[i].playback_aa_slot = -1;
141#endif
142#ifdef HAVE_REMOTE_LCD
143 sb_skin_data[i].remote_wps = (i == SCREEN_REMOTE);
144#endif
145 sb_skin[i].data = &sb_skin_data[i];
146 sb_skin[i].display = &screens[i];
147 /* Currently no seperate wps_state needed/possible
148 so use the only available ( "global" ) one */
149 sb_skin[i].state = &wps_state;
150 sb_skin[i].statusbars = &skinbars;
151 }
152}
diff --git a/apps/gui/statusbar-skinned.h b/apps/gui/statusbar-skinned.h
new file mode 100644
index 0000000000..7c81eb8d01
--- /dev/null
+++ b/apps/gui/statusbar-skinned.h
@@ -0,0 +1,51 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2009 Thomas Martitz
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21#ifndef __STATUSBAR_SKINNED_H__
22#define __STATUSBAR_SKINNED_H__
23
24#define DEFAULT_UPDATE_DELAY (HZ/7)
25
26#ifdef HAVE_LCD_BITMAP
27
28#include <stdio.h>
29#include <string.h>
30#include <stdlib.h>
31#include "config.h"
32
33
34void sb_skin_data_load(enum screen_type screen, const char *buf, bool isfile);
35
36/* probably temporary, to shut the classic statusbar up */
37bool sb_skin_get_state(enum screen_type screen);
38void sb_skin_set_state(int state, enum screen_type screen);
39void sb_skin_init(void);
40struct viewport *sb_skin_get_info_vp(enum screen_type screen);
41
42void sb_skin_set_update_delay(int delay);
43
44#else /* CHARCELL */
45#define sb_skin_init()
46#define sb_skin_data_load(a,b,c)
47#define sb_skin_set_update_delay(a)
48#define sb_skin_set_state(a,b)
49#define sb_skin_get_state(a)
50#endif
51#endif /* __STATUSBAR_SKINNED_H__ */
diff --git a/apps/gui/statusbar.c b/apps/gui/statusbar.c
index 5aac200157..4710ebac42 100644
--- a/apps/gui/statusbar.c
+++ b/apps/gui/statusbar.c
@@ -188,6 +188,9 @@ void gui_statusbar_draw(struct gui_statusbar * bar, bool force_redraw)
188{ 188{
189 struct screen * display = bar->display; 189 struct screen * display = bar->display;
190 190
191 if (!display)
192 return;
193
191#ifdef HAVE_LCD_CHARCELLS 194#ifdef HAVE_LCD_CHARCELLS
192 int val; 195 int val;
193 (void)force_redraw; /* The Player always has "redraw" */ 196 (void)force_redraw; /* The Player always has "redraw" */
diff --git a/apps/gui/statusbar.h b/apps/gui/statusbar.h
index 84d37858e2..b25edbfab3 100644
--- a/apps/gui/statusbar.h
+++ b/apps/gui/statusbar.h
@@ -55,7 +55,8 @@ struct status_info {
55}; 55};
56 56
57/* statusbar visibility/position, used for settings also */ 57/* statusbar visibility/position, used for settings also */
58enum statusbar_values { STATUSBAR_OFF = 0, STATUSBAR_TOP, STATUSBAR_BOTTOM }; 58enum statusbar_values { STATUSBAR_OFF = 0, STATUSBAR_TOP, STATUSBAR_BOTTOM,
59 STATUSBAR_CUSTOM };
59 60
60struct gui_statusbar 61struct gui_statusbar
61{ 62{
diff --git a/apps/gui/viewport.c b/apps/gui/viewport.c
index fdd06bdc46..f39a299521 100644
--- a/apps/gui/viewport.c
+++ b/apps/gui/viewport.c
@@ -58,6 +58,9 @@
58#ifdef HAVE_LCD_BITMAP 58#ifdef HAVE_LCD_BITMAP
59#include "language.h" 59#include "language.h"
60#endif 60#endif
61#include "statusbar-skinned.h"
62#include "debug.h"
63
61 64
62static int statusbar_enabled = 0; 65static int statusbar_enabled = 0;
63 66
@@ -93,8 +96,9 @@ static bool showing_bars(enum screen_type screen)
93 if (statusbar_enabled & VP_SB_ONSCREEN(screen)) 96 if (statusbar_enabled & VP_SB_ONSCREEN(screen))
94 { 97 {
95#ifdef HAVE_LCD_BITMAP 98#ifdef HAVE_LCD_BITMAP
96 bool ignore = statusbar_enabled & VP_SB_IGNORE_SETTING(screen); 99 int ignore;
97 return ignore || (statusbar_position(screen)); 100 ignore = statusbar_enabled & VP_SB_IGNORE_SETTING(screen);
101 return ignore || (statusbar_position(screen) != STATUSBAR_OFF);
98#else 102#else
99 return true; 103 return true;
100#endif 104#endif
@@ -109,22 +113,30 @@ void viewport_set_fullscreen(struct viewport *vp,
109 vp->width = screens[screen].lcdwidth; 113 vp->width = screens[screen].lcdwidth;
110 114
111#ifdef HAVE_LCD_BITMAP 115#ifdef HAVE_LCD_BITMAP
112 set_default_align_flags(vp); 116 struct viewport *sb_skin_vp = sb_skin_get_info_vp(screen);
113 vp->drawmode = DRMODE_SOLID; 117 if (sb_skin_vp && sb_skin_get_state(screen)
114 vp->font = FONT_UI; /* default to UI to discourage SYSFONT use */ 118 && statusbar_enabled & VP_SB_ONSCREEN(screen))
115 119 {
116 vp->height = screens[screen].lcdheight; 120 *vp = *sb_skin_vp;
117 if (statusbar_position(screen) != STATUSBAR_BOTTOM 121 }
118 && showing_bars(screen)) 122 else
119 vp->y = STATUSBAR_HEIGHT; 123 {
120 else 124 if (statusbar_position(screen) != STATUSBAR_BOTTOM && showing_bars(screen))
121 vp->y = 0; 125 vp->y = STATUSBAR_HEIGHT;
126 else
127 vp->y = 0;
122#else 128#else
123 vp->y = 0; 129 {
130 vp->y = 0;
124#endif 131#endif
125 vp->height = screens[screen].lcdheight 132 vp->height = screens[screen].lcdheight
126 - (showing_bars(screen)?STATUSBAR_HEIGHT:0); 133 - (showing_bars(screen)?STATUSBAR_HEIGHT:0);
134 }
127 135
136#ifdef HAVE_LCD_BITMAP
137 set_default_align_flags(vp);
138 vp->font = FONT_UI; /* default to UI to discourage SYSFONT use */
139 vp->drawmode = DRMODE_SOLID;
128#if LCD_DEPTH > 1 140#if LCD_DEPTH > 1
129#ifdef HAVE_REMOTE_LCD 141#ifdef HAVE_REMOTE_LCD
130 /* We only need this test if there is a remote LCD */ 142 /* We only need this test if there is a remote LCD */
@@ -144,7 +156,7 @@ void viewport_set_fullscreen(struct viewport *vp,
144 vp->bg_pattern = LCD_REMOTE_DEFAULT_BG; 156 vp->bg_pattern = LCD_REMOTE_DEFAULT_BG;
145 } 157 }
146#endif 158#endif
147 159#endif
148} 160}
149 161
150void viewport_set_defaults(struct viewport *vp, 162void viewport_set_defaults(struct viewport *vp,
@@ -180,21 +192,29 @@ int viewportmanager_get_statusbar(void)
180int viewportmanager_set_statusbar(const int enabled) 192int viewportmanager_set_statusbar(const int enabled)
181{ 193{
182 int old = statusbar_enabled; 194 int old = statusbar_enabled;
195 int i;
196
183 statusbar_enabled = enabled; 197 statusbar_enabled = enabled;
184 if (enabled) 198
199 FOR_NB_SCREENS(i)
185 { 200 {
186 int i; 201 if (showing_bars(i)
187 FOR_NB_SCREENS(i) 202 && statusbar_position(i) != STATUSBAR_CUSTOM)
188 { 203 {
189 if (showing_bars(i)) 204 add_event(GUI_EVENT_ACTIONUPDATE, false, viewportmanager_redraw);
190 gui_statusbar_draw(&statusbars.statusbars[i], true); 205 gui_statusbar_draw(&statusbars.statusbars[i], true);
191 } 206 }
192 add_event(GUI_EVENT_ACTIONUPDATE, false, viewportmanager_redraw); 207 else
208 remove_event(GUI_EVENT_ACTIONUPDATE, viewportmanager_redraw);
193 } 209 }
194 else 210
211#ifdef HAVE_LCD_BITMAP
212 FOR_NB_SCREENS(i)
195 { 213 {
196 remove_event(GUI_EVENT_ACTIONUPDATE, viewportmanager_redraw); 214 sb_skin_set_state(showing_bars(i)
215 && statusbar_position(i) == STATUSBAR_CUSTOM, i);
197 } 216 }
217#endif
198 return old; 218 return old;
199} 219}
200 220
@@ -204,7 +224,8 @@ static void viewportmanager_redraw(void* data)
204 224
205 FOR_NB_SCREENS(i) 225 FOR_NB_SCREENS(i)
206 { 226 {
207 if (showing_bars(i)) 227 if (showing_bars(i)
228 && statusbar_position(i) != STATUSBAR_CUSTOM)
208 gui_statusbar_draw(&statusbars.statusbars[i], NULL != data); 229 gui_statusbar_draw(&statusbars.statusbars[i], NULL != data);
209 } 230 }
210} 231}
@@ -234,11 +255,6 @@ void viewportmanager_theme_changed(const int which)
234 /* reset the ui viewport */ 255 /* reset the ui viewport */
235 FOR_NB_SCREENS(i) 256 FOR_NB_SCREENS(i)
236 ui_vp_info.active[i] = retval & BIT_N(i); 257 ui_vp_info.active[i] = retval & BIT_N(i);
237
238 if (retval != 0)
239 add_event(GUI_EVENT_REFRESH, false, viewportmanager_ui_vp_changed);
240 else
241 remove_event(GUI_EVENT_REFRESH, viewportmanager_ui_vp_changed);
242 /* and point to it */ 258 /* and point to it */
243 ui_vp_info.vp = custom_vp; 259 ui_vp_info.vp = custom_vp;
244 } 260 }
@@ -249,18 +265,14 @@ void viewportmanager_theme_changed(const int which)
249 } 265 }
250 if (which & THEME_STATUSBAR) 266 if (which & THEME_STATUSBAR)
251 { 267 {
252 statusbar_enabled = VP_SB_HIDE_ALL; 268 statusbar_enabled = 0;
253
254 FOR_NB_SCREENS(i) 269 FOR_NB_SCREENS(i)
255 { 270 {
256 if (statusbar_position(i) != STATUSBAR_OFF) 271 if (statusbar_position(i) != STATUSBAR_OFF)
257 statusbar_enabled |= VP_SB_ONSCREEN(i); 272 statusbar_enabled |= VP_SB_ONSCREEN(i);
258 } 273 }
259 274
260 if (statusbar_enabled != VP_SB_HIDE_ALL) 275 viewportmanager_set_statusbar(statusbar_enabled);
261 add_event(GUI_EVENT_ACTIONUPDATE, false, viewportmanager_redraw);
262 else
263 remove_event(GUI_EVENT_ACTIONUPDATE, viewportmanager_redraw);
264 276
265 /* reposition viewport to fit statusbar, only if not using the ui vp */ 277 /* reposition viewport to fit statusbar, only if not using the ui vp */
266 278
@@ -270,6 +282,19 @@ void viewportmanager_theme_changed(const int which)
270 viewport_set_fullscreen(&custom_vp[i], i); 282 viewport_set_fullscreen(&custom_vp[i], i);
271 } 283 }
272 } 284 }
285
286 int event_add = 0;
287 FOR_NB_SCREENS(i)
288 {
289 event_add |= ui_vp_info.active[i];
290 event_add |= (statusbar_position(i) == STATUSBAR_CUSTOM);
291 }
292
293 if (event_add)
294 add_event(GUI_EVENT_REFRESH, false, viewportmanager_ui_vp_changed);
295 else
296 remove_event(GUI_EVENT_REFRESH, viewportmanager_ui_vp_changed);
297
273 send_event(GUI_EVENT_THEME_CHANGED, NULL); 298 send_event(GUI_EVENT_THEME_CHANGED, NULL);
274} 299}
275 300
@@ -283,10 +308,10 @@ static void viewportmanager_ui_vp_changed(void *param)
283 FOR_NB_SCREENS(i) 308 FOR_NB_SCREENS(i)
284 screens[i].clear_display(); 309 screens[i].clear_display();
285 /* redraw the statusbar if it was enabled */ 310 /* redraw the statusbar if it was enabled */
286 viewportmanager_set_statusbar(statusbar_enabled); 311 send_event(GUI_EVENT_ACTIONUPDATE, (void*)true);
287 /* call the passed function which will redraw the content of 312 /* call the passed function which will redraw the content of
288 * the current screen */ 313 * the current screen */
289 if (param != NULL) 314 if (draw_func != NULL)
290 draw_func(); 315 draw_func();
291 FOR_NB_SCREENS(i) 316 FOR_NB_SCREENS(i)
292 screens[i].update(); 317 screens[i].update();
diff --git a/apps/gui/viewport.h b/apps/gui/viewport.h
index cffc7fbaef..0e5ad30f35 100644
--- a/apps/gui/viewport.h
+++ b/apps/gui/viewport.h
@@ -56,16 +56,16 @@ void viewport_set_defaults(struct viewport *vp,
56 */ 56 */
57 57
58 58
59#define THEME_STATUSBAR (BIT_N(0)) 59#define THEME_STATUSBAR (BIT_N(0))
60#define THEME_UI_VIEWPORT (BIT_N(1)) 60#define THEME_UI_VIEWPORT (BIT_N(1))
61#define THEME_BUTTONBAR (BIT_N(2)) 61#define THEME_BUTTONBAR (BIT_N(2))
62#define THEME_LANGUAGE (BIT_N(3)) 62#define THEME_LANGUAGE (BIT_N(3))
63#define THEME_ALL (~(0u)) 63#define THEME_ALL (~(0u))
64 64
65#define VP_SB_HIDE_ALL 0 65#define VP_SB_HIDE_ALL 0
66#define VP_SB_ONSCREEN(screen) BIT_N(screen) 66#define VP_SB_ONSCREEN(screen) BIT_N(screen)
67#define VP_SB_IGNORE_SETTING(screen) BIT_N(4+screen) 67#define VP_SB_IGNORE_SETTING(screen) BIT_N(4+screen)
68#define VP_SB_ALLSCREENS (VP_SB_ONSCREEN(0)|VP_SB_ONSCREEN(1)) 68#define VP_SB_ALLSCREENS (VP_SB_ONSCREEN(0)|VP_SB_ONSCREEN(1))
69 69
70#ifndef __PCTOOL__ 70#ifndef __PCTOOL__
71/* 71/*
diff --git a/apps/gui/wps.c b/apps/gui/wps.c
index a74e3d449d..11ce946e98 100644
--- a/apps/gui/wps.c
+++ b/apps/gui/wps.c
@@ -31,7 +31,6 @@
31#include "action.h" 31#include "action.h"
32#include "kernel.h" 32#include "kernel.h"
33#include "filetypes.h" 33#include "filetypes.h"
34#include "debug.h"
35#include "sprintf.h" 34#include "sprintf.h"
36#include "settings.h" 35#include "settings.h"
37#include "skin_engine/skin_engine.h" 36#include "skin_engine/skin_engine.h"
@@ -67,6 +66,7 @@
67#include "dsp.h" 66#include "dsp.h"
68#include "playlist_viewer.h" 67#include "playlist_viewer.h"
69#include "wps.h" 68#include "wps.h"
69#include "statusbar-skinned.h"
70 70
71#define RESTORE_WPS_INSTANTLY 0l 71#define RESTORE_WPS_INSTANTLY 0l
72#define RESTORE_WPS_NEXT_SECOND ((long)(HZ+current_tick)) 72#define RESTORE_WPS_NEXT_SECOND ((long)(HZ+current_tick))
@@ -82,7 +82,7 @@
82static int wpsbars = 0; 82static int wpsbars = 0;
83 83
84/* currently only one wps_state is needed, initialize to 0 */ 84/* currently only one wps_state is needed, initialize to 0 */
85static struct wps_state wps_state = { .id3 = NULL }; 85 struct wps_state wps_state = { .id3 = NULL };
86static struct gui_wps gui_wps[NB_SCREENS] = {{ .data = NULL }}; 86static struct gui_wps gui_wps[NB_SCREENS] = {{ .data = NULL }};
87static struct wps_data wps_datas[NB_SCREENS] = {{ .wps_loaded = 0 }}; 87static struct wps_data wps_datas[NB_SCREENS] = {{ .wps_loaded = 0 }};
88 88
@@ -129,8 +129,8 @@ void wps_data_load(enum screen_type screen, const char *buf, bool isfile)
129 129
130#endif /* __PCTOOL__ */ 130#endif /* __PCTOOL__ */
131 131
132 loaded_ok = buf && skin_data_load(gui_wps[screen].data, 132 loaded_ok = buf && skin_data_load(gui_wps[screen].data, buf, isfile);
133 &screens[screen], buf, isfile); 133
134 if (!loaded_ok) /* load the hardcoded default */ 134 if (!loaded_ok) /* load the hardcoded default */
135 { 135 {
136 char *skin_buf[NB_SCREENS] = { 136 char *skin_buf[NB_SCREENS] = {
@@ -153,11 +153,11 @@ void wps_data_load(enum screen_type screen, const char *buf, bool isfile)
153 "%pb\n", 153 "%pb\n",
154#endif 154#endif
155 }; 155 };
156 skin_data_load(gui_wps[screen].data, &screens[screen], 156 skin_data_load(gui_wps[screen].data, skin_buf[screen], false);
157 skin_buf[screen], false);
158 } 157 }
159#ifdef HAVE_REMOVE_LCD 158#ifdef HAVE_REMOVE_LCD
160 gui_wps[screen].data->remote_wps = !(screen == SCREEN_MAIN); 159 gui_wps[screen].data->remote_wps = !(screen == SCREEN_MAIN);
160
161#endif 161#endif
162} 162}
163 163
@@ -587,6 +587,8 @@ static void gwps_leave_wps(void)
587 /* Play safe and unregister the hook */ 587 /* Play safe and unregister the hook */
588 lcd_activation_set_hook(NULL); 588 lcd_activation_set_hook(NULL);
589#endif 589#endif
590 /* unhandle statusbar update delay */
591 sb_skin_set_update_delay(DEFAULT_UPDATE_DELAY);
590 send_event(GUI_EVENT_REFRESH, NULL); 592 send_event(GUI_EVENT_REFRESH, NULL);
591} 593}
592 594
@@ -739,7 +741,6 @@ long gui_wps_show(void)
739#endif 741#endif
740 } 742 }
741 } 743 }
742
743#ifdef HAVE_LCD_BITMAP 744#ifdef HAVE_LCD_BITMAP
744 /* when the peak meter is enabled we want to have a 745 /* when the peak meter is enabled we want to have a
745 few extra updates to make it look smooth. On the 746 few extra updates to make it look smooth. On the
@@ -1175,7 +1176,13 @@ long gui_wps_show(void)
1175 skin_update(&gui_wps[i], WPS_REFRESH_NON_STATIC); 1176 skin_update(&gui_wps[i], WPS_REFRESH_NON_STATIC);
1176 } 1177 }
1177 } 1178 }
1178 wps_state.do_full_update = false; 1179 /* currently skinned statusbar and wps share the same wps_state,
1180 * don't steal do_full_update away */
1181 if (wps_state.do_full_update)
1182 {
1183 send_event(GUI_EVENT_ACTIONUPDATE, (void*)true);
1184 wps_state.do_full_update = false;
1185 }
1179 update = false; 1186 update = false;
1180 } 1187 }
1181 1188
@@ -1188,6 +1195,9 @@ long gui_wps_show(void)
1188#if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP) 1195#if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP)
1189 lcd_activation_set_hook(wps_lcd_activation_hook); 1196 lcd_activation_set_hook(wps_lcd_activation_hook);
1190#endif 1197#endif
1198 /* we remove the update delay since it's not very usable in the wps,
1199 * e.g. during volume changing or ffwd/rewind */
1200 sb_skin_set_update_delay(0);
1191 FOR_NB_SCREENS(i) 1201 FOR_NB_SCREENS(i)
1192 { 1202 {
1193 screens[i].stop_scroll(); 1203 screens[i].stop_scroll();