Mercurial > mplayer.hg
annotate libmenu/menu.c @ 36607:6b17e4932555
Improve the dialog for font encodings.
In case iconv is available, add only available encodings from the
full list to avoid possible confusion.
In any case (and especially if iconv isn't available) add UNICODE,
since this is internally provided by MPlayer.
author | ib |
---|---|
date | Thu, 23 Jan 2014 12:09:37 +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 } |