From 8b5efd6455370c02211f9fec2a3dbb74f5d0fcbc Mon Sep 17 00:00:00 2001 From: Uoti Urpala Date: Tue, 25 Oct 2011 07:05:47 +0300 Subject: libmenu: remove OSD menu functionality (--menu) Something like the OSD menu functionality could be useful. However the current implementation has several problems and would require a relatively large amount of work to get into good shape. As far as I know there are few users of the existing functionality. Nobody is working on the existing code and keeping it compiling at all while changing other code would require extra work. So delete the menu code and some related code elsewhere that's used by nothing else. --- libmenu/menu.c | 776 ------------------------------------------------- libmenu/menu.h | 127 -------- libmenu/menu_chapsel.c | 186 ------------ libmenu/menu_cmdlist.c | 177 ----------- libmenu/menu_console.c | 498 ------------------------------- libmenu/menu_dvbin.c | 301 ------------------- libmenu/menu_filesel.c | 506 -------------------------------- libmenu/menu_list.c | 331 --------------------- libmenu/menu_list.h | 106 ------- libmenu/menu_param.c | 301 ------------------- libmenu/menu_pt.c | 179 ------------ libmenu/menu_txt.c | 205 ------------- libmenu/vf_menu.c | 267 ----------------- 13 files changed, 3960 deletions(-) delete mode 100644 libmenu/menu.c delete mode 100644 libmenu/menu.h delete mode 100644 libmenu/menu_chapsel.c delete mode 100644 libmenu/menu_cmdlist.c delete mode 100644 libmenu/menu_console.c delete mode 100644 libmenu/menu_dvbin.c delete mode 100644 libmenu/menu_filesel.c delete mode 100644 libmenu/menu_list.c delete mode 100644 libmenu/menu_list.h delete mode 100644 libmenu/menu_param.c delete mode 100644 libmenu/menu_pt.c delete mode 100644 libmenu/menu_txt.c delete mode 100644 libmenu/vf_menu.c (limited to 'libmenu') 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 -#include -#include -#include -#include - -#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(hpic_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 -#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 - * Copyright (C) 2007 Ulion - * - * 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 -#include -#include - -#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 / 3600; - int minute = (start_time / 60) % 60; - int seconds = start_time % 60; - sprintf(timestr,"%02d:%02d:%02d", hour, minute, seconds); - - tmp = fmt_replace(menu->priv->fmt_with_time, e->p.txt, timestr); - free(e->p.txt); - e->p.txt = tmp; - } - menu_list_add_entry(menu, e); - } - } - else - menu_list_read_cmd(menu, MENU_CMD_CANCEL); - - return 1; -} - -static void read_cmd (menu_t* menu, int cmd) -{ - switch (cmd) { - case MENU_CMD_RIGHT: - case MENU_CMD_OK: { - char cmdbuf[26]; - sprintf(cmdbuf, "seek_chapter %d 1", menu->priv->p.current->cid); - mp_input_queue_cmd(menu->input_ctx, mp_input_parse_cmd(cmdbuf)); - if (menu->priv->auto_close) - mp_input_queue_cmd(menu->input_ctx, mp_input_parse_cmd("menu hide")); - break; - } - default: - menu_list_read_cmd (menu, cmd); - } -} - -static void close_cs (menu_t* menu) -{ - menu_list_uninit (menu, NULL); -} - -static int open_cs (menu_t* menu, char* args) -{ - args = NULL; - - menu->draw = menu_list_draw; - menu->read_cmd = read_cmd; - menu->close = close_cs; - menu->priv->p.title = menu->priv->title; - - return fill_menu (menu); -} - -const menu_info_t menu_info_chapsel = { - "Chapter selector menu", - "chapsel", - "Benjamin Zores & Ulion", - "", - { - "chapsel_cfg", - sizeof(struct menu_priv_s), - &cfg_dflt, - cfg_fields - }, - open_cs -}; diff --git a/libmenu/menu_cmdlist.c b/libmenu/menu_cmdlist.c deleted file mode 100644 index 14026d04c4..0000000000 --- a/libmenu/menu_cmdlist.c +++ /dev/null @@ -1,177 +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 -#include -#include -#include - -#include "libmpcodecs/img_format.h" -#include "libmpcodecs/mp_image.h" - -#include "m_option.h" -#include "m_struct.h" -#include "asxparser.h" -#include "menu.h" -#include "menu_list.h" - -#include "sub/font_load.h" - -#include "input/input.h" - - - -struct list_entry_s { - struct list_entry p; - - char* ok; - char* cancel; - char* left; - char* right; -}; - -struct menu_priv_s { - menu_list_priv_t p; -}; - -#define ST_OFF(m) M_ST_OFF(struct menu_priv_s, m) - -static struct menu_priv_s cfg_dflt = { - MENU_LIST_PRIV_DFLT, -}; - -static const m_option_t cfg_fields[] = { - MENU_LIST_PRIV_FIELDS, - { "title",M_ST_OFF(struct menu_priv_s,p.title), CONF_TYPE_STRING, 0, 0, 0, NULL }, - { NULL, NULL, NULL, 0,0,0,NULL } -}; - -#define mpriv (menu->priv) - -static void read_cmd(menu_t* menu,int cmd) { - switch(cmd) { - case MENU_CMD_RIGHT: - if(mpriv->p.current->right) { - mp_input_parse_and_queue_cmds(menu->input_ctx, mpriv->p.current->right); - break; - } // fallback on ok if right is not defined - case MENU_CMD_OK: - if (mpriv->p.current->ok) - mp_input_parse_and_queue_cmds(menu->input_ctx, mpriv->p.current->ok); - break; - case MENU_CMD_LEFT: - if(mpriv->p.current->left) { - mp_input_parse_and_queue_cmds(menu->input_ctx, mpriv->p.current->left); - break; - } // fallback on cancel if left is not defined - case MENU_CMD_CANCEL: - if(mpriv->p.current->cancel) { - mp_input_parse_and_queue_cmds(menu->input_ctx, mpriv->p.current->cancel); - break; - } - default: - menu_list_read_cmd(menu,cmd); - } -} - -static void free_entry(list_entry_t* entry) { - free(entry->ok); - free(entry->cancel); - free(entry->left); - free(entry->right); - free(entry->p.txt); - free(entry); -} - -static void close_menu(menu_t* menu) { - menu_list_uninit(menu,free_entry); -} - -static int parse_args(menu_t* menu,char* args) { - char *element,*body, **attribs, *name; - list_entry_t* m = NULL; - int r; - ASX_Parser_t* parser = asx_parser_new(menu->mconfig); - - while(1) { - r = asx_get_element(parser,&args,&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 -1; - } else if(r == 0) { - asx_parser_free(parser); - if(!m) - mp_tmsg(MSGT_GLOBAL,MSGL_WARN,"[MENU] No entry found in the menu definition.\n"); - return m ? 1 : 0; - } - // Has it a name ? - name = asx_get_attrib("name",attribs); - if(!name) { - mp_tmsg(MSGT_GLOBAL,MSGL_WARN,"[MENU] List menu entry definitions need a name (line %d).\n",parser->line); - free(element); - free(body); - asx_free_attribs(attribs); - continue; - } - m = calloc(1,sizeof(struct list_entry_s)); - m->p.txt = name; - m->ok = asx_get_attrib("ok",attribs); - m->cancel = asx_get_attrib("cancel",attribs); - m->left = asx_get_attrib("left",attribs); - m->right = asx_get_attrib("right",attribs); - menu_list_add_entry(menu,m); - - free(element); - free(body); - asx_free_attribs(attribs); - } -} - -static int open_cmdlist(menu_t* menu, char* args) { - menu->draw = menu_list_draw; - menu->read_cmd = read_cmd; - menu->close = close_menu; - - if(!args) { - mp_tmsg(MSGT_GLOBAL,MSGL_WARN,"[MENU] List menu needs an argument.\n"); - return 0; - } - - menu_list_init(menu); - if(!parse_args(menu,args)) - return 0; - return 1; -} - -const menu_info_t menu_info_cmdlist = { - "Command list menu", - "cmdlist", - "Albeu", - "", - { - "cmdlist_cfg", - sizeof(struct menu_priv_s), - &cfg_dflt, - cfg_fields - }, - open_cmdlist -}; diff --git a/libmenu/menu_console.c b/libmenu/menu_console.c deleted file mode 100644 index 5e1687b823..0000000000 --- a/libmenu/menu_console.c +++ /dev/null @@ -1,498 +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 -#include -#include -#include -#include -#include -#ifndef __MINGW32__ -#include -#endif -#include -#include - -#include "libmpcodecs/img_format.h" -#include "libmpcodecs/mp_image.h" - -#include "m_struct.h" -#include "m_option.h" -#include "menu.h" - -#include "sub/font_load.h" -#include "input/keycodes.h" -#include "input/input.h" -#include "osdep/timer.h" - -typedef struct history_st history_t; - -struct history_st { - char* buffer; - int size; - history_t* next; - history_t* prev; -}; - -struct menu_priv_s { - char** lines; // Our buffer - int last_line; - int num_lines; - int add_line; - unsigned int hide_ts; - unsigned int show_ts; - pid_t child; // Child process if we are running a shell cmd - int child_fd[3]; // The 3 default fd - char* prompt; - //int max_lines; // Max number of lines with the last mpi - history_t* history; - history_t* cur_history; - int history_size; - - char* mp_prompt; - char* child_prompt; - int buf_lines; // Buffer size (in line) - int height; // Display size in % - int minb; - int vspace; - int bg,bg_alpha; - unsigned int hide_time; - unsigned int show_time; - int history_max; - int raw_child; -}; - -static struct menu_priv_s cfg_dflt = { - NULL, - 0, - 0, - 1, - 0, - 0, - 0, - { 0 , 0, 0 }, - NULL, - NULL, - NULL, - 0, - - "# ", - "$ ", - 50, // lines - 33, // % - 3, - 3, - 0x80,0x40, - 500, - 500, - 10, - 0 -}; - -#define ST_OFF(m) M_ST_OFF(struct menu_priv_s,m) - -static const m_option_t cfg_fields[] = { - { "prompt", ST_OFF(mp_prompt), CONF_TYPE_STRING, M_OPT_MIN, 1, 0, NULL }, - { "child-prompt", ST_OFF(child_prompt), CONF_TYPE_STRING, M_OPT_MIN, 1, 0, NULL }, - { "buffer-lines", ST_OFF(buf_lines), CONF_TYPE_INT, M_OPT_MIN, 5, 0, NULL }, - { "height", ST_OFF(height), CONF_TYPE_INT, M_OPT_RANGE, 1, 100, NULL }, - { "minbor", ST_OFF(minb), CONF_TYPE_INT, M_OPT_MIN, 0, 0, NULL }, - { "vspace", ST_OFF(vspace), CONF_TYPE_INT, M_OPT_MIN, 0, 0, NULL }, - { "bg", ST_OFF(bg), CONF_TYPE_INT, M_OPT_RANGE, -1, 255, NULL }, - { "bg-alpha", ST_OFF(bg_alpha), CONF_TYPE_INT, M_OPT_RANGE, 0, 255, NULL }, - { "show-time",ST_OFF(show_time), CONF_TYPE_INT, M_OPT_MIN, 0, 0, NULL }, - { "hide-time",ST_OFF(hide_time), CONF_TYPE_INT, M_OPT_MIN, 0, 0, NULL }, - { "history-size",ST_OFF(history_max), CONF_TYPE_INT, M_OPT_MIN, 1, 0, NULL }, - { "raw-child", ST_OFF(raw_child), CONF_TYPE_FLAG, 0, 0, 1, NULL }, - { NULL, NULL, NULL, 0,0,0,NULL } -}; - -#define mpriv (menu->priv) - -static void check_child(menu_t* menu); - -static void add_line(struct menu_priv_s* priv, char* l) { - char* eol = strchr(l,'\n'); - - if(eol) { - if(eol != l) { - eol[0] = '\0'; - add_line(priv,l); - } - if(eol[1]) add_line(priv,eol+1); - return; - } - - if(priv->num_lines >= priv->buf_lines) - free(priv->lines[priv->last_line]); - else - priv->num_lines++; - - priv->lines[priv->last_line] = strdup(l); - priv->last_line = (priv->last_line + 1) % priv->buf_lines; - priv->add_line = 1; -} - -static void add_string(struct menu_priv_s* priv, char* l) { - char* eol = strchr(l,'\n'); - int ll = priv->last_line > 0 ? priv->last_line - 1 : priv->buf_lines-1; - - if(priv->num_lines <= 0 || priv->add_line || eol == l) { - add_line(priv,l); - priv->add_line = 0; - return; - } - - if(eol) { - eol[0] = '\0'; - add_string(priv,l); - if(eol[1]) { - add_line(priv,eol+1); - priv->add_line = 0; - } else - priv->add_line = 1; - return; - } - priv->lines[ll] = realloc(priv->lines[ll],strlen(priv->lines[ll]) + strlen(l) + 1); - if ( priv->lines[ll] != NULL ) - { - strcat(priv->lines[ll],l); - } -} - -static void draw(menu_t* menu, mp_image_t* mpi) { - int h = mpi->h*mpriv->height/100; - int w = mpi->w - 2* mpriv->minb; - int x = mpriv->minb, y; - int lw,lh,i, ll; - - if(mpriv->child) check_child(menu); - - ll = mpriv->last_line - 1; - - if(mpriv->hide_ts) { - unsigned int t = GetTimerMS() - mpriv->hide_ts; - if(t >= mpriv->hide_time) { - mpriv->hide_ts = 0; - menu->show = 0; - return; - } - h = mpi->h*(mpriv->height - (mpriv->height * t /mpriv->hide_time))/100; - } else if(mpriv->show_time && mpriv->show_ts == 0) { - mpriv->show_ts = GetTimerMS(); - return; - } else if(mpriv->show_ts > 0) { - unsigned int t = GetTimerMS() - mpriv->show_ts; - if(t > mpriv->show_time) - mpriv->show_ts = -1; - else - h = mpi->h*(mpriv->height * t /mpriv->hide_time)/100; - } - - y = h - mpriv->vspace; - - if(x < 0 || y < 0 || w <= 0 || h <= 0 ) - return; - - if(mpriv->bg >= 0) - menu_draw_box(mpi,mpriv->bg,mpriv->bg_alpha,0,0,mpi->w,h); - - if(!mpriv->child || !mpriv->raw_child){ - char input[strlen(mpriv->cur_history->buffer) + strlen(mpriv->prompt) + 1]; - sprintf(input,"%s%s",mpriv->prompt,mpriv->cur_history->buffer); - menu_text_size(input,w,mpriv->vspace,1,&lw,&lh); - menu_draw_text_full(mpi,input,x,y,w,h,mpriv->vspace,1, - MENU_TEXT_BOT|MENU_TEXT_LEFT, - MENU_TEXT_BOT|MENU_TEXT_LEFT); - y -= lh + mpriv->vspace; - } - - - for( i = 0 ; y > mpriv->minb && i < mpriv->num_lines ; i++){ - int c = (ll - i) >= 0 ? ll - i : mpriv->buf_lines + ll - i; - menu_text_size(mpriv->lines[c],w,mpriv->vspace,1,&lw,&lh); - menu_draw_text_full(mpi,mpriv->lines[c],x,y,w,h,mpriv->vspace,1, - MENU_TEXT_BOT|MENU_TEXT_LEFT, - MENU_TEXT_BOT|MENU_TEXT_LEFT); - y -= lh + mpriv->vspace; - } - return; -} - -static void check_child(menu_t* menu) { -#ifndef __MINGW32__ - fd_set rfd; - struct timeval tv; - int max_fd = mpriv->child_fd[2] > mpriv->child_fd[1] ? mpriv->child_fd[2] : - mpriv->child_fd[1]; - int i,r,child_status,w; - char buffer[256]; - - if(!mpriv->child) return; - - memset(&tv,0,sizeof(struct timeval)); - FD_ZERO(&rfd); - FD_SET(mpriv->child_fd[1],&rfd); - FD_SET(mpriv->child_fd[2],&rfd); - - r = select(max_fd+1,&rfd, NULL, NULL, &tv); - if(r == 0) { - r = waitpid(mpriv->child,&child_status,WNOHANG); - if(r < 0){ - if(errno==ECHILD){ ///exiting children get handled in mplayer.c - for(i = 0 ; i < 3 ; i++) - close(mpriv->child_fd[i]); - mpriv->child = 0; - mpriv->prompt = mpriv->mp_prompt; - //add_line(mpriv,"Child process exited"); - } - else mp_tmsg(MSGT_GLOBAL,MSGL_ERR,"[MENU] Waitpid error: %s.\n",strerror(errno)); - } - } else if(r < 0) { - mp_tmsg(MSGT_GLOBAL,MSGL_ERR,"[MENU] Select error.\n"); - return; - } - - w = 0; - for(i = 1 ; i < 3 ; i++) { - if(FD_ISSET(mpriv->child_fd[i],&rfd)){ - if(w) mpriv->add_line = 1; - r = read(mpriv->child_fd[i],buffer,255); - if(r < 0) - mp_tmsg(MSGT_GLOBAL,MSGL_ERR,"[MENU] Read error on child's file descriptor: %s.\n", i == 1 ? "stdout":"stderr"); - else if(r>0) { - buffer[r] = '\0'; - add_string(mpriv,buffer); - } - w = 1; - } - } -#endif - -} - -#define close_pipe(pipe) close(pipe[0]); close(pipe[1]) - -static int run_shell_cmd(menu_t* menu, char* cmd) { -#ifndef __MINGW32__ - int in[2],out[2],err[2]; - - mp_tmsg(MSGT_GLOBAL,MSGL_INFO,"[MENU] Console run: %s ...\n",cmd); - if(mpriv->child) { - mp_tmsg(MSGT_GLOBAL,MSGL_ERR,"[MENU] A child is already running.\n"); - return 0; - } - - pipe(in); - pipe(out); - pipe(err); - - mpriv->child = fork(); - if(mpriv->child < 0) { - mp_tmsg(MSGT_GLOBAL,MSGL_ERR,"[MENU] Fork failed !!!\n"); - close_pipe(in); - close_pipe(out); - close_pipe(err); - return 0; - } - if(!mpriv->child) { // Chlid process - int err_fd = dup(2); - FILE* errf = fdopen(err_fd,"w"); - // Bind the std fd to our pipes - dup2(in[0],0); - dup2(out[1],1); - dup2(err[1],2); - execl("/bin/sh","sh","-c",cmd,(void*)NULL); - fprintf(errf,"exec failed : %s\n",strerror(errno)); - exit(1); - } - // MPlayer - mpriv->child_fd[0] = in[1]; - mpriv->child_fd[1] = out[0]; - mpriv->child_fd[2] = err[0]; - mpriv->prompt = mpriv->child_prompt; - //add_line(mpriv,"Child process started"); -#endif - return 1; -} - -static void enter_cmd(menu_t* menu) { - history_t* h; - char input[strlen(mpriv->cur_history->buffer) + strlen(mpriv->prompt) + 1]; - - sprintf(input,"%s%s",mpriv->prompt,mpriv->cur_history->buffer); - add_line(mpriv,input); - - if(mpriv->history == mpriv->cur_history) { - if(mpriv->history_size >= mpriv->history_max) { - history_t* i; - for(i = mpriv->history ; i->prev ; i = i->prev) - /**/; - i->next->prev = NULL; - free(i->buffer); - free(i); - } else - mpriv->history_size++; - h = calloc(1,sizeof(history_t)); - h->size = 255; - h->buffer = calloc(h->size,1); - h->prev = mpriv->history; - mpriv->history->next = h; - mpriv->history = h; - } else - mpriv->history->buffer[0] = '\0'; - - mpriv->cur_history = mpriv->history; - //mpriv->input = mpriv->cur_history->buffer; -} - -static void read_cmd(menu_t* menu,int cmd) { - switch(cmd) { - case MENU_CMD_CANCEL: - if(mpriv->hide_time) - mpriv->hide_ts = GetTimerMS(); - else - menu->show = 0; - mpriv->show_ts = 0; - return; - case MENU_CMD_OK: { - mp_cmd_t* c; - if(mpriv->child) { - char *str = mpriv->cur_history->buffer; - int l = strlen(str); - while(l > 0) { - int w = write(mpriv->child_fd[0],str,l); - if(w < 0) { - mp_tmsg(MSGT_GLOBAL,MSGL_ERR,"[MENU] write error\n"); - break; - } - l -= w; - str += w; - } - if(write(mpriv->child_fd[0],"\n",1) < 0) - mp_tmsg(MSGT_GLOBAL,MSGL_ERR,"[MENU] write error\n"); - enter_cmd(menu); - return; - } - c = mp_input_parse_cmd(mpriv->cur_history->buffer); - enter_cmd(menu); - if(!c) - add_line(mpriv,"Invalid command try help"); - else { - switch(c->id) { - case MP_CMD_CHELP: - add_line(mpriv,"MPlayer console 0.01"); - add_line(mpriv,"TODO: meaningful help message ;)"); - add_line(mpriv,"Enter any slave command"); - add_line(mpriv,"exit close this console"); - break; - case MP_CMD_CEXIT: - menu->show = 0; - menu->cl = 1; - break; - case MP_CMD_CHIDE: - if(mpriv->hide_time) - mpriv->hide_ts = GetTimerMS(); - else - menu->show = 0; - mpriv->show_ts = 0; - break; - case MP_CMD_RUN: - run_shell_cmd(menu,c->args[0].v.s); - break; - default: // Send the other commands to mplayer - mp_input_queue_cmd(menu->input_ctx, c); - } - } - return; - } - case MENU_CMD_UP: - if(mpriv->cur_history->prev) - mpriv->cur_history = mpriv->cur_history->prev; - break; - case MENU_CMD_DOWN: - if(mpriv->cur_history->next) - mpriv->cur_history = mpriv->cur_history->next; - break; - } -} - -static int read_key(menu_t* menu,int c) { - if(mpriv->child && mpriv->raw_child) { - write(mpriv->child_fd[0],&c,sizeof(int)); - return 1; - } - - if (c == KEY_DELETE || c == KEY_BS) { - unsigned int i = strlen(mpriv->cur_history->buffer); - if(i > 0) - mpriv->cur_history->buffer[i-1] = '\0'; - return 1; - } - if (menu_dflt_read_key(menu, c)) - return 1; - - if(isascii(c)) { - int l = strlen(mpriv->cur_history->buffer); - if(l >= mpriv->cur_history->size) { - mpriv->cur_history->size += 255; - mpriv->cur_history->buffer = realloc(mpriv->cur_history,mpriv->cur_history->size); - } - mpriv->cur_history->buffer[l] = (char)c; - mpriv->cur_history->buffer[l+1] = '\0'; - return 1; - } - return 0; -} - - -static int openMenu(menu_t* menu, char* args) { - - - menu->draw = draw; - menu->read_cmd = read_cmd; - menu->read_key = read_key; - - mpriv->lines = calloc(mpriv->buf_lines,sizeof(char*)); - mpriv->prompt = mpriv->mp_prompt; - mpriv->cur_history = mpriv->history = calloc(1,sizeof(history_t)); - mpriv->cur_history->buffer = calloc(255,1); - mpriv->cur_history->size = 255; - - if(args) - add_line(mpriv,args); - - return 1; -} - -const menu_info_t menu_info_console = { - "MPlayer console", - "console", - "Albeu", - "", - { - "console_cfg", - sizeof(struct menu_priv_s), - &cfg_dflt, - cfg_fields - }, - openMenu, -}; diff --git a/libmenu/menu_dvbin.c b/libmenu/menu_dvbin.c deleted file mode 100644 index c21fadf635..0000000000 --- a/libmenu/menu_dvbin.c +++ /dev/null @@ -1,301 +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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "config.h" - -#include "m_struct.h" -#include "m_option.h" - -#include "libmpcodecs/img_format.h" -#include "libmpcodecs/mp_image.h" - -#include "menu.h" -#include "menu_list.h" -#include "input/input.h" -#include "input/keycodes.h" - -#include "stream/dvbin.h" - - - -struct list_entry_s { - struct list_entry p; - int num; //the position of the chosen channel in the list -}; - -struct menu_priv_s { - menu_list_priv_t p; - char* title; - char* file; - int card; - int level; - int auto_close; - dvb_config_t *config; -}; - - -#define ST_OFF(m) M_ST_OFF(struct menu_priv_s, m) -#define mpriv (menu->priv) - -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 }, - { NULL, NULL, NULL, 0,0,0,NULL }, -}; - - -static struct menu_priv_s cfg_dflt = { - MENU_LIST_PRIV_DFLT, - "Select a channel: ", - "channels.conf", - 0, - 0, - 1, - NULL, -}; - - - - -static void free_entry(list_entry_t* entry) -{ - free(entry->p.txt); - free(entry); -} - - -static int fill_channels_menu(menu_t *menu, dvb_channels_list *dvb_list_ptr) -{ - int n; - dvb_channel_t *channel; - list_entry_t* elem; - - mpriv->level = 2; - if(dvb_list_ptr == NULL) - { - mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_set_channel: LIST NULL PTR, quit\n"); - n = 1; - if((elem = calloc(1, sizeof(list_entry_t))) != NULL) - { - elem->p.next = NULL; - elem->p.txt = strdup("There are no channels for this DVB card!"); - - menu_list_add_entry(menu, elem); - } - return 1; - } - for(n = 0; n < dvb_list_ptr->NUM_CHANNELS; n++) - { - channel = &(dvb_list_ptr->channels[n]); - if((elem = calloc(1, sizeof(list_entry_t))) != NULL) - { - elem->p.next = NULL; - elem->p.txt = strdup(channel->name); - elem->num = n; - - menu_list_add_entry(menu, elem); - } - else - { - mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_menu: fill_menu: couldn't malloc %zd bytes for menu item: %s, exit\n", - sizeof(list_entry_t), strerror(errno)); - break; - } - } - - return n; -} - - -static int fill_cards_menu(menu_t *menu, dvb_config_t *conf) -{ - int n; - list_entry_t* elem; - - for(n = 0; n < conf->count; n++) - { - if((elem = calloc(1, sizeof(list_entry_t))) != NULL) - { - elem->p.next = NULL; - elem->p.txt = strdup(conf->cards[n].name); - elem->num = n; - - if(n == 0) - elem->p.prev = NULL; - - menu_list_add_entry(menu, elem); - } - else - { - fprintf(stderr, "dvb_menu: fill_menu: couldn't malloc %zd bytes for menu item: %s, exit\n", - sizeof(list_entry_t), strerror(errno)); - if(n) - return 1; - - return 0; - } - } - - return n; -} - - -static int fill_menu(menu_t* menu) -{ - list_entry_t* elem; - dvb_channels_list *dvb_list_ptr; - - menu_list_init(menu); - - if(mpriv->config == NULL) - { - if((elem = calloc(1, sizeof(list_entry_t))) != NULL) - { - elem->p.prev = elem->p.next = NULL; - elem->p.txt = strdup("NO DVB configuration present!"); - - menu_list_add_entry(menu, elem); - return 1; - } - return 0; - } - - mpriv->p.title = mpriv->title; - if(mpriv->level == 1 && mpriv->config->count > 1) - return fill_cards_menu(menu, mpriv->config); - else - { - dvb_list_ptr = mpriv->config->cards[mpriv->card].list; - return fill_channels_menu(menu, dvb_list_ptr); - } -} - - -static void read_cmd(menu_t* menu, int cmd) -{ - list_entry_t *elem; - mp_cmd_t* c; - char *cmd_name; - switch(cmd) - { - case MENU_CMD_RIGHT: - case MENU_CMD_OK: - { - elem = mpriv->p.current; - - if(mpriv->level == 1) - { - mpriv->card = mpriv->p.current->num; - mpriv->level = 2; - menu_list_uninit(menu, free_entry); - fill_menu(menu); - } - else - { - dvb_priv_t *dvbp = (dvb_priv_t*) mpriv->config->priv; - cmd_name = malloc(25 + strlen(elem->p.txt)); - if(dvbp != NULL) - sprintf(cmd_name, "dvb_set_channel %d %d", elem->num, mpriv->card); - else - sprintf(cmd_name, "loadfile 'dvb://%d@%s'", mpriv->card+1, elem->p.txt); - - c = mp_input_parse_cmd(cmd_name); - free(cmd_name); - if(c) - { - if(mpriv->auto_close) - mp_input_queue_cmd(menu->input_ctx, mp_input_parse_cmd ("menu hide")); - mp_input_queue_cmd(menu->input_ctx, c); - } - } - } - break; - - case MENU_CMD_LEFT: - case MENU_CMD_CANCEL: - { - elem = mpriv->p.current; - - menu_list_uninit(menu, free_entry); - if(mpriv->config->count > 1) - mpriv->level--; - else - mpriv->level = 0; - - if(mpriv->level > 0) - { - fill_menu(menu); - break; - } - } - - default: - menu_list_read_cmd(menu, cmd); - } -} - - -static void close_menu(menu_t* menu) -{ - dvb_free_config(mpriv->config); - menu_list_uninit(menu, free_entry); -} - - -static int open_dvb_sel(menu_t* menu, char* args) -{ - mpriv->config = dvb_get_config(); - if(mpriv->config == NULL) - return 0; - - menu->draw = menu_list_draw; - menu->read_cmd = read_cmd; - menu->close = close_menu; - - mpriv->card = 0; - mpriv->level = 1; - return fill_menu(menu); -} - -const menu_info_t menu_info_dvbsel = -{ - "DVB channels menu", //descr - "dvbsel", //name - "Nico", //author - "dvb_sel", - { //m_struct_t priv_st= - "dvb_cfg", //name - sizeof(struct menu_priv_s), //size - &cfg_dflt, //defaults - cfg_fields //settable fields - }, - open_dvb_sel //open function -}; diff --git a/libmenu/menu_filesel.c b/libmenu/menu_filesel.c deleted file mode 100644 index 7c63954d1d..0000000000 --- a/libmenu/menu_filesel.c +++ /dev/null @@ -1,506 +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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "config.h" -#include "mp_msg.h" - -#include "m_struct.h" -#include "m_option.h" - -#include "libmpcodecs/img_format.h" -#include "libmpcodecs/mp_image.h" - -#include "menu.h" -#include "menu_list.h" -#include "input/input.h" -#include "input/keycodes.h" - -#define MENU_KEEP_PATH "/tmp/mp_current_path" - -int menu_keepdir = 0; -char *menu_chroot = NULL; - -struct list_entry_s { - struct list_entry p; - int d; -}; - -struct menu_priv_s { - menu_list_priv_t p; - char* dir; // current dir - /// Cfg fields - char* path; - char* title; - char* file_action; - char* dir_action; - char** actions; - char* filter; -}; - -static struct menu_priv_s cfg_dflt = { - MENU_LIST_PRIV_DFLT, - NULL, - - NULL, - "Select a file: %p", - "loadfile '%p'", - NULL, - NULL, - NULL -}; - -#define ST_OFF(m) M_ST_OFF(struct menu_priv_s,m) - -static const m_option_t cfg_fields[] = { - MENU_LIST_PRIV_FIELDS, - { "path", ST_OFF(path), CONF_TYPE_STRING, 0, 0, 0, NULL }, - { "title", ST_OFF(title), CONF_TYPE_STRING, 0, 0, 0, NULL }, - { "file-action", ST_OFF(file_action), CONF_TYPE_STRING, 0, 0, 0, NULL }, - { "dir-action", ST_OFF(dir_action), CONF_TYPE_STRING, 0, 0, 0, NULL }, - { "actions", ST_OFF(actions), CONF_TYPE_STRING_LIST, 0, 0, 0, NULL}, - { "filter", ST_OFF(filter), CONF_TYPE_STRING, 0, 0, 0, NULL}, - { NULL, NULL, NULL, 0,0,0,NULL } -}; - -#define mpriv (menu->priv) - -static void free_entry(list_entry_t* entry) { - free(entry->p.txt); - free(entry); -} - -static char* replace_path(char* title , char* dir , int escape) { - char *p = strstr(title,"%p"); - if(p) { - int tl = strlen(title); - int dl = strlen(dir); - int t1l = p-title; - int l = tl - 2 + dl; - char *r, *n, *d = dir; - - if (escape) { - do { - if (*d == '\\') - l++; - else if (*d == '\'') /* ' -> \'\\\'\' */ - l+=7; - } while (*d++); - } - r = malloc(l + 1); - n = r + t1l; - memcpy(r,title,t1l); - do { - if (escape) { - if (*dir == '\\') - *n++ = '\\'; - else if (*dir == '\'') { /* ' -> \'\\\'\' */ - *n++ = '\\'; *n++ = '\''; - *n++ = '\\'; *n++ = '\\'; - *n++ = '\\'; *n++ = '\''; - *n++ = '\\'; - } - } - } while ((*n++ = *dir++)); - if(tl - t1l - 2 > 0) - strcpy(n-1,p+2); - return r; - } else - return title; -} - -typedef int (*kill_warn)(const void*, const void*); - -static int mylstat(char *dir, char *file,struct stat* st) { - int l = strlen(dir) + strlen(file); - char s[l+2]; - if (!strcmp("..", file)) { - char *slash; - l -= 3; - strcpy(s, dir); -#if HAVE_DOS_PATHS - if (s[l] == '/' || s[l] == '\\') -#else - if (s[l] == '/') -#endif - s[l] = '\0'; - slash = strrchr(s, '/'); -#if HAVE_DOS_PATHS - if (!slash) - slash = strrchr(s,'\\'); -#endif - if (!slash) - return stat(dir,st); - slash[1] = '\0'; - return stat(s,st); - } - sprintf(s,"%s/%s",dir,file); - return stat(s,st); -} - -static int compare(char **a, char **b){ - if((*a)[strlen(*a) - 1] == '/') { - if((*b)[strlen(*b) - 1] == '/') - return strcmp(*b, *a) ; - else - return 1; - } else { - if((*b)[strlen(*b) - 1] == '/') - return -1; - else - return strcmp(*b, *a); - } -} - -static char **get_extensions(menu_t *menu){ - char **extensions, ext[32]; - FILE *fp; - int n = 1; - - if (!mpriv->filter) - return NULL; - - fp = fopen(mpriv->filter, "r"); - if(!fp) - return NULL; - - extensions = malloc(sizeof(*extensions)); - *extensions = NULL; - - while(fgets(ext,sizeof(ext),fp)) { - char **l, *e; - int s = strlen (ext); - - if(ext[s-1] == '\n') { - ext[s-1] = '\0'; - s--; - } - e = malloc(s+1); - extensions = realloc(extensions, ++n * sizeof(*extensions)); - extensions = realloc(extensions, ++n * sizeof(*extensions)); - strcpy (e, ext); - for (l=extensions; *l; l++); - *l++ = e; - *l = NULL; - } - - fclose (fp); - return extensions; -} - -static void free_extensions(char **extensions){ - if (extensions) { - char **l = extensions; - while (*l) - free (*l++); - free (extensions); - } -} - -static int open_dir(menu_t* menu,char* args) { - char **namelist, **tp; - struct dirent *dp; - struct stat st; - int n; - int path_fp; - list_entry_t* e; - DIR* dirp; - extern int file_filter; - char **extensions, **elem, *ext; - - menu_list_init(menu); - - free(mpriv->dir); - mpriv->dir = strdup(args); - if(mpriv->p.title && mpriv->p.title != mpriv->title && mpriv->p.title != cfg_dflt.p.title) - free(mpriv->p.title); - - mpriv->p.title = replace_path(mpriv->title,mpriv->dir,0); - - if ((dirp = opendir (mpriv->dir)) == NULL){ - mp_tmsg(MSGT_GLOBAL,MSGL_ERR,"[MENU] opendir error: %s\n", strerror(errno)); - return 0; - } - - if (menu_keepdir) { - path_fp = open (MENU_KEEP_PATH, O_CREAT | O_WRONLY | O_TRUNC, 0666); - if (path_fp >= 0) { - write (path_fp, mpriv->dir, strlen (mpriv->dir)); - close (path_fp); - } - } - - namelist = malloc(sizeof(char *)); - extensions = get_extensions(menu); - - n=0; - while ((dp = readdir(dirp)) != NULL) { - if(dp->d_name[0] == '.' && strcmp(dp->d_name,"..") != 0) - continue; - if (menu_chroot && !strcmp (dp->d_name,"..")) { - size_t len = strlen (menu_chroot); - if ((strlen (mpriv->dir) == len || strlen (mpriv->dir) == len + 1) - && !strncmp (mpriv->dir, menu_chroot, len)) - continue; - } - if (mylstat(args,dp->d_name,&st)) - continue; - if (file_filter && extensions && !S_ISDIR(st.st_mode)) { - if((ext = strrchr(dp->d_name,'.')) == NULL) - continue; - ext++; - elem = extensions; - do { - if (!strcasecmp(ext, *elem)) - break; - } while (*++elem); - if (*elem == NULL) - continue; - } - if(n%20 == 0){ // Get some more mem - if((tp = realloc(namelist, (n+20) * sizeof (char *))) - == NULL) { - mp_tmsg(MSGT_GLOBAL,MSGL_ERR,"[MENU] realloc error: %s\n", strerror(errno)); - n--; - goto bailout; - } - namelist=tp; - } - - namelist[n] = malloc(strlen(dp->d_name) + 2); - if(namelist[n] == NULL){ - mp_tmsg(MSGT_GLOBAL,MSGL_ERR,"[MENU] memory allocation error: %s\n", strerror(errno)); - n--; - goto bailout; - } - - strcpy(namelist[n], dp->d_name); - if(S_ISDIR(st.st_mode)) - strcat