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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
1
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
2 #include <stdlib.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
3 #include <stdio.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
4 #include <dirent.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
5 #include <errno.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
6 #include <string.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
7 #include <sys/types.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
10 #include <ctype.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
13
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
14
16862
931bdbc37ee0 Unify include paths, -I.. is in CFLAGS.
diego
parents: 16061
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
18
16862
931bdbc37ee0 Unify include paths, -I.. is in CFLAGS.
diego
parents: 16061
diff changeset
19 #include "m_struct.h"
931bdbc37ee0 Unify include paths, -I.. is in CFLAGS.
diego
parents: 16061
diff changeset
20 #include "m_option.h"
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
24
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
25 #include "menu.h"
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
26 #include "menu_list.h"
16862
931bdbc37ee0 Unify include paths, -I.. is in CFLAGS.
diego
parents: 16061
diff changeset
27 #include "input/input.h"
931bdbc37ee0 Unify include paths, -I.. is in CFLAGS.
diego
parents: 16061
diff changeset
28 #include "osdep/keycodes.h"
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
36 struct list_entry_s {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
37 struct list_entry p;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
38 int d;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
39 };
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
40
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
41 struct menu_priv_s {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
42 menu_list_priv_t p;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
43 char* dir; // current dir
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
44 /// Cfg fields
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
45 char* path;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
46 char* title;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
47 char* file_action;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
51 };
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
52
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
53 static struct menu_priv_s cfg_dflt = {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
54 MENU_LIST_PRIV_DFLT,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
55 NULL,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
56
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
57 NULL,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
58 "Select a file: %p",
8226
4b8fcc2af8f1 quote the filenames
albeu
parents: 8197
diff changeset
59 "loadfile '%p'",
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
63 };
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
64
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
65 #define ST_OFF(m) M_ST_OFF(struct menu_priv_s,m)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
66
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
67 static m_option_t cfg_fields[] = {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
68 MENU_LIST_PRIV_FIELDS,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
69 { "path", ST_OFF(path), CONF_TYPE_STRING, 0, 0, 0, NULL },
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
70 { "title", ST_OFF(title), CONF_TYPE_STRING, 0, 0, 0, NULL },
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
71 { "file-action", ST_OFF(file_action), CONF_TYPE_STRING, 0, 0, 0, NULL },
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
75 { NULL, NULL, NULL, 0,0,0,NULL }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
76 };
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
77
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
78 #define mpriv (menu->priv)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
79
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
80 static void free_entry(list_entry_t* entry) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
81 free(entry->p.txt);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
82 free(entry);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
83 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
84
27086
1d0ac8ff2527 fixes two bugs:
ben
parents: 26970
diff changeset
85 static char* replace_path(char* title , char* dir , int escape) {
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
86 char *p = strstr(title,"%p");
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
87 if(p) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
88 int tl = strlen(title);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
89 int dl = strlen(dir);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
90 int t1l = p-title;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
1d0ac8ff2527 fixes two bugs:
ben
parents: 26970
diff changeset
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
1d0ac8ff2527 fixes two bugs:
ben
parents: 26970
diff changeset
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
1d0ac8ff2527 fixes two bugs:
ben
parents: 26970
diff changeset
98 else if (*d == '\'') /* ' -> \'\\\'\' */
1d0ac8ff2527 fixes two bugs:
ben
parents: 26970
diff changeset
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
1d0ac8ff2527 fixes two bugs:
ben
parents: 26970
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
1d0ac8ff2527 fixes two bugs:
ben
parents: 26970
diff changeset
106 if (escape) {
1d0ac8ff2527 fixes two bugs:
ben
parents: 26970
diff changeset
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
1d0ac8ff2527 fixes two bugs:
ben
parents: 26970
diff changeset
109 else if (*dir == '\'') { /* ' -> \'\\\'\' */
1d0ac8ff2527 fixes two bugs:
ben
parents: 26970
diff changeset
110 *n++ = '\\'; *n++ = '\'';
1d0ac8ff2527 fixes two bugs:
ben
parents: 26970
diff changeset
111 *n++ = '\\'; *n++ = '\\';
1d0ac8ff2527 fixes two bugs:
ben
parents: 26970
diff changeset
112 *n++ = '\\'; *n++ = '\'';
1d0ac8ff2527 fixes two bugs:
ben
parents: 26970
diff changeset
113 *n++ = '\\';
1d0ac8ff2527 fixes two bugs:
ben
parents: 26970
diff changeset
114 }
1d0ac8ff2527 fixes two bugs:
ben
parents: 26970
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
119 return r;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
120 } else
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
121 return title;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
122 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
123
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
124 typedef int (*kill_warn)(const void*, const void*);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
f88ba181ecf2 some 10l bugfixes
arpi
parents: 8358
diff changeset
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
8546faeb0112 lstat->stat
arpi
parents: 9104
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
215 struct stat st;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
218 char* p = NULL;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
223
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
224 menu_list_init(menu);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
225
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
226 if(mpriv->dir)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
227 free(mpriv->dir);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
228 mpriv->dir = strdup(args);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
229 if(mpriv->p.title && mpriv->p.title != mpriv->title && mpriv->p.title != cfg_dflt.p.title)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
230 free(mpriv->p.title);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
231 p = strstr(mpriv->title,"%p");
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
232
27086
1d0ac8ff2527 fixes two bugs:
ben
parents: 26970
diff changeset
233 mpriv->p.title = replace_path(mpriv->title,mpriv->dir,0);
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
261022c048cd add some closedir() to fix some opendir() leaks
aurel
parents: 10624
diff changeset
300 closedir(dirp);
261022c048cd add some closedir() to fix some opendir() leaks
aurel
parents: 10624
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
306 return 0;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
307 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
f88ba181ecf2 some 10l bugfixes
arpi
parents: 8358
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
318 free(namelist[n]);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
319 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
320 free(namelist);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
321
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
322 return 1;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
323 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
327 static void read_cmd(menu_t* menu,int cmd) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
332 case MENU_CMD_OK: {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
336 int l = strlen(mpriv->dir);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
337 char *slash = NULL, *p = NULL;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
338 if(strcmp(mpriv->p.current->p.txt,"../") == 0) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
339 if(l <= 1) break;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
340 mpriv->dir[l-1] = '\0';
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
341 slash = strrchr(mpriv->dir,'/');
20505
543f6e8deeb6 Handle windows path separator in filesel menu.
reimar
parents: 19491
diff changeset
342 #if defined(__MINGW32__) || defined(__CYGWIN__)
543f6e8deeb6 Handle windows path separator in filesel menu.
reimar
parents: 19491
diff changeset
343 if (!slash)
543f6e8deeb6 Handle windows path separator in filesel menu.
reimar
parents: 19491
diff changeset
344 slash = strrchr(mpriv->dir,'\\');
543f6e8deeb6 Handle windows path separator in filesel menu.
reimar
parents: 19491
diff changeset
345 #endif
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
346 if(!slash) break;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
347 slash[1] = '\0';
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
348 p = strdup(mpriv->dir);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
349 } else {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
350 p = malloc(l + strlen(mpriv->p.current->p.txt) + 1);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
351 sprintf(p,"%s%s",mpriv->dir,mpriv->p.current->p.txt);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
352 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
353 menu_list_uninit(menu,free_entry);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
356 menu->cl = 1;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
357 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
360 int fname_len = strlen(mpriv->dir) + strlen(mpriv->p.current->p.txt) + 1;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
361 char filename[fname_len];
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
364 sprintf(filename,"%s%s",mpriv->dir,mpriv->p.current->p.txt);
27086
1d0ac8ff2527 fixes two bugs:
ben
parents: 26970
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
368 free(str);
25300
b1638a8b9dc6 Combine common code for dealing with file action and dir action.
ulion
parents: 25299
diff changeset
369 }
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
1d0ac8ff2527 fixes two bugs:
ben
parents: 26970
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
381 default:
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
382 menu_list_read_cmd(menu,cmd);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
383 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
384 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
397 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
398
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
399 static void clos(menu_t* menu) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
400 menu_list_uninit(menu,free_entry);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
401 free(mpriv->dir);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
402 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
403
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
404 static int open_fs(menu_t* menu, char* args) {
26970
2eea71274bd1 Removed unused freepath variable.
ben
parents: 26961
diff changeset
405 char *path = mpriv->path;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
408 args = NULL; // Warning kill
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
409
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
410 menu->draw = menu_list_draw;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
411 menu->read_cmd = read_cmd;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
412 menu->read_key = read_key;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
413 menu->close = clos;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
805f7deb1b48 Ensure 'path' string is 0 terminated.
ben
parents: 26945
diff changeset
424 path[st.st_size] = '\0';
26970
2eea71274bd1 Removed unused freepath variable.
ben
parents: 26961
diff changeset
425 if (!((read(path_fp, path, st.st_size) == st.st_size) && path[0] == '/'
2eea71274bd1 Removed unused freepath variable.
ben
parents: 26961
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
61bc7acb7bb1 Deny the code using realpath().
ulion
parents: 25528
diff changeset
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
61bc7acb7bb1 Deny the code using realpath().
ulion
parents: 25528
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
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
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
478
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
479 return r;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
480 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
481
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
482 const menu_info_t menu_info_filesel = {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
483 "File seletor menu",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
484 "filesel",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
485 "Albeu",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
486 "",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
487 {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
488 "fs_cfg",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
489 sizeof(struct menu_priv_s),
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
490 &cfg_dflt,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
491 cfg_fields
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
492 },
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
493 open_fs
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
494 };