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"
40 /*some short cuts for fg/bg/line selector handling */
42 #define LINE_SEL_FROM_SETTINGS(vp) \
44 vp->lss_pattern = global_settings.lss_color; \
45 vp->lse_pattern = global_settings.lse_color; \
46 vp->lst_pattern = global_settings.lst_color; \
48 #define FG_FALLBACK global_settings.fg_color
49 #define BG_FALLBACK global_settings.bg_color
51 /* mono/greyscale doesn't have most of the above */
52 #define LINE_SEL_FROM_SETTINGS(vp)
53 #define FG_FALLBACK LCD_DEFAULT_FG
54 #define BG_FALLBACK LCD_DEFAULT_BG
57 static int statusbar_enabled
= 0;
59 int viewport_get_nb_lines(struct viewport
*vp
)
61 #ifdef HAVE_LCD_BITMAP
62 return vp
->height
/font_get(vp
->font
)->height
;
69 static bool showing_bars(enum screen_type screen
)
71 if (statusbar_enabled
& VP_SB_ONSCREEN(screen
))
73 #ifdef HAVE_LCD_BITMAP
74 bool ignore
= statusbar_enabled
& VP_SB_IGNORE_SETTING(screen
);
75 return ignore
|| (statusbar_position(screen
));
83 void viewport_set_defaults(struct viewport
*vp
, enum screen_type screen
)
86 vp
->width
= screens
[screen
].lcdwidth
;
88 #ifdef HAVE_LCD_BITMAP
89 vp
->drawmode
= DRMODE_SOLID
;
90 vp
->font
= FONT_UI
; /* default to UI to discourage SYSFONT use */
92 vp
->height
= screens
[screen
].lcdheight
;
93 if (statusbar_position(screen
) != STATUSBAR_BOTTOM
&& showing_bars(screen
))
94 vp
->y
= STATUSBAR_HEIGHT
;
100 vp
->height
= screens
[screen
].lcdheight
- (showing_bars(screen
)?STATUSBAR_HEIGHT
:0);
103 #ifdef HAVE_REMOTE_LCD
104 /* We only need this test if there is a remote LCD */
105 if (screen
== SCREEN_MAIN
)
108 vp
->fg_pattern
= FG_FALLBACK
;
109 vp
->bg_pattern
= BG_FALLBACK
;
110 LINE_SEL_FROM_SETTINGS(vp
);
114 #if defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1
115 if (screen
== SCREEN_REMOTE
)
117 vp
->fg_pattern
= LCD_REMOTE_DEFAULT_FG
;
118 vp
->bg_pattern
= LCD_REMOTE_DEFAULT_BG
;
124 int viewportmanager_set_statusbar(int enabled
)
126 int old
= statusbar_enabled
;
127 statusbar_enabled
= enabled
;
134 gui_statusbar_draw(&statusbars
.statusbars
[i
], true);
136 add_event(GUI_EVENT_ACTIONUPDATE
, false, viewportmanager_draw_statusbars
);
140 remove_event(GUI_EVENT_ACTIONUPDATE
, viewportmanager_draw_statusbars
);
145 void viewportmanager_draw_statusbars(void* data
)
152 gui_statusbar_draw(&statusbars
.statusbars
[i
], (bool)data
);
156 void viewportmanager_statusbar_changed(void* data
)
159 statusbar_enabled
= 0;
160 if (global_settings
.statusbar
!= STATUSBAR_OFF
)
161 statusbar_enabled
= VP_SB_ONSCREEN(SCREEN_MAIN
);
162 #ifdef HAVE_REMOTE_LCD
163 if (global_settings
.remote_statusbar
!= STATUSBAR_OFF
)
164 statusbar_enabled
|= VP_SB_ONSCREEN(SCREEN_REMOTE
);
166 viewportmanager_set_statusbar(statusbar_enabled
);
169 #ifdef HAVE_LCD_COLOR
170 #define ARG_STRING(_depth) ((_depth) == 2 ? "dddddgg":"dddddcc")
172 #define ARG_STRING(_depth) "dddddgg"
175 #ifdef HAVE_LCD_BITMAP
176 const char* viewport_parse_viewport(struct viewport
*vp
,
177 enum screen_type screen
,
179 const char separator
)
181 /* parse the list to the viewport struct */
182 const char *ptr
= bufptr
;
196 /* Work out the depth of this display */
197 depth
= screens
[screen
].depth
;
198 #if (LCD_DEPTH == 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH == 1)
201 if (!(ptr
= parse_list("ddddd", &set
, separator
, ptr
,
202 &vp
->x
, &vp
->y
, &vp
->width
, &vp
->height
, &vp
->font
)))
207 #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1)
210 if (!(ptr
= parse_list(ARG_STRING(depth
), &set
, separator
, ptr
,
211 &vp
->x
, &vp
->y
, &vp
->width
, &vp
->height
, &vp
->font
,
212 &vp
->fg_pattern
,&vp
->bg_pattern
)))
220 /* X and Y *must* be set */
221 if (!LIST_VALUE_PARSED(set
, PL_X
) || !LIST_VALUE_PARSED(set
, PL_Y
))
225 if (!LIST_VALUE_PARSED(set
, PL_WIDTH
))
226 vp
->width
= screens
[screen
].lcdwidth
- vp
->x
;
227 if (!LIST_VALUE_PARSED(set
, PL_HEIGHT
))
228 vp
->height
= screens
[screen
].lcdheight
- vp
->y
;
230 #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1)
231 if (!LIST_VALUE_PARSED(set
, PL_FG
))
232 vp
->fg_pattern
= FG_FALLBACK
;
233 if (!LIST_VALUE_PARSED(set
, PL_BG
))
234 vp
->bg_pattern
= BG_FALLBACK
;
235 #endif /* LCD_DEPTH > 1 || LCD_REMOTE_DEPTH > 1 */
237 LINE_SEL_FROM_SETTINGS(vp
);
239 /* Validate the viewport dimensions - we know that the numbers are
240 non-negative integers, ignore bars and assume the viewport takes them
242 if ((vp
->x
>= screens
[screen
].lcdwidth
) ||
243 ((vp
->x
+ vp
->width
) > screens
[screen
].lcdwidth
) ||
244 (vp
->y
>= screens
[screen
].lcdheight
) ||
245 ((vp
->y
+ vp
->height
) > screens
[screen
].lcdheight
))
250 /* Default to using the user font if the font was an invalid number or '-'*/
251 if (((vp
->font
!= FONT_SYSFIXED
) && (vp
->font
!= FONT_UI
))
252 || !LIST_VALUE_PARSED(set
, PL_FONT
)
256 /* Set the defaults for fields not user-specified */
257 vp
->drawmode
= DRMODE_SOLID
;
262 #endif /* HAVE_LCD_BITMAP */