From b858c886e109f39b83ff36fe9880884f759af322 Mon Sep 17 00:00:00 2001 From: kugel Date: Sun, 9 Aug 2009 16:16:55 +0000 Subject: [PATCH] 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 --- apps/gui/skin_engine/wps_parser.c | 97 +++-------------------------------- apps/gui/viewport.c | 104 ++++++++++++++++++++++++++++++++++++-- apps/gui/viewport.h | 7 +++ 3 files changed, 116 insertions(+), 92 deletions(-) diff --git a/apps/gui/skin_engine/wps_parser.c b/apps/gui/skin_engine/wps_parser.c index 440133327..3df2c5f0a 100644 --- a/apps/gui/skin_engine/wps_parser.c +++ b/apps/gui/skin_engine/wps_parser.c @@ -25,6 +25,7 @@ #include "file.h" #include "misc.h" #include "plugin.h" +#include "viewport.h" #ifdef __PCTOOL__ #ifdef WPSEDITOR @@ -587,26 +588,12 @@ static int parse_viewport(const char *wps_bufptr, { (void)token; /* Kill warnings */ const char *ptr = wps_bufptr; - struct viewport* vp; - int depth; - 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; + + const int screen = #ifdef HAVE_REMOTE_LCD - if (wps_data->remote_wps) - { - lcd_width = LCD_REMOTE_WIDTH; - lcd_height = LCD_REMOTE_HEIGHT; - } + wps_data->remote_wps ? SCREEN_REMOTE : #endif + SCREEN_MAIN; if (wps_data->num_viewports >= WPS_MAX_VIEWPORTS) return WPS_ERROR_INVALID_PARAM; @@ -635,87 +622,19 @@ static int parse_viewport(const char *wps_bufptr, return WPS_ERROR_INVALID_PARAM; 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| */ /* Set the defaults for fields not user-specified */ vp->drawmode = DRMODE_SOLID; - /* Work out the depth of this display */ -#ifdef HAVE_REMOTE_LCD - 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 - {} + if (!(ptr = viewport_parse_viewport(vp, screen, ptr, '|'))) + return WPS_ERROR_INVALID_PARAM; /* Check for trailing | */ if (*ptr != '|') 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; diff --git a/apps/gui/viewport.c b/apps/gui/viewport.c index d635c1048..52704d9f6 100644 --- a/apps/gui/viewport.c +++ b/apps/gui/viewport.c @@ -35,6 +35,15 @@ #include "screen_access.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; 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 vp->fg_pattern = global_settings.fg_color; vp->bg_pattern = global_settings.bg_color; - vp->lss_pattern = global_settings.lss_color; - vp->lse_pattern = global_settings.lse_color; - vp->lst_pattern = global_settings.lst_color; + LINE_SEL_FROM_SETTINGS(vp); #elif LCD_DEPTH > 1 vp->fg_pattern = LCD_DEFAULT_FG; vp->bg_pattern = LCD_DEFAULT_BG; @@ -151,3 +158,94 @@ void viewportmanager_statusbar_changed(void* data) #endif 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; +} diff --git a/apps/gui/viewport.h b/apps/gui/viewport.h index acc9758ee..65a9815bc 100644 --- a/apps/gui/viewport.h +++ b/apps/gui/viewport.h @@ -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); +/* 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. * * The parameter is a bit OR'ed combination of the following (screen is -- 2.11.4.GIT