diff --git a/apps/filetree.c b/apps/filetree.c
index 945b9ac..6b56c80 100644
--- a/apps/filetree.c
+++ b/apps/filetree.c
@@ -528,13 +528,9 @@ int ft_enter(struct tree_context* c)
splash(0, ID2P(LANG_WAIT));
if (!settings_load_config(buf,true))
break;
- /* do both steps seperately so that the redrawing after theme
- * changing is independant of whether the theme has a custom ui
- * vp or not */
- send_event(GUI_EVENT_REFRESH, NULL);
- /* for the statusbar */
- send_event(GUI_EVENT_ACTIONUPDATE, (void*)true);
- tree_drawlists();
+
+ /* redraw the UI in case the user setting changed apparence */
+ send_event(GUI_EVENT_REFRESH, tree_drawlists);
splash(HZ, ID2P(LANG_SETTINGS_LOADED));
break;

diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c
index 460101a..4f33910 100644
--- a/apps/gui/skin_engine/skin_display.c
+++ b/apps/gui/skin_engine/skin_display.c
@@ -58,26 +58,6 @@

static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode);

-
-/* TODO: maybe move this whole function into wps.c instead ? */
-bool gui_wps_display(struct gui_wps *gwps)
-{
- struct screen *display = gwps->display;
-
- /* Update the values in the first (default) viewport - in case the user
- has modified the statusbar or colour settings */
-#if LCD_DEPTH > 1
- if (display->depth > 1)
- {
- struct viewport *vp = &find_viewport(VP_DEFAULT_LABEL, gwps->data)->vp;
- vp->fg_pattern = display->get_foreground();
- vp->bg_pattern = display->get_background();
- }
-#endif
- display->backdrop_show(BACKDROP_SKIN_WPS);
- return skin_redraw(gwps, WPS_REFRESH_ALL);
-}
-
/* update a skinned screen, update_type is WPS_REFRESH_* values.
* Usually it should only be WPS_REFRESH_NON_STATIC
* A full update will be done if required (state.do_full_update == true)
diff --git a/apps/gui/viewport.c b/apps/gui/viewport.c
index 0a2630c..9a7cfbd 100644
--- a/apps/gui/viewport.c
+++ b/apps/gui/viewport.c
@@ -70,6 +70,7 @@ static struct viewport custom_vp[NB_SCREENS];

/* callbacks for GUI_EVENT_* events */
static void viewportmanager_ui_vp_changed(void *param);
+static void viewportmanager_call_draw_func(void *param);
static void statusbar_toggled(void* param);
static unsigned viewport_init_ui_vp(void);
#endif
@@ -215,29 +216,47 @@ void viewportmanager_theme_changed(const int which)
event_add |= (statusbar_position(i) == STATUSBAR_CUSTOM);
}

+ /* add one of those to ensure the draw function is called always */
if (event_add)
+ {
add_event(GUI_EVENT_REFRESH, false, viewportmanager_ui_vp_changed);
+ remove_event(GUI_EVENT_REFRESH, viewportmanager_call_draw_func);
+ }
else
+ {
+ add_event(GUI_EVENT_REFRESH, false, viewportmanager_call_draw_func);
remove_event(GUI_EVENT_REFRESH, viewportmanager_ui_vp_changed);
+ }

send_event(GUI_EVENT_THEME_CHANGED, NULL);
}

+/*
+ * simply calls a function that draws stuff, this exists to ensure the
+ * drawing function call in the GUI_EVENT_REFRESH event
+ *
+ * param should be 'void func(void)' */
+static void viewportmanager_call_draw_func(void *param)
+{
+ /* cast param to a function */
+ void (*draw_func)(void) = ((void(*)(void))param);
+ /* call the passed function which will redraw the content of
+ * the current screen */
+ if (draw_func != NULL)
+ draw_func();
+}
+
static void viewportmanager_ui_vp_changed(void *param)
{
/* if the user changed the theme, we need to initiate a full redraw */
int i;
- /* cast param to a function */
- void (*draw_func)(void) = ((void(*)(void))param);
/* start with clearing the screen */
FOR_NB_SCREENS(i)
screens[i].clear_display();
/* redraw the statusbar if it was enabled */
send_event(GUI_EVENT_ACTIONUPDATE, (void*)true);
- /* call the passed function which will redraw the content of
- * the current screen */
- if (draw_func != NULL)
- draw_func();
+ /* call redraw function */
+ viewportmanager_call_draw_func(param);
FOR_NB_SCREENS(i)
screens[i].update();
}
diff --git a/apps/gui/wps.c b/apps/gui/wps.c
index cc6bd60..d7c196f 100644
--- a/apps/gui/wps.c
+++ b/apps/gui/wps.c
@@ -582,6 +582,31 @@ static void gwps_leave_wps(void)
send_event(GUI_EVENT_REFRESH, NULL);
}

+/*
+ * display the wps on entering or restoring */
+static void gwps_enter_wps(void)
+{
+ int i;
+ FOR_NB_SCREENS(i)
+ {
+ struct gui_wps *gwps = &gui_wps[i];
+ struct screen *display = gwps->display;
+
+ display->stop_scroll();
+ /* Update the values in the first (default) viewport - in case the user
+ has modified the statusbar or colour settings */
+#if LCD_DEPTH > 1
+ if (display->depth > 1)
+ {
+ struct viewport *vp = &find_viewport(VP_DEFAULT_LABEL, gwps->data)->vp;
+ vp->fg_pattern = display->get_foreground();
+ vp->bg_pattern = display->get_background();
+ }
+#endif
+ skin_update(gwps, WPS_REFRESH_ALL);
+ }
+}
+
#ifdef HAVE_TOUCHSCREEN
int wps_get_touchaction(struct wps_data *data)
{
@@ -1166,10 +1191,8 @@ long gui_wps_show(void)
* e.g. during volume changing or ffwd/rewind */
sb_skin_set_update_delay(0);
FOR_NB_SCREENS(i)
- {
- screens[i].stop_scroll();
- gui_wps_display(&gui_wps[i]);
- }
+ gui_wps[i].display->backdrop_show(BACKDROP_SKIN_WPS);
+ send_event(GUI_EVENT_REFRESH, gwps_enter_wps);
}

if (exit) {