annotate libmenu/menu_param.c @ 24427:50159082a80b

Check wLongsPerEntry before using it. This fixes a potential crash for some values of it. As a side effect it works around broken callocs with an integer overflow vulnerability, but using MPlayer on such systems should never be assumed to be safe!
author reimar
date Thu, 13 Sep 2007 15:18:57 +0000
parents 69bf352bcef8
children 96d0992c7920
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
1
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
2 #include "config.h"
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
3
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
4 #include <stdlib.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
5 #include <stdio.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
6 #include <dirent.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
7 #include <errno.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
8 #include <string.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
9 #include <sys/types.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
10 #include <sys/stat.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
11 #include <ctype.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
12
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
13 #include "mp_msg.h"
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
14 #include "help_mp.h"
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
15
16862
931bdbc37ee0 Unify include paths, -I.. is in CFLAGS.
diego
parents: 10864
diff changeset
16 #include "m_struct.h"
931bdbc37ee0 Unify include paths, -I.. is in CFLAGS.
diego
parents: 10864
diff changeset
17 #include "m_option.h"
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
18 #include "m_property.h"
16862
931bdbc37ee0 Unify include paths, -I.. is in CFLAGS.
diego
parents: 10864
diff changeset
19 #include "asxparser.h"
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
20
19431
ac69ba536915 Explicitly include libmpcodecs/img_format.h and libvo/fastmemcpy.h.
diego
parents: 19059
diff changeset
21 #include "libmpcodecs/img_format.h"
ac69ba536915 Explicitly include libmpcodecs/img_format.h and libvo/fastmemcpy.h.
diego
parents: 19059
diff changeset
22 #include "libmpcodecs/mp_image.h"
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
23
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
24 #include "menu.h"
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
25 #include "menu_list.h"
16862
931bdbc37ee0 Unify include paths, -I.. is in CFLAGS.
diego
parents: 10864
diff changeset
26 #include "input/input.h"
931bdbc37ee0 Unify include paths, -I.. is in CFLAGS.
diego
parents: 10864
diff changeset
27 #include "osdep/keycodes.h"
23398
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
28 #include "command.h"
19529
9a59c33bee29 new option for libmenu that allow display of properties and metadata of currently played stream
ben
parents: 19431
diff changeset
29
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
30 struct list_entry_s {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
31 struct list_entry p;
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
32 char* name;
23398
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
33 char* txt;
23393
a5e55cb59bbc Rework the property API to allow sub properties such as
albeu
parents: 22284
diff changeset
34 char* prop;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
35 m_option_t* opt;
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
36 char* menu;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
37 };
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
38
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
39 struct menu_priv_s {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
40 menu_list_priv_t p;
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
41 char* ptr;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
42 int edit;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
43 /// Cfg fields
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
44 char* na;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
45 int hide_na;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
46 };
19532
13599373bb02 added new helpers to allow easy metadata retrieval and make libmenu use them
ben
parents: 19529
diff changeset
47
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
48 static struct menu_priv_s cfg_dflt = {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
49 MENU_LIST_PRIV_DFLT,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
50 NULL,
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
51 0,
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
52 "N/A",
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
53 1
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
54 };
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
55
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
56 static m_option_t cfg_fields[] = {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
57 MENU_LIST_PRIV_FIELDS,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
58 { "title", M_ST_OFF(menu_list_priv_t,title), CONF_TYPE_STRING, 0, 0, 0, NULL },
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
59 { "na", M_ST_OFF(struct menu_priv_s,na), CONF_TYPE_STRING, 0, 0, 0, NULL },
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
60 { "hide-na", M_ST_OFF(struct menu_priv_s,hide_na), CONF_TYPE_FLAG, CONF_RANGE, 0, 1, NULL },
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
61 { NULL, NULL, NULL, 0,0,0,NULL }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
62 };
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
63
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
64 #define mpriv (menu->priv)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
65
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
66 static void entry_set_text(menu_t* menu, list_entry_t* e) {
23398
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
67 char* val = e->txt ? property_expand_string(menu->ctx, e->txt) :
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
68 mp_property_print(e->prop, menu->ctx);
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
69 int l,edit = (mpriv->edit && e == mpriv->p.current);
23398
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
70 if(!val || !val[0]) {
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
71 if(val) free(val);
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
72 if(mpriv->hide_na) {
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
73 e->p.hide = 1;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
74 return;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
75 }
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
76 val = strdup(mpriv->na);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
77 } else if(mpriv->hide_na)
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
78 e->p.hide = 0;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
79 l = strlen(e->name) + 2 + strlen(val) + (edit ? 4 : 0) + 1;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
80 if(e->p.txt) free(e->p.txt);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
81 e->p.txt = malloc(l);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
82 sprintf(e->p.txt,"%s: %s%s%s",e->name,edit ? "> " : "",val,edit ? " <" : "");
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
83 free(val);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
84 }
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
85
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
86 static void update_entries(menu_t* menu) {
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
87 list_entry_t* e;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
88 for(e = mpriv->p.menu ; e ; e = e->p.next)
23398
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
89 if(e->txt || e->prop) entry_set_text(menu,e);
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
90 }
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
91
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
92 static int parse_args(menu_t* menu,char* args) {
23398
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
93 char *element,*body, **attribs, *name, *txt;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
94 list_entry_t* m = NULL;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
95 int r;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
96 m_option_t* opt;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
97 ASX_Parser_t* parser = asx_parser_new();
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
98
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
99
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
100 while(1) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
101 r = asx_get_element(parser,&args,&element,&body,&attribs);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
102 if(r < 0) {
17994
6927fabaef92 Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents: 17949
diff changeset
103 mp_msg(MSGT_OSD_MENU,MSGL_ERR,MSGTR_LIBMENU_SyntaxErrorAtLine,parser->line);
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
104 asx_parser_free(parser);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
105 return -1;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
106 } else if(r == 0) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
107 asx_parser_free(parser);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
108 if(!m)
17994
6927fabaef92 Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents: 17949
diff changeset
109 mp_msg(MSGT_OSD_MENU,MSGL_WARN,MSGTR_LIBMENU_NoEntryFoundInTheMenuDefinition);
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
110 m = calloc(1,sizeof(struct list_entry_s));
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
111 m->p.txt = strdup("Back");
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
112 menu_list_add_entry(menu,m);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
113 return 1;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
114 }
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
115 if(!strcmp(element,"menu")) {
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
116 name = asx_get_attrib("menu",attribs);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
117 if(!name) {
17994
6927fabaef92 Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents: 17949
diff changeset
118 mp_msg(MSGT_OSD_MENU,MSGL_WARN,MSGTR_LIBMENU_SubmenuDefinitionNeedAMenuAttribut);
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
119 goto next_element;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
120 }
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
121 m = calloc(1,sizeof(struct list_entry_s));
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
122 m->menu = name;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
123 name = NULL; // we want to keep it
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
124 m->p.txt = asx_get_attrib("name",attribs);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
125 if(!m->p.txt) m->p.txt = strdup(m->menu);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
126 menu_list_add_entry(menu,m);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
127 goto next_element;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
128 }
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
129
23398
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
130 name = asx_get_attrib("property",attribs);
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
131 opt = NULL;
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
132 if(name && mp_property_do(name,M_PROPERTY_GET_TYPE,&opt,menu->ctx) <= 0) {
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
133 mp_msg(MSGT_OSD_MENU,MSGL_WARN,MSGTR_LIBMENU_InvalidProperty,
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
134 name,parser->line);
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
135 goto next_element;
19529
9a59c33bee29 new option for libmenu that allow display of properties and metadata of currently played stream
ben
parents: 19431
diff changeset
136 }
23398
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
137 txt = asx_get_attrib("txt",attribs);
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
138 if(!(name || txt)) {
17994
6927fabaef92 Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents: 17949
diff changeset
139 mp_msg(MSGT_OSD_MENU,MSGL_WARN,MSGTR_LIBMENU_PrefMenuEntryDefinitionsNeed,parser->line);
23398
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
140 if(txt) free(txt), txt = NULL;
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
141 goto next_element;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
142 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
143 m = calloc(1,sizeof(struct list_entry_s));
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
144 m->opt = opt;
23398
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
145 m->txt = txt; txt = NULL;
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
146 m->prop = name; name = NULL;
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
147 m->name = asx_get_attrib("name",attribs);
23398
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
148 if(!m->name) m->name = strdup(opt ? opt->name : "-");
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
149 entry_set_text(menu,m);
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
150 menu_list_add_entry(menu,m);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
151
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
152 next_element:
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
153 free(element);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
154 if(body) free(body);
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
155 if(name) free(name);
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
156 asx_free_attribs(attribs);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
157 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
158 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
159
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
160 static void read_key(menu_t* menu,int c) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
161 menu_list_read_key(menu,c,0);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
162 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
163
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
164 static void read_cmd(menu_t* menu,int cmd) {
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
165 list_entry_t* e = mpriv->p.current;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
166
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
167 if(e->opt) {
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
168 switch(cmd) {
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
169 case MENU_CMD_UP:
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
170 if(!mpriv->edit) break;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
171 case MENU_CMD_RIGHT:
23393
a5e55cb59bbc Rework the property API to allow sub properties such as
albeu
parents: 22284
diff changeset
172 if(mp_property_do(e->prop,M_PROPERTY_STEP_UP,NULL,menu->ctx) > 0)
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
173 update_entries(menu);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
174 return;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
175 case MENU_CMD_DOWN:
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
176 if(!mpriv->edit) break;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
177 case MENU_CMD_LEFT:
23393
a5e55cb59bbc Rework the property API to allow sub properties such as
albeu
parents: 22284
diff changeset
178 if(mp_property_do(e->prop,M_PROPERTY_STEP_DOWN,NULL,menu->ctx) > 0)
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
179 update_entries(menu);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
180 return;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
181
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
182 case MENU_CMD_OK:
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
183 // check that the property is writable
23393
a5e55cb59bbc Rework the property API to allow sub properties such as
albeu
parents: 22284
diff changeset
184 if(mp_property_do(e->prop,M_PROPERTY_SET,NULL,menu->ctx) < 0) return;
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
185 // shortcut for flags
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
186 if(e->opt->type == CONF_TYPE_FLAG) {
23393
a5e55cb59bbc Rework the property API to allow sub properties such as
albeu
parents: 22284
diff changeset
187 if(mp_property_do(e->prop,M_PROPERTY_STEP_UP,NULL,menu->ctx) > 0)
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
188 update_entries(menu);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
189 return;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
190 }
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
191 // switch
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
192 mpriv->edit = !mpriv->edit;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
193 // update the menu
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
194 update_entries(menu);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
195 // switch the pointer
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
196 if(mpriv->edit) {
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
197 mpriv->ptr = mpriv->p.ptr;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
198 mpriv->p.ptr = NULL;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
199 } else
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
200 mpriv->p.ptr = mpriv->ptr;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
201 return;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
202 case MENU_CMD_CANCEL:
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
203 if(!mpriv->edit) break;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
204 mpriv->edit = 0;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
205 update_entries(menu);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
206 mpriv->p.ptr = mpriv->ptr;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
207 return;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
208 }
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
209 } else if(e->menu) {
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
210 switch(cmd) {
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
211 case MENU_CMD_RIGHT:
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
212 case MENU_CMD_OK: {
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
213 mp_cmd_t* c;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
214 char* txt = malloc(10 + strlen(e->menu) + 1);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
215 sprintf(txt,"set_menu %s",e->menu);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
216 c = mp_input_parse_cmd(txt);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
217 if(c) mp_input_queue_cmd(c);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
218 return;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
219 }
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
220 }
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
221 } else {
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
222 switch(cmd) {
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
223 case MENU_CMD_RIGHT:
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
224 case MENU_CMD_OK:
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
225 menu->show = 0;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
226 menu->cl = 1;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
227 return;
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
228 }
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
229 }
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
230 menu_list_read_cmd(menu,cmd);
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
231 }
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
232
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
233 static void free_entry(list_entry_t* entry) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
234 free(entry->p.txt);
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
235 if(entry->name) free(entry->name);
23398
69bf352bcef8 Drop the metadata stuff and replace it with generic property string expansion.
albeu
parents: 23393
diff changeset
236 if(entry->txt) free(entry->txt);
23393
a5e55cb59bbc Rework the property API to allow sub properties such as
albeu
parents: 22284
diff changeset
237 if(entry->prop) free(entry->prop);
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
238 if(entry->menu) free(entry->menu);
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
239 free(entry);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
240 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
241
10864
a2537e7d2d76 make menu work on mingw (run command is still disabled), based on patch by Christophe Perinaud
faust3
parents: 9380
diff changeset
242 static void closeMenu(menu_t* menu) {
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
243 menu_list_uninit(menu,free_entry);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
244 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
245
10864
a2537e7d2d76 make menu work on mingw (run command is still disabled), based on patch by Christophe Perinaud
faust3
parents: 9380
diff changeset
246 static int openMenu(menu_t* menu, char* args) {
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
247
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
248 menu->draw = menu_list_draw;
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
249 menu->read_cmd = read_cmd;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
250 menu->read_key = read_key;
10864
a2537e7d2d76 make menu work on mingw (run command is still disabled), based on patch by Christophe Perinaud
faust3
parents: 9380
diff changeset
251 menu->close = closeMenu;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
252
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
253
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
254 if(!args) {
18006
ce1a5b200c39 Minor spelling and grammar fixes for part 1 of Otvos Attila's
corey
parents: 17994
diff changeset
255 mp_msg(MSGT_OSD_MENU,MSGL_ERR,MSGTR_LIBMENU_PrefMenuNeedsAnArgument);
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
256 return 0;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
257 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
258
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
259 menu_list_init(menu);
17949
a6b11b35892a Turn the preferences menu in something usefull using the new
albeu
parents: 16862
diff changeset
260 return parse_args(menu,args);
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
261 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
262
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
263 const menu_info_t menu_info_pref = {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
264 "Preferences menu",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
265 "pref",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
266 "Albeu",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
267 "",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
268 {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
269 "pref_cfg",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
270 sizeof(struct menu_priv_s),
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
271 &cfg_dflt,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
272 cfg_fields
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
273 },
10864
a2537e7d2d76 make menu work on mingw (run command is still disabled), based on patch by Christophe Perinaud
faust3
parents: 9380
diff changeset
274 openMenu
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
275 };