diff options
Diffstat (limited to 'libmenu')
-rw-r--r-- | libmenu/menu.c | 776 | ||||
-rw-r--r-- | libmenu/menu.h | 127 | ||||
-rw-r--r-- | libmenu/menu_chapsel.c | 186 | ||||
-rw-r--r-- | libmenu/menu_cmdlist.c | 177 | ||||
-rw-r--r-- | libmenu/menu_console.c | 498 | ||||
-rw-r--r-- | libmenu/menu_dvbin.c | 301 | ||||
-rw-r--r-- | libmenu/menu_filesel.c | 506 | ||||
-rw-r--r-- | libmenu/menu_list.c | 331 | ||||
-rw-r--r-- | libmenu/menu_list.h | 106 | ||||
-rw-r--r-- | libmenu/menu_param.c | 301 | ||||
-rw-r--r-- | libmenu/menu_pt.c | 179 | ||||
-rw-r--r-- | libmenu/menu_txt.c | 205 | ||||
-rw-r--r-- | libmenu/vf_menu.c | 267 |
13 files changed, 0 insertions, 3960 deletions
diff --git a/libmenu/menu.c b/libmenu/menu.c deleted file mode 100644 index 3e003900ce..0000000000 --- a/libmenu/menu.c +++ /dev/null @@ -1,776 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include "config.h" -#include "mp_msg.h" - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <fcntl.h> -#include <unistd.h> - -#include "libvo/osd.h" -#include "sub/font_load.h" -#include "sub/sub.h" -#include "input/keycodes.h" -#include "asxparser.h" -#include "stream/stream.h" -#include "input/input.h" - -#include "libmpcodecs/img_format.h" -#include "libmpcodecs/mp_image.h" -#include "m_option.h" -#include "m_struct.h" -#include "menu.h" - -extern menu_info_t menu_info_cmdlist; -extern menu_info_t menu_info_chapsel; -extern menu_info_t menu_info_pt; -extern menu_info_t menu_info_filesel; -extern menu_info_t menu_info_txt; -extern menu_info_t menu_info_console; -extern menu_info_t menu_info_pref; -extern menu_info_t menu_info_dvbsel; - - -menu_info_t* menu_info_list[] = { - &menu_info_pt, - &menu_info_cmdlist, - &menu_info_chapsel, - &menu_info_filesel, - &menu_info_txt, - &menu_info_console, -#ifdef CONFIG_DVBIN - &menu_info_dvbsel, -#endif - &menu_info_pref, - NULL -}; - -typedef struct key_cmd_s { - int key; - char *cmd; -} key_cmd_t; - -typedef struct menu_cmd_bindings_s { - char *name; - key_cmd_t *bindings; - int binding_num; - struct menu_cmd_bindings_s *parent; -} menu_cmd_bindings_t; - -struct menu_def_st { - char* name; - menu_info_t* type; - void* cfg; - char* args; -}; - -double menu_mouse_x = -1.0; -double menu_mouse_y = -1.0; -int menu_mouse_pos_updated = 0; - -static struct MPContext *menu_ctx = NULL; -static struct m_config *menu_mconfig = NULL; -static struct input_ctx *menu_input = NULL; -static menu_def_t* menu_list = NULL; -static int menu_count = 0; -static menu_cmd_bindings_t *cmd_bindings = NULL; -static int cmd_bindings_num = 0; - - -static menu_cmd_bindings_t *get_cmd_bindings(const char *name) -{ - int i; - for (i = 0; i < cmd_bindings_num; ++i) - if (!strcasecmp(cmd_bindings[i].name, name)) - return &cmd_bindings[i]; - return NULL; -} - -static int menu_parse_config(char* buffer, struct m_config *mconfig) -{ - char *element,*body, **attribs, *name; - menu_info_t* minfo = NULL; - int r,i; - ASX_Parser_t* parser = asx_parser_new(mconfig); - - while(1) { - r = asx_get_element(parser,&buffer,&element,&body,&attribs); - if(r < 0) { - mp_tmsg(MSGT_GLOBAL,MSGL_WARN,"[MENU] syntax error at line: %d\n",parser->line); - asx_parser_free(parser); - return 0; - } else if(r == 0) { - asx_parser_free(parser); - return 1; - } - // Has it a name ? - name = asx_get_attrib("name",attribs); - if(!name) { - mp_tmsg(MSGT_GLOBAL,MSGL_WARN,"[MENU] Menu definitions need a name attribute (line %d).\n",parser->line); - free(element); - free(body); - asx_free_attribs(attribs); - continue; - } - - if (!strcasecmp(element, "keybindings")) { - menu_cmd_bindings_t *bindings = cmd_bindings; - char *parent_bindings; - cmd_bindings = realloc(cmd_bindings, - (cmd_bindings_num+1)*sizeof(menu_cmd_bindings_t)); - for (i = 0; i < cmd_bindings_num; ++i) - if (cmd_bindings[i].parent) - cmd_bindings[i].parent = cmd_bindings[i].parent-bindings+cmd_bindings; - bindings = &cmd_bindings[cmd_bindings_num]; - memset(bindings, 0, sizeof(menu_cmd_bindings_t)); - bindings->name = name; - parent_bindings = asx_get_attrib("parent",attribs); - if (parent_bindings) { - bindings->parent = get_cmd_bindings(parent_bindings); - free(parent_bindings); - } - free(element); - asx_free_attribs(attribs); - if (body) { - char *bd = body; - char *b, *key, *cmd; - int keycode; - for(;;) { - r = asx_get_element(parser,&bd,&element,&b,&attribs); - if(r < 0) { - mp_tmsg(MSGT_GLOBAL,MSGL_WARN,"[MENU] syntax error at line: %d\n", - parser->line); - free(body); - asx_parser_free(parser); - return 0; - } - if(r == 0) - break; - if (!strcasecmp(element, "binding")) { - key = asx_get_attrib("key",attribs); - cmd = asx_get_attrib("cmd",attribs); - if (key && (keycode = mp_input_get_key_from_name(key)) >= 0) { - keycode &= ~MP_NO_REPEAT_KEY; - mp_msg(MSGT_GLOBAL,MSGL_V, - "[libmenu] got keybinding element %d %s=>[%s].\n", - keycode, key, cmd ? cmd : ""); - bindings->bindings = realloc(bindings->bindings, - (bindings->binding_num+1)*sizeof(key_cmd_t)); - bindings->bindings[bindings->binding_num].key = keycode; - bindings->bindings[bindings->binding_num].cmd = cmd; - ++bindings->binding_num; - } - else - free(cmd); - free(key); - } - free(element); - asx_free_attribs(attribs); - free(b); - } - free(body); - } - ++cmd_bindings_num; - continue; - } - // Try to find this menu type in our list - for(i = 0, minfo = NULL ; menu_info_list[i] ; i++) { - if(strcasecmp(element,menu_info_list[i]->name) == 0) { - minfo = menu_info_list[i]; - break; - } - } - // Got it : add this to our list - if(minfo) { - menu_list = realloc(menu_list,(menu_count+2)*sizeof(menu_def_t)); - menu_list[menu_count].name = name; - menu_list[menu_count].type = minfo; - menu_list[menu_count].cfg = m_struct_alloc(&minfo->priv_st); - menu_list[menu_count].args = body; - // Setup the attribs - for(i = 0 ; attribs[2*i] ; i++) { - if(strcasecmp(attribs[2*i],"name") == 0) continue; - if (!m_struct_set(&minfo->priv_st, menu_list[menu_count].cfg, - attribs[2*i], bstr(attribs[2*i+1]))) - mp_tmsg(MSGT_GLOBAL,MSGL_WARN,"[MENU] bad attribute %s=%s in menu '%s' at line %d\n",attribs[2*i],attribs[2*i+1], - name,parser->line); - } - menu_count++; - memset(&menu_list[menu_count],0,sizeof(menu_def_t)); - } else { - mp_tmsg(MSGT_GLOBAL,MSGL_WARN,"[MENU] unknown menu type '%s' at line %d\n",element,parser->line); - free(name); - free(body); - } - - free(element); - asx_free_attribs(attribs); - } - -} - - -/// This will build the menu_defs list from the cfg file -#define BUF_STEP 1024 -#define BUF_MIN 128 -#define BUF_MAX BUF_STEP*1024 -int menu_init(struct MPContext *mpctx, struct m_config *mconfig, - struct input_ctx *input_ctx, char* cfg_file) -{ - char* buffer = NULL; - int bl = BUF_STEP, br = 0; - int f, fd; -#ifndef CONFIG_FREETYPE - if(vo_font == NULL) - return 0; -#endif - fd = open(cfg_file, O_RDONLY); - if(fd < 0) { - mp_tmsg(MSGT_GLOBAL,MSGL_WARN,"[MENU] Can't open menu config file: %s\n",cfg_file); - return 0; - } - buffer = malloc(bl); - while(1) { - int r; - if(bl - br < BUF_MIN) { - if(bl >= BUF_MAX) { - mp_tmsg(MSGT_GLOBAL,MSGL_WARN,"[MENU] Config file is too big (> %d KB)\n",BUF_MAX/1024); - close(fd); - free(buffer); - return 0; - } - bl += BUF_STEP; - buffer = realloc(buffer,bl); - } - r = read(fd,buffer+br,bl-br); - if(r == 0) break; - br += r; - } - if(!br) { - mp_tmsg(MSGT_GLOBAL,MSGL_WARN,"[MENU] Config file is empty.\n"); - return 0; - } - buffer[br-1] = '\0'; - - close(fd); - - menu_ctx = mpctx; - menu_mconfig = mconfig; - menu_input = input_ctx; - f = menu_parse_config(buffer, mconfig); - free(buffer); - return f; -} - -// Destroy all this stuff -void menu_uninit(void) { - int i; - for(i = 0 ; menu_list && menu_list[i].name ; i++) { - free(menu_list[i].name); - m_struct_free(&menu_list[i].type->priv_st,menu_list[i].cfg); - free(menu_list[i].args); - } - free(menu_list); - menu_count = 0; - for (i = 0; i < cmd_bindings_num; ++i) { - free(cmd_bindings[i].name); - while(cmd_bindings[i].binding_num > 0) - free(cmd_bindings[i].bindings[--cmd_bindings[i].binding_num].cmd); - free(cmd_bindings[i].bindings); - } - free(cmd_bindings); -} - -/// Default read_key function -int menu_dflt_read_key(menu_t* menu,int cmd) { - int i; - menu_cmd_bindings_t *bindings = get_cmd_bindings(menu->type->name); - if (!bindings) - bindings = get_cmd_bindings(menu->type->type->name); - if (!bindings) - bindings = get_cmd_bindings("default"); - while (bindings) { - for (i = 0; i < bindings->binding_num; ++i) { - if (bindings->bindings[i].key == cmd) { - if (bindings->bindings[i].cmd) - mp_input_parse_and_queue_cmds(menu->input_ctx, - bindings->bindings[i].cmd); - return 1; - } - } - bindings = bindings->parent; - } - return 0; -} - -menu_t* menu_open(char *name) { - menu_t* m; - int i; - - for(i = 0 ; menu_list[i].name != NULL ; i++) { - if(strcmp(name,menu_list[i].name) == 0) - break; - } - if(menu_list[i].name == NULL) { - mp_tmsg(MSGT_GLOBAL,MSGL_WARN,"[MENU] Menu %s not found.\n",name); - return NULL; - } - m = calloc(1,sizeof(menu_t)); - m->priv_st = &(menu_list[i].type->priv_st); - m->priv = m_struct_copy(m->priv_st,menu_list[i].cfg); - m->ctx = menu_ctx; - m->mconfig = menu_mconfig; - m->input_ctx = menu_input; - m->type = &menu_list[i]; - if(menu_list[i].type->open(m,menu_list[i].args)) - return m; - if(m->priv) - m_struct_free(m->priv_st,m->priv); - free(m); - mp_tmsg(MSGT_GLOBAL,MSGL_WARN,"[MENU] Menu '%s': Init failed.\n",name); - return NULL; -} - -void menu_draw(menu_t* menu,mp_image_t* mpi) { - if(menu->show && menu->draw) - menu->draw(menu,mpi); -} - -void menu_update_mouse_pos(double x, double y) { - menu_mouse_x = x; - menu_mouse_y = y; - menu_mouse_pos_updated = 1; -} - -void menu_read_cmd(menu_t* menu,int cmd) { - if(menu->read_cmd) - menu->read_cmd(menu,cmd); -} - -void menu_close(menu_t* menu) { - if(menu->close) - menu->close(menu); - if(menu->priv) - m_struct_free(menu->priv_st,menu->priv); - free(menu); -} - -int menu_read_key(menu_t* menu,int cmd) { - if(menu->read_key) - return menu->read_key(menu,cmd); - else - return menu_dflt_read_key(menu,cmd); -} - -///////////////////////////// Helpers //////////////////////////////////// - -typedef void (*draw_alpha_f)(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride); - -inline static draw_alpha_f get_draw_alpha(uint32_t fmt) { - switch(fmt) { - case IMGFMT_BGR12: - case IMGFMT_RGB12: - return vo_draw_alpha_rgb12; - case IMGFMT_BGR15: - case IMGFMT_RGB15: - return vo_draw_alpha_rgb15; - case IMGFMT_BGR16: - case IMGFMT_RGB16: - return vo_draw_alpha_rgb16; - case IMGFMT_BGR24: - case IMGFMT_RGB24: - return vo_draw_alpha_rgb24; - case IMGFMT_BGR32: - case IMGFMT_RGB32: - return vo_draw_alpha_rgb32; - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_YVU9: - case IMGFMT_IF09: - case IMGFMT_Y800: - case IMGFMT_Y8: - return vo_draw_alpha_yv12; - case IMGFMT_YUY2: - return vo_draw_alpha_yuy2; - case IMGFMT_UYVY: - return vo_draw_alpha_uyvy; - } - - return NULL; -} - -// return the real height of a char: -static inline int get_height(int c,int h){ - int font; - if ((font=vo_font->font[c])>=0) - if(h<vo_font->pic_a[font]->h) h=vo_font->pic_a[font]->h; - return h; -} - -static void render_txt(char *txt) -{ - while (*txt) { - int c = utf8_get_char((const char**)&txt); - render_one_glyph(vo_font, c); - } -} - -#ifdef CONFIG_FRIBIDI -#include <fribidi/fribidi.h> -#include "libavutil/common.h" -char *menu_fribidi_charset = NULL; -int menu_flip_hebrew = 0; -int menu_fribidi_flip_commas = 0; - -static char *menu_fribidi(char *txt) -{ - static int char_set_num = -1; - static FriBidiChar *logical, *visual; - static size_t buffer_size = 1024; - static char *outputstr; - -#if FRIBIDI_INTERFACE_VERSION < 3 - FriBidiCharType base; -#else - FriBidiParType base; -#endif - fribidi_boolean log2vis; - size_t len; - - if (menu_flip_hebrew) { - len = strlen(txt); - if (char_set_num == -1) { - fribidi_set_mirroring (1); - fribidi_set_reorder_nsm (0); - char_set_num = fribidi_parse_charset("UTF-8"); - buffer_size = FFMAX(1024,len+1); - logical = malloc(buffer_size); - visual = malloc(buffer_size); - outputstr = malloc(buffer_size); - } else if (len+1 > buffer_size) { - buffer_size = len+1; - logical = realloc(logical, buffer_size); - visual = realloc(visual, buffer_size); - outputstr = realloc(outputstr, buffer_size); - } - len = fribidi_charset_to_unicode (char_set_num, txt, len, logical); - base = menu_fribidi_flip_commas?FRIBIDI_TYPE_ON:FRIBIDI_TYPE_L; - log2vis = fribidi_log2vis (logical, len, &base, visual, NULL, NULL, NULL); - if (log2vis) { - len = fribidi_remove_bidi_marks (visual, len, NULL, NULL, NULL); - fribidi_unicode_to_charset (char_set_num, visual, len, outputstr); - return outputstr; - } - } - return txt; -} -#endif - -void menu_draw_text(mp_image_t* mpi,char* txt, int x, int y) { - draw_alpha_f draw_alpha = get_draw_alpha(mpi->imgfmt); - int font; - - if(!draw_alpha) { - mp_tmsg(MSGT_GLOBAL,MSGL_WARN,"[MENU] Unsupported output format!!!!\n"); - return; - } - -#ifdef CONFIG_FRIBIDI - txt = menu_fribidi(txt); -#endif - render_txt(txt); - - while (*txt) { - int c=utf8_get_char((const char**)&txt); - if ((font=vo_font->font[c])>=0 && (x + vo_font->width[c] <= mpi->w) && (y + vo_font->pic_a[font]->h <= mpi->h)) - draw_alpha(vo_font->width[c], vo_font->pic_a[font]->h, - vo_font->pic_b[font]->bmp+vo_font->start[c], - vo_font->pic_a[font]->bmp+vo_font->start[c], - vo_font->pic_a[font]->w, - mpi->planes[0] + y * mpi->stride[0] + x * (mpi->bpp>>3), - mpi->stride[0]); - x+=vo_font->width[c]+vo_font->charspace; - } - -} - -void menu_draw_text_full(mp_image_t* mpi,char* txt, - int x, int y,int w, int h, - int vspace, int warp, int align, int anchor) { - int need_w,need_h; - int sy, ymin, ymax; - int sx, xmin, xmax, xmid, xrmin; - int ll = 0; - int font; - draw_alpha_f draw_alpha = get_draw_alpha(mpi->imgfmt); - - if(!draw_alpha) { - mp_tmsg(MSGT_GLOBAL,MSGL_WARN,"[MENU] Unsupported output format!!!!\n"); - return; - } - -#ifdef CONFIG_FRIBIDI - txt = menu_fribidi(txt); -#endif - render_txt(txt); - - if(x > mpi->w || y > mpi->h) - return; - - if(anchor & MENU_TEXT_VCENTER) { - if(h <= 0) h = mpi->h; - ymin = y - h/2; - ymax = y + h/2; - } else if(anchor & MENU_TEXT_BOT) { - if(h <= 0) h = mpi->h - y; - ymin = y - h; - ymax = y; - } else { - if(h <= 0) h = mpi->h - y; - ymin = y; - ymax = y + h; - } - - if(anchor & MENU_TEXT_HCENTER) { - if(w <= 0) w = mpi->w; - xmin = x - w/2; - xmax = x + w/2; - } else if(anchor & MENU_TEXT_RIGHT) { - if(w <= 0) w = mpi->w -x; - xmin = x - w; - xmax = x; - } else { - if(w <= 0) w = mpi->w -x; - xmin = x; - xmax = x + w; - } - - // How many space do we need to draw this ? - menu_text_size(txt,w,vspace,warp,&need_w,&need_h); - - // Find the first line - if(align & MENU_TEXT_VCENTER) - sy = ymin + ((h - need_h)/2); - else if(align & MENU_TEXT_BOT) - sy = ymax - need_h - 1; - else - sy = y; - -#if 0 - // Find the first col - if(align & MENU_TEXT_HCENTER) - sx = xmin + ((w - need_w)/2); - else if(align & MENU_TEXT_RIGHT) - sx = xmax - need_w; -#endif - - xmid = xmin + (xmax - xmin) / 2; - xrmin = xmin; - // Clamp the bb to the mpi size - if(ymin < 0) ymin = 0; - if(xmin < 0) xmin = 0; - if(ymax > mpi->h) ymax = mpi->h; - if(xmax > mpi->w) xmax = mpi->w; - - // Jump some the beginnig text if needed - while(sy < ymin && *txt) { - int c=utf8_get_char((const char**)&txt); - if(c == '\n' || (warp && ll + vo_font->width[c] > w)) { - ll = 0; - sy += vo_font->height + vspace; - if(c == '\n') continue; - } - ll += vo_font->width[c]+vo_font->charspace; - } - if(*txt == '\0') // Nothing left to draw - return; - - while(sy < ymax && *txt) { - char* line_end = NULL; - int n; - - if(txt[0] == '\n') { // New line - sy += vo_font->height + vspace; - txt++; - continue; - } - - // Get the length and end of this line - for(n = 0, ll = 0 ; txt[n] != '\0' && txt[n] != '\n' ; n++) { - unsigned char c = txt[n]; - if(warp && ll + vo_font->width[c] > w) break; - ll += vo_font->width[c]+vo_font->charspace; - } - line_end = &txt[n]; - ll -= vo_font->charspace; - - - if(align & (MENU_TEXT_HCENTER|MENU_TEXT_RIGHT)) { - // Too long line - if(ll > xmax-xmin) { - if(align & MENU_TEXT_HCENTER) { - int mid = ll/2; - // Find the middle point - for(n--, ll = 0 ; n <= 0 ; n--) { - ll += vo_font->width[(int)txt[n]]+vo_font->charspace; - if(ll - vo_font->charspace > mid) break; - } - ll -= vo_font->charspace; - sx = xmid + mid - ll; - } else// MENU_TEXT_RIGHT) - sx = xmax + vo_font->charspace; - - // We are after the start point -> go back - if(sx > xmin) { - for(n-- ; n <= 0 ; n--) { - unsigned char c = txt[n]; - if(sx - vo_font->width[c] - vo_font->charspace < xmin) break; - sx -= vo_font->width[c]+vo_font->charspace; - } - } else { // We are before the start point -> go forward - for( ; sx < xmin && (&txt[n]) != line_end ; n++) { - unsigned char c = txt[n]; - sx += vo_font->width[c]+vo_font->charspace; - } - } - txt = &txt[n]; // Jump to the new start char - } else { - if(align & MENU_TEXT_HCENTER) - sx = xmid - ll/2; - else - sx = xmax - 1 - ll; - } - } else { - for(sx = xrmin ; sx < xmin && txt != line_end ; txt++) { - unsigned char c = txt[n]; - sx += vo_font->width[c]+vo_font->charspace; - } - } - - while(sx < xmax && txt != line_end) { - int c=utf8_get_char((const char**)&txt); - font = vo_font->font[c]; - if(font >= 0) { - int cs = (vo_font->pic_a[font]->h - vo_font->height) / 2; - if ((sx + vo_font->width[c] <= xmax) && (sy + vo_font->height <= ymax) ) - draw_alpha(vo_font->width[c], vo_font->height, - vo_font->pic_b[font]->bmp+vo_font->start[c] + - cs * vo_font->pic_a[font]->w, - vo_font->pic_a[font]->bmp+vo_font->start[c] + - cs * vo_font->pic_a[font]->w, - vo_font->pic_a[font]->w, - mpi->planes[0] + sy * mpi->stride[0] + sx * (mpi->bpp>>3), - mpi->stride[0]); - // else - //printf("Can't draw '%c'\n",c); - } - sx+=vo_font->width[c]+vo_font->charspace; - } - txt = line_end; - if(txt[0] == '\0') break; - sy += vo_font->height + vspace; - } -} - -int menu_text_length(char* txt) { - int l = 0; - render_txt(txt); - while (*txt) { - int c=utf8_get_char((const char**)&txt); - l += vo_font->width[c]+vo_font->charspace; - } - return l - vo_font->charspace; -} - -void menu_text_size(char* txt,int max_width, int vspace, int warp, int* _w, int* _h) { - int l = 1, i = 0; - int w = 0; - - render_txt(txt); - while (*txt) { - int c=utf8_get_char((const char**)&txt); - if(c == '\n' || (warp && i + vo_font->width[c] >= max_width)) { - i -= vo_font->charspace; - if (i > w) w = i; - if(*txt) - l++; - i = 0; - if(c == '\n') continue; - } - i += vo_font->width[c]+vo_font->charspace; - } - if (i > 0) { - i -= vo_font->charspace; - if (i > w) w = i; - } - - *_w = w; - *_h = (l-1) * (vo_font->height + vspace) + vo_font->height; -} - - -int menu_text_num_lines(char* txt, int max_width) { - int l = 1, i = 0; - render_txt(txt); - while (*txt) { - int c=utf8_get_char((const char**)&txt); - if(c == '\n' || i + vo_font->width[c] > max_width) { - l++; - i = 0; - if(c == '\n') continue; - } - i += vo_font->width[c]+vo_font->charspace; - } - return l; -} - - -void menu_draw_box(mp_image_t* mpi,unsigned char grey,unsigned char alpha, int x, int y, int w, int h) { - draw_alpha_f draw_alpha = get_draw_alpha(mpi->imgfmt); - int g; - - if(!draw_alpha) { - mp_tmsg(MSGT_GLOBAL,MSGL_WARN,"[MENU] Unsupported output format!!!!\n"); - return; - } - - if(x > mpi->w || y > mpi->h) return; - - if(x < 0) w += x, x = 0; - if(x+w > mpi->w) w = mpi->w-x; - if(y < 0) h += y, y = 0; - if(y+h > mpi->h) h = mpi->h-y; - - g = ((256-alpha)*grey)>>8; - if(g < 1) g = 1; - - { - int stride = (w+7)&(~7); // round to 8 - char pic[stride*h],pic_alpha[stride*h]; - memset(pic,g,stride*h); - memset(pic_alpha,alpha,stride*h); - draw_alpha(w,h,pic,pic_alpha,stride, - mpi->planes[0] + y * mpi->stride[0] + x * (mpi->bpp>>3), - mpi->stride[0]); - } - -} diff --git a/libmenu/menu.h b/libmenu/menu.h deleted file mode 100644 index 0414aea9b4..0000000000 --- a/libmenu/menu.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifndef MPLAYER_MENU_H -#define MPLAYER_MENU_H - -#include "m_struct.h" -#include "libmpcodecs/mp_image.h" - -extern double menu_mouse_x; -extern double menu_mouse_y; -extern int menu_mouse_pos_updated; -extern const struct vf_info vf_info_menu; - -struct menu_priv_s; -typedef struct menu_s menu_t; - -typedef struct menu_def_st menu_def_t; - -struct m_struct_st; - -struct menu_s { - struct MPContext *ctx; - struct m_config *mconfig; - struct input_ctx *input_ctx; - void (*draw)(menu_t* menu,mp_image_t* mpi); - void (*read_cmd)(menu_t* menu,int cmd); - int (*read_key)(menu_t* menu,int cmd); - void (*close)(menu_t* menu); - struct m_struct_st* priv_st; - struct menu_priv_s* priv; - int show; // Draw it ? - int cl; // Close request (user sent a close cmd or - menu_t* parent; - menu_def_t *type; -}; - -typedef struct menu_info_s { - const char *info; - const char *name; - const char *author; - const char *comment; - struct m_struct_st priv_st; // Config struct definition - // cfg is a config struct as defined in cfg_st, it may be used as a priv struct - // cfg is filled from the attributs found in the cfg file - // the args param hold the content of the balise in the cfg file (if any) - int (*open)(menu_t* menu, char* args); -} menu_info_t; - - -#define MENU_CMD_UP 0 -#define MENU_CMD_DOWN 1 -#define MENU_CMD_OK 2 -#define MENU_CMD_CANCEL 3 -#define MENU_CMD_LEFT 4 -#define MENU_CMD_RIGHT 5 -#define MENU_CMD_ACTION 6 -#define MENU_CMD_HOME 7 -#define MENU_CMD_END 8 -#define MENU_CMD_PAGE_UP 9 -#define MENU_CMD_PAGE_DOWN 10 -#define MENU_CMD_CLICK 11 - -/// Global init/uninit -int menu_init(struct MPContext *mpctx, struct m_config *mconfig, - struct input_ctx *input_ctx, char* cfg_file); -void menu_uninit(void); - -/// Open a menu defined in the config file -menu_t* menu_open(char *name); - -void menu_draw(menu_t* menu,mp_image_t* mpi); -void menu_read_cmd(menu_t* menu,int cmd); -void menu_close(menu_t* menu); -int menu_read_key(menu_t* menu,int cmd); - -//// Default implementation -int menu_dflt_read_key(menu_t* menu,int cmd); - -/// Receive mouse position events. -void menu_update_mouse_pos(double x, double y); - -/////////// Helpers - -#define MENU_TEXT_TOP (1<<0) -#define MENU_TEXT_VCENTER (1<<1) -#define MENU_TEXT_BOT (1<<2) -#define MENU_TEXT_VMASK (MENU_TEXT_TOP|MENU_TEXT_VCENTER|MENU_TEXT_BOT) -#define MENU_TEXT_LEFT (1<<3) -#define MENU_TEXT_HCENTER (1<<4) -#define MENU_TEXT_RIGHT (1<<5) -#define MENU_TEXT_HMASK (MENU_TEXT_LEFT|MENU_TEXT_HCENTER|MENU_TEXT_RIGHT) -#define MENU_TEXT_CENTER (MENU_TEXT_VCENTER|MENU_TEXT_HCENTER) - -void menu_draw_text(mp_image_t* mpi, char* txt, int x, int y); -int menu_text_length(char* txt); -int menu_text_num_lines(char* txt, int max_width); - -void menu_text_size(char* txt,int max_width, - int vspace, int warp, - int* _w, int* _h); - -void menu_draw_text_full(mp_image_t* mpi,char* txt, - int x, int y,int w, int h, - int vspace, int warp, int align, int anchor); - -void menu_draw_box(mp_image_t* mpi, unsigned char grey, unsigned char alpha, int x, int y, int w, int h); - -struct vf_instance; -void vf_menu_pause_update(struct vf_instance *vf); - -#endif /* MPLAYER_MENU_H */ diff --git a/libmenu/menu_chapsel.c b/libmenu/menu_chapsel.c deleted file mode 100644 index d1489549c2..0000000000 --- a/libmenu/menu_chapsel.c +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Support chapter list and selection. - * - * Copyright (C) 2006-2007 Benjamin Zores <ben A geexbox P org> - * Copyright (C) 2007 Ulion <ulion A gmail P com> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#include "config.h" - -#include "talloc.h" -#include "m_struct.h" -#include "m_option.h" -#include "input/input.h" - -#include "stream/stream.h" -#include "libmpdemux/demuxer.h" -#include "access_mpcontext.h" - -#include "libmpcodecs/mp_image.h" - -#include "menu.h" -#include "menu_list.h" - -struct list_entry_s { - struct list_entry p; - int cid; -}; - -struct menu_priv_s { - menu_list_priv_t p; - char* title; - int auto_close; - char* fmt_with_time; -}; - -static struct menu_priv_s cfg_dflt = { - MENU_LIST_PRIV_DFLT, - "Select chapter", - 0, - "${chapter_name} [${start}]" -}; - -#define ST_OFF(m) M_ST_OFF(struct menu_priv_s,m) - -static const m_option_t cfg_fields[] = { - MENU_LIST_PRIV_FIELDS, - { "title", ST_OFF (title), CONF_TYPE_STRING, 0, 0, 0, NULL }, - { "auto-close", ST_OFF (auto_close), CONF_TYPE_FLAG, 0, 0, 1, NULL }, - { "fmt-with-time", ST_OFF (fmt_with_time), CONF_TYPE_STRING, 0, 0, 0, NULL }, - { NULL, NULL, NULL, 0, 0, 0, NULL } -}; - -static char *fmt_replace(const char *fmt, const char *chapter_name, - const char *start) { - static const char ctag[] = "${chapter_name}"; - static const char stag[] = "${start}"; - int l = strlen(fmt); - int cl = strlen(chapter_name); - int sl = strlen(start); - char *str = malloc(l + cl + sl); - char *p; - strcpy(str, fmt); - p = strstr(str, ctag); - if (p) { - memmove(p+cl, p+sizeof(ctag)-1, str+l+1 - (p+sizeof(ctag)-1)); - memcpy(p, chapter_name, cl); - l -= sizeof(ctag) + 1; - l += cl; - } - p = strstr(str, stag); - if (p) { - memmove(p+sl, p+sizeof(stag)-1, str+l+1 - (p+sizeof(stag)-1)); - memcpy(p, start, sl); - l -= sizeof(stag) + 1; - l += sl; - } - return str; -} - -static int fill_menu (menu_t* menu) -{ - list_entry_t* e; - int cid, chapter_num = 0; - int start_time; - demuxer_t* demuxer = mpctx_get_demuxer(menu->ctx); - - if (demuxer) - chapter_num = demuxer_chapter_count(demuxer); - if (chapter_num > 0) { - menu_list_init (menu); - for (cid = 0; cid < chapter_num; ++cid) - if ((e = calloc (1, sizeof (list_entry_t))) != NULL) { - e->cid = cid + 1; - e->p.next = NULL; - char *str = demuxer_chapter_display_name(demuxer, cid); - e->p.txt = strdup(str); - talloc_free(str); - start_time = demuxer_chapter_time(demuxer, cid, NULL); - if (start_time >= 0) { - char timestr[13]; - char *tmp; - int hour = start_time |