summaryrefslogtreecommitdiff
path: root/apps/gui/viewport.c
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2009-08-16 22:20:11 +0000
committerThomas Martitz <kugel@rockbox.org>2009-08-16 22:20:11 +0000
commit4c48b59be8ba41b80350d5329d0f13240229da0a (patch)
treee8cb9547c4d8d5faff39de2aef5626a5cabc689d /apps/gui/viewport.c
parentc0897a8002d493244efd69fca5c433dbafe8d5be (diff)
downloadrockbox-4c48b59be8ba41b80350d5329d0f13240229da0a.tar.gz
rockbox-4c48b59be8ba41b80350d5329d0f13240229da0a.zip
User definable UI viewport, to be able to restrict the UI into a viewport for all bitmap displays.
Flyspray: FS#8799 This will allow for pretty themes, for example those with nice glass effects on their backdrops (some might argue they're wasting screen space but it's upto them), as well as allowing for future background WPS updates in the main UI. Plugins are not converted yet, they simply use the full screen. Ideally, any plugin that does *not* want the UI viewport, should take care of that itself (i.e. plugins should normally use the UI viewport). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22365 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/gui/viewport.c')
-rw-r--r--apps/gui/viewport.c169
1 files changed, 154 insertions, 15 deletions
diff --git a/apps/gui/viewport.c b/apps/gui/viewport.c
index ef527d90cc..bb4c291cc0 100644
--- a/apps/gui/viewport.c
+++ b/apps/gui/viewport.c
@@ -56,6 +56,22 @@
56 56
57static int statusbar_enabled = 0; 57static int statusbar_enabled = 0;
58 58
59#ifdef HAVE_LCD_BITMAP
60
61static struct {
62 struct viewport* vp;
63 int active;
64} ui_vp_info;
65
66static struct viewport custom_vp[NB_SCREENS];
67
68/* callbacks for GUI_EVENT_* events */
69static void viewportmanager_ui_vp_changed(void *param);
70static void statusbar_toggled(void* param);
71static int viewport_init_ui_vp(void);
72#endif
73static void viewportmanager_redraw(void* data);
74
59int viewport_get_nb_lines(struct viewport *vp) 75int viewport_get_nb_lines(struct viewport *vp)
60{ 76{
61#ifdef HAVE_LCD_BITMAP 77#ifdef HAVE_LCD_BITMAP
@@ -78,9 +94,9 @@ static bool showing_bars(enum screen_type screen)
78#endif 94#endif
79 } 95 }
80 return false; 96 return false;
81} 97}
82 98
83void viewport_set_defaults(struct viewport *vp, enum screen_type screen) 99void viewport_set_fullscreen(struct viewport *vp, enum screen_type screen)
84{ 100{
85 vp->x = 0; 101 vp->x = 0;
86 vp->width = screens[screen].lcdwidth; 102 vp->width = screens[screen].lcdwidth;
@@ -120,6 +136,30 @@ void viewport_set_defaults(struct viewport *vp, enum screen_type screen)
120#endif 136#endif
121} 137}
122 138
139void viewport_set_defaults(struct viewport *vp, enum screen_type screen)
140{
141#ifdef HAVE_LCD_BITMAP
142 if (ui_vp_info.active)
143 *vp = custom_vp[screen];
144 else
145#endif
146 viewport_set_fullscreen(vp, screen);
147}
148
149void viewportmanager_init(void)
150{
151 viewportmanager_set_statusbar(VP_SB_ALLSCREENS);
152#ifdef HAVE_LCD_BITMAP
153 add_event(GUI_EVENT_STATUSBAR_TOGGLE, false, statusbar_toggled);
154 ui_vp_info.active = viewport_init_ui_vp();
155 ui_vp_info.vp = custom_vp;
156#endif
157}
158
159int viewportmanager_get_statusbar(void)
160{
161 return statusbar_enabled;
162}
123 163
124int viewportmanager_set_statusbar(int enabled) 164int viewportmanager_set_statusbar(int enabled)
125{ 165{
@@ -133,37 +173,101 @@ int viewportmanager_set_statusbar(int enabled)
133 if (showing_bars(i)) 173 if (showing_bars(i))
134 gui_statusbar_draw(&statusbars.statusbars[i], true); 174 gui_statusbar_draw(&statusbars.statusbars[i], true);
135 } 175 }
136 add_event(GUI_EVENT_ACTIONUPDATE, false, viewportmanager_draw_statusbars); 176 add_event(GUI_EVENT_ACTIONUPDATE, false, viewportmanager_redraw);
137 } 177 }
138 else 178 else
139 { 179 {
140 remove_event(GUI_EVENT_ACTIONUPDATE, viewportmanager_draw_statusbars); 180 remove_event(GUI_EVENT_ACTIONUPDATE, viewportmanager_redraw);
141 } 181 }
142 return old; 182 return old;
143} 183}
144 184
145void viewportmanager_draw_statusbars(void* data) 185static void viewportmanager_redraw(void* data)
146{ 186{
147 int i; 187 int i;
148 188
149 FOR_NB_SCREENS(i) 189 FOR_NB_SCREENS(i)
150 { 190 {
151 if (showing_bars(i)) 191 if (showing_bars(i))
152 gui_statusbar_draw(&statusbars.statusbars[i], (bool)data); 192 gui_statusbar_draw(&statusbars.statusbars[i], NULL != data);
153 } 193 }
154} 194}
195#ifdef HAVE_LCD_BITMAP
155 196
156void viewportmanager_statusbar_changed(void* data) 197static void statusbar_toggled(void* param)
157{ 198{
158 (void)data; 199 (void)param;
159 statusbar_enabled = 0; 200 /* update vp manager for the new setting and reposition vps
160 if (global_settings.statusbar != STATUSBAR_OFF) 201 * if necessary */
161 statusbar_enabled = VP_SB_ONSCREEN(SCREEN_MAIN); 202 viewportmanager_theme_changed(THEME_STATUSBAR);
203}
204
205void viewportmanager_theme_changed(int which)
206{
207 if (which & THEME_UI_VIEWPORT)
208 {
209 /* reset the ui viewport */
210 if ((ui_vp_info.active = viewport_init_ui_vp()))
211 add_event(GUI_EVENT_REFRESH, false, viewportmanager_ui_vp_changed);
212 else
213 remove_event(GUI_EVENT_REFRESH, viewportmanager_ui_vp_changed);
214 /* and point to it */
215 ui_vp_info.vp = custom_vp;
216 }
217 if (which & THEME_STATUSBAR)
218 {
219 statusbar_enabled = 0;
220 if (global_settings.statusbar != STATUSBAR_OFF)
221 statusbar_enabled = VP_SB_ONSCREEN(SCREEN_MAIN);
162#ifdef HAVE_REMOTE_LCD 222#ifdef HAVE_REMOTE_LCD
163 if (global_settings.remote_statusbar != STATUSBAR_OFF) 223 if (global_settings.remote_statusbar != STATUSBAR_OFF)
164 statusbar_enabled |= VP_SB_ONSCREEN(SCREEN_REMOTE); 224 statusbar_enabled |= VP_SB_ONSCREEN(SCREEN_REMOTE);
165#endif 225#endif
226 if (statusbar_enabled)
227 add_event(GUI_EVENT_ACTIONUPDATE, false, viewportmanager_redraw);
228 else
229 remove_event(GUI_EVENT_ACTIONUPDATE, viewportmanager_redraw);
230
231 /* reposition viewport to fit statusbar, only if not using the ui vp */
232 if (!ui_vp_info.active)
233 {
234 int i;
235 FOR_NB_SCREENS(i)
236 viewport_set_fullscreen(&custom_vp[i], i);
237 }
238 }
239}
240
241static void viewportmanager_ui_vp_changed(void *param)
242{
243 /* if the user changed the theme, we need to initiate a full redraw */
244 int i;
245 /* cast param to a function */
246 void (*draw_func)(void) = ((void(*)(void))param);
247 /* start with clearing the screen */
248 FOR_NB_SCREENS(i)
249 screens[i].clear_display();
250 /* redraw the statusbar if it was enabled */
166 viewportmanager_set_statusbar(statusbar_enabled); 251 viewportmanager_set_statusbar(statusbar_enabled);
252 /* call the passed function which will redraw the content of
253 * the current screen */
254 if (param != NULL)
255 draw_func();
256 FOR_NB_SCREENS(i)
257 screens[i].update();
258}
259
260void viewport_set_current_vp(struct viewport* vp)
261{
262 if (vp != NULL)
263 ui_vp_info.vp = vp;
264 else
265 ui_vp_info.vp = custom_vp;
266}
267
268struct viewport* viewport_get_current_vp(void)
269{
270 return ui_vp_info.vp;
167} 271}
168 272
169#ifdef HAVE_LCD_COLOR 273#ifdef HAVE_LCD_COLOR
@@ -172,7 +276,6 @@ void viewportmanager_statusbar_changed(void* data)
172#define ARG_STRING(_depth) "dddddgg" 276#define ARG_STRING(_depth) "dddddgg"
173#endif 277#endif
174 278
175#ifdef HAVE_LCD_BITMAP
176const char* viewport_parse_viewport(struct viewport *vp, 279const char* viewport_parse_viewport(struct viewport *vp,
177 enum screen_type screen, 280 enum screen_type screen,
178 const char *bufptr, 281 const char *bufptr,
@@ -213,9 +316,9 @@ const char* viewport_parse_viewport(struct viewport *vp,
213 return NULL; 316 return NULL;
214 } 317 }
215 else 318 else
216#undef ARG_STRING
217#endif 319#endif
218 {} 320 {}
321#undef ARG_STRING
219 322
220 /* X and Y *must* be set */ 323 /* X and Y *must* be set */
221 if (!LIST_VALUE_PARSED(set, PL_X) || !LIST_VALUE_PARSED(set, PL_Y)) 324 if (!LIST_VALUE_PARSED(set, PL_X) || !LIST_VALUE_PARSED(set, PL_Y))
@@ -259,4 +362,40 @@ const char* viewport_parse_viewport(struct viewport *vp,
259 return ptr; 362 return ptr;
260} 363}
261 364
365/*
366 * (re)parse the UI vp from the settings
367 * - Returns
368 * 0 if no UI vp is used
369 * >0 if it's used at least partly (on multiscreen targets)
370 * NB_SCREENS if all screens have a UI vp
371 */
372static int viewport_init_ui_vp(void)
373{
374 int screen, ret = NB_SCREENS;
375 FOR_NB_SCREENS(screen)
376 {
377#ifdef HAVE_REMOTE_LCD
378 if ((screen == SCREEN_REMOTE))
379 {
380 if(!(viewport_parse_viewport(&custom_vp[screen], screen,
381 global_settings.remote_ui_vp_config, ',')))
382 {
383 viewport_set_fullscreen(&custom_vp[screen], screen);
384 ret--;
385 }
386 }
387 else
388#endif
389 {
390 if (!(viewport_parse_viewport(&custom_vp[screen], screen,
391 global_settings.ui_vp_config, ',')))
392 {
393 viewport_set_fullscreen(&custom_vp[screen], screen);
394 ret--;
395 }
396 }
397 }
398 return ret;
399}
400
262#endif /* HAVE_LCD_BITMAP */ 401#endif /* HAVE_LCD_BITMAP */