summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2007-11-12 21:34:01 +0000
committerDave Chapman <dave@dchapman.com>2007-11-12 21:34:01 +0000
commitf6ef46b73f628586aef988246d253f3e5154119d (patch)
tree50da730905477a3dce9909b575c3353e310310ef /apps
parent4b65cb67a52dab50530c19c1f647d1b3985bb1a8 (diff)
downloadrockbox-f6ef46b73f628586aef988246d253f3e5154119d.zip
rockbox-f6ef46b73f628586aef988246d253f3e5154119d.tar.gz
rockbox-f6ef46b73f628586aef988246d253f3e5154119d.tar.bz2
rockbox-f6ef46b73f628586aef988246d253f3e5154119d.tar.xz
FS#8135 - add an optional "left margin" parameter to the %s WPS tag - e.g. %s|100|. This patch uses parts of the scroll-margins patch (FS#2954), but is much smaller, only offers a left-margin, and only affects the WPS code.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15604 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/gui/gwps-common.c45
-rw-r--r--apps/gui/gwps.h1
-rw-r--r--apps/gui/wps_parser.c35
3 files changed, 67 insertions, 14 deletions
diff --git a/apps/gui/gwps-common.c b/apps/gui/gwps-common.c
index 00505af..f148646 100644
--- a/apps/gui/gwps-common.c
+++ b/apps/gui/gwps-common.c
@@ -1352,6 +1352,13 @@ static char *get_token_value(struct gui_wps *gwps,
return NULL;
#endif
+#ifdef HAVE_LCD_BITMAP
+ case WPS_TOKEN_ALIGN_SCROLLMARGIN:
+ gwps->display->setmargins(token->value.i,
+ gwps->display->getymargin());
+ return NULL;
+#endif
+
default:
return NULL;
}
@@ -1454,6 +1461,11 @@ static bool get_line(struct gui_wps *gwps,
align->center = NULL;
align->right = NULL;
+#ifdef HAVE_LCD_BITMAP
+ /* Reset margins - only bitmap targets modify them */
+ gwps->display->setmargins(0, gwps->display->getymargin());
+#endif
+
/* Process all tokens of the desired subline */
last_token_idx = wps_last_token_index(data, line, subline);
for (i = wps_first_token_index(data, line, subline);
@@ -1677,12 +1689,13 @@ static void write_line(struct screen *display,
bool scroll)
{
- int left_width = 0; /* left_xpos would always be 0 */
+ int left_width = 0, left_xpos;
int center_width = 0, center_xpos;
int right_width = 0, right_xpos;
int ypos;
int space_width;
int string_height;
+ int scroll_width;
/* calculate different string sizes and positions */
display->getstringsize((unsigned char *)" ", &space_width, &string_height);
@@ -1691,19 +1704,21 @@ static void write_line(struct screen *display,
&left_width, &string_height);
}
- if (format_align->center != 0) {
- display->getstringsize((unsigned char *)format_align->center,
- &center_width, &string_height);
- }
-
- center_xpos=(display->width - center_width) / 2;
-
if (format_align->right != 0) {
display->getstringsize((unsigned char *)format_align->right,
&right_width, &string_height);
}
+ if (format_align->center != 0) {
+ display->getstringsize((unsigned char *)format_align->center,
+ &center_width, &string_height);
+ }
+
+ left_xpos = display->getxmargin();
right_xpos = (display->width - right_width);
+ center_xpos = (display->width + left_xpos - center_width) / 2;
+
+ scroll_width = display->width - left_xpos;
/* Checks for overlapping strings.
If needed the overlapping strings will be merged, separated by a
@@ -1712,7 +1727,7 @@ static void write_line(struct screen *display,
/* CASE 1: left and centered string overlap */
/* there is a left string, need to merge left and center */
if ((left_width != 0 && center_width != 0) &&
- (left_width + space_width > center_xpos)) {
+ (left_xpos + left_width + space_width > center_xpos)) {
/* replace the former separator '\0' of left and
center string with a space */
*(--format_align->center) = ' ';
@@ -1723,7 +1738,7 @@ static void write_line(struct screen *display,
}
/* there is no left string, move center to left */
if ((left_width == 0 && center_width != 0) &&
- (left_width > center_xpos)) {
+ (left_xpos + left_width > center_xpos)) {
/* move the center string to the left string */
format_align->left = format_align->center;
/* calculate the new width and position of the string */
@@ -1764,7 +1779,7 @@ static void write_line(struct screen *display,
was one or it has been merged in case 1 or 2 */
/* there is a left string, need to merge left and right */
if ((left_width != 0 && center_width == 0 && right_width != 0) &&
- (left_width + space_width > right_xpos)) {
+ (left_xpos + left_width + space_width > right_xpos)) {
/* replace the former separator '\0' of left and
right string with a space */
*(--format_align->right) = ' ';
@@ -1787,7 +1802,9 @@ static void write_line(struct screen *display,
ypos = (line * string_height) + display->getymargin();
- if (scroll && left_width > display->width)
+ if (scroll && ((left_width > scroll_width) ||
+ (center_width > scroll_width) ||
+ (right_width > scroll_width)))
{
display->puts_scroll(0, line,
(unsigned char *)format_align->left);
@@ -1797,7 +1814,7 @@ static void write_line(struct screen *display,
#ifdef HAVE_LCD_BITMAP
/* clear the line first */
display->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
- display->fillrect(0, ypos, display->width, string_height);
+ display->fillrect(left_xpos, ypos, display->width, string_height);
display->set_drawmode(DRMODE_SOLID);
#endif
@@ -1808,7 +1825,7 @@ static void write_line(struct screen *display,
/* print aligned strings */
if (left_width != 0)
{
- display->putsxy(0, ypos,
+ display->putsxy(left_xpos, ypos,
(unsigned char *)format_align->left);
}
if (center_width != 0)
diff --git a/apps/gui/gwps.h b/apps/gui/gwps.h
index f57656b..94c2836 100644
--- a/apps/gui/gwps.h
+++ b/apps/gui/gwps.h
@@ -124,6 +124,7 @@ enum wps_token_type {
WPS_TOKEN_ALIGN_LEFT,
WPS_TOKEN_ALIGN_CENTER,
WPS_TOKEN_ALIGN_RIGHT,
+ WPS_TOKEN_ALIGN_SCROLLMARGIN,
/* Sublines */
WPS_TOKEN_SUBLINE_TIMEOUT,
diff --git a/apps/gui/wps_parser.c b/apps/gui/wps_parser.c
index 84e1b18..0d86a5a 100644
--- a/apps/gui/wps_parser.c
+++ b/apps/gui/wps_parser.c
@@ -115,6 +115,8 @@ static int parse_dir_level(const char *wps_bufptr,
struct wps_token *token, struct wps_data *wps_data);
#ifdef HAVE_LCD_BITMAP
+static int parse_scrollmargin(const char *wps_bufptr,
+ struct wps_token *token, struct wps_data *wps_data);
static int parse_image_special(const char *wps_bufptr,
struct wps_token *token, struct wps_data *wps_data);
static int parse_statusbar_enable(const char *wps_bufptr,
@@ -277,7 +279,12 @@ static const struct wps_tag all_tags[] = {
{ WPS_TOKEN_CROSSFADE, "xf", WPS_REFRESH_DYNAMIC, NULL },
#endif
+#ifdef HAVE_LCD_BITMAP
+ { WPS_TOKEN_ALIGN_SCROLLMARGIN, "s", WPS_REFRESH_SCROLL,
+ parse_scrollmargin },
+#else
{ WPS_NO_TOKEN, "s", WPS_REFRESH_SCROLL, NULL },
+#endif
{ WPS_TOKEN_SUBLINE_TIMEOUT, "t", 0, parse_subline_timeout },
#ifdef HAVE_LCD_BITMAP
@@ -832,6 +839,34 @@ static int parse_albumart_conditional(const char *wps_bufptr,
};
#endif /* HAVE_ALBUMART */
+#ifdef HAVE_LCD_BITMAP
+static int parse_scrollmargin(const char *wps_bufptr, struct wps_token *token,
+ struct wps_data *wps_data)
+{
+ const char* p;
+ const char* pend;
+
+ (void)wps_data; /* Kill the warning */
+
+ /* valid tag looks like %s or %s|12| */
+ if(*wps_bufptr == '|')
+ {
+ p = wps_bufptr + 1;
+
+ if(isdigit(*p) && (pend = strchr(p, '|')))
+ {
+ token->value.i = atoi(p);
+ return(pend - wps_bufptr + 1);
+ }
+ } else {
+ token->value.i = 0;
+ }
+
+ return(0);
+}
+#endif
+
+
/* Parse a generic token from the given string. Return the length read */
static int parse_token(const char *wps_bufptr, struct wps_data *wps_data)
{