Mercurial > mplayer.hg
annotate libmenu/menu_filesel.c @ 27985:1c77b86d355d
Remove a ColorFill that is not necessary since the surface it is used
on has exactly the same size as the video image and the video will
be copied into it before it is used the first time.
author | reimar |
---|---|
date | Mon, 24 Nov 2008 09:46:23 +0000 |
parents | 1d0ac8ff2527 |
children | f8b6c7045cf8 |
rev | line source |
---|---|
8197 | 1 |
2 #include <stdlib.h> | |
3 #include <stdio.h> | |
4 #include <dirent.h> | |
5 #include <errno.h> | |
6 #include <string.h> | |
7 #include <sys/types.h> | |
8 #include <sys/stat.h> | |
23229
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
9 #include <fcntl.h> |
8197 | 10 #include <ctype.h> |
11 #include <unistd.h> | |
8291
abe95dde3223
limits.h required to get a PATH_MAX definition (on solaris)
jkeil
parents:
8226
diff
changeset
|
12 #include <limits.h> |
8197 | 13 |
14 | |
16862 | 15 #include "config.h" |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17945
diff
changeset
|
16 #include "mp_msg.h" |
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17945
diff
changeset
|
17 #include "help_mp.h" |
8197 | 18 |
16862 | 19 #include "m_struct.h" |
20 #include "m_option.h" | |
8197 | 21 |
19431
ac69ba536915
Explicitly include libmpcodecs/img_format.h and libvo/fastmemcpy.h.
diego
parents:
17994
diff
changeset
|
22 #include "libmpcodecs/img_format.h" |
ac69ba536915
Explicitly include libmpcodecs/img_format.h and libvo/fastmemcpy.h.
diego
parents:
17994
diff
changeset
|
23 #include "libmpcodecs/mp_image.h" |
8197 | 24 |
25 #include "menu.h" | |
26 #include "menu_list.h" | |
16862 | 27 #include "input/input.h" |
28 #include "osdep/keycodes.h" | |
8197 | 29 |
23229
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
30 #define MENU_KEEP_PATH "/tmp/mp_current_path" |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
31 |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
32 int menu_keepdir = 0; |
23391
9bf57f60bf0a
new -menu-chroot option that prevent OSD file selection menu to go to an unwanted location (yeah, chroot ;-))
ben
parents:
23229
diff
changeset
|
33 char *menu_chroot = NULL; |
25528
e3f6092fb640
Default use the dir where the current playing file located if path not set.
ulion
parents:
25505
diff
changeset
|
34 extern char *filename; |
23229
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
35 |
8197 | 36 struct list_entry_s { |
37 struct list_entry p; | |
38 int d; | |
39 }; | |
40 | |
41 struct menu_priv_s { | |
42 menu_list_priv_t p; | |
43 char* dir; // current dir | |
44 /// Cfg fields | |
45 char* path; | |
46 char* title; | |
47 char* file_action; | |
48 char* dir_action; | |
19490
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
49 char** actions; |
19491
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
50 char* filter; |
8197 | 51 }; |
52 | |
53 static struct menu_priv_s cfg_dflt = { | |
54 MENU_LIST_PRIV_DFLT, | |
55 NULL, | |
56 | |
57 NULL, | |
58 "Select a file: %p", | |
8226 | 59 "loadfile '%p'", |
8197 | 60 NULL, |
19491
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
61 NULL, |
19490
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
62 NULL |
8197 | 63 }; |
64 | |
65 #define ST_OFF(m) M_ST_OFF(struct menu_priv_s,m) | |
66 | |
67 static m_option_t cfg_fields[] = { | |
68 MENU_LIST_PRIV_FIELDS, | |
69 { "path", ST_OFF(path), CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
70 { "title", ST_OFF(title), CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
71 { "file-action", ST_OFF(file_action), CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
72 { "dir-action", ST_OFF(dir_action), CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
19490
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
73 { "actions", ST_OFF(actions), CONF_TYPE_STRING_LIST, 0, 0, 0, NULL}, |
19491
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
74 { "filter", ST_OFF(filter), CONF_TYPE_STRING, 0, 0, 0, NULL}, |
8197 | 75 { NULL, NULL, NULL, 0,0,0,NULL } |
76 }; | |
77 | |
78 #define mpriv (menu->priv) | |
79 | |
80 static void free_entry(list_entry_t* entry) { | |
81 free(entry->p.txt); | |
82 free(entry); | |
83 } | |
84 | |
27086 | 85 static char* replace_path(char* title , char* dir , int escape) { |
8197 | 86 char *p = strstr(title,"%p"); |
87 if(p) { | |
88 int tl = strlen(title); | |
89 int dl = strlen(dir); | |
90 int t1l = p-title; | |
91 int l = tl - 2 + dl; | |
10624
cdfd4a43c406
I've juste found a bug which prevent to load a file whose name contain
albeu
parents:
9380
diff
changeset
|
92 char *r, *n, *d = dir; |
cdfd4a43c406
I've juste found a bug which prevent to load a file whose name contain
albeu
parents:
9380
diff
changeset
|
93 |
27086 | 94 if (escape) { |
10624
cdfd4a43c406
I've juste found a bug which prevent to load a file whose name contain
albeu
parents:
9380
diff
changeset
|
95 do { |
27086 | 96 if (*d == '\\') |
10624
cdfd4a43c406
I've juste found a bug which prevent to load a file whose name contain
albeu
parents:
9380
diff
changeset
|
97 l++; |
27086 | 98 else if (*d == '\'') /* ' -> \'\\\'\' */ |
99 l+=7; | |
10624
cdfd4a43c406
I've juste found a bug which prevent to load a file whose name contain
albeu
parents:
9380
diff
changeset
|
100 } while (*d++); |
27086 | 101 } |
10624
cdfd4a43c406
I've juste found a bug which prevent to load a file whose name contain
albeu
parents:
9380
diff
changeset
|
102 r = malloc(l + 1); |
cdfd4a43c406
I've juste found a bug which prevent to load a file whose name contain
albeu
parents:
9380
diff
changeset
|
103 n = r + t1l; |
8197 | 104 memcpy(r,title,t1l); |
10624
cdfd4a43c406
I've juste found a bug which prevent to load a file whose name contain
albeu
parents:
9380
diff
changeset
|
105 do { |
27086 | 106 if (escape) { |
107 if (*dir == '\\') | |
10624
cdfd4a43c406
I've juste found a bug which prevent to load a file whose name contain
albeu
parents:
9380
diff
changeset
|
108 *n++ = '\\'; |
27086 | 109 else if (*dir == '\'') { /* ' -> \'\\\'\' */ |
110 *n++ = '\\'; *n++ = '\''; | |
111 *n++ = '\\'; *n++ = '\\'; | |
112 *n++ = '\\'; *n++ = '\''; | |
113 *n++ = '\\'; | |
114 } | |
115 } | |
10624
cdfd4a43c406
I've juste found a bug which prevent to load a file whose name contain
albeu
parents:
9380
diff
changeset
|
116 } while ((*n++ = *dir++)); |
8197 | 117 if(tl - t1l - 2 > 0) |
10624
cdfd4a43c406
I've juste found a bug which prevent to load a file whose name contain
albeu
parents:
9380
diff
changeset
|
118 strcpy(n-1,p+2); |
8197 | 119 return r; |
120 } else | |
121 return title; | |
122 } | |
123 | |
124 typedef int (*kill_warn)(const void*, const void*); | |
125 | |
8358
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
126 static int mylstat(char *dir, char *file,struct stat* st) { |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
127 int l = strlen(dir) + strlen(file); |
8613 | 128 char s[l+2]; |
25311
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
129 if (!strcmp("..", file)) { |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
130 char *slash; |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
131 l -= 3; |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
132 strcpy(s, dir); |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
133 #if defined(__MINGW32__) || defined(__CYGWIN__) |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
134 if (s[l] == '/' || s[l] == '\\') |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
135 #else |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
136 if (s[l] == '/') |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
137 #endif |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
138 s[l] = '\0'; |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
139 slash = strrchr(s, '/'); |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
140 #if defined(__MINGW32__) || defined(__CYGWIN__) |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
141 if (!slash) |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
142 slash = strrchr(s,'\\'); |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
143 #endif |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
144 if (!slash) |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
145 return stat(dir,st); |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
146 slash[1] = '\0'; |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
147 return stat(s,st); |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
148 } |
8358
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
149 sprintf(s,"%s/%s",dir,file); |
9249 | 150 return stat(s,st); |
8358
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
151 } |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
152 |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
153 static int compare(char **a, char **b){ |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
154 if((*a)[strlen(*a) - 1] == '/') { |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
155 if((*b)[strlen(*b) - 1] == '/') |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
156 return strcmp(*b, *a) ; |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
157 else |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
158 return 1; |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
159 } else { |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
160 if((*b)[strlen(*b) - 1] == '/') |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
161 return -1; |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
162 else |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
163 return strcmp(*b, *a); |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
164 } |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
165 } |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
166 |
19491
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
167 static char **get_extensions(menu_t *menu){ |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
168 char **extensions, ext[32]; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
169 FILE *fp; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
170 int n = 1; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
171 |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
172 if (!mpriv->filter) |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
173 return NULL; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
174 |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
175 fp = fopen(mpriv->filter, "r"); |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
176 if(!fp) |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
177 return NULL; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
178 |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
179 extensions = (char **) malloc(sizeof(*extensions)); |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
180 *extensions = NULL; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
181 |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
182 while(fgets(ext,sizeof(ext),fp)) { |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
183 char **l, *e; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
184 int s = strlen (ext); |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
185 |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
186 if(ext[s-1] == '\n') { |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
187 ext[s-1] = '\0'; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
188 s--; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
189 } |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
190 e = (char *) malloc(s+1); |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
191 extensions = (char **) realloc(extensions, ++n * sizeof(*extensions)); |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
192 extensions = (char **) realloc(extensions, ++n * sizeof(*extensions)); |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
193 strcpy (e, ext); |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
194 for (l=extensions; *l; l++); |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
195 *l++ = e; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
196 *l = NULL; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
197 } |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
198 |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
199 fclose (fp); |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
200 return extensions; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
201 } |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
202 |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
203 static void free_extensions(char **extensions){ |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
204 if (extensions) { |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
205 char **l = extensions; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
206 while (*l) |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
207 free (*l++); |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
208 free (extensions); |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
209 } |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
210 } |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
211 |
25354
a4c4b56e933d
reverted r25323: deprecated by ulion's recent patches
ben
parents:
25320
diff
changeset
|
212 static int open_dir(menu_t* menu,char* args) { |
8358
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
213 char **namelist, **tp; |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
214 struct dirent *dp; |
8197 | 215 struct stat st; |
216 int n; | |
23229
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
217 int path_fp; |
8197 | 218 char* p = NULL; |
219 list_entry_t* e; | |
8358
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
220 DIR* dirp; |
19491
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
221 extern int file_filter; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
222 char **extensions, **elem, *ext; |
8197 | 223 |
224 menu_list_init(menu); | |
225 | |
226 if(mpriv->dir) | |
227 free(mpriv->dir); | |
228 mpriv->dir = strdup(args); | |
229 if(mpriv->p.title && mpriv->p.title != mpriv->title && mpriv->p.title != cfg_dflt.p.title) | |
230 free(mpriv->p.title); | |
231 p = strstr(mpriv->title,"%p"); | |
232 | |
27086 | 233 mpriv->p.title = replace_path(mpriv->title,mpriv->dir,0); |
8197 | 234 |
8358
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
235 if ((dirp = opendir (mpriv->dir)) == NULL){ |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17945
diff
changeset
|
236 mp_msg(MSGT_GLOBAL,MSGL_ERR,MSGTR_LIBMENU_OpendirError, strerror(errno)); |
8358
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
237 return 0; |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
238 } |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
239 |
23229
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
240 if (menu_keepdir) { |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
241 path_fp = open (MENU_KEEP_PATH, O_CREAT | O_WRONLY | O_TRUNC, 0666); |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
242 if (path_fp >= 0) { |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
243 write (path_fp, mpriv->dir, strlen (mpriv->dir)); |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
244 close (path_fp); |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
245 } |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
246 } |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
247 |
8358
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
248 namelist = (char **) malloc(sizeof(char *)); |
19491
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
249 extensions = get_extensions(menu); |
8358
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
250 |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
251 n=0; |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
252 while ((dp = readdir(dirp)) != NULL) { |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
253 if(dp->d_name[0] == '.' && strcmp(dp->d_name,"..") != 0) |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
254 continue; |
23391
9bf57f60bf0a
new -menu-chroot option that prevent OSD file selection menu to go to an unwanted location (yeah, chroot ;-))
ben
parents:
23229
diff
changeset
|
255 if (menu_chroot && !strcmp (dp->d_name,"..")) { |
26945
b105b2c1f8ae
Use size_t instead of int for a variable that is compared to the result
diego
parents:
25632
diff
changeset
|
256 size_t len = strlen (menu_chroot); |
23391
9bf57f60bf0a
new -menu-chroot option that prevent OSD file selection menu to go to an unwanted location (yeah, chroot ;-))
ben
parents:
23229
diff
changeset
|
257 if ((strlen (mpriv->dir) == len || strlen (mpriv->dir) == len + 1) |
9bf57f60bf0a
new -menu-chroot option that prevent OSD file selection menu to go to an unwanted location (yeah, chroot ;-))
ben
parents:
23229
diff
changeset
|
258 && !strncmp (mpriv->dir, menu_chroot, len)) |
9bf57f60bf0a
new -menu-chroot option that prevent OSD file selection menu to go to an unwanted location (yeah, chroot ;-))
ben
parents:
23229
diff
changeset
|
259 continue; |
9bf57f60bf0a
new -menu-chroot option that prevent OSD file selection menu to go to an unwanted location (yeah, chroot ;-))
ben
parents:
23229
diff
changeset
|
260 } |
25311
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
261 if (mylstat(args,dp->d_name,&st)) |
605f00b6a4ae
Fix mylstat() call to parent dir where the subdir has no exec permission.
ulion
parents:
25300
diff
changeset
|
262 continue; |
19491
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
263 if (file_filter && extensions && !S_ISDIR(st.st_mode)) { |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
264 if((ext = strrchr(dp->d_name,'.')) == NULL) |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
265 continue; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
266 ext++; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
267 elem = extensions; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
268 do { |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
269 if (!strcasecmp(ext, *elem)) |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
270 break; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
271 } while (*++elem); |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
272 if (*elem == NULL) |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
273 continue; |
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
274 } |
8358
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
275 if(n%20 == 0){ // Get some more mem |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
276 if((tp = (char **) realloc(namelist, (n+20) * sizeof (char *))) |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
277 == NULL) { |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17945
diff
changeset
|
278 mp_msg(MSGT_GLOBAL,MSGL_ERR,MSGTR_LIBMENU_ReallocError, strerror(errno)); |
9104
a0aacfb492a5
Also attached some cleanup to menu_filesel.c, mainly to make it more
arpi
parents:
8853
diff
changeset
|
279 n--; |
8358
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
280 goto bailout; |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
281 } |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
282 namelist=tp; |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
283 } |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
284 |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
285 namelist[n] = (char *) malloc(strlen(dp->d_name) + 2); |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
286 if(namelist[n] == NULL){ |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17945
diff
changeset
|
287 mp_msg(MSGT_GLOBAL,MSGL_ERR,MSGTR_LIBMENU_MallocError, strerror(errno)); |
9104
a0aacfb492a5
Also attached some cleanup to menu_filesel.c, mainly to make it more
arpi
parents:
8853
diff
changeset
|
288 n--; |
8358
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
289 goto bailout; |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
290 } |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
291 |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
292 strcpy(namelist[n], dp->d_name); |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
293 if(S_ISDIR(st.st_mode)) |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
294 strcat(namelist[n], "/"); |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
295 n++; |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
296 } |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
297 |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
298 bailout: |
19491
10d8f2cae948
added new filter option to menu file browser to only display some files according to extension
ben
parents:
19490
diff
changeset
|
299 free_extensions (extensions); |
16061 | 300 closedir(dirp); |
301 | |
9104
a0aacfb492a5
Also attached some cleanup to menu_filesel.c, mainly to make it more
arpi
parents:
8853
diff
changeset
|
302 qsort(namelist, n, sizeof(char *), (kill_warn)compare); |
a0aacfb492a5
Also attached some cleanup to menu_filesel.c, mainly to make it more
arpi
parents:
8853
diff
changeset
|
303 |
8197 | 304 if (n < 0) { |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17945
diff
changeset
|
305 mp_msg(MSGT_GLOBAL,MSGL_ERR,MSGTR_LIBMENU_ReaddirError,strerror(errno)); |
8197 | 306 return 0; |
307 } | |
308 while(n--) { | |
9104
a0aacfb492a5
Also attached some cleanup to menu_filesel.c, mainly to make it more
arpi
parents:
8853
diff
changeset
|
309 if((e = calloc(1,sizeof(list_entry_t))) != NULL){ |
8613 | 310 e->p.next = NULL; |
8358
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
311 e->p.txt = strdup(namelist[n]); |
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
312 if(strchr(namelist[n], '/') != NULL) |
8197 | 313 e->d = 1; |
8358
ecf6a4cf3272
No scandir() an no functions defined within other functions.
arpi
parents:
8291
diff
changeset
|
314 menu_list_add_entry(menu,e); |
9104
a0aacfb492a5
Also attached some cleanup to menu_filesel.c, mainly to make it more
arpi
parents:
8853
diff
changeset
|
315 }else{ |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17945
diff
changeset
|
316 mp_msg(MSGT_GLOBAL,MSGL_ERR,MSGTR_LIBMENU_MallocError, strerror(errno)); |
9104
a0aacfb492a5
Also attached some cleanup to menu_filesel.c, mainly to make it more
arpi
parents:
8853
diff
changeset
|
317 } |
8197 | 318 free(namelist[n]); |
319 } | |
320 free(namelist); | |
321 | |
322 return 1; | |
323 } | |
324 | |
19490
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
325 static char *action; |
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
326 |
8197 | 327 static void read_cmd(menu_t* menu,int cmd) { |
328 switch(cmd) { | |
17945
98f4e3704a76
Allow 6 ways (up/down/left/right/ok/cancel) navigation.
albeu
parents:
16862
diff
changeset
|
329 case MENU_CMD_LEFT: |
98f4e3704a76
Allow 6 ways (up/down/left/right/ok/cancel) navigation.
albeu
parents:
16862
diff
changeset
|
330 mpriv->p.current = mpriv->p.menu; // Hack : we consider that the first entry is ../ |
98f4e3704a76
Allow 6 ways (up/down/left/right/ok/cancel) navigation.
albeu
parents:
16862
diff
changeset
|
331 case MENU_CMD_RIGHT: |
8197 | 332 case MENU_CMD_OK: { |
333 // Directory | |
25300
b1638a8b9dc6
Combine common code for dealing with file action and dir action.
ulion
parents:
25299
diff
changeset
|
334 if(mpriv->p.current->d && !mpriv->dir_action) { |
b1638a8b9dc6
Combine common code for dealing with file action and dir action.
ulion
parents:
25299
diff
changeset
|
335 // Default action : open this dirctory ourself |
8197 | 336 int l = strlen(mpriv->dir); |
337 char *slash = NULL, *p = NULL; | |
338 if(strcmp(mpriv->p.current->p.txt,"../") == 0) { | |
339 if(l <= 1) break; | |
340 mpriv->dir[l-1] = '\0'; | |
341 slash = strrchr(mpriv->dir,'/'); | |
20505 | 342 #if defined(__MINGW32__) || defined(__CYGWIN__) |
343 if (!slash) | |
344 slash = strrchr(mpriv->dir,'\\'); | |
345 #endif | |
8197 | 346 if(!slash) break; |
347 slash[1] = '\0'; | |
348 p = strdup(mpriv->dir); | |
349 } else { | |
350 p = malloc(l + strlen(mpriv->p.current->p.txt) + 1); | |
351 sprintf(p,"%s%s",mpriv->dir,mpriv->p.current->p.txt); | |
352 } | |
353 menu_list_uninit(menu,free_entry); | |
354 if(!open_dir(menu,p)) { | |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17945
diff
changeset
|
355 mp_msg(MSGT_GLOBAL,MSGL_ERR,MSGTR_LIBMENU_CantOpenDirectory,p); |
8197 | 356 menu->cl = 1; |
357 } | |
358 free(p); | |
25300
b1638a8b9dc6
Combine common code for dealing with file action and dir action.
ulion
parents:
25299
diff
changeset
|
359 } else { // File and directory dealt with action string. |
8197 | 360 int fname_len = strlen(mpriv->dir) + strlen(mpriv->p.current->p.txt) + 1; |
361 char filename[fname_len]; | |
362 char *str; | |
25300
b1638a8b9dc6
Combine common code for dealing with file action and dir action.
ulion
parents:
25299
diff
changeset
|
363 char *action = mpriv->p.current->d ? mpriv->dir_action:mpriv->file_action; |
8197 | 364 sprintf(filename,"%s%s",mpriv->dir,mpriv->p.current->p.txt); |
27086 | 365 str = replace_path(action, filename,1); |
25505
8d329f7bbc3c
Remove redundant option 'auto-close' from cmdlist and filesel.
ulion
parents:
25502
diff
changeset
|
366 mp_input_parse_and_queue_cmds(str); |
25300
b1638a8b9dc6
Combine common code for dealing with file action and dir action.
ulion
parents:
25299
diff
changeset
|
367 if (str != action) |
8197 | 368 free(str); |
25300
b1638a8b9dc6
Combine common code for dealing with file action and dir action.
ulion
parents:
25299
diff
changeset
|
369 } |
8197 | 370 } break; |
19490
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
371 case MENU_CMD_ACTION: { |
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
372 int fname_len = strlen(mpriv->dir) + strlen(mpriv->p.current->p.txt) + 1; |
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
373 char filename[fname_len]; |
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
374 char *str; |
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
375 sprintf(filename,"%s%s",mpriv->dir,mpriv->p.current->p.txt); |
27086 | 376 str = replace_path(action, filename,1); |
25320
4fbf536cc033
Support to run multiple mplayer commands set in menu.conf
ulion
parents:
25311
diff
changeset
|
377 mp_input_parse_and_queue_cmds(str); |
19490
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
378 if(str != action) |
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
379 free(str); |
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
380 } break; |
8197 | 381 default: |
382 menu_list_read_cmd(menu,cmd); | |
383 } | |
384 } | |
385 | |
25502
605d4e3e403f
From now on, libmenu does not steal all input keys from input modules.
ulion
parents:
25354
diff
changeset
|
386 static int read_key(menu_t* menu,int c){ |
19490
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
387 char **str; |
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
388 for (str=mpriv->actions; str && *str; str++) |
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
389 if (c == (*str)[0]) { |
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
390 action = &(*str)[2]; |
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
391 read_cmd(menu,MENU_CMD_ACTION); |
25502
605d4e3e403f
From now on, libmenu does not steal all input keys from input modules.
ulion
parents:
25354
diff
changeset
|
392 return 1; |
19490
f57977ac0394
support multiple actions in menu's file browser using key bindings
ben
parents:
19431
diff
changeset
|
393 } |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25134
diff
changeset
|
394 if (menu_dflt_read_key(menu, c)) |
25502
605d4e3e403f
From now on, libmenu does not steal all input keys from input modules.
ulion
parents:
25354
diff
changeset
|
395 return 1; |
605d4e3e403f
From now on, libmenu does not steal all input keys from input modules.
ulion
parents:
25354
diff
changeset
|
396 return menu_list_jump_to_key(menu, c); |
8197 | 397 } |
398 | |
399 static void clos(menu_t* menu) { | |
400 menu_list_uninit(menu,free_entry); | |
401 free(mpriv->dir); | |
402 } | |
403 | |
404 static int open_fs(menu_t* menu, char* args) { | |
26970 | 405 char *path = mpriv->path; |
8197 | 406 int r = 0; |
25134
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
407 char wd[PATH_MAX+1], b[PATH_MAX+1]; |
8197 | 408 args = NULL; // Warning kill |
409 | |
410 menu->draw = menu_list_draw; | |
411 menu->read_cmd = read_cmd; | |
412 menu->read_key = read_key; | |
413 menu->close = clos; | |
414 | |
23229
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
415 if (menu_keepdir) { |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
416 if (!path || path[0] == '\0') { |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
417 struct stat st; |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
418 int path_fp; |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
419 |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
420 path_fp = open (MENU_KEEP_PATH, O_RDONLY); |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
421 if (path_fp >= 0) { |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
422 if (!fstat (path_fp, &st) && (st.st_size > 0)) { |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
423 path = malloc(st.st_size+1); |
26960 | 424 path[st.st_size] = '\0'; |
26970 | 425 if (!((read(path_fp, path, st.st_size) == st.st_size) && path[0] == '/' |
426 && !stat(path, &st) && S_ISDIR(st.st_mode))) { | |
23229
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
427 free(path); |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
428 path = NULL; |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
429 } |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
430 } |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
431 close (path_fp); |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
432 } |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
433 } |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
434 } |
ae2a2d5ca64b
new -menu-keepdir option that allows libmenu file browser to always restart browsing from the last place we were instead of current dir
ben
parents:
20505
diff
changeset
|
435 |
8197 | 436 getcwd(wd,PATH_MAX); |
25528
e3f6092fb640
Default use the dir where the current playing file located if path not set.
ulion
parents:
25505
diff
changeset
|
437 if (!path || path[0] == '\0') { |
25632 | 438 #if 0 |
25528
e3f6092fb640
Default use the dir where the current playing file located if path not set.
ulion
parents:
25505
diff
changeset
|
439 char *slash = NULL; |
e3f6092fb640
Default use the dir where the current playing file located if path not set.
ulion
parents:
25505
diff
changeset
|
440 if (filename && !strstr(filename, "://") && (path=realpath(filename, b))) { |
e3f6092fb640
Default use the dir where the current playing file located if path not set.
ulion
parents:
25505
diff
changeset
|
441 slash = strrchr(path, '/'); |
e3f6092fb640
Default use the dir where the current playing file located if path not set.
ulion
parents:
25505
diff
changeset
|
442 #if defined(__MINGW32__) || defined(__CYGWIN__) |
e3f6092fb640
Default use the dir where the current playing file located if path not set.
ulion
parents:
25505
diff
changeset
|
443 // FIXME: Do we need and can convert all '\\' in path to '/' on win32? |
e3f6092fb640
Default use the dir where the current playing file located if path not set.
ulion
parents:
25505
diff
changeset
|
444 if (!slash) |
e3f6092fb640
Default use the dir where the current playing file located if path not set.
ulion
parents:
25505
diff
changeset
|
445 slash = strrchr(path, '\\'); |
e3f6092fb640
Default use the dir where the current playing file located if path not set.
ulion
parents:
25505
diff
changeset
|
446 #endif |
e3f6092fb640
Default use the dir where the current playing file located if path not set.
ulion
parents:
25505
diff
changeset
|
447 } |
e3f6092fb640
Default use the dir where the current playing file located if path not set.
ulion
parents:
25505
diff
changeset
|
448 if (slash) |
e3f6092fb640
Default use the dir where the current playing file located if path not set.
ulion
parents:
25505
diff
changeset
|
449 slash[1] = '\0'; |
e3f6092fb640
Default use the dir where the current playing file located if path not set.
ulion
parents:
25505
diff
changeset
|
450 else |
25632 | 451 #endif |
25528
e3f6092fb640
Default use the dir where the current playing file located if path not set.
ulion
parents:
25505
diff
changeset
|
452 path = wd; |
e3f6092fb640
Default use the dir where the current playing file located if path not set.
ulion
parents:
25505
diff
changeset
|
453 } |
25134
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
454 if (path[0] != '/') { |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
455 if(path[strlen(path)-1] != '/') |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
456 snprintf(b,sizeof(b),"%s/%s/",wd,path); |
8197 | 457 else |
25134
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
458 snprintf(b,sizeof(b),"%s/%s",wd,path); |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
459 path = b; |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
460 } else if (path[strlen(path)-1]!='/') { |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
461 sprintf(b,"%s/",path); |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
462 path = b; |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
463 } |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
464 if (menu_chroot && menu_chroot[0] == '/') { |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
465 int l = strlen(menu_chroot); |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
466 if (l > 0 && menu_chroot[l-1] == '/') |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
467 --l; |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
468 if (strncmp(menu_chroot, path, l) || (path[l] != '\0' && path[l] != '/')) { |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
469 if (menu_chroot[l] == '/') |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
470 path = menu_chroot; |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
471 else { |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
472 sprintf(b,"%s/",menu_chroot); |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
473 path = b; |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
474 } |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
475 } |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
476 } |
dcf1bfb29dc8
Fix code to make sure the browse starting path within the menu-chroot path.
ulion
parents:
23391
diff
changeset
|
477 r = open_dir(menu,path); |
8197 | 478 |
479 return r; | |
480 } | |
481 | |
482 const menu_info_t menu_info_filesel = { | |
483 "File seletor menu", | |
484 "filesel", | |
485 "Albeu", | |
486 "", | |
487 { | |
488 "fs_cfg", | |
489 sizeof(struct menu_priv_s), | |
490 &cfg_dflt, | |
491 cfg_fields | |
492 }, | |
493 open_fs | |
494 }; |