1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2008 by Jonathan Gordon
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
25 #include "lcd-remote.h"
34 #include "statusbar.h"
35 #include "screen_access.h"
36 #include "appevents.h"
41 #define LINE_SEL_FROM_SETTINGS(vp) \
43 vp->lss_pattern = global_settings.lss_color; \
44 vp->lse_pattern = global_settings.lse_color; \
45 vp->lst_pattern = global_settings.lst_color; \
48 #define LINE_SEL_FROM_SETTINGS(vp)
52 #define FG_FALLBACK global_settings.fg_color
53 #define BG_FALLBACK global_settings.bg_color
55 #define FG_FALLBACK LCD_DEFAULT_FG
56 #define BG_FALLBACK LCD_DEFAULT_FG
59 static int statusbar_enabled
= 0;
61 int viewport_get_nb_lines(struct viewport
*vp
)
63 #ifdef HAVE_LCD_BITMAP
64 return vp
->height
/font_get(vp
->font
)->height
;
71 static bool showing_bars(enum screen_type screen
)
73 if (statusbar_enabled
& VP_SB_ONSCREEN(screen
))
75 #ifdef HAVE_LCD_BITMAP
76 bool ignore
= statusbar_enabled
& VP_SB_IGNORE_SETTING(screen
);
77 return ignore
|| (statusbar_position(screen
));
85 void viewport_set_defaults(struct viewport
*vp
, enum screen_type screen
)
88 vp
->width
= screens
[screen
].lcdwidth
;
90 #ifdef HAVE_LCD_BITMAP
91 vp
->drawmode
= DRMODE_SOLID
;
92 vp
->font
= FONT_UI
; /* default to UI to discourage SYSFONT use */
94 vp
->height
= screens
[screen
].lcdheight
;
95 if (statusbar_position(screen
) != STATUSBAR_BOTTOM
&& showing_bars(screen
))
96 vp
->y
= STATUSBAR_HEIGHT
;
102 vp
->height
= screens
[screen
].lcdheight
- (showing_bars(screen
)?STATUSBAR_HEIGHT
:0);
105 #ifdef HAVE_REMOTE_LCD
106 /* We only need this test if there is a remote LCD */
107 if (screen
== SCREEN_MAIN
)
110 vp
->fg_pattern
= FG_FALLBACK
;
111 vp
->bg_pattern
= BG_FALLBACK
;
112 LINE_SEL_FROM_SETTINGS(vp
);
116 #if defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1
117 if (screen
== SCREEN_REMOTE
)
119 vp
->fg_pattern
= LCD_REMOTE_DEFAULT_FG
;
120 vp
->bg_pattern
= LCD_REMOTE_DEFAULT_BG
;
126 int viewportmanager_set_statusbar(int enabled
)
128 int old
= statusbar_enabled
;
129 statusbar_enabled
= enabled
;
136 gui_statusbar_draw(&statusbars
.statusbars
[i
], true);
138 add_event(GUI_EVENT_ACTIONUPDATE
, false, viewportmanager_draw_statusbars
);
142 remove_event(GUI_EVENT_ACTIONUPDATE
, viewportmanager_draw_statusbars
);
147 void viewportmanager_draw_statusbars(void* data
)
154 gui_statusbar_draw(&statusbars
.statusbars
[i
], (bool)data
);
158 void viewportmanager_statusbar_changed(void* data
)
161 statusbar_enabled
= 0;
162 if (global_settings
.statusbar
!= STATUSBAR_OFF
)
163 statusbar_enabled
= VP_SB_ONSCREEN(SCREEN_MAIN
);
164 #ifdef HAVE_REMOTE_LCD
165 if (global_settings
.remote_statusbar
!= STATUSBAR_OFF
)
166 statusbar_enabled
|= VP_SB_ONSCREEN(SCREEN_REMOTE
);
168 viewportmanager_set_statusbar(statusbar_enabled
);
171 #ifdef HAVE_LCD_BITMAP
172 const char* viewport_parse_viewport(struct viewport
*vp
,
173 enum screen_type screen
,
175 const char separator
)
177 /* parse the list to the viewport struct */
178 const char *ptr
= bufptr
;
192 /* Work out the depth of this display */
193 depth
= screens
[screen
].depth
;
194 #ifdef HAVE_LCD_COLOR
197 if (!(ptr
= parse_list("dddddcc", &set
, separator
, ptr
, &vp
->x
, &vp
->y
, &vp
->width
,
198 &vp
->height
, &vp
->font
, &vp
->fg_pattern
,&vp
->bg_pattern
)))
203 #if (LCD_DEPTH == 2) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH == 2)
205 if (!(ptr
= parse_list("dddddgg", &set
, separator
, ptr
, &vp
->x
, &vp
->y
, &vp
->width
,
206 &vp
->height
, &vp
->font
, &vp
->fg_pattern
, &vp
->bg_pattern
)))
211 #if (LCD_DEPTH == 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH == 1)
214 if (!(ptr
= parse_list("ddddd", &set
, separator
, ptr
, &vp
->x
, &vp
->y
, &vp
->width
,
215 &vp
->height
, &vp
->font
)))
222 /* X and Y *must* be set */
223 if (!LIST_VALUE_PARSED(set
, PL_X
) || !LIST_VALUE_PARSED(set
, PL_Y
))
227 if (!LIST_VALUE_PARSED(set
, PL_WIDTH
))
228 vp
->width
= screens
[screen
].lcdwidth
- vp
->x
;
229 if (!LIST_VALUE_PARSED(set
, PL_HEIGHT
))
230 vp
->height
= screens
[screen
].lcdheight
- vp
->y
;
232 #if LCD_DEPTH > 1 || LCD_REMOTE_DEPTH > 1
233 if (!LIST_VALUE_PARSED(set
, PL_FG
))
234 vp
->fg_pattern
= FG_FALLBACK
;
235 if (!LIST_VALUE_PARSED(set
, PL_BG
))
236 vp
->bg_pattern
= BG_FALLBACK
;
237 #endif /* LCD_DEPTH > 1 || LCD_REMOTE_DEPTH > 1 */
239 LINE_SEL_FROM_SETTINGS(vp
);
241 /* Validate the viewport dimensions - we know that the numbers are
242 non-negative integers, ignore bars and assume the viewport takes them
244 if ((vp
->x
>= screens
[screen
].lcdwidth
) ||
245 ((vp
->x
+ vp
->width
) > screens
[screen
].lcdwidth
) ||
246 (vp
->y
>= screens
[screen
].lcdheight
) ||
247 ((vp
->y
+ vp
->height
) > screens
[screen
].lcdheight
))
252 /* Default to using the user font if the font was an invalid number or '-'*/
253 if (((vp
->font
!= FONT_SYSFIXED
) && (vp
->font
!= FONT_UI
))
254 || !LIST_VALUE_PARSED(set
, PL_FONT
)
258 vp
->drawmode
= DRMODE_SOLID
;
263 #endif /* HAVE_LCD_BITMAP */