summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/gui/skin_engine/skin_display.c6
-rw-r--r--apps/gui/skin_engine/wps_internals.h20
-rw-r--r--apps/gui/statusbar-skinned.c47
-rw-r--r--apps/gui/wps.c37
4 files changed, 72 insertions, 38 deletions
diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c
index 66675ce..13751a9 100644
--- a/apps/gui/skin_engine/skin_display.c
+++ b/apps/gui/skin_engine/skin_display.c
@@ -100,9 +100,9 @@ bool skin_update(struct gui_wps *gwps, unsigned int update_type)
* called from. This is also safe for skined screen which dont use the id3 */
struct mp3entry *id3 = gwps->state->id3;
bool cuesheet_update = (id3 != NULL ? cuesheet_subtrack_changed(id3) : false);
- gwps->state->do_full_update = cuesheet_update || gwps->state->do_full_update;
+ gwps->sync_data->do_full_update |= cuesheet_update;
- retval = skin_redraw(gwps, gwps->state->do_full_update ?
+ retval = skin_redraw(gwps, gwps->sync_data->do_full_update ?
WPS_REFRESH_ALL : update_type);
return retval;
}
@@ -1145,7 +1145,7 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
if (refresh_mode & WPS_REFRESH_STATUSBAR)
{
- viewportmanager_set_statusbar(*gwps->statusbars);
+ viewportmanager_set_statusbar(gwps->sync_data->statusbars);
}
/* Restore the default viewport */
display->set_viewport(NULL);
diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h
index 3dbf4e0..1fd6864 100644
--- a/apps/gui/skin_engine/wps_internals.h
+++ b/apps/gui/skin_engine/wps_internals.h
@@ -296,9 +296,19 @@ struct wps_state
bool wps_time_countup;
struct mp3entry* id3;
struct mp3entry* nid3;
- bool do_full_update;
};
+/* Holds data for all screens in a skin. */
+struct wps_sync_data
+{
+ /* suitable for the viewportmanager, possibly only temporary here
+ * needs to be same for all screens! can't be split up for screens
+ * due to what viewportmanager_set_statusbar() accepts
+ * (FIXME?) */
+ int statusbars;
+ /* indicates whether the skin needs a full update for all screens */
+ bool do_full_update;
+};
/* change the ff/rew-status
if ff_rew = true then we are in skipping mode
@@ -318,12 +328,8 @@ struct gui_wps
struct screen *display;
struct wps_data *data;
struct wps_state *state;
-
- /* suitable for the viewportmanager, possibly only temporary here
- * needs to be same for all screens! can't be split up for screens
- * due to what viewportmanager_set_statusbar() accepts
- * (FIXME?) */
- int *statusbars;
+ /* must point to the same struct for all screens */
+ struct wps_sync_data *sync_data;
};
/* gui_wps end */
diff --git a/apps/gui/statusbar-skinned.c b/apps/gui/statusbar-skinned.c
index 1cb6aa3..e28782d 100644
--- a/apps/gui/statusbar-skinned.c
+++ b/apps/gui/statusbar-skinned.c
@@ -38,6 +38,7 @@
extern struct wps_state wps_state; /* from wps.c */
static struct gui_wps sb_skin[NB_SCREENS] = {{ .data = NULL }};
static struct wps_data sb_skin_data[NB_SCREENS] = {{ .wps_loaded = 0 }};
+static struct wps_sync_data sb_skin_sync_data = { .do_full_update = false };
/* initial setup of wps_data */
static void sb_skin_update(void*);
@@ -87,9 +88,22 @@ inline bool sb_skin_get_state(enum screen_type screen)
return loaded_ok[screen] && (skinbars & VP_SB_ONSCREEN(screen));
}
+
+static void do_update_callback(void *param)
+{
+ (void)param;
+ /* the WPS handles changing the actual id3 data in the id3 pointers
+ * we imported, we just want a full update */
+ sb_skin_sync_data.do_full_update = true;
+ /* force timeout in wps main loop, so that the update is instantly */
+ queue_post(&button_queue, BUTTON_NONE, 0);
+}
+
+
void sb_skin_set_state(int state, enum screen_type screen)
{
- sb_skin[screen].state->do_full_update = true;
+ sb_skin[screen].sync_data->do_full_update = true;
+ skinbars = sb_skin[screen].sync_data->statusbars;
if (state)
{
skinbars |= VP_SB_ONSCREEN(screen);
@@ -100,28 +114,45 @@ void sb_skin_set_state(int state, enum screen_type screen)
}
if (skinbars)
+ {
+#if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP)
+ add_event(LCD_EVENT_ACTIVATION, false, do_update_callback);
+#endif
add_event(GUI_EVENT_ACTIONUPDATE, false, sb_skin_update);
+ }
else
+ {
+#if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP)
+ add_event(LCD_EVENT_ACTIVATION, false, do_update_callback);
+#endif
remove_event(GUI_EVENT_ACTIONUPDATE, sb_skin_update);
+ }
+
+ sb_skin[screen].sync_data->statusbars = skinbars;
}
static void sb_skin_update(void* param)
{
static long next_update = 0;
int i;
- int forced_draw = param || sb_skin[SCREEN_MAIN].state->do_full_update;
+ int forced_draw = param || sb_skin[SCREEN_MAIN].sync_data->do_full_update;
if (TIME_AFTER(current_tick, next_update) || forced_draw)
{
FOR_NB_SCREENS(i)
{
if (sb_skin_get_state(i))
{
- skin_update(&sb_skin[i], forced_draw?
- WPS_REFRESH_ALL : WPS_REFRESH_NON_STATIC);
+#if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP)
+ /* currently, all remotes are readable without backlight
+ * so still update those */
+ if (lcd_active() || (i != SCREEN_MAIN))
+#endif
+ skin_update(&sb_skin[i], forced_draw?
+ WPS_REFRESH_ALL : WPS_REFRESH_NON_STATIC);
}
}
next_update = current_tick + update_delay; /* don't update too often */
- sb_skin[SCREEN_MAIN].state->do_full_update = false;
+ sb_skin[SCREEN_MAIN].sync_data->do_full_update = false;
}
}
@@ -130,6 +161,7 @@ void sb_skin_set_update_delay(int delay)
update_delay = delay;
}
+
void sb_skin_init(void)
{
int i;
@@ -147,6 +179,9 @@ void sb_skin_init(void)
/* Currently no seperate wps_state needed/possible
so use the only available ( "global" ) one */
sb_skin[i].state = &wps_state;
- sb_skin[i].statusbars = &skinbars;
+ sb_skin_sync_data.statusbars = VP_SB_HIDE_ALL;
+ sb_skin[i].sync_data = &sb_skin_sync_data;
}
+ add_event(PLAYBACK_EVENT_TRACK_CHANGE, false, do_update_callback);
+ add_event(PLAYBACK_EVENT_NEXTTRACKID3_AVAILABLE, false, do_update_callback);
}
diff --git a/apps/gui/wps.c b/apps/gui/wps.c
index 6d9d844..8d1a0b9 100644
--- a/apps/gui/wps.c
+++ b/apps/gui/wps.c
@@ -78,13 +78,11 @@
/* 3% of 30min file == 54s step size */
#define MIN_FF_REWIND_STEP 500
-/* this is for the viewportmanager */
-static int wpsbars = 0;
-
/* currently only one wps_state is needed, initialize to 0 */
- struct wps_state wps_state = { .id3 = NULL };
+ struct wps_state wps_state = { .id3 = NULL };
static struct gui_wps gui_wps[NB_SCREENS] = {{ .data = NULL }};
static struct wps_data wps_datas[NB_SCREENS] = {{ .wps_loaded = 0 }};
+static struct wps_sync_data wps_sync_data = { .do_full_update = false };
/* initial setup of wps_data */
static void wps_state_init(void);
@@ -565,7 +563,7 @@ static void play_hop(int direction)
static void wps_lcd_activation_hook(void *param)
{
(void)param;
- wps_state.do_full_update = true;
+ wps_sync_data.do_full_update = true;
/* force timeout in wps main loop, so that the update is instantly */
queue_post(&button_queue, BUTTON_NONE, 0);
}
@@ -1127,7 +1125,7 @@ long gui_wps_show(void)
/* this case is used by the softlock feature
* it requests a full update here */
case ACTION_REDRAW:
- wps_state.do_full_update = true;
+ wps_sync_data.do_full_update = true;
break;
case ACTION_NONE: /* Timeout, do a partial update */
update = true;
@@ -1157,7 +1155,7 @@ long gui_wps_show(void)
break;
}
- if (wps_state.do_full_update || update)
+ if (wps_sync_data.do_full_update || update)
{
#if defined(HAVE_BACKLIGHT) || defined(HAVE_REMOTE_LCD)
gwps_caption_backlight(&wps_state);
@@ -1173,13 +1171,7 @@ long gui_wps_show(void)
skin_update(&gui_wps[i], WPS_REFRESH_NON_STATIC);
}
}
- /* currently skinned statusbar and wps share the same wps_state,
- * don't steal do_full_update away */
- if (wps_state.do_full_update)
- {
- send_event(GUI_EVENT_ACTIONUPDATE, (void*)true);
- wps_state.do_full_update = false;
- }
+ wps_sync_data.do_full_update = false;
update = false;
}
@@ -1242,13 +1234,13 @@ static void track_changed_callback(void *param)
cue_find_current_track(wps_state.id3->cuesheet, wps_state.id3->elapsed);
cue_spoof_id3(wps_state.id3->cuesheet, wps_state.id3);
}
- wps_state.do_full_update = true;
+ wps_sync_data.do_full_update = true;
}
static void nextid3available_callback(void* param)
{
(void)param;
wps_state.nid3 = audio_next_track();
- wps_state.do_full_update = true;
+ wps_sync_data.do_full_update = true;
}
@@ -1267,7 +1259,7 @@ static void wps_state_init(void)
wps_state.nid3 = NULL;
}
/* We'll be updating due to restore initialized with true */
- wps_state.do_full_update = false;
+ wps_sync_data.do_full_update = false;
/* add the WPS track event callbacks */
add_event(PLAYBACK_EVENT_TRACK_CHANGE, false, track_changed_callback);
add_event(PLAYBACK_EVENT_NEXTTRACKID3_AVAILABLE, false, nextid3available_callback);
@@ -1280,7 +1272,8 @@ static void statusbar_toggle_handler(void *data)
(void)data;
int i;
- wpsbars = VP_SB_HIDE_ALL;
+ int *wpsbars = &wps_sync_data.statusbars;
+ *wpsbars = VP_SB_HIDE_ALL;
FOR_NB_SCREENS(i)
{ /* fix viewports if needed */
skin_statusbar_changed(&gui_wps[i]);
@@ -1293,7 +1286,7 @@ static void statusbar_toggle_handler(void *data)
else if (statusbar_position(i) != STATUSBAR_OFF)
draw = true;
if (draw)
- wpsbars |=
+ *wpsbars |=
(VP_SB_ONSCREEN(i) | VP_SB_IGNORE_SETTING(i));
}
}
@@ -1318,10 +1311,10 @@ void gui_sync_wps_init(void)
so use the only available ( "global" ) one */
gui_wps[i].state = &wps_state;
gui_wps[i].display->backdrop_unload(BACKDROP_SKIN_WPS);
- /* only one wpsbars needed/wanted */
- gui_wps[i].statusbars = &wpsbars;
+ /* must point to the same struct for both screens */
+ gui_wps[i].sync_data = &wps_sync_data;
+ gui_wps[i].sync_data->statusbars = VP_SB_ALLSCREENS;
}
- *(gui_wps[SCREEN_MAIN].statusbars) =VP_SB_ALLSCREENS;
#ifdef HAVE_LCD_BITMAP
add_event(GUI_EVENT_STATUSBAR_TOGGLE, false, statusbar_toggle_handler);
#endif