diff options
Diffstat (limited to 'apps/gui/viewport.c')
-rw-r--r-- | apps/gui/viewport.c | 169 |
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 | ||
57 | static int statusbar_enabled = 0; | 57 | static int statusbar_enabled = 0; |
58 | 58 | ||
59 | #ifdef HAVE_LCD_BITMAP | ||
60 | |||
61 | static struct { | ||
62 | struct viewport* vp; | ||
63 | int active; | ||
64 | } ui_vp_info; | ||
65 | |||
66 | static struct viewport custom_vp[NB_SCREENS]; | ||
67 | |||
68 | /* callbacks for GUI_EVENT_* events */ | ||
69 | static void viewportmanager_ui_vp_changed(void *param); | ||
70 | static void statusbar_toggled(void* param); | ||
71 | static int viewport_init_ui_vp(void); | ||
72 | #endif | ||
73 | static void viewportmanager_redraw(void* data); | ||
74 | |||
59 | int viewport_get_nb_lines(struct viewport *vp) | 75 | int 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 | ||
83 | void viewport_set_defaults(struct viewport *vp, enum screen_type screen) | 99 | void 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 | ||
139 | void 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 | |||
149 | void 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 | |||
159 | int viewportmanager_get_statusbar(void) | ||
160 | { | ||
161 | return statusbar_enabled; | ||
162 | } | ||
123 | 163 | ||
124 | int viewportmanager_set_statusbar(int enabled) | 164 | int 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 | ||
145 | void viewportmanager_draw_statusbars(void* data) | 185 | static 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 | ||
156 | void viewportmanager_statusbar_changed(void* data) | 197 | static 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 | |||
205 | void 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 | |||
241 | static 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 | |||
260 | void 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 | |||
268 | struct 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 | ||
176 | const char* viewport_parse_viewport(struct viewport *vp, | 279 | const 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 | */ | ||
372 | static 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 */ |