static int parse_image_special(struct skin_element *element, struct wps_token *token, struct wps_data *wps_data) { (void)wps_data; /* kill warning */ (void)token; #if LCD_DEPTH > 1 char *filename; if (token->type == SKIN_TOKEN_IMAGE_BACKDROP) { if (isdefault(&element->params[0])) { filename = "-"; } else { filename = element->params[0].data.text; /* format: %X(filename.bmp) or %X(d) */ if (!strcmp(filename, "d")) filename = NULL; } wps_data->backdrop = filename; } #endif return 0; }
static int parse_viewportcolour(struct skin_element *element, struct wps_token *token, struct wps_data *wps_data) { (void)wps_data; struct skin_tag_parameter *param = element->params; struct viewport_colour *colour = (struct viewport_colour *)skin_buffer_alloc(sizeof(struct viewport_colour)); if (!colour) return -1; if (isdefault(param)) { colour->colour = get_viewport_default_colour(curr_screen, token->type == SKIN_TOKEN_VIEWPORT_FGCOLOUR); } else { if (!parse_color(curr_screen, param->data.text, &colour->colour)) return -1; } colour->vp = &curr_vp->vp; token->value.data = colour; if (element->line == curr_viewport_element->line) { if (token->type == SKIN_TOKEN_VIEWPORT_FGCOLOUR) { curr_vp->start_fgcolour = colour->colour; curr_vp->vp.fg_pattern = colour->colour; } else { curr_vp->start_bgcolour = colour->colour; curr_vp->vp.bg_pattern = colour->colour; } } return 0; }
static void displaysettings(struct termios *m, int all) { const struct key *kbd = keys; const struct mode *mod = modes; struct winsize winsize; speed_t in, out; tcflag_t *bitsp, mask; const char *linestr; in = cfgetispeed(m); out = cfgetospeed(m); if (!in || in == out) { if (all || out != B38400) printtoken("speed %s baud;", baudtostr(out)); } else { printtoken("ispeed %s baud;", baudtostr(in)); printtoken("ospeed %s baud;", baudtostr(out)); } if (all) { if (ioctl(STDIN_FILENO, TIOCGWINSZ, &winsize)) eprintf("TIOCGWINSZ <stdin>:"); printtoken("rows %u;", winsize.ws_row); printtoken("columns %u;", winsize.ws_col); } printtoken("\n"); if (all || m->c_line != 0) { linestr = linetostr(m->c_line); if (linestr) printtoken("line = %s;", linestr); else printtoken("line = %u;", (unsigned)(m->c_line)); } if (all || (m->c_cc[VMIN] != 1 && !(m->c_lflag & ICANON))) printtoken("min = %u;", (unsigned)(m->c_cc[VMIN])); if (all || (m->c_cc[VTIME] != 0 && !(m->c_lflag & ICANON))) printtoken("time = %u;", (unsigned)(m->c_cc[VTIME])); printtoken("\n"); for (; kbd->op; kbd++) if (all || m->c_cc[kbd->index] != kbd->sanevalue) printtoken("%s = %s;", kbd->op, keytostr(m->c_cc[kbd->index])); printtoken("\n"); for (; mod->op; mod++) { switch (mod->type) { case CTRL: bitsp = &m->c_cflag; break; case IN: bitsp = &m->c_iflag; break; case OUT: bitsp = &m->c_oflag; break; case LOCAL: bitsp = &m->c_lflag; break; default: bitsp = 0; break; } if (!bitsp || (mod->flags & DUP)) continue; mask = mod->clear ? mod->clear : mod->set; if ((*bitsp & mask) == mod->set) { if (all || !isdefault(mod->flags)) printtoken("%s", mod->op); } else if (mod->flags & BOOL) { if (all || isdefault(mod->flags)) printtoken("-%s", mod->op); } } printtoken("\n"); }
static int parse_albumart_load(struct skin_element* element, struct wps_token *token, struct wps_data *wps_data) { struct dim dimensions; int albumart_slot; bool swap_for_rtl = lang_is_rtl() && follow_lang_direction; struct skin_albumart *aa = (struct skin_albumart *)skin_buffer_alloc(sizeof(struct skin_albumart)); (void)token; /* silence warning */ if (!aa) return -1; /* reset albumart info in wps */ aa->width = -1; aa->height = -1; aa->xalign = WPS_ALBUMART_ALIGN_CENTER; /* default */ aa->yalign = WPS_ALBUMART_ALIGN_CENTER; /* default */ aa->x = element->params[0].data.number; aa->y = element->params[1].data.number; aa->width = element->params[2].data.number; aa->height = element->params[3].data.number; aa->vp = &curr_vp->vp; aa->draw_handle = -1; /* if we got here, we parsed everything ok .. ! */ if (aa->width < 0) aa->width = 0; else if (aa->width > LCD_WIDTH) aa->width = LCD_WIDTH; if (aa->height < 0) aa->height = 0; else if (aa->height > LCD_HEIGHT) aa->height = LCD_HEIGHT; if (swap_for_rtl) aa->x = LCD_WIDTH - (aa->x + aa->width); aa->state = WPS_ALBUMART_LOAD; wps_data->albumart = aa; dimensions.width = aa->width; dimensions.height = aa->height; albumart_slot = playback_claim_aa_slot(&dimensions); if (0 <= albumart_slot) wps_data->playback_aa_slot = albumart_slot; if (element->params_count > 4 && !isdefault(&element->params[4])) { switch (*element->params[4].data.text) { case 'l': case 'L': if (swap_for_rtl) aa->xalign = WPS_ALBUMART_ALIGN_RIGHT; else aa->xalign = WPS_ALBUMART_ALIGN_LEFT; break; case 'c': case 'C': aa->xalign = WPS_ALBUMART_ALIGN_CENTER; break; case 'r': case 'R': if (swap_for_rtl) aa->xalign = WPS_ALBUMART_ALIGN_LEFT; else aa->xalign = WPS_ALBUMART_ALIGN_RIGHT; break; } } if (element->params_count > 5 && !isdefault(&element->params[5])) { switch (*element->params[5].data.text) { case 't': case 'T': aa->yalign = WPS_ALBUMART_ALIGN_TOP; break; case 'c': case 'C': aa->yalign = WPS_ALBUMART_ALIGN_CENTER; break; case 'b': case 'B': aa->yalign = WPS_ALBUMART_ALIGN_BOTTOM; break; } } return 0; }
static int parse_progressbar_tag(struct skin_element* element, struct wps_token *token, struct wps_data *wps_data) { #ifdef HAVE_LCD_BITMAP struct progressbar *pb; struct viewport *vp = &curr_vp->vp; struct skin_tag_parameter *param = element->params; int curr_param = 0; char *image_filename = NULL; if (element->params_count == 0 && element->tag->type != SKIN_TOKEN_PROGRESSBAR) return 0; /* nothing to do */ pb = (struct progressbar*)skin_buffer_alloc(sizeof(struct progressbar)); token->value.data = pb; if (!pb) return WPS_ERROR_INVALID_PARAM; pb->vp = vp; pb->follow_lang_direction = follow_lang_direction > 0; pb->nofill = false; pb->nobar = false; pb->image = NULL; pb->slider = NULL; pb->invert_fill_direction = false; pb->horizontal = true; if (element->params_count == 0) { pb->x = 0; pb->width = vp->width; pb->height = SYSFONT_HEIGHT-2; pb->y = -1; /* Will be computed during the rendering */ pb->type = element->tag->type; return 0; } /* (x, y, width, height, ...) */ if (!isdefault(param)) pb->x = param->data.number; else pb->x = 0; param++; if (!isdefault(param)) pb->y = param->data.number; else pb->y = -1; /* computed at rendering */ param++; if (!isdefault(param)) pb->width = param->data.number; else pb->width = vp->width - pb->x; param++; if (!isdefault(param)) { /* A zero height makes no sense - reject it */ if (param->data.number == 0) return WPS_ERROR_INVALID_PARAM; pb->height = param->data.number; } else { if (vp->font > FONT_UI) pb->height = -1; /* calculate at display time */ else { #ifndef __PCTOOL__ pb->height = font_get(vp->font)->height; #else pb->height = 8; #endif } } /* optional params, first is the image filename if it isnt recognised as a keyword */ curr_param = 4; if (isdefault(&element->params[curr_param])) { param++; curr_param++; } pb->horizontal = pb->width > pb->height; while (curr_param < element->params_count) { param++; if (!strcmp(param->data.text, "invert")) pb->invert_fill_direction = true; else if (!strcmp(param->data.text, "nofill")) pb->nofill = true; else if (!strcmp(param->data.text, "nobar")) pb->nobar = true; else if (!strcmp(param->data.text, "slider")) { if (curr_param+1 < element->params_count) { curr_param++; param++; pb->slider = find_image(param->data.text, wps_data); } else /* option needs the next param */ return -1; } else if (!strcmp(param->data.text, "image")) { if (curr_param+1 < element->params_count) { curr_param++; param++; image_filename = param->data.text; } else /* option needs the next param */ return -1; } else if (!strcmp(param->data.text, "vertical")) { pb->horizontal = false; if (isdefault(&element->params[3])) pb->height = vp->height - pb->y; } else if (!strcmp(param->data.text, "horizontal")) pb->horizontal = true; else if (curr_param == 4) image_filename = param->data.text; curr_param++; } if (image_filename) { pb->image = find_image(image_filename, wps_data); if (!pb->image) /* load later */ { struct gui_img* img = (struct gui_img*)skin_buffer_alloc(sizeof(struct gui_img)); if (!img) return WPS_ERROR_INVALID_PARAM; /* save a pointer to the filename */ img->bm.data = (char*)image_filename; img->label = image_filename; img->x = 0; img->y = 0; img->num_subimages = 1; img->always_display = false; img->display = -1; img->using_preloaded_icons = false; img->vp = &curr_vp->vp; struct skin_token_list *item = (struct skin_token_list *)new_skin_token_list_item(NULL, img); if (!item) return WPS_ERROR_INVALID_PARAM; add_to_ll_chain(&wps_data->images, item); pb->image = img; } } if (token->type == SKIN_TOKEN_VOLUME) token->type = SKIN_TOKEN_VOLUMEBAR; else if (token->type == SKIN_TOKEN_BATTERY_PERCENT) token->type = SKIN_TOKEN_BATTERY_PERCENTBAR; else if (token->type == SKIN_TOKEN_TUNER_RSSI) token->type = SKIN_TOKEN_TUNER_RSSI_BAR; pb->type = token->type; return 0; #else (void)element; if (token->type == SKIN_TOKEN_PROGRESSBAR || token->type == SKIN_TOKEN_PLAYER_PROGRESSBAR) { wps_data->full_line_progressbar = token->type == SKIN_TOKEN_PLAYER_PROGRESSBAR; } return 0; #endif }
/* finally, assign the font_id to the viewport */ vp->font = font->id; } return success; } #endif /* HAVE_LCD_BITMAP */ static int convert_viewport(struct wps_data *data, struct skin_element* element) { struct skin_viewport *skin_vp = (struct skin_viewport *)skin_buffer_alloc(sizeof(struct skin_viewport)); struct screen *display = &screens[curr_screen]; if (!skin_vp) return CALLBACK_ERROR; skin_vp->hidden_flags = 0; skin_vp->label = NULL; skin_vp->is_infovp = false; element->data = skin_vp; curr_vp = skin_vp; curr_viewport_element = element; viewport_set_defaults(&skin_vp->vp, curr_screen); #ifdef HAVE_REMOTE_LCD /* viewport_set_defaults() sets the font to FONT_UI+curr_screen. * This parser requires font 1 to always be the UI font, * so force it back to FONT_UI and handle the screen number at the end */ skin_vp->vp.font = FONT_UI; #endif #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) skin_vp->start_fgcolour = skin_vp->vp.fg_pattern; skin_vp->start_bgcolour = skin_vp->vp.bg_pattern; #endif struct skin_tag_parameter *param = element->params; if (element->params_count == 0) /* default viewport */ { if (!data->tree) /* first viewport in the skin */ data->tree = element; skin_vp->label = VP_DEFAULT_LABEL; return CALLBACK_OK; } if (element->params_count == 6) { if (element->tag->type == SKIN_TOKEN_UIVIEWPORT_LOAD) { skin_vp->is_infovp = true; if (isdefault(param)) { skin_vp->hidden_flags = VP_NEVER_VISIBLE; skin_vp->label = VP_DEFAULT_LABEL; } else { skin_vp->hidden_flags = VP_NEVER_VISIBLE; skin_vp->label = param->data.text; } } else { skin_vp->hidden_flags = VP_DRAW_HIDEABLE|VP_DRAW_HIDDEN; skin_vp->label = param->data.text; } param++; } /* x */ if (!isdefault(param)) { skin_vp->vp.x = param->data.number; if (param->data.number < 0) skin_vp->vp.x += display->lcdwidth; } param++; /* y */ if (!isdefault(param)) { skin_vp->vp.y = param->data.number; if (param->data.number < 0) skin_vp->vp.y += display->lcdheight; } param++; /* width */ if (!isdefault(param)) { skin_vp->vp.width = param->data.number; if (param->data.number < 0) skin_vp->vp.width = (skin_vp->vp.width + display->lcdwidth) - skin_vp->vp.x; } else { skin_vp->vp.width = display->lcdwidth - skin_vp->vp.x; } param++; /* height */ if (!isdefault(param)) { skin_vp->vp.height = param->data.number; if (param->data.number < 0) skin_vp->vp.height = (skin_vp->vp.height + display->lcdheight) - skin_vp->vp.y; } else { skin_vp->vp.height = display->lcdheight - skin_vp->vp.y; } param++; #ifdef HAVE_LCD_BITMAP /* font */ if (!isdefault(param)) { skin_vp->vp.font = param->data.number; } #endif if ((unsigned) skin_vp->vp.x >= (unsigned) display->lcdwidth || skin_vp->vp.width + skin_vp->vp.x > display->lcdwidth || (unsigned) skin_vp->vp.y >= (unsigned) display->lcdheight || skin_vp->vp.height + skin_vp->vp.y > display->lcdheight) return CALLBACK_ERROR; return CALLBACK_OK; }