1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
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) {