summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2009-08-09 16:16:55 +0000
committerThomas Martitz <kugel@rockbox.org>2009-08-09 16:16:55 +0000
commit9bd7b23e9980247e97e54a275769e5f1dd3b443e (patch)
tree562d57058aa287f59a735fc6e045a87fb5b3f746
parent5aeaa84cab08154dc451a39902c376bd8a8922f4 (diff)
downloadrockbox-9bd7b23e9980247e97e54a275769e5f1dd3b443e.tar.gz
rockbox-9bd7b23e9980247e97e54a275769e5f1dd3b443e.zip
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
-rw-r--r--apps/gui/skin_engine/wps_parser.c97
-rw-r--r--apps/gui/viewport.c104
-rw-r--r--apps/gui/viewport.h7
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 440133327a..3df2c5f0aa 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 d635c10481..52704d9f69 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 acc9758ee3..65a9815bcd 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