summaryrefslogtreecommitdiff
path: root/apps/gui/statusbar-skinned.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui/statusbar-skinned.c')
-rw-r--r--apps/gui/statusbar-skinned.c152
1 files changed, 152 insertions, 0 deletions
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}