summaryrefslogtreecommitdiff
path: root/apps/gui/viewport.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui/viewport.c')
-rw-r--r--apps/gui/viewport.c101
1 files changed, 63 insertions, 38 deletions
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();