Mercurial > mplayer.hg
annotate libmenu/menu.c @ 36215:4eb27365d0b0
Add hack to fix compilation issues on OSX with broken libiconv.
Such a hack is not really a good solution, but since the
issue is relatively common it seems worth it for the moment.
author | reimar |
---|---|
date | Sun, 09 Jun 2013 13:54:47 +0000 |
parents | 389d43c448b3 |
children | 2c8fbf453871 |
rev | line source |
---|---|
28113 | 1 /* |
2 * This file is part of MPlayer. | |
3 * | |
4 * MPlayer is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; either version 2 of the License, or | |
7 * (at your option) any later version. | |
8 * | |
9 * MPlayer is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 * GNU General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU General Public License along | |
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
17 */ | |
8197 | 18 |
16862 | 19 #include "config.h" |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17993
diff
changeset
|
20 #include "mp_msg.h" |
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17993
diff
changeset
|
21 #include "help_mp.h" |
8197 | 22 |
23 #include <stdlib.h> | |
24 #include <stdio.h> | |
25 #include <string.h> | |
35903 | 26 #include <strings.h> |
8604
41a1e5dbb552
This patch fixes the reading of the menu.conf, because stream_open()
arpi
parents:
8251
diff
changeset
|
27 #include <fcntl.h> |
41a1e5dbb552
This patch fixes the reading of the menu.conf, because stream_open()
arpi
parents:
8251
diff
changeset
|
28 #include <unistd.h> |
8197 | 29 |
32469
3fef2e17a03f
Move osd.[ch] and osd_template.c from libvo to sub.
cigaes
parents:
32467
diff
changeset
|
30 #include "sub/osd.h" |
32466
9e627a1793b1
Move font_load.[ch], font_load_ft.c and osd_font.h from libvo to sub.
cigaes
parents:
32135
diff
changeset
|
31 #include "sub/font_load.h" |
32467 | 32 #include "sub/sub.h" |
16862 | 33 #include "osdep/keycodes.h" |
34 #include "asxparser.h" | |
19271
64d82a45a05d
introduce new 'stream' directory for all stream layer related components and split them from libmpdemux
ben
parents:
18194
diff
changeset
|
35 #include "stream/stream.h" |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
36 #include "input/input.h" |
8197 | 37 |
19431
ac69ba536915
Explicitly include libmpcodecs/img_format.h and libvo/fastmemcpy.h.
diego
parents:
19271
diff
changeset
|
38 #include "libmpcodecs/img_format.h" |
ac69ba536915
Explicitly include libmpcodecs/img_format.h and libvo/fastmemcpy.h.
diego
parents:
19271
diff
changeset
|
39 #include "libmpcodecs/mp_image.h" |
16862 | 40 #include "m_option.h" |
41 #include "m_struct.h" | |
8197 | 42 #include "menu.h" |
43 | |
32135
1e86e91fec5d
const-correctness for the menu_info_t OSD menu info declarations
diego
parents:
31661
diff
changeset
|
44 extern const menu_info_t menu_info_cmdlist; |
1e86e91fec5d
const-correctness for the menu_info_t OSD menu info declarations
diego
parents:
31661
diff
changeset
|
45 extern const menu_info_t menu_info_chapsel; |
1e86e91fec5d
const-correctness for the menu_info_t OSD menu info declarations
diego
parents:
31661
diff
changeset
|
46 extern const menu_info_t menu_info_pt; |
1e86e91fec5d
const-correctness for the menu_info_t OSD menu info declarations
diego
parents:
31661
diff
changeset
|
47 extern const menu_info_t menu_info_filesel; |
1e86e91fec5d
const-correctness for the menu_info_t OSD menu info declarations
diego
parents:
31661
diff
changeset
|
48 extern const menu_info_t menu_info_txt; |
1e86e91fec5d
const-correctness for the menu_info_t OSD menu info declarations
diego
parents:
31661
diff
changeset
|
49 extern const menu_info_t menu_info_console; |
1e86e91fec5d
const-correctness for the menu_info_t OSD menu info declarations
diego
parents:
31661
diff
changeset
|
50 extern const menu_info_t menu_info_pref; |
1e86e91fec5d
const-correctness for the menu_info_t OSD menu info declarations
diego
parents:
31661
diff
changeset
|
51 extern const menu_info_t menu_info_dvbsel; |
10626
fd97f3727f15
Finnaly commit Nico's dvb menu. Sorry for committing this
albeu
parents:
10397
diff
changeset
|
52 |
8197 | 53 |
32135
1e86e91fec5d
const-correctness for the menu_info_t OSD menu info declarations
diego
parents:
31661
diff
changeset
|
54 const menu_info_t * const menu_info_list[] = { |
8197 | 55 &menu_info_pt, |
56 &menu_info_cmdlist, | |
25364 | 57 &menu_info_chapsel, |
8197 | 58 &menu_info_filesel, |
59 &menu_info_txt, | |
60 &menu_info_console, | |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27359
diff
changeset
|
61 #ifdef CONFIG_DVBIN |
10626
fd97f3727f15
Finnaly commit Nico's dvb menu. Sorry for committing this
albeu
parents:
10397
diff
changeset
|
62 &menu_info_dvbsel, |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
63 #endif |
8197 | 64 &menu_info_pref, |
65 NULL | |
66 }; | |
67 | |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
68 typedef struct key_cmd_s { |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
69 int key; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
70 char *cmd; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
71 } key_cmd_t; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
72 |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
73 typedef struct menu_cmd_bindings_s { |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
74 char *name; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
75 key_cmd_t *bindings; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
76 int binding_num; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
77 struct menu_cmd_bindings_s *parent; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
78 } menu_cmd_bindings_t; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
79 |
25208
1b3dabc8c2b8
Add type info to menu_t, now we can get the menu name and the type name of menu.
ulion
parents:
24940
diff
changeset
|
80 struct menu_def_st { |
8197 | 81 char* name; |
35303 | 82 const menu_info_t* type; |
8197 | 83 void* cfg; |
84 char* args; | |
25208
1b3dabc8c2b8
Add type info to menu_t, now we can get the menu name and the type name of menu.
ulion
parents:
24940
diff
changeset
|
85 }; |
8197 | 86 |
25461 | 87 double menu_mouse_x = -1.0; |
88 double menu_mouse_y = -1.0; | |
89 int menu_mouse_pos_updated = 0; | |
90 | |
22284 | 91 static struct MPContext *menu_ctx = NULL; |
8197 | 92 static menu_def_t* menu_list = NULL; |
21797
14061bc22cb3
fix gprof support (aka work around gprof's brain dead design)
gpoirier
parents:
20507
diff
changeset
|
93 static int menu_count = 0; |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
94 static menu_cmd_bindings_t *cmd_bindings = NULL; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
95 static int cmd_bindings_num = 0; |
8197 | 96 |
97 | |
30590
d218228dc74d
Mark some more functions that are not used outside of their files as static.
diego
parents:
29263
diff
changeset
|
98 static menu_cmd_bindings_t *get_cmd_bindings(const char *name) |
d218228dc74d
Mark some more functions that are not used outside of their files as static.
diego
parents:
29263
diff
changeset
|
99 { |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
100 int i; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
101 for (i = 0; i < cmd_bindings_num; ++i) |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
102 if (!strcasecmp(cmd_bindings[i].name, name)) |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
103 return &cmd_bindings[i]; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
104 return NULL; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
105 } |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
106 |
8197 | 107 static int menu_parse_config(char* buffer) { |
108 char *element,*body, **attribs, *name; | |
32135
1e86e91fec5d
const-correctness for the menu_info_t OSD menu info declarations
diego
parents:
31661
diff
changeset
|
109 const menu_info_t* minfo = NULL; |
8197 | 110 int r,i; |
111 ASX_Parser_t* parser = asx_parser_new(); | |
112 | |
113 while(1) { | |
114 r = asx_get_element(parser,&buffer,&element,&body,&attribs); | |
115 if(r < 0) { | |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17993
diff
changeset
|
116 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_SyntaxErrorAtLine,parser->line); |
8197 | 117 asx_parser_free(parser); |
118 return 0; | |
119 } else if(r == 0) { | |
120 asx_parser_free(parser); | |
121 return 1; | |
122 } | |
123 // Has it a name ? | |
124 name = asx_get_attrib("name",attribs); | |
125 if(!name) { | |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17993
diff
changeset
|
126 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_MenuDefinitionsNeedANameAttrib,parser->line); |
8197 | 127 free(element); |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32469
diff
changeset
|
128 free(body); |
8197 | 129 asx_free_attribs(attribs); |
130 continue; | |
131 } | |
132 | |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
133 if (!strcasecmp(element, "keybindings")) { |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
134 menu_cmd_bindings_t *bindings = cmd_bindings; |
25347
22e5eb039c83
Fix memory leak. I thought asx_get_attrib() return a const char *,
ulion
parents:
25320
diff
changeset
|
135 char *parent_bindings; |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
136 cmd_bindings = realloc(cmd_bindings, |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
137 (cmd_bindings_num+1)*sizeof(menu_cmd_bindings_t)); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
138 for (i = 0; i < cmd_bindings_num; ++i) |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
139 if (cmd_bindings[i].parent) |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
140 cmd_bindings[i].parent = cmd_bindings[i].parent-bindings+cmd_bindings; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
141 bindings = &cmd_bindings[cmd_bindings_num]; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
142 memset(bindings, 0, sizeof(menu_cmd_bindings_t)); |
25347
22e5eb039c83
Fix memory leak. I thought asx_get_attrib() return a const char *,
ulion
parents:
25320
diff
changeset
|
143 bindings->name = name; |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
144 parent_bindings = asx_get_attrib("parent",attribs); |
25347
22e5eb039c83
Fix memory leak. I thought asx_get_attrib() return a const char *,
ulion
parents:
25320
diff
changeset
|
145 if (parent_bindings) { |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
146 bindings->parent = get_cmd_bindings(parent_bindings); |
25347
22e5eb039c83
Fix memory leak. I thought asx_get_attrib() return a const char *,
ulion
parents:
25320
diff
changeset
|
147 free(parent_bindings); |
22e5eb039c83
Fix memory leak. I thought asx_get_attrib() return a const char *,
ulion
parents:
25320
diff
changeset
|
148 } |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
149 free(element); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
150 asx_free_attribs(attribs); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
151 if (body) { |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
152 char *bd = body; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
153 char *b, *key, *cmd; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
154 int keycode; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
155 for(;;) { |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
156 r = asx_get_element(parser,&bd,&element,&b,&attribs); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
157 if(r < 0) { |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
158 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_SyntaxErrorAtLine, |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
159 parser->line); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
160 free(body); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
161 asx_parser_free(parser); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
162 return 0; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
163 } |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
164 if(r == 0) |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
165 break; |
25408
f73887cc6b45
Ignore elements of keybindings other than 'binding'.
ulion
parents:
25407
diff
changeset
|
166 if (!strcasecmp(element, "binding")) { |
25409 | 167 key = asx_get_attrib("key",attribs); |
168 cmd = asx_get_attrib("cmd",attribs); | |
169 if (key && (keycode = mp_input_get_key_from_name(key)) >= 0) { | |
170 keycode &= ~MP_NO_REPEAT_KEY; | |
171 mp_msg(MSGT_GLOBAL,MSGL_V, | |
172 "[libmenu] got keybinding element %d %s=>[%s].\n", | |
173 keycode, key, cmd ? cmd : ""); | |
174 bindings->bindings = realloc(bindings->bindings, | |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
175 (bindings->binding_num+1)*sizeof(key_cmd_t)); |
25409 | 176 bindings->bindings[bindings->binding_num].key = keycode; |
177 bindings->bindings[bindings->binding_num].cmd = cmd; | |
178 ++bindings->binding_num; | |
179 } | |
180 else | |
181 free(cmd); | |
182 free(key); | |
25408
f73887cc6b45
Ignore elements of keybindings other than 'binding'.
ulion
parents:
25407
diff
changeset
|
183 } |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
184 free(element); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
185 asx_free_attribs(attribs); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
186 free(b); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
187 } |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
188 free(body); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
189 } |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
190 ++cmd_bindings_num; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
191 continue; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
192 } |
8197 | 193 // Try to find this menu type in our list |
194 for(i = 0, minfo = NULL ; menu_info_list[i] ; i++) { | |
195 if(strcasecmp(element,menu_info_list[i]->name) == 0) { | |
196 minfo = menu_info_list[i]; | |
197 break; | |
198 } | |
199 } | |
200 // Got it : add this to our list | |
201 if(minfo) { | |
21797
14061bc22cb3
fix gprof support (aka work around gprof's brain dead design)
gpoirier
parents:
20507
diff
changeset
|
202 menu_list = realloc(menu_list,(menu_count+2)*sizeof(menu_def_t)); |
14061bc22cb3
fix gprof support (aka work around gprof's brain dead design)
gpoirier
parents:
20507
diff
changeset
|
203 menu_list[menu_count].name = name; |
14061bc22cb3
fix gprof support (aka work around gprof's brain dead design)
gpoirier
parents:
20507
diff
changeset
|
204 menu_list[menu_count].type = minfo; |
14061bc22cb3
fix gprof support (aka work around gprof's brain dead design)
gpoirier
parents:
20507
diff
changeset
|
205 menu_list[menu_count].cfg = m_struct_alloc(&minfo->priv_st); |
14061bc22cb3
fix gprof support (aka work around gprof's brain dead design)
gpoirier
parents:
20507
diff
changeset
|
206 menu_list[menu_count].args = body; |
8197 | 207 // Setup the attribs |
208 for(i = 0 ; attribs[2*i] ; i++) { | |
209 if(strcasecmp(attribs[2*i],"name") == 0) continue; | |
21797
14061bc22cb3
fix gprof support (aka work around gprof's brain dead design)
gpoirier
parents:
20507
diff
changeset
|
210 if(!m_struct_set(&minfo->priv_st,menu_list[menu_count].cfg,attribs[2*i], attribs[2*i+1])) |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17993
diff
changeset
|
211 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_BadAttrib,attribs[2*i],attribs[2*i+1], |
8197 | 212 name,parser->line); |
213 } | |
21797
14061bc22cb3
fix gprof support (aka work around gprof's brain dead design)
gpoirier
parents:
20507
diff
changeset
|
214 menu_count++; |
14061bc22cb3
fix gprof support (aka work around gprof's brain dead design)
gpoirier
parents:
20507
diff
changeset
|
215 memset(&menu_list[menu_count],0,sizeof(menu_def_t)); |
8197 | 216 } else { |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17993
diff
changeset
|
217 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_UnknownMenuType,element,parser->line); |
8197 | 218 free(name); |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32469
diff
changeset
|
219 free(body); |
8197 | 220 } |
221 | |
222 free(element); | |
223 asx_free_attribs(attribs); | |
224 } | |
225 | |
226 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
227 |
8197 | 228 |
229 /// This will build the menu_defs list from the cfg file | |
230 #define BUF_STEP 1024 | |
231 #define BUF_MIN 128 | |
232 #define BUF_MAX BUF_STEP*1024 | |
22284 | 233 int menu_init(struct MPContext *mpctx, char* cfg_file) { |
8197 | 234 char* buffer = NULL; |
235 int bl = BUF_STEP, br = 0; | |
35302 | 236 int f = 0, fd = -1; |
27393 | 237 #ifndef CONFIG_FREETYPE |
9103
6c2c74adaebe
mplayer crashes if one tries to use osd menu without having a font
arpi
parents:
8604
diff
changeset
|
238 if(vo_font == NULL) |
35302 | 239 goto out; |
9212
24b102dbd0fe
Fixes a problem where the menu won't work, if you just use freetype fonts
arpi
parents:
9103
diff
changeset
|
240 #endif |
9103
6c2c74adaebe
mplayer crashes if one tries to use osd menu without having a font
arpi
parents:
8604
diff
changeset
|
241 fd = open(cfg_file, O_RDONLY); |
8604
41a1e5dbb552
This patch fixes the reading of the menu.conf, because stream_open()
arpi
parents:
8251
diff
changeset
|
242 if(fd < 0) { |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17993
diff
changeset
|
243 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_CantOpenConfigFile,cfg_file); |
35302 | 244 goto out; |
8197 | 245 } |
246 buffer = malloc(bl); | |
247 while(1) { | |
248 int r; | |
249 if(bl - br < BUF_MIN) { | |
250 if(bl >= BUF_MAX) { | |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17993
diff
changeset
|
251 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_ConfigFileIsTooBig,BUF_MAX/1024); |
35302 | 252 goto out; |
8197 | 253 } |
254 bl += BUF_STEP; | |
255 buffer = realloc(buffer,bl); | |
256 } | |
8604
41a1e5dbb552
This patch fixes the reading of the menu.conf, because stream_open()
arpi
parents:
8251
diff
changeset
|
257 r = read(fd,buffer+br,bl-br); |
8197 | 258 if(r == 0) break; |
259 br += r; | |
260 } | |
261 if(!br) { | |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17993
diff
changeset
|
262 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_ConfigFileIsEmpty); |
35302 | 263 goto out; |
8197 | 264 } |
265 buffer[br-1] = '\0'; | |
266 | |
22284 | 267 menu_ctx = mpctx; |
8197 | 268 f = menu_parse_config(buffer); |
35302 | 269 |
270 out: | |
271 if (fd != -1) close(fd); | |
8197 | 272 free(buffer); |
273 return f; | |
274 } | |
275 | |
276 // Destroy all this stuff | |
25420 | 277 void menu_uninit(void) { |
8197 | 278 int i; |
279 for(i = 0 ; menu_list && menu_list[i].name ; i++) { | |
280 free(menu_list[i].name); | |
281 m_struct_free(&menu_list[i].type->priv_st,menu_list[i].cfg); | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32469
diff
changeset
|
282 free(menu_list[i].args); |
8197 | 283 } |
284 free(menu_list); | |
21797
14061bc22cb3
fix gprof support (aka work around gprof's brain dead design)
gpoirier
parents:
20507
diff
changeset
|
285 menu_count = 0; |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
286 for (i = 0; i < cmd_bindings_num; ++i) { |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
287 free(cmd_bindings[i].name); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
288 while(cmd_bindings[i].binding_num > 0) |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
289 free(cmd_bindings[i].bindings[--cmd_bindings[i].binding_num].cmd); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
290 free(cmd_bindings[i].bindings); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
291 } |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
292 free(cmd_bindings); |
8197 | 293 } |
294 | |
295 /// Default read_key function | |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
296 int menu_dflt_read_key(menu_t* menu,int cmd) { |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
297 int i; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
298 menu_cmd_bindings_t *bindings = get_cmd_bindings(menu->type->name); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
299 if (!bindings) |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
300 bindings = get_cmd_bindings(menu->type->type->name); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
301 if (!bindings) |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
302 bindings = get_cmd_bindings("default"); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
303 while (bindings) { |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
304 for (i = 0; i < bindings->binding_num; ++i) { |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
305 if (bindings->bindings[i].key == cmd) { |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
306 if (bindings->bindings[i].cmd) |
25320
4fbf536cc033
Support to run multiple mplayer commands set in menu.conf
ulion
parents:
25263
diff
changeset
|
307 mp_input_parse_and_queue_cmds(bindings->bindings[i].cmd); |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
308 return 1; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
309 } |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
310 } |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
311 bindings = bindings->parent; |
8197 | 312 } |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25208
diff
changeset
|
313 return 0; |
8197 | 314 } |
315 | |
316 menu_t* menu_open(char *name) { | |
317 menu_t* m; | |
318 int i; | |
319 | |
320 for(i = 0 ; menu_list[i].name != NULL ; i++) { | |
321 if(strcmp(name,menu_list[i].name) == 0) | |
322 break; | |
323 } | |
324 if(menu_list[i].name == NULL) { | |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17993
diff
changeset
|
325 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_MenuNotFound,name); |
8197 | 326 return NULL; |
327 } | |
328 m = calloc(1,sizeof(menu_t)); | |
329 m->priv_st = &(menu_list[i].type->priv_st); | |
330 m->priv = m_struct_copy(m->priv_st,menu_list[i].cfg); | |
22284 | 331 m->ctx = menu_ctx; |
25208
1b3dabc8c2b8
Add type info to menu_t, now we can get the menu name and the type name of menu.
ulion
parents:
24940
diff
changeset
|
332 m->type = &menu_list[i]; |
8197 | 333 if(menu_list[i].type->open(m,menu_list[i].args)) |
334 return m; | |
335 if(m->priv) | |
336 m_struct_free(m->priv_st,m->priv); | |
337 free(m); | |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17993
diff
changeset
|
338 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_MenuInitFailed,name); |
8197 | 339 return NULL; |
340 } | |
341 | |
342 void menu_draw(menu_t* menu,mp_image_t* mpi) { | |
343 if(menu->show && menu->draw) | |
344 menu->draw(menu,mpi); | |
345 } | |
346 | |
25461 | 347 void menu_update_mouse_pos(double x, double y) { |
348 menu_mouse_x = x; | |
349 menu_mouse_y = y; | |
350 menu_mouse_pos_updated = 1; | |
351 } | |
352 | |
8197 | 353 void menu_read_cmd(menu_t* menu,int cmd) { |
354 if(menu->read_cmd) | |
355 menu->read_cmd(menu,cmd); | |
356 } | |
357 | |
358 void menu_close(menu_t* menu) { | |
359 if(menu->close) | |
360 menu->close(menu); | |
361 if(menu->priv) | |
362 m_struct_free(menu->priv_st,menu->priv); | |
363 free(menu); | |
364 } | |
365 | |
25502
605d4e3e403f
From now on, libmenu does not steal all input keys from input modules.
ulion
parents:
25461
diff
changeset
|
366 int menu_read_key(menu_t* menu,int cmd) { |
8197 | 367 if(menu->read_key) |
25502
605d4e3e403f
From now on, libmenu does not steal all input keys from input modules.
ulion
parents:
25461
diff
changeset
|
368 return menu->read_key(menu,cmd); |
8197 | 369 else |
25502
605d4e3e403f
From now on, libmenu does not steal all input keys from input modules.
ulion
parents:
25461
diff
changeset
|
370 return menu_dflt_read_key(menu,cmd); |
8197 | 371 } |
372 | |
373 ///////////////////////////// Helpers //////////////////////////////////// | |
374 | |
375 typedef void (*draw_alpha_f)(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride); | |
376 | |
34492
1495455e6d22
Move static keyword to the beginning of function declarations.
diego
parents:
33353
diff
changeset
|
377 static inline draw_alpha_f get_draw_alpha(uint32_t fmt) { |
8197 | 378 switch(fmt) { |
31082
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30590
diff
changeset
|
379 case IMGFMT_BGR12: |
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30590
diff
changeset
|
380 case IMGFMT_RGB12: |
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30590
diff
changeset
|
381 return vo_draw_alpha_rgb12; |
8197 | 382 case IMGFMT_BGR15: |
383 case IMGFMT_RGB15: | |
384 return vo_draw_alpha_rgb15; | |
385 case IMGFMT_BGR16: | |
386 case IMGFMT_RGB16: | |
387 return vo_draw_alpha_rgb16; | |
388 case IMGFMT_BGR24: | |
389 case IMGFMT_RGB24: | |
390 return vo_draw_alpha_rgb24; | |
391 case IMGFMT_BGR32: | |
392 case IMGFMT_RGB32: | |
393 return vo_draw_alpha_rgb32; | |
394 case IMGFMT_YV12: | |
395 case IMGFMT_I420: | |
396 case IMGFMT_IYUV: | |
397 case IMGFMT_YVU9: | |
398 case IMGFMT_IF09: | |
399 case IMGFMT_Y800: | |
400 case IMGFMT_Y8: | |
401 return vo_draw_alpha_yv12; | |
402 case IMGFMT_YUY2: | |
403 return vo_draw_alpha_yuy2; | |
18194 | 404 case IMGFMT_UYVY: |
405 return vo_draw_alpha_uyvy; | |
8197 | 406 } |
407 | |
408 return NULL; | |
409 } | |
410 | |
8224
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
411 // return the real height of a char: |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
412 static inline int get_height(int c,int h){ |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
413 int font; |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
414 if ((font=vo_font->font[c])>=0) |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
415 if(h<vo_font->pic_a[font]->h) h=vo_font->pic_a[font]->h; |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
416 return h; |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
417 } |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
418 |
23227
a142b048c65e
support for unicode/utf8 in libmenu (geexbox patch #545)
ben
parents:
22284
diff
changeset
|
419 static void render_txt(char *txt) |
a142b048c65e
support for unicode/utf8 in libmenu (geexbox patch #545)
ben
parents:
22284
diff
changeset
|
420 { |
a142b048c65e
support for unicode/utf8 in libmenu (geexbox patch #545)
ben
parents:
22284
diff
changeset
|
421 while (*txt) { |
24940 | 422 int c = utf8_get_char((const char**)&txt); |
23227
a142b048c65e
support for unicode/utf8 in libmenu (geexbox patch #545)
ben
parents:
22284
diff
changeset
|
423 render_one_glyph(vo_font, c); |
a142b048c65e
support for unicode/utf8 in libmenu (geexbox patch #545)
ben
parents:
22284
diff
changeset
|
424 } |
a142b048c65e
support for unicode/utf8 in libmenu (geexbox patch #545)
ben
parents:
22284
diff
changeset
|
425 } |
8197 | 426 |
27393 | 427 #ifdef CONFIG_FRIBIDI |
23228
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
428 #include <fribidi/fribidi.h> |
23231 | 429 #include "libavutil/common.h" |
23238 | 430 char *menu_fribidi_charset = NULL; |
431 int menu_flip_hebrew = 0; | |
432 int menu_fribidi_flip_commas = 0; | |
23228
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
433 |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
434 static char *menu_fribidi(char *txt) |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
435 { |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
436 static int char_set_num = -1; |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
437 static FriBidiChar *logical, *visual; |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
438 static size_t buffer_size = 1024; |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
439 static char *outputstr; |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
440 |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
441 size_t len; |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
442 |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
443 if (menu_flip_hebrew) { |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
444 len = strlen(txt); |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
445 if (char_set_num == -1) { |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
446 fribidi_set_mirroring (1); |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
447 fribidi_set_reorder_nsm (0); |
23337
10a7279b8e56
get rid of -menu-utf8 and -menu-unicode once for all, patch by Guillaume Lecerf
ben
parents:
23238
diff
changeset
|
448 char_set_num = fribidi_parse_charset("UTF-8"); |
23231 | 449 buffer_size = FFMAX(1024,len+1); |
23230 | 450 logical = malloc(buffer_size); |
451 visual = malloc(buffer_size); | |
452 outputstr = malloc(buffer_size); | |
23228
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
453 } else if (len+1 > buffer_size) { |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
454 buffer_size = len+1; |
23230 | 455 logical = realloc(logical, buffer_size); |
456 visual = realloc(visual, buffer_size); | |
457 outputstr = realloc(outputstr, buffer_size); | |
23228
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
458 } |
33353
63dbf59fa312
Move some common fribidi code into a shared function.
reimar
parents:
33316
diff
changeset
|
459 len = do_fribid_log2vis(char_set_num, txt, logical, visual, menu_fribidi_flip_commas); |
63dbf59fa312
Move some common fribidi code into a shared function.
reimar
parents:
33316
diff
changeset
|
460 if (len > 0) { |
23228
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
461 fribidi_unicode_to_charset (char_set_num, visual, len, outputstr); |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
462 return outputstr; |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
463 } |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
464 } |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
465 return txt; |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
466 } |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
467 #endif |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
468 |
8197 | 469 void menu_draw_text(mp_image_t* mpi,char* txt, int x, int y) { |
470 draw_alpha_f draw_alpha = get_draw_alpha(mpi->imgfmt); | |
471 int font; | |
472 | |
473 if(!draw_alpha) { | |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17993
diff
changeset
|
474 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_UnsupportedOutformat); |
8197 | 475 return; |
476 } | |
477 | |
27393 | 478 #ifdef CONFIG_FRIBIDI |
23228
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
479 txt = menu_fribidi(txt); |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
480 #endif |
8224
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
481 render_txt(txt); |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
482 |
8197 | 483 while (*txt) { |
24940 | 484 int c=utf8_get_char((const char**)&txt); |
8197 | 485 if ((font=vo_font->font[c])>=0 && (x + vo_font->width[c] <= mpi->w) && (y + vo_font->pic_a[font]->h <= mpi->h)) |
486 draw_alpha(vo_font->width[c], vo_font->pic_a[font]->h, | |
487 vo_font->pic_b[font]->bmp+vo_font->start[c], | |
488 vo_font->pic_a[font]->bmp+vo_font->start[c], | |
489 vo_font->pic_a[font]->w, | |
490 mpi->planes[0] + y * mpi->stride[0] + x * (mpi->bpp>>3), | |
491 mpi->stride[0]); | |
492 x+=vo_font->width[c]+vo_font->charspace; | |
493 } | |
494 | |
495 } | |
496 | |
497 void menu_draw_text_full(mp_image_t* mpi,char* txt, | |
498 int x, int y,int w, int h, | |
499 int vspace, int warp, int align, int anchor) { | |
500 int need_w,need_h; | |
501 int sy, ymin, ymax; | |
502 int sx, xmin, xmax, xmid, xrmin; | |
503 int ll = 0; | |
504 int font; | |
505 draw_alpha_f draw_alpha = get_draw_alpha(mpi->imgfmt); | |
506 | |
507 if(!draw_alpha) { | |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17993
diff
changeset
|
508 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_UnsupportedOutformat); |
8197 | 509 return; |
510 } | |
511 | |
27393 | 512 #ifdef CONFIG_FRIBIDI |
23228
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
513 txt = menu_fribidi(txt); |
2e95dcd49946
support for hebrew through fribidi in libmenu (geexbox patch #580)
ben
parents:
23227
diff
changeset
|
514 #endif |
8224
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
515 render_txt(txt); |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
516 |
8197 | 517 if(x > mpi->w || y > mpi->h) |
518 return; | |
519 | |
520 if(anchor & MENU_TEXT_VCENTER) { | |
521 if(h <= 0) h = mpi->h; | |
522 ymin = y - h/2; | |
523 ymax = y + h/2; | |
524 } else if(anchor & MENU_TEXT_BOT) { | |
525 if(h <= 0) h = mpi->h - y; | |
526 ymin = y - h; | |
527 ymax = y; | |
528 } else { | |
529 if(h <= 0) h = mpi->h - y; | |
530 ymin = y; | |
531 ymax = y + h; | |
532 } | |
533 | |
534 if(anchor & MENU_TEXT_HCENTER) { | |
535 if(w <= 0) w = mpi->w; | |
536 xmin = x - w/2; | |
537 xmax = x + w/2; | |
538 } else if(anchor & MENU_TEXT_RIGHT) { | |
539 if(w <= 0) w = mpi->w -x; | |
540 xmin = x - w; | |
541 xmax = x; | |
542 } else { | |
543 if(w <= 0) w = mpi->w -x; | |
544 xmin = x; | |
545 xmax = x + w; | |
546 } | |
547 | |
548 // How many space do we need to draw this ? | |
549 menu_text_size(txt,w,vspace,warp,&need_w,&need_h); | |
550 | |
551 // Find the first line | |
552 if(align & MENU_TEXT_VCENTER) | |
553 sy = ymin + ((h - need_h)/2); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
554 else if(align & MENU_TEXT_BOT) |
8232 | 555 sy = ymax - need_h - 1; |
8197 | 556 else |
557 sy = y; | |
558 | |
559 #if 0 | |
560 // Find the first col | |
561 if(align & MENU_TEXT_HCENTER) | |
562 sx = xmin + ((w - need_w)/2); | |
563 else if(align & MENU_TEXT_RIGHT) | |
564 sx = xmax - need_w; | |
565 #endif | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
566 |
8197 | 567 xmid = xmin + (xmax - xmin) / 2; |
568 xrmin = xmin; | |
569 // Clamp the bb to the mpi size | |
570 if(ymin < 0) ymin = 0; | |
571 if(xmin < 0) xmin = 0; | |
572 if(ymax > mpi->h) ymax = mpi->h; | |
573 if(xmax > mpi->w) xmax = mpi->w; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
574 |
8197 | 575 // Jump some the beginnig text if needed |
576 while(sy < ymin && *txt) { | |
24940 | 577 int c=utf8_get_char((const char**)&txt); |
8197 | 578 if(c == '\n' || (warp && ll + vo_font->width[c] > w)) { |
579 ll = 0; | |
580 sy += vo_font->height + vspace; | |
581 if(c == '\n') continue; | |
582 } | |
583 ll += vo_font->width[c]+vo_font->charspace; | |
584 } | |
585 if(*txt == '\0') // Nothing left to draw | |
586 return; | |
587 | |
588 while(sy < ymax && *txt) { | |
589 char* line_end = NULL; | |
590 int n; | |
591 | |
592 if(txt[0] == '\n') { // New line | |
593 sy += vo_font->height + vspace; | |
594 txt++; | |
595 continue; | |
596 } | |
597 | |
598 // Get the length and end of this line | |
599 for(n = 0, ll = 0 ; txt[n] != '\0' && txt[n] != '\n' ; n++) { | |
600 unsigned char c = txt[n]; | |
601 if(warp && ll + vo_font->width[c] > w) break; | |
602 ll += vo_font->width[c]+vo_font->charspace; | |
603 } | |
604 line_end = &txt[n]; | |
605 ll -= vo_font->charspace; | |
606 | |
607 | |
608 if(align & (MENU_TEXT_HCENTER|MENU_TEXT_RIGHT)) { | |
609 // Too long line | |
610 if(ll > xmax-xmin) { | |
611 if(align & MENU_TEXT_HCENTER) { | |
612 int mid = ll/2; | |
613 // Find the middle point | |
614 for(n--, ll = 0 ; n <= 0 ; n--) { | |
615 ll += vo_font->width[(int)txt[n]]+vo_font->charspace; | |
616 if(ll - vo_font->charspace > mid) break; | |
617 } | |
618 ll -= vo_font->charspace; | |
619 sx = xmid + mid - ll; | |
620 } else// MENU_TEXT_RIGHT) | |
621 sx = xmax + vo_font->charspace; | |
622 | |
623 // We are after the start point -> go back | |
624 if(sx > xmin) { | |
625 for(n-- ; n <= 0 ; n--) { | |
626 unsigned char c = txt[n]; | |
627 if(sx - vo_font->width[c] - vo_font->charspace < xmin) break; | |
628 sx -= vo_font->width[c]+vo_font->charspace; | |
629 } | |
630 } else { // We are before the start point -> go forward | |
631 for( ; sx < xmin && (&txt[n]) != line_end ; n++) { | |
632 unsigned char c = txt[n]; | |
633 sx += vo_font->width[c]+vo_font->charspace; | |
634 } | |
635 } | |
636 txt = &txt[n]; // Jump to the new start char | |
637 } else { | |
638 if(align & MENU_TEXT_HCENTER) | |
639 sx = xmid - ll/2; | |
640 else | |
8232 | 641 sx = xmax - 1 - ll; |
8197 | 642 } |
643 } else { | |
644 for(sx = xrmin ; sx < xmin && txt != line_end ; txt++) { | |
645 unsigned char c = txt[n]; | |
646 sx += vo_font->width[c]+vo_font->charspace; | |
647 } | |
648 } | |
649 | |
650 while(sx < xmax && txt != line_end) { | |
24940 | 651 int c=utf8_get_char((const char**)&txt); |
8197 | 652 font = vo_font->font[c]; |
8232 | 653 if(font >= 0) { |
654 int cs = (vo_font->pic_a[font]->h - vo_font->height) / 2; | |
25434 | 655 if ((sx + vo_font->width[c] <= xmax) && (sy + vo_font->height <= ymax) ) |
8232 | 656 draw_alpha(vo_font->width[c], vo_font->height, |
657 vo_font->pic_b[font]->bmp+vo_font->start[c] + | |
658 cs * vo_font->pic_a[font]->w, | |
659 vo_font->pic_a[font]->bmp+vo_font->start[c] + | |
660 cs * vo_font->pic_a[font]->w, | |
661 vo_font->pic_a[font]->w, | |
662 mpi->planes[0] + sy * mpi->stride[0] + sx * (mpi->bpp>>3), | |
663 mpi->stride[0]); | |
664 // else | |
665 //printf("Can't draw '%c'\n",c); | |
666 } | |
8197 | 667 sx+=vo_font->width[c]+vo_font->charspace; |
668 } | |
669 txt = line_end; | |
670 if(txt[0] == '\0') break; | |
671 sy += vo_font->height + vspace; | |
672 } | |
673 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
674 |
8197 | 675 int menu_text_length(char* txt) { |
676 int l = 0; | |
8224
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
677 render_txt(txt); |
8197 | 678 while (*txt) { |
24940 | 679 int c=utf8_get_char((const char**)&txt); |
8197 | 680 l += vo_font->width[c]+vo_font->charspace; |
681 } | |
682 return l - vo_font->charspace; | |
683 } | |
684 | |
685 void menu_text_size(char* txt,int max_width, int vspace, int warp, int* _w, int* _h) { | |
686 int l = 1, i = 0; | |
687 int w = 0; | |
8224
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
688 |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
689 render_txt(txt); |
8197 | 690 while (*txt) { |
24940 | 691 int c=utf8_get_char((const char**)&txt); |
8197 | 692 if(c == '\n' || (warp && i + vo_font->width[c] >= max_width)) { |
25434 | 693 i -= vo_font->charspace; |
694 if (i > w) w = i; | |
8197 | 695 if(*txt) |
696 l++; | |
697 i = 0; | |
698 if(c == '\n') continue; | |
699 } | |
700 i += vo_font->width[c]+vo_font->charspace; | |
25434 | 701 } |
702 if (i > 0) { | |
703 i -= vo_font->charspace; | |
704 if (i > w) w = i; | |
8197 | 705 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
706 |
8197 | 707 *_w = w; |
708 *_h = (l-1) * (vo_font->height + vspace) + vo_font->height; | |
709 } | |
710 | |
711 | |
712 int menu_text_num_lines(char* txt, int max_width) { | |
713 int l = 1, i = 0; | |
8224
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
714 render_txt(txt); |
8197 | 715 while (*txt) { |
24940 | 716 int c=utf8_get_char((const char**)&txt); |
8197 | 717 if(c == '\n' || i + vo_font->width[c] > max_width) { |
718 l++; | |
719 i = 0; | |
720 if(c == '\n') continue; | |
721 } | |
722 i += vo_font->width[c]+vo_font->charspace; | |
723 } | |
724 return l; | |
725 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
726 |
17993
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
727 |
18193 | 728 void menu_draw_box(mp_image_t* mpi,unsigned char grey,unsigned char alpha, int x, int y, int w, int h) { |
17993
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
729 draw_alpha_f draw_alpha = get_draw_alpha(mpi->imgfmt); |
18193 | 730 int g; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
731 |
17993
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
732 if(!draw_alpha) { |
18193 | 733 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_UnsupportedOutformat); |
17993
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
734 return; |
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
735 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
736 |
17993
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
737 if(x > mpi->w || y > mpi->h) return; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
738 |
17993
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
739 if(x < 0) w += x, x = 0; |
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
740 if(x+w > mpi->w) w = mpi->w-x; |
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
741 if(y < 0) h += y, y = 0; |
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
742 if(y+h > mpi->h) h = mpi->h-y; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
743 |
18193 | 744 g = ((256-alpha)*grey)>>8; |
745 if(g < 1) g = 1; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
746 |
17993
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
747 { |
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
748 int stride = (w+7)&(~7); // round to 8 |
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
749 char pic[stride*h],pic_alpha[stride*h]; |
18193 | 750 memset(pic,g,stride*h); |
17993
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
751 memset(pic_alpha,alpha,stride*h); |
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
752 draw_alpha(w,h,pic,pic_alpha,stride, |
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
753 mpi->planes[0] + y * mpi->stride[0] + x * (mpi->bpp>>3), |
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
754 mpi->stride[0]); |
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
755 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
756 |
17993
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17945
diff
changeset
|
757 } |