mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-12-10 05:35:20 -05:00
Factor out WPS' %V parsing function into viewport.c, in preperation of customlist. No functional change.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22222 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
5aeaa84cab
commit
9bd7b23e99
3 changed files with 116 additions and 92 deletions
|
|
@ -25,6 +25,7 @@
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "plugin.h"
|
#include "plugin.h"
|
||||||
|
#include "viewport.h"
|
||||||
|
|
||||||
#ifdef __PCTOOL__
|
#ifdef __PCTOOL__
|
||||||
#ifdef WPSEDITOR
|
#ifdef WPSEDITOR
|
||||||
|
|
@ -587,26 +588,12 @@ static int parse_viewport(const char *wps_bufptr,
|
||||||
{
|
{
|
||||||
(void)token; /* Kill warnings */
|
(void)token; /* Kill warnings */
|
||||||
const char *ptr = wps_bufptr;
|
const char *ptr = wps_bufptr;
|
||||||
struct viewport* vp;
|
|
||||||
int depth;
|
const int screen =
|
||||||
uint32_t set = 0;
|
|
||||||
enum {
|
|
||||||
PL_X = 0,
|
|
||||||
PL_Y,
|
|
||||||
PL_WIDTH,
|
|
||||||
PL_HEIGHT,
|
|
||||||
PL_FONT,
|
|
||||||
PL_FG,
|
|
||||||
PL_BG,
|
|
||||||
};
|
|
||||||
int lcd_width = LCD_WIDTH, lcd_height = LCD_HEIGHT;
|
|
||||||
#ifdef HAVE_REMOTE_LCD
|
#ifdef HAVE_REMOTE_LCD
|
||||||
if (wps_data->remote_wps)
|
wps_data->remote_wps ? SCREEN_REMOTE :
|
||||||
{
|
|
||||||
lcd_width = LCD_REMOTE_WIDTH;
|
|
||||||
lcd_height = LCD_REMOTE_HEIGHT;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
SCREEN_MAIN;
|
||||||
|
|
||||||
if (wps_data->num_viewports >= WPS_MAX_VIEWPORTS)
|
if (wps_data->num_viewports >= WPS_MAX_VIEWPORTS)
|
||||||
return WPS_ERROR_INVALID_PARAM;
|
return WPS_ERROR_INVALID_PARAM;
|
||||||
|
|
@ -635,87 +622,19 @@ static int parse_viewport(const char *wps_bufptr,
|
||||||
return WPS_ERROR_INVALID_PARAM;
|
return WPS_ERROR_INVALID_PARAM;
|
||||||
|
|
||||||
ptr++;
|
ptr++;
|
||||||
vp = &wps_data->viewports[wps_data->num_viewports].vp;
|
struct viewport *vp = &wps_data->viewports[wps_data->num_viewports].vp;
|
||||||
/* format: %V|x|y|width|height|font|fg_pattern|bg_pattern| */
|
/* format: %V|x|y|width|height|font|fg_pattern|bg_pattern| */
|
||||||
|
|
||||||
/* Set the defaults for fields not user-specified */
|
/* Set the defaults for fields not user-specified */
|
||||||
vp->drawmode = DRMODE_SOLID;
|
vp->drawmode = DRMODE_SOLID;
|
||||||
|
|
||||||
/* Work out the depth of this display */
|
if (!(ptr = viewport_parse_viewport(vp, screen, ptr, '|')))
|
||||||
#ifdef HAVE_REMOTE_LCD
|
return WPS_ERROR_INVALID_PARAM;
|
||||||
depth = (wps_data->remote_wps ? LCD_REMOTE_DEPTH : LCD_DEPTH);
|
|
||||||
#else
|
|
||||||
depth = LCD_DEPTH;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_LCD_COLOR
|
|
||||||
if (depth == 16)
|
|
||||||
{
|
|
||||||
if (!(ptr = parse_list("dddddcc", &set, '|', ptr, &vp->x, &vp->y, &vp->width,
|
|
||||||
&vp->height, &vp->font, &vp->fg_pattern,&vp->bg_pattern)))
|
|
||||||
return WPS_ERROR_INVALID_PARAM;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
#if (LCD_DEPTH == 2) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH == 2)
|
|
||||||
if (depth == 2) {
|
|
||||||
/* Default to black on white */
|
|
||||||
vp->fg_pattern = 0;
|
|
||||||
vp->bg_pattern = 3;
|
|
||||||
if (!(ptr = parse_list("dddddgg", &set, '|', ptr, &vp->x, &vp->y, &vp->width,
|
|
||||||
&vp->height, &vp->font, &vp->fg_pattern, &vp->bg_pattern)))
|
|
||||||
return WPS_ERROR_INVALID_PARAM;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
#if (LCD_DEPTH == 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH == 1)
|
|
||||||
if (depth == 1)
|
|
||||||
{
|
|
||||||
if (!(ptr = parse_list("ddddd", &set, '|', ptr, &vp->x, &vp->y,
|
|
||||||
&vp->width, &vp->height, &vp->font)))
|
|
||||||
return WPS_ERROR_INVALID_PARAM;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{}
|
|
||||||
|
|
||||||
/* Check for trailing | */
|
/* Check for trailing | */
|
||||||
if (*ptr != '|')
|
if (*ptr != '|')
|
||||||
return WPS_ERROR_INVALID_PARAM;
|
return WPS_ERROR_INVALID_PARAM;
|
||||||
|
|
||||||
if (!LIST_VALUE_PARSED(set, PL_X) || !LIST_VALUE_PARSED(set, PL_Y))
|
|
||||||
return WPS_ERROR_INVALID_PARAM;
|
|
||||||
|
|
||||||
/* fix defaults */
|
|
||||||
if (!LIST_VALUE_PARSED(set, PL_WIDTH))
|
|
||||||
vp->width = lcd_width - vp->x;
|
|
||||||
if (!LIST_VALUE_PARSED(set, PL_HEIGHT))
|
|
||||||
vp->height = lcd_height - vp->y;
|
|
||||||
|
|
||||||
/* Default to using the user font if the font was an invalid number */
|
|
||||||
if (!LIST_VALUE_PARSED(set, PL_FONT) ||
|
|
||||||
((vp->font != FONT_SYSFIXED) && (vp->font != FONT_UI)))
|
|
||||||
vp->font = FONT_UI;
|
|
||||||
|
|
||||||
/* Validate the viewport dimensions - we know that the numbers are
|
|
||||||
non-negative integers */
|
|
||||||
if ((vp->x >= lcd_width) ||
|
|
||||||
((vp->x + vp->width) > lcd_width) ||
|
|
||||||
(vp->y >= lcd_height) ||
|
|
||||||
((vp->y + vp->height) > lcd_height))
|
|
||||||
{
|
|
||||||
return WPS_ERROR_INVALID_PARAM;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_LCD_COLOR
|
|
||||||
if (depth == 16)
|
|
||||||
{
|
|
||||||
if (!LIST_VALUE_PARSED(set, PL_FG))
|
|
||||||
vp->fg_pattern = global_settings.fg_color;
|
|
||||||
if (!LIST_VALUE_PARSED(set, PL_BG))
|
|
||||||
vp->bg_pattern = global_settings.bg_color;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
wps_data->viewports[wps_data->num_viewports-1].last_line = wps_data->num_lines - 1;
|
wps_data->viewports[wps_data->num_viewports-1].last_line = wps_data->num_lines - 1;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,15 @@
|
||||||
#include "screen_access.h"
|
#include "screen_access.h"
|
||||||
#include "appevents.h"
|
#include "appevents.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define LINE_SEL_FROM_SETTINGS(vp) \
|
||||||
|
do { \
|
||||||
|
vp->lss_pattern = global_settings.lss_color; \
|
||||||
|
vp->lse_pattern = global_settings.lse_color; \
|
||||||
|
vp->lst_pattern = global_settings.lst_color; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
static int statusbar_enabled = 0;
|
static int statusbar_enabled = 0;
|
||||||
|
|
||||||
int viewport_get_nb_lines(struct viewport *vp)
|
int viewport_get_nb_lines(struct viewport *vp)
|
||||||
|
|
@ -88,9 +97,7 @@ void viewport_set_defaults(struct viewport *vp, enum screen_type screen)
|
||||||
#ifdef HAVE_LCD_COLOR
|
#ifdef HAVE_LCD_COLOR
|
||||||
vp->fg_pattern = global_settings.fg_color;
|
vp->fg_pattern = global_settings.fg_color;
|
||||||
vp->bg_pattern = global_settings.bg_color;
|
vp->bg_pattern = global_settings.bg_color;
|
||||||
vp->lss_pattern = global_settings.lss_color;
|
LINE_SEL_FROM_SETTINGS(vp);
|
||||||
vp->lse_pattern = global_settings.lse_color;
|
|
||||||
vp->lst_pattern = global_settings.lst_color;
|
|
||||||
#elif LCD_DEPTH > 1
|
#elif LCD_DEPTH > 1
|
||||||
vp->fg_pattern = LCD_DEFAULT_FG;
|
vp->fg_pattern = LCD_DEFAULT_FG;
|
||||||
vp->bg_pattern = LCD_DEFAULT_BG;
|
vp->bg_pattern = LCD_DEFAULT_BG;
|
||||||
|
|
@ -151,3 +158,94 @@ void viewportmanager_statusbar_changed(void* data)
|
||||||
#endif
|
#endif
|
||||||
viewportmanager_set_statusbar(statusbar_enabled);
|
viewportmanager_set_statusbar(statusbar_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* viewport_parse_viewport(struct viewport *vp,
|
||||||
|
enum screen_type screen,
|
||||||
|
const char *bufptr,
|
||||||
|
const char separator)
|
||||||
|
{
|
||||||
|
/* parse the list to the viewport struct */
|
||||||
|
const char *ptr = bufptr;
|
||||||
|
int depth;
|
||||||
|
uint32_t set = 0;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PL_X = 0,
|
||||||
|
PL_Y,
|
||||||
|
PL_WIDTH,
|
||||||
|
PL_HEIGHT,
|
||||||
|
PL_FONT,
|
||||||
|
PL_FG,
|
||||||
|
PL_BG,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Work out the depth of this display */
|
||||||
|
depth = screens[screen].depth;
|
||||||
|
#ifdef HAVE_LCD_COLOR
|
||||||
|
if (depth == 16)
|
||||||
|
{
|
||||||
|
if (!(ptr = parse_list("dddddcc", &set, separator, ptr, &vp->x, &vp->y, &vp->width,
|
||||||
|
&vp->height, &vp->font, &vp->fg_pattern,&vp->bg_pattern)))
|
||||||
|
return VP_ERROR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
#if (LCD_DEPTH == 2) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH == 2)
|
||||||
|
if (depth == 2) {
|
||||||
|
if (!(ptr = parse_list("dddddgg", &set, separator, ptr, &vp->x, &vp->y, &vp->width,
|
||||||
|
&vp->height, &vp->font, &vp->fg_pattern, &vp->bg_pattern)))
|
||||||
|
return VP_ERROR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
#if (LCD_DEPTH == 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH == 1)
|
||||||
|
if (depth == 1)
|
||||||
|
{
|
||||||
|
if (!(ptr = parse_list("ddddd", &set, separator, ptr, &vp->x, &vp->y, &vp->width,
|
||||||
|
&vp->height, &vp->font)))
|
||||||
|
return VP_ERROR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{}
|
||||||
|
|
||||||
|
/* X and Y *must* be set */
|
||||||
|
if (!LIST_VALUE_PARSED(set, PL_X) || !LIST_VALUE_PARSED(set, PL_Y))
|
||||||
|
return VP_ERROR;
|
||||||
|
|
||||||
|
/* fix defaults */
|
||||||
|
if (!LIST_VALUE_PARSED(set, PL_WIDTH))
|
||||||
|
vp->width = screens[screen].lcdwidth - vp->x;
|
||||||
|
if (!LIST_VALUE_PARSED(set, PL_HEIGHT))
|
||||||
|
vp->height = screens[screen].lcdheight - vp->y;
|
||||||
|
|
||||||
|
#if (LCD_DEPTH > 1)
|
||||||
|
if (!LIST_VALUE_PARSED(set, PL_FG))
|
||||||
|
vp->fg_pattern = global_settings.fg_color;
|
||||||
|
if (!LIST_VALUE_PARSED(set, PL_BG))
|
||||||
|
vp->bg_pattern = global_settings.bg_color;
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_LCD_COLOR
|
||||||
|
LINE_SEL_FROM_SETTINGS(vp);
|
||||||
|
#endif
|
||||||
|
/* Validate the viewport dimensions - we know that the numbers are
|
||||||
|
non-negative integers, ignore bars and assume the viewport takes them
|
||||||
|
* into account */
|
||||||
|
if ((vp->x >= screens[screen].lcdwidth) ||
|
||||||
|
((vp->x + vp->width) > screens[screen].lcdwidth) ||
|
||||||
|
(vp->y >= screens[screen].lcdheight) ||
|
||||||
|
((vp->y + vp->height) > screens[screen].lcdheight))
|
||||||
|
{
|
||||||
|
return VP_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Default to using the user font if the font was an invalid number or '-'*/
|
||||||
|
if (((vp->font != FONT_SYSFIXED) && (vp->font != FONT_UI))
|
||||||
|
|| !LIST_VALUE_PARSED(set, PL_FONT)
|
||||||
|
)
|
||||||
|
vp->font = FONT_UI;
|
||||||
|
|
||||||
|
vp->drawmode = DRMODE_SOLID;
|
||||||
|
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,13 @@ int viewport_load_config(const char *config, struct viewport *vp);
|
||||||
|
|
||||||
void viewport_set_defaults(struct viewport *vp, enum screen_type screen);
|
void viewport_set_defaults(struct viewport *vp, enum screen_type screen);
|
||||||
|
|
||||||
|
/* parse a viewport list, which looks like
|
||||||
|
* X|Y|width|height|font|foregorund color|background color
|
||||||
|
* | is a separator */
|
||||||
|
const char* viewport_parse_viewport(struct viewport *vp,
|
||||||
|
enum screen_type screen,
|
||||||
|
const char *bufptr,
|
||||||
|
const char separator);
|
||||||
/* Used to specify which screens the statusbar (SB) should be displayed on.
|
/* Used to specify which screens the statusbar (SB) should be displayed on.
|
||||||
*
|
*
|
||||||
* The parameter is a bit OR'ed combination of the following (screen is
|
* The parameter is a bit OR'ed combination of the following (screen is
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue