Basically I'm updating the progressbar-slider patch and was hoping one of you intrepid devs wouldn't mind answering a few questions. Ok, in parse_progressbar in wps_parser.c I added another field for pb->pb_type which is what this patch uses instead of pb->have_bitmap_pb because with this patch you have 3 choices REGULAR, BITMAP and SLIDER instead of just REGULAR and BITMAP. In wps_parser I added an extra 'd' to the list I was parsing so I could have the kind variable which I was using in the %pb tag to indicate what type of progressbar that progressbar was. The problem is the way I have it set up with that extra if (LIST_VALUE_PARSED(set, PB_KIND)) I have in it I have to add "-|" to the end of the %pb declaration in the default theme for it to work since my code insists on having that extra field even if it has no value like that. What I'm wanting to know how to do is how can I have an extra field there and not have it required to be there in some form. Right now I have to at least have a |-| there but I want the default theme to work as is because nobody will remember to do that most likely. so...How do I do this? Oh and by the way, whoever wrote parse_list in misc.c is a genius! I love that function! Sorry for the sloppiness, but for clarity here is my parse_progressbar method so you'll know exactly what I'm doing:
static int parse_progressbar(const char *wps_bufptr,
struct wps_token *token,
struct wps_data *wps_data)
{
(void)token; /* Kill warnings */
/* %pb or %pb|filename|x|y|width|height|
using - for any of the params uses "sane" values */
#ifdef HAVE_LCD_BITMAP
enum {
PB_FILENAME = 0,
PB_X,
PB_Y,
PB_WIDTH,
PB_HEIGHT,
PB_KIND
};
const char *filename;
int x, y, height, width, kind;
uint32_t set = 0;
const char *ptr = wps_bufptr;
struct progressbar *pb;
struct viewport *vp = &wps_data->viewports[wps_data->num_viewports].vp;
int font_height = font_get(vp->font)->height;
int line_y_pos = font_height*(wps_data->num_lines -
wps_data->viewports[wps_data->num_viewports].first_line);
if (wps_data->progressbar_count +1 >= MAX_PROGRESSBARS)
return WPS_ERROR_INVALID_PARAM;
pb = &wps_data->progressbar[wps_data->progressbar_count];
pb->have_bitmap_pb = false;
if (*wps_bufptr != '|') /* regular old style */
{
pb->x = 0;
pb->width = vp->width;
pb->height = SYSFONT_HEIGHT-2;
pb->y = line_y_pos + (font_height-pb->height)/2;
wps_data->viewports[wps_data->num_viewports].pb =
&wps_data->progressbar[wps_data->progressbar_count];
wps_data->progressbar_count++;
return 0;
}
ptr = wps_bufptr + 1;
if (!(ptr = parse_list("sddddd", &set, '|', ptr, &filename,
&x, &y, &width, &height, &kind)))
return WPS_ERROR_INVALID_PARAM;
if (LIST_VALUE_PARSED(set, PB_FILENAME)) /* filename */
bmp_names[PROGRESSBAR_BMP+wps_data->progressbar_count] = filename;
if (LIST_VALUE_PARSED(set, PB_X)) /* x */
pb->x = x;
else
pb->x = vp->x;
if (LIST_VALUE_PARSED(set, PB_WIDTH)) /* width */
pb->width = width;
else
pb->width = vp->width - pb->x;
if (LIST_VALUE_PARSED(set, PB_HEIGHT)) /* height, default to font height */
pb->height = height;
else
pb->height = font_height;
if (LIST_VALUE_PARSED(set, PB_Y)) /* y */
pb->y = y;
else
pb->y = line_y_pos + (font_height-pb->height)/2;
if (LIST_VALUE_PARSED(set, PB_KIND))
pb->pb_type = kind;
else
pb->pb_type = BITMAP;
wps_data->progressbar[wps_data->progressbar_count].have_bitmap_pb = false;
wps_data->viewports[wps_data->num_viewports].pb =
&wps_data->progressbar[wps_data->progressbar_count];
wps_data->progressbar_count++;
/* Skip the rest of the line */
return skip_end_of_line(wps_bufptr)-1;
#else
if (*(wps_bufptr-1) == 'f')
wps_data->full_line_progressbar = true;
else
wps_data->full_line_progressbar = false;
return 0;
#endif
}