~ubuntu-dev/mplayer/ubuntu-feisty

« back to all changes in this revision

Viewing changes to libmenu/menu_filesel.c

  • Committer: William Grant
  • Date: 2007-02-03 03:16:07 UTC
  • mto: This revision was merged to the branch mainline in revision 16.
  • Revision ID: william.grant@ubuntu.org.au-20070203031607-08gc2ompbz6spt9i
Update to 1.0rc1.

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
#include "m_struct.h"
19
19
#include "m_option.h"
20
20
 
21
 
#include "img_format.h"
22
 
#include "mp_image.h"
 
21
#include "libmpcodecs/img_format.h"
 
22
#include "libmpcodecs/mp_image.h"
23
23
 
24
24
#include "menu.h"
25
25
#include "menu_list.h"
40
40
  char* file_action;
41
41
  char* dir_action;
42
42
  int auto_close;
 
43
  char** actions;
 
44
  char* filter; 
43
45
};
44
46
 
45
47
static struct menu_priv_s cfg_dflt = {
50
52
  "Select a file: %p",
51
53
  "loadfile '%p'",
52
54
  NULL,
53
 
  0
 
55
  0,
 
56
  NULL,
 
57
  NULL
54
58
};
55
59
 
56
60
#define ST_OFF(m) M_ST_OFF(struct menu_priv_s,m)
62
66
  { "file-action", ST_OFF(file_action),  CONF_TYPE_STRING, 0, 0, 0, NULL },
63
67
  { "dir-action", ST_OFF(dir_action),  CONF_TYPE_STRING, 0, 0, 0, NULL },
64
68
  { "auto-close", ST_OFF(auto_close), CONF_TYPE_FLAG, 0, 0, 1, NULL },
 
69
  { "actions", ST_OFF(actions), CONF_TYPE_STRING_LIST, 0, 0, 0, NULL},
 
70
  { "filter", ST_OFF(filter), CONF_TYPE_STRING, 0, 0, 0, NULL},
65
71
  { NULL, NULL, NULL, 0,0,0,NULL }
66
72
};
67
73
 
123
129
  }
124
130
}
125
131
 
 
132
static char **get_extensions(menu_t *menu){
 
133
  char **extensions, ext[32];
 
134
  FILE *fp;
 
135
  int n = 1;
 
136
 
 
137
  if (!mpriv->filter)
 
138
    return NULL;
 
139
 
 
140
  fp = fopen(mpriv->filter, "r");
 
141
  if(!fp)
 
142
    return NULL;
 
143
 
 
144
  extensions = (char **) malloc(sizeof(*extensions));
 
145
  *extensions = NULL;
 
146
 
 
147
  while(fgets(ext,sizeof(ext),fp)) {
 
148
    char **l, *e;
 
149
    int s = strlen (ext);
 
150
 
 
151
    if(ext[s-1] == '\n') {
 
152
      ext[s-1] = '\0';
 
153
      s--;
 
154
    }
 
155
    e = (char *) malloc(s+1);
 
156
    extensions = (char **) realloc(extensions, ++n * sizeof(*extensions));
 
157
    extensions = (char **) realloc(extensions, ++n * sizeof(*extensions));
 
158
    strcpy (e, ext);
 
159
    for (l=extensions; *l; l++);
 
160
    *l++ = e;
 
161
    *l = NULL;
 
162
  }
 
163
 
 
164
  fclose (fp);
 
165
  return extensions;
 
166
}
 
167
 
 
168
static void free_extensions(char **extensions){
 
169
  if (extensions) {
 
170
    char **l = extensions;
 
171
    while (*l)
 
172
      free (*l++);
 
173
    free (extensions);
 
174
  }
 
175
}
 
176
 
126
177
static int open_dir(menu_t* menu,char* args) {
127
178
  char **namelist, **tp;
128
179
  struct dirent *dp;
131
182
  char* p = NULL;
132
183
  list_entry_t* e;
133
184
  DIR* dirp;
 
185
  extern int file_filter;
 
186
  char **extensions, **elem, *ext;
134
187
 
135
188
  menu_list_init(menu);
136
189
 
149
202
  }
150
203
 
151
204
  namelist = (char **) malloc(sizeof(char *));
 
205
  extensions = get_extensions(menu);
152
206
 
153
207
  n=0;
154
208
  while ((dp = readdir(dirp)) != NULL) {
155
209
    if(dp->d_name[0] == '.' && strcmp(dp->d_name,"..") != 0)
156
210
      continue;
 
211
    mylstat(args,dp->d_name,&st);
 
212
    if (file_filter && extensions && !S_ISDIR(st.st_mode)) {
 
213
      if((ext = strrchr(dp->d_name,'.')) == NULL)
 
214
        continue;
 
215
      ext++;
 
216
      elem = extensions;
 
217
      do {
 
218
        if (!strcasecmp(ext, *elem))
 
219
          break;
 
220
      } while (*++elem);
 
221
      if (*elem == NULL)
 
222
        continue;
 
223
    }
157
224
    if(n%20 == 0){ // Get some more mem
158
225
      if((tp = (char **) realloc(namelist, (n+20) * sizeof (char *)))
159
226
         == NULL) {
172
239
    }
173
240
     
174
241
    strcpy(namelist[n], dp->d_name);
175
 
    mylstat(args,namelist[n],&st); 
176
242
    if(S_ISDIR(st.st_mode))
177
243
      strcat(namelist[n], "/");
178
244
    n++;
179
245
  }
180
246
 
181
247
bailout:
 
248
  free_extensions (extensions);
182
249
  closedir(dirp);
183
250
 
184
251
  qsort(namelist, n, sizeof(char *), (kill_warn)compare);
205
272
}
206
273
    
207
274
 
 
275
static char *action;
 
276
 
208
277
static void read_cmd(menu_t* menu,int cmd) {
209
278
  mp_cmd_t* c = NULL;
210
279
  switch(cmd) {
260
329
        menu->cl = 1;
261
330
    }
262
331
  } break;
 
332
  case MENU_CMD_ACTION: {
 
333
    int fname_len = strlen(mpriv->dir) + strlen(mpriv->p.current->p.txt) + 1;
 
334
    char filename[fname_len];
 
335
    char *str;
 
336
    sprintf(filename,"%s%s",mpriv->dir,mpriv->p.current->p.txt);
 
337
    str = replace_path(action, filename);
 
338
    mp_input_queue_cmd(mp_input_parse_cmd(str));
 
339
    if(str != action)
 
340
      free(str);
 
341
  } break;
263
342
  default:
264
343
    menu_list_read_cmd(menu,cmd);
265
344
  }
268
347
static void read_key(menu_t* menu,int c){
269
348
  if(c == KEY_BS)
270
349
    read_cmd(menu,MENU_CMD_LEFT);
271
 
  else
272
 
    menu_list_read_key(menu,c,1);
 
350
  else {
 
351
    char **str;
 
352
    for (str=mpriv->actions; str && *str; str++)
 
353
      if (c == (*str)[0]) {
 
354
        action = &(*str)[2];
 
355
        read_cmd(menu,MENU_CMD_ACTION);
 
356
        break;
 
357
      }
 
358
    if (!str || !*str)
 
359
      menu_list_read_key(menu,c,1);
 
360
  }
273
361
}
274
362
 
275
363
static void clos(menu_t* menu) {