summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/fileop.c344
-rw-r--r--apps/fileop.h19
-rw-r--r--apps/lang/italiano.lang1091
-rw-r--r--apps/onplay.c245
-rw-r--r--apps/onplay.h2
5 files changed, 615 insertions, 1086 deletions
diff --git a/apps/fileop.c b/apps/fileop.c
index 0d2dc774b9..35bd9f2241 100644
--- a/apps/fileop.c
+++ b/apps/fileop.c
@@ -1,10 +1,10 @@
1/*************************************************************************** 1/***************************************************************************
2 * __________ __ ___. 2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___ 3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / 4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < 5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ 6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/ 7 * \/ \/ \/ \/ \/
8 * $Id$ 8 * $Id$
9 * 9 *
10 * Copyright (C) 2002 Björn Stenberg 10 * Copyright (C) 2002 Björn Stenberg
@@ -50,6 +50,17 @@ struct file_op_params
50 size_t append; /* Append position in 'path' for stack push */ 50 size_t append; /* Append position in 'path' for stack push */
51}; 51};
52 52
53static int prompt_name(char* buf, size_t bufsz)
54{
55 if (kbd_input(buf, bufsz, NULL) < 0)
56 return FORC_CANCELLED;
57 /* at least prevent escapes out of the base directory from keyboard-
58 entered filenames; the file code should reject other invalidities */
59 if (*buf != '\0' && !strchr(buf, PATH_SEPCH) && !is_dotdir_name(buf))
60 return FORC_SUCCESS;
61 return FORC_UNKNOWN_FAILURE;
62}
63
53static bool poll_cancel_action(const char *path, int operation, int current, int total) 64static bool poll_cancel_action(const char *path, int operation, int current, int total)
54{ 65{
55 const char *op_str = ""; 66 const char *op_str = "";
@@ -75,7 +86,7 @@ static bool poll_cancel_action(const char *path, int operation, int current, int
75 return ACTION_STD_CANCEL == get_action(CONTEXT_STD, TIMEOUT_NOBLOCK); 86 return ACTION_STD_CANCEL == get_action(CONTEXT_STD, TIMEOUT_NOBLOCK);
76} 87}
77 88
78static struct file_op_params* init_file_op(struct file_op_params *param, 89static void init_file_op(struct file_op_params *param,
79 const char *basename, 90 const char *basename,
80 const char *selected_file) 91 const char *selected_file)
81{ 92{
@@ -90,8 +101,6 @@ static struct file_op_params* init_file_op(struct file_op_params *param,
90 param->is_dir = dir_exists(param->path); 101 param->is_dir = dir_exists(param->path);
91 param->objects = 0; /* how many files and subdirectories*/ 102 param->objects = 0; /* how many files and subdirectories*/
92 param->processed = 0; 103 param->processed = 0;
93
94 return param;
95} 104}
96 105
97/* counts file objects, deletes file objects */ 106/* counts file objects, deletes file objects */
@@ -144,7 +153,7 @@ static int directory_fileop(struct file_op_params *param, enum file_op_current f
144 153
145 if (info.attribute & ATTR_DIRECTORY) { 154 if (info.attribute & ATTR_DIRECTORY) {
146 /* remove a subdirectory */ 155 /* remove a subdirectory */
147 rc = directory_fileop(param, fileop); 156 rc = directory_fileop(param, fileop); /* recursion */
148 } else { 157 } else {
149 /* remove a file */ 158 /* remove a file */
150 if (poll_cancel_action(param->path, FOC_DELETE, param->processed, param->objects)) 159 if (poll_cancel_action(param->path, FOC_DELETE, param->processed, param->objects))
@@ -165,8 +174,8 @@ static int directory_fileop(struct file_op_params *param, enum file_op_current f
165 } 174 }
166 175
167 if (info.attribute & ATTR_DIRECTORY) { 176 if (info.attribute & ATTR_DIRECTORY) {
168 /* remove a subdirectory */ 177 /* enter subdirectory */
169 rc = directory_fileop(param, FOC_COUNT); 178 rc = directory_fileop(param, FOC_COUNT); /* recursion */
170 } else { 179 } else {
171 if (poll_cancel_action(param->path, FOC_COUNT, param->objects, 0)) 180 if (poll_cancel_action(param->path, FOC_COUNT, param->objects, 0))
172 { 181 {
@@ -195,150 +204,42 @@ static int directory_fileop(struct file_op_params *param, enum file_op_current f
195 return rc; 204 return rc;
196} 205}
197 206
207/* Walk a directory tree and count the number of objects (dirs & files)
208 * also check that enough resources exist to do an operation */
198static int check_count_fileobjects(struct file_op_params *param) 209static int check_count_fileobjects(struct file_op_params *param)
199{ 210{
211 cpu_boost(true);
200 int rc = directory_fileop(param, FOC_COUNT); 212 int rc = directory_fileop(param, FOC_COUNT);
213 cpu_boost(false);
201 DEBUGF("%s res:(%d) objects %d \n", __func__, rc, param->objects); 214 DEBUGF("%s res:(%d) objects %d \n", __func__, rc, param->objects);
202 return rc; 215 return rc;
203} 216}
204 217
205static bool check_new_name(const char *basename) 218/* Attempt to just rename a file or directory */
206{
207 /* at least prevent escapes out of the base directory from keyboard-
208 entered filenames; the file code should reject other invalidities */
209 return *basename != '\0' && !strchr(basename, PATH_SEPCH) &&
210 !is_dotdir_name(basename);
211}
212
213int create_dir(void)
214{
215 int rc = FORC_UNKNOWN_FAILURE;
216 char dirname[MAX_PATH];
217 size_t pathlen = path_append(dirname, getcwd(NULL, 0), PA_SEP_HARD,
218 sizeof (dirname));
219 char *basename = dirname + pathlen;
220
221 if (pathlen >= sizeof (dirname)) {
222 /* Too long */
223 } else if (kbd_input(basename, sizeof (dirname) - pathlen, NULL) < 0) {
224 rc = FORC_CANCELLED;
225 } else if (check_new_name(basename)) {
226 rc = mkdir(dirname);
227 }
228
229 return rc;
230}
231
232/************************************************************************************/
233/* share code for file and directory deletion, saves space */
234static int delete_file_dir(struct file_op_params *param)
235{
236 /* Note: delete_file_dir() will happily delete whatever
237 * path is passed (after confirmation) */
238 if (confirm_delete_yesno(param->path) != YESNO_YES) {
239 return FORC_CANCELLED;
240 }
241
242 clear_screen_buffer(true);
243 poll_cancel_action(param->path, FOC_DELETE, param->processed, param->objects);
244
245 int rc = FORC_UNKNOWN_FAILURE;
246
247 if (param->is_dir) { /* if directory */
248 cpu_boost(true);
249 rc = directory_fileop(param, FOC_DELETE);
250 cpu_boost(false);
251 } else {
252 rc = remove(param->path);
253 }
254
255 return rc;
256}
257
258int delete_fileobject(const char *selected_file)
259{
260 struct file_op_params param;
261 if (init_file_op(&param, selected_file, NULL)->is_dir == true)
262 {
263 int rc = check_count_fileobjects(&param);
264 DEBUGF("%s res: %d, ct: %d, %s", __func__, rc, param.objects, param.path);
265 if (rc != FORC_SUCCESS)
266 return rc;
267 }
268
269 return delete_file_dir(&param);
270}
271
272int rename_file(const char *selected_file)
273{
274 int rc = FORC_UNKNOWN_FAILURE;
275 char newname[MAX_PATH];
276 const char *oldbase, *selection = selected_file;
277
278 path_basename(selection, &oldbase);
279 size_t pathlen = oldbase - selection;
280 char *newbase = newname + pathlen;
281
282 if (strmemccpy(newname, selection, sizeof (newname)) == NULL) {
283 /* Too long */
284 } else if (kbd_input(newbase, sizeof (newname) - pathlen, NULL) < 0) {
285 rc = FORC_CANCELLED;
286 } else if (!strcmp(oldbase, newbase)) {
287 rc = FORC_NOOP; /* No change at all */
288 } else if (check_new_name(newbase)) {
289 switch (relate(selection, newname))
290 {
291 case RELATE_DIFFERENT:
292 if (file_exists(newname)) {
293 break; /* don't overwrite */
294 }
295 /* Fall-through */
296 case RELATE_SAME:
297 rc = rename(selection, newname);
298 break;
299 case RELATE_PREFIX:
300 default:
301 break;
302 }
303 }
304
305 return rc;
306}
307
308static int move_by_rename(const char *src_path, 219static int move_by_rename(const char *src_path,
309 const char *dst_path, 220 const char *dst_path,
310 unsigned int *pflags) 221 unsigned int *pflags)
311{ 222{
312 unsigned int flags = *pflags; 223 unsigned int flags = *pflags;
313 int rc = FORC_UNKNOWN_FAILURE; 224 int rc = FORC_UNKNOWN_FAILURE;
314 while (!(flags & (PASTE_COPY | PASTE_EXDEV))) { 225 if (!(flags & (PASTE_COPY | PASTE_EXDEV))) {
315 if ((flags & PASTE_OVERWRITE) || !file_exists(dst_path)) { 226 if ((flags & PASTE_OVERWRITE) || !file_exists(dst_path)) {
316 /* Just try to move the directory / file */ 227 /* Just try to move the directory / file */
317 if (poll_cancel_action(src_path, FOC_MOVE, 0 , 0)) { 228 if (poll_cancel_action(src_path, FOC_MOVE, 0 , 0)) {
318 rc = FORC_CANCELLED; 229 rc = FORC_CANCELLED;
319 } else { 230 } else {
320 rc = rename(src_path, dst_path); 231 rc = rename(src_path, dst_path);
321 } 232#ifdef HAVE_MULTIVOLUME
322 233 if (rc < FORC_SUCCESS && errno == EXDEV) {
323 if (rc < 0) { 234 /* Failed because cross volume rename doesn't work */
324 int errnum = errno; 235 *pflags |= PASTE_EXDEV; /* force a move instead */
325 if (errnum == ENOTEMPTY && (flags & PASTE_OVERWRITE)) {
326 /* Directory is not empty thus rename() will not do a quick
327 overwrite */
328 break;
329 } 236 }
330 #ifdef HAVE_MULTIVOLUME 237#endif /* HAVE_MULTIVOLUME */
331 else if (errnum == EXDEV) { 238 /* if (errno == ENOTEMPTY && (flags & PASTE_OVERWRITE)) {
332 /* Failed because cross volume rename doesn't work; force 239 * Directory is not empty thus rename() will not do a quick overwrite */
333 a move instead */
334 *pflags |= PASTE_EXDEV;
335 break;
336 }
337 #endif /* HAVE_MULTIVOLUME */
338 } 240 }
339 } 241 }
340 242
341 break;
342 } 243 }
343 return rc; 244 return rc;
344} 245}
@@ -365,8 +266,7 @@ static int copy_move_file(const char *src_path, const char *dst_path, unsigned i
365 return FORC_NO_BUFFER_AVAIL; 266 return FORC_NO_BUFFER_AVAIL;
366 } 267 }
367 268
368 buffersize &= ~0x1ff; /* Round buffer size to multiple of sector 269 buffersize &= ~0x1ff; /* Round buffer size to multiple of sector size */
369 size */
370 270
371 int src_fd = open(src_path, O_RDONLY); 271 int src_fd = open(src_path, O_RDONLY);
372 if (src_fd >= 0) { 272 if (src_fd >= 0) {
@@ -423,9 +323,12 @@ static int copy_move_file(const char *src_path, const char *dst_path, unsigned i
423 } 323 }
424 324
425 if (rc == FORC_SUCCESS) { 325 if (rc == FORC_SUCCESS) {
426 /* If overwriting, set the correct length if original was 326 if (total_size != src_sz)
427 longer */ 327 rc = FORC_UNKNOWN_FAILURE;
428 rc = ftruncate(dst_fd, total_size) * 10; 328 else {
329 /* If overwriting, set the correct length if original was longer */
330 rc = ftruncate(dst_fd, total_size) * 10;
331 }
429 } 332 }
430 333
431 close(dst_fd); 334 close(dst_fd);
@@ -449,20 +352,19 @@ static int copy_move_file(const char *src_path, const char *dst_path, unsigned i
449 352
450/* Paste a directory */ 353/* Paste a directory */
451static int copy_move_directory(struct file_op_params *src, 354static int copy_move_directory(struct file_op_params *src,
452 struct file_op_params *dst, 355 struct file_op_params *dst,
453 unsigned int flags) 356 unsigned int flags)
454{ 357{
455 int rc = FORC_UNKNOWN_FAILURE;
456
457 DIR *srcdir = opendir(src->path); 358 DIR *srcdir = opendir(src->path);
458 359
459 if (srcdir) { 360 if (!srcdir)
460 /* Make a directory to copy things to */ 361 return FORC_PATH_NOT_EXIST;
461 rc = mkdir(dst->path) * 10; 362
462 if (rc < 0 && errno == EEXIST && (flags & PASTE_OVERWRITE)) { 363 /* Make a directory to copy things to */
463 /* Exists and overwrite was approved */ 364 int rc = mkdir(dst->path) * 10;
464 rc = FORC_SUCCESS; 365 if (rc < 0 && errno == EEXIST && (flags & PASTE_OVERWRITE)) {
465 } 366 /* Exists and overwrite was approved */
367 rc = FORC_SUCCESS;
466 } 368 }
467 369
468 size_t srcap = src->append, dstap = dst->append; 370 size_t srcap = src->append, dstap = dst->append;
@@ -488,7 +390,7 @@ static int copy_move_directory(struct file_op_params *src,
488 /* Append names to current directories */ 390 /* Append names to current directories */
489 src->append = srcap + 391 src->append = srcap +
490 path_append(&src->path[srcap], PA_SEP_HARD, entry->d_name, 392 path_append(&src->path[srcap], PA_SEP_HARD, entry->d_name,
491 sizeof(src->path) - srcap); 393 sizeof (src->path) - srcap);
492 394
493 dst->append = dstap + 395 dst->append = dstap +
494 path_append(&dst->path[dstap], PA_SEP_HARD, entry->d_name, 396 path_append(&dst->path[dstap], PA_SEP_HARD, entry->d_name,
@@ -538,13 +440,16 @@ static int copy_move_directory(struct file_op_params *src,
538 return rc; 440 return rc;
539} 441}
540 442
443/************************************************************************************/
444/* PUBLIC FUNCTIONS */
445/************************************************************************************/
446
447/* Copy or move a file or directory see: file_op_flags */
541int copy_move_fileobject(const char *src_path, const char *dst_path, unsigned int flags) 448int copy_move_fileobject(const char *src_path, const char *dst_path, unsigned int flags)
542{ 449{
543 if (!src_path[0]) 450 if (!src_path[0])
544 return FORC_NOOP; 451 return FORC_NOOP;
545 452
546 int rc = FORC_UNKNOWN_FAILURE;
547
548 struct file_op_params src, dst; 453 struct file_op_params src, dst;
549 454
550 /* Figure out the name of the selection */ 455 /* Figure out the name of the selection */
@@ -553,40 +458,37 @@ int copy_move_fileobject(const char *src_path, const char *dst_path, unsigned in
553 458
554 /* Final target is current directory plus name of selection */ 459 /* Final target is current directory plus name of selection */
555 init_file_op(&dst, dst_path, nameptr); 460 init_file_op(&dst, dst_path, nameptr);
461 if (dst.append >= sizeof (dst.path))
462 return FORC_PATH_TOO_LONG;
556 463
557 switch (dst.append < sizeof (dst.path) ? 464 int rel = relate(src_path, dst.path);
558 relate(src_path, dst.path) : FORC_PATH_TOO_LONG) 465 if (rel == RELATE_SAME)
559 { 466 return FORC_NOOP;
560 case RELATE_SAME:
561 rc = FORC_NOOP;
562 break;
563 467
564 case RELATE_DIFFERENT: 468 if (rel == RELATE_DIFFERENT) {
469 int rc;
565 if (file_exists(dst.path)) { 470 if (file_exists(dst.path)) {
566 /* If user chooses not to overwrite, cancel */ 471 /* If user chooses not to overwrite, cancel */
567 if (confirm_overwrite_yesno() == YESNO_NO) { 472 if (confirm_overwrite_yesno() == YESNO_NO) {
568 rc = FORC_NOOVERWRT; 473 return FORC_NOOVERWRT;
569 break;
570 } 474 }
571 475
572 flags |= PASTE_OVERWRITE; 476 flags |= PASTE_OVERWRITE;
573 } 477 }
574 478
479 init_file_op(&src, src_path, NULL);
480 if (src.append >= sizeof (src.path))
481 return FORC_PATH_TOO_LONG;
575 /* Now figure out what we're doing */ 482 /* Now figure out what we're doing */
576 cpu_boost(true); 483 cpu_boost(true);
577
578 init_file_op(&src, src_path, NULL);
579
580 if (src.is_dir) { 484 if (src.is_dir) {
581 /* Copy or move a subdirectory */ 485 /* Copy or move a subdirectory */
582 486 /* Try renaming first */
583 if (src.append < sizeof (src.path)) { 487 rc = move_by_rename(src.path, dst.path, &flags);
584 /* Try renaming first */ 488 if (rc < FORC_SUCCESS) {
585 rc = move_by_rename(src.path, dst.path, &flags); 489 rc = check_count_fileobjects(&src);
586 if (rc != FORC_SUCCESS && rc != FORC_CANCELLED) { 490 if (rc == FORC_SUCCESS) {
587 if (check_count_fileobjects(&src) == FORC_SUCCESS) { 491 rc = copy_move_directory(&src, &dst, flags);
588 rc = copy_move_directory(&src, &dst, flags);
589 }
590 } 492 }
591 } 493 }
592 } else { 494 } else {
@@ -595,12 +497,102 @@ int copy_move_fileobject(const char *src_path, const char *dst_path, unsigned in
595 } 497 }
596 498
597 cpu_boost(false); 499 cpu_boost(false);
598 break; 500 DEBUGF("%s res: %d, ct: %d/%d %s\n",
501 __func__, rc, src.objects, src.processed, src.path);
502 return rc;
503 }
504
505 /* Else Some other relation / failure */
506 DEBUGF("%s res: %d, rel: %d\n", __func__, FORC_UNKNOWN_FAILURE, rel);
507 return FORC_UNKNOWN_FAILURE;
508}
509
510int create_dir(void)
511{
512 int rc;
513 char dirname[MAX_PATH];
514 size_t pathlen = path_append(dirname, getcwd(NULL, 0), PA_SEP_HARD,
515 sizeof (dirname));
516 char *basename = dirname + pathlen;
517
518 if (pathlen >= sizeof (dirname))
519 return FORC_PATH_TOO_LONG;
520
521 rc = prompt_name(basename, sizeof (dirname) - pathlen);
522 if (rc == FORC_SUCCESS)
523 rc = mkdir(dirname) * 10;
524 return rc;
525}
599 526
600 case RELATE_PREFIX: 527/* share code for file and directory deletion, saves space */
601 default: /* Some other relation / failure */ 528int delete_fileobject(const char *selected_file)
602 break; 529{
530 int rc;
531 struct file_op_params param;
532 init_file_op(&param, selected_file, NULL);
533 if (param.append >= sizeof (param.path))
534 return FORC_PATH_TOO_LONG;
535
536 if (param.is_dir) {
537 int rc = check_count_fileobjects(&param);
538 DEBUGF("%s res: %d, ct: %d, %s", __func__, rc, param.objects, param.path);
539 if (rc != FORC_SUCCESS)
540 return rc;
541 }
542
543 /* Note: delete_fileobject() will happily delete whatever
544 * path is passed (after confirmation) */
545 if (confirm_delete_yesno(param.path) != YESNO_YES) {
546 return FORC_CANCELLED;
547 }
548
549 clear_screen_buffer(true);
550 if (poll_cancel_action(param.path, FOC_DELETE, param.processed, param.objects))
551 return FORC_CANCELLED;
552
553 if (param.is_dir) { /* if directory */
554 cpu_boost(true);
555 rc = directory_fileop(&param, FOC_DELETE);
556 cpu_boost(false);
557 } else {
558 rc = remove(param.path) * 10;
603 } 559 }
604 560
605 return rc; 561 return rc;
606} 562}
563
564int rename_file(const char *selected_file)
565{
566 int rc;
567 char newname[MAX_PATH];
568 const char *oldbase, *selection = selected_file;
569
570 path_basename(selection, &oldbase);
571 size_t pathlen = oldbase - selection;
572 char *newbase = newname + pathlen;
573
574 if (strmemccpy(newname, selection, sizeof (newname)) == NULL)
575 return FORC_PATH_TOO_LONG;
576
577 rc = prompt_name(newbase, sizeof (newname) - pathlen);
578
579 if (rc != FORC_SUCCESS)
580 return rc;
581
582 if (!strcmp(oldbase, newbase))
583 return FORC_NOOP; /* No change at all */
584
585 int rel = relate(selection, newname);
586 if (rel == RELATE_DIFFERENT)
587 {
588 if (file_exists(newname)) { /* don't overwrite */
589 return FORC_PATH_EXISTS;
590 }
591 return rename(selection, newname) * 10;
592 }
593 if (rel == RELATE_SAME)
594 return rename(selection, newname) * 10;
595
596 /* Else Some other relation / failure */
597 return FORC_UNKNOWN_FAILURE;
598}
diff --git a/apps/fileop.h b/apps/fileop.h
index f8237dc64f..f477549977 100644
--- a/apps/fileop.h
+++ b/apps/fileop.h
@@ -1,10 +1,10 @@
1/*************************************************************************** 1/***************************************************************************
2 * __________ __ ___. 2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___ 3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / 4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < 5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ 6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/ 7 * \/ \/ \/ \/ \/
8 * $Id$ 8 * $Id$
9 * 9 *
10 * Copyright (C) 2002 Björn Stenberg 10 * Copyright (C) 2002 Björn Stenberg
@@ -26,6 +26,7 @@
26/* result codes of various file operations */ 26/* result codes of various file operations */
27enum fileop_result_code 27enum fileop_result_code
28{ 28{
29 FORC_PATH_EXISTS = -8,
29 FORC_READ_FAILURE = -7, 30 FORC_READ_FAILURE = -7,
30 FORC_WRITE_FAILURE = -6, 31 FORC_WRITE_FAILURE = -6,
31 FORC_NO_BUFFER_AVAIL = -5, 32 FORC_NO_BUFFER_AVAIL = -5,
@@ -55,7 +56,6 @@ enum file_op_current
55 FOC_MOVE, 56 FOC_MOVE,
56 FOC_COPY, 57 FOC_COPY,
57 FOC_DELETE, 58 FOC_DELETE,
58 FOC_CREATE,
59}; 59};
60 60
61int create_dir(void); 61int create_dir(void);
@@ -64,7 +64,8 @@ int rename_file(const char *selected_file);
64 64
65int delete_fileobject(const char *selected_file); 65int delete_fileobject(const char *selected_file);
66 66
67int copy_move_fileobject(const char *src_path, const char *dst_path, 67int copy_move_fileobject(const char *src_path,
68 unsigned int flags); 68 const char *dst_path,
69 unsigned int flags);
69 70
70#endif /* FILEOP_H */ 71#endif /* FILEOP_H */
diff --git a/apps/lang/italiano.lang b/apps/lang/italiano.lang
index 946850750f..a7d1eaa9a7 100644
--- a/apps/lang/italiano.lang
+++ b/apps/lang/italiano.lang
@@ -40,10 +40,10 @@
40 *: "No" 40 *: "No"
41 </source> 41 </source>
42 <dest> 42 <dest>
43 *: "No" 43 *: "~No"
44 </dest> 44 </dest>
45 <voice> 45 <voice>
46 *: "No" 46 *: "~No"
47 </voice> 47 </voice>
48</phrase> 48</phrase>
49<phrase> 49<phrase>
@@ -330,10 +330,10 @@
330 *: "Database" 330 *: "Database"
331 </source> 331 </source>
332 <dest> 332 <dest>
333 *: "Database" 333 *: "~Database"
334 </dest> 334 </dest>
335 <voice> 335 <voice>
336 *: "Database" 336 *: "~Database"
337 </voice> 337 </voice>
338</phrase> 338</phrase>
339<phrase> 339<phrase>
@@ -539,20 +539,6 @@
539 </voice> 539 </voice>
540</phrase> 540</phrase>
541<phrase> 541<phrase>
542 id: LANG_BOOKMARK_CONTEXT_DELETE
543 desc: bookmark context menu, delete this bookmark
544 user: core
545 <source>
546 *: "Delete"
547 </source>
548 <dest>
549 *: "Cancella"
550 </dest>
551 <voice>
552 *: "Cancella"
553 </voice>
554</phrase>
555<phrase>
556 id: LANG_AUTO_BOOKMARK_QUERY 542 id: LANG_AUTO_BOOKMARK_QUERY
557 desc: prompt for user to decide to create an bookmark 543 desc: prompt for user to decide to create an bookmark
558 user: core 544 user: core
@@ -630,10 +616,10 @@
630 *: "Volume" 616 *: "Volume"
631 </source> 617 </source>
632 <dest> 618 <dest>
633 *: "Volume" 619 *: "~Volume"
634 </dest> 620 </dest>
635 <voice> 621 <voice>
636 *: "Volume" 622 *: "~Volume"
637 </voice> 623 </voice>
638</phrase> 624</phrase>
639<phrase> 625<phrase>
@@ -694,30 +680,30 @@
694</phrase> 680</phrase>
695<phrase> 681<phrase>
696 id: LANG_CHANNEL_STEREO 682 id: LANG_CHANNEL_STEREO
697 desc: in sound_settings 683 desc: in sound_settings and radio screen
698 user: core 684 user: core
699 <source> 685 <source>
700 *: "Stereo" 686 *: "Stereo"
701 </source> 687 </source>
702 <dest> 688 <dest>
703 *: "Stereo" 689 *: "~Stereo"
704 </dest> 690 </dest>
705 <voice> 691 <voice>
706 *: "Stereo" 692 *: "~Stereo"
707 </voice> 693 </voice>
708</phrase> 694</phrase>
709<phrase> 695<phrase>
710 id: LANG_CHANNEL_MONO 696 id: LANG_CHANNEL_MONO
711 desc: in sound_settings 697 desc: in sound_settings and radio screen
712 user: core 698 user: core
713 <source> 699 <source>
714 *: "Mono" 700 *: "Mono"
715 </source> 701 </source>
716 <dest> 702 <dest>
717 *: "Mono" 703 *: "~Mono"
718 </dest> 704 </dest>
719 <voice> 705 <voice>
720 *: "Mono" 706 *: "~Mono"
721 </voice> 707 </voice>
722</phrase> 708</phrase>
723<phrase> 709<phrase>
@@ -787,10 +773,10 @@
787 *: "Karaoke" 773 *: "Karaoke"
788 </source> 774 </source>
789 <dest> 775 <dest>
790 *: "Karaoke" 776 *: "~Karaoke"
791 </dest> 777 </dest>
792 <voice> 778 <voice>
793 *: "Karaoke" 779 *: "~Karaoke"
794 </voice> 780 </voice>
795</phrase> 781</phrase>
796<phrase> 782<phrase>
@@ -815,7 +801,7 @@
815 *: "Crossfeed" 801 *: "Crossfeed"
816 </source> 802 </source>
817 <dest> 803 <dest>
818 *: "Crossfeed" 804 *: "~Crossfeed"
819 </dest> 805 </dest>
820 <voice> 806 <voice>
821 *: "Crossfid" 807 *: "Crossfid"
@@ -990,20 +976,6 @@
990 </voice> 976 </voice>
991</phrase> 977</phrase>
992<phrase> 978<phrase>
993 id: LANG_EQUALIZER_EDIT_MODE
994 desc: in the equalizer settings menu
995 user: core
996 <source>
997 *: "Edit mode: %s"
998 </source>
999 <dest>
1000 *: "Modo editing: %s"
1001 </dest>
1002 <voice>
1003 *: ""
1004 </voice>
1005</phrase>
1006<phrase>
1007 id: LANG_EQUALIZER_GAIN_ITEM 979 id: LANG_EQUALIZER_GAIN_ITEM
1008 desc: in the equalizer settings menu 980 desc: in the equalizer settings menu
1009 user: core 981 user: core
@@ -1109,10 +1081,10 @@
1109 *: "Dithering" 1081 *: "Dithering"
1110 </source> 1082 </source>
1111 <dest> 1083 <dest>
1112 *: "Dithering" 1084 *: "~Dithering"
1113 </dest> 1085 </dest>
1114 <voice> 1086 <voice>
1115 *: "Dithering" 1087 *: "~Dithering"
1116 </voice> 1088 </voice>
1117</phrase> 1089</phrase>
1118<phrase> 1090<phrase>
@@ -1324,11 +1296,11 @@
1324 </source> 1296 </source>
1325 <dest> 1297 <dest>
1326 *: none 1298 *: none
1327 crossfade: "Crossfade" 1299 crossfade: "~Crossfade"
1328 </dest> 1300 </dest>
1329 <voice> 1301 <voice>
1330 *: none 1302 *: none
1331 crossfade: "Crossfade" 1303 crossfade: "~Crossfade"
1332 </voice> 1304 </voice>
1333</phrase> 1305</phrase>
1334<phrase> 1306<phrase>
@@ -1477,11 +1449,11 @@
1477 </source> 1449 </source>
1478 <dest> 1450 <dest>
1479 *: none 1451 *: none
1480 crossfade: "Mix" 1452 crossfade: "~Mix"
1481 </dest> 1453 </dest>
1482 <voice> 1454 <voice>
1483 *: none 1455 *: none
1484 crossfade: "Mix" 1456 crossfade: "~Mix"
1485 </voice> 1457 </voice>
1486</phrase> 1458</phrase>
1487<phrase> 1459<phrase>
@@ -1492,10 +1464,10 @@
1492 *: "Replaygain" 1464 *: "Replaygain"
1493 </source> 1465 </source>
1494 <dest> 1466 <dest>
1495 *: "Replaygain" 1467 *: "~Replaygain"
1496 </dest> 1468 </dest>
1497 <voice> 1469 <voice>
1498 *: "Replaygain" 1470 *: "~Replaygain"
1499 </voice> 1471 </voice>
1500</phrase> 1472</phrase>
1501<phrase> 1473<phrase>
@@ -2159,10 +2131,10 @@
2159 *: "Display" 2131 *: "Display"
2160 </source> 2132 </source>
2161 <dest> 2133 <dest>
2162 *: "Display" 2134 *: "~Display"
2163 </dest> 2135 </dest>
2164 <voice> 2136 <voice>
2165 *: "Display" 2137 *: "~Display"
2166 </voice> 2138 </voice>
2167</phrase> 2139</phrase>
2168<phrase> 2140<phrase>
@@ -2264,11 +2236,11 @@
2264 hold_button: "Backlight on Hold" 2236 hold_button: "Backlight on Hold"
2265 </source> 2237 </source>
2266 <dest> 2238 <dest>
2267 *: "Backlight on Lock" 2239 *: "Retroilluminazione su Blocco"
2268 hold_button: "Retroilluminazione Sul tasto di blocco" 2240 hold_button: "Retroilluminazione Sul tasto di blocco"
2269 </dest> 2241 </dest>
2270 <voice> 2242 <voice>
2271 *: "Backlight on Lock" 2243 *: "Retroilluminazione su Blocco"
2272 hold_button: "RetroIlluminazione sul tasto di blocco" 2244 hold_button: "RetroIlluminazione sul tasto di blocco"
2273 </voice> 2245 </voice>
2274</phrase> 2246</phrase>
@@ -3090,10 +3062,10 @@
3090 *: "Latin1 (ISO-8859-1)" 3062 *: "Latin1 (ISO-8859-1)"
3091 </source> 3063 </source>
3092 <dest> 3064 <dest>
3093 *: "Latin1 (ISO-8859-1)" 3065 *: "~Latin1 (ISO-8859-1)"
3094 </dest> 3066 </dest>
3095 <voice> 3067 <voice>
3096 *: "Latin1" 3068 *: "~Latin 1"
3097 </voice> 3069 </voice>
3098</phrase> 3070</phrase>
3099<phrase> 3071<phrase>
@@ -3146,10 +3118,10 @@
3146 *: "Thai (ISO-8859-11)" 3118 *: "Thai (ISO-8859-11)"
3147 </source> 3119 </source>
3148 <dest> 3120 <dest>
3149 *: "Thai (ISO-8859-11)" 3121 *: "~Thai (ISO-8859-11)"
3150 </dest> 3122 </dest>
3151 <voice> 3123 <voice>
3152 *: "Thai" 3124 *: "~Thai"
3153 </voice> 3125 </voice>
3154</phrase> 3126</phrase>
3155<phrase> 3127<phrase>
@@ -3258,10 +3230,10 @@
3258 *: "Unicode (UTF-8)" 3230 *: "Unicode (UTF-8)"
3259 </source> 3231 </source>
3260 <dest> 3232 <dest>
3261 *: "Unicode (UTF-8)" 3233 *: "~Unicode (UTF-8)"
3262 </dest> 3234 </dest>
3263 <voice> 3235 <voice>
3264 *: "Unicode" 3236 *: "~Unicode"
3265 </voice> 3237 </voice>
3266</phrase> 3238</phrase>
3267<phrase> 3239<phrase>
@@ -3759,7 +3731,7 @@
3759 *: "Feb" 3731 *: "Feb"
3760 </source> 3732 </source>
3761 <dest> 3733 <dest>
3762 *: "Feb" 3734 *: "~Feb"
3763 </dest> 3735 </dest>
3764 <voice> 3736 <voice>
3765 *: "Febbraio" 3737 *: "Febbraio"
@@ -3773,7 +3745,7 @@
3773 *: "Mar" 3745 *: "Mar"
3774 </source> 3746 </source>
3775 <dest> 3747 <dest>
3776 *: "Mar" 3748 *: "~Mar"
3777 </dest> 3749 </dest>
3778 <voice> 3750 <voice>
3779 *: "Marzo" 3751 *: "Marzo"
@@ -3787,7 +3759,7 @@
3787 *: "Apr" 3759 *: "Apr"
3788 </source> 3760 </source>
3789 <dest> 3761 <dest>
3790 *: "Apr" 3762 *: "~Apr"
3791 </dest> 3763 </dest>
3792 <voice> 3764 <voice>
3793 *: "Aprile" 3765 *: "Aprile"
@@ -3885,7 +3857,7 @@
3885 *: "Nov" 3857 *: "Nov"
3886 </source> 3858 </source>
3887 <dest> 3859 <dest>
3888 *: "Nov" 3860 *: "~Nov"
3889 </dest> 3861 </dest>
3890 <voice> 3862 <voice>
3891 *: "Novembre" 3863 *: "Novembre"
@@ -4061,23 +4033,6 @@
4061 </voice> 4033 </voice>
4062</phrase> 4034</phrase>
4063<phrase> 4035<phrase>
4064 id: LANG_ALARM_MOD_SHUTDOWN
4065 desc: The text that tells the user that the alarm time is ok and the device shuts off (for the RTC alarm mod).
4066 user: core
4067 <source>
4068 *: none
4069 alarm: "Alarm Set"
4070 </source>
4071 <dest>
4072 *: none
4073 alarm: "Imposta Allarme"
4074 </dest>
4075 <voice>
4076 *: none
4077 alarm: "Imposta Allarme"
4078 </voice>
4079</phrase>
4080<phrase>
4081 id: LANG_ALARM_MOD_ERROR 4036 id: LANG_ALARM_MOD_ERROR
4082 desc: The text that tells that the time is incorrect (for the RTC alarm mod). 4037 desc: The text that tells that the time is incorrect (for the RTC alarm mod).
4083 user: core 4038 user: core
@@ -4095,20 +4050,6 @@
4095 </voice> 4050 </voice>
4096</phrase> 4051</phrase>
4097<phrase> 4052<phrase>
4098 id: LANG_ALARM_MOD_KEYS
4099 desc: deprecated
4100 user: core
4101 <source>
4102 *: ""
4103 </source>
4104 <dest>
4105 *: ""
4106 </dest>
4107 <voice>
4108 *: ""
4109 </voice>
4110</phrase>
4111<phrase>
4112 id: LANG_ALARM_MOD_DISABLE 4053 id: LANG_ALARM_MOD_DISABLE
4113 desc: Announce that the RTC alarm has been turned off 4054 desc: Announce that the RTC alarm has been turned off
4114 user: core 4055 user: core
@@ -5040,11 +4981,11 @@
5040 </source> 4981 </source>
5041 <dest> 4982 <dest>
5042 *: none 4983 *: none
5043 recording: "Bitrate" 4984 recording: "~Bitrate"
5044 </dest> 4985 </dest>
5045 <voice> 4986 <voice>
5046 *: none 4987 *: none
5047 recording: "Bitrate" 4988 recording: "~Bitrate"
5048 </voice> 4989 </voice>
5049</phrase> 4990</phrase>
5050<phrase> 4991<phrase>
@@ -5306,38 +5247,6 @@
5306 </voice> 5247 </voice>
5307</phrase> 5248</phrase>
5308<phrase> 5249<phrase>
5309 id: LANG_RECORD_DIRECTORY
5310 desc: in recording settings_menu
5311 user: core
5312 <source>
5313 *: none
5314 recording: "Directory"
5315 </source>
5316 <dest>
5317 *: none
5318 recording: "Cartella"
5319 </dest>
5320 <voice>
5321 *: none
5322 recording: "Cartella"
5323 </voice>
5324</phrase>
5325<phrase>
5326 id: LANG_SET_AS_REC_DIR
5327 desc: deprecated
5328 user: core
5329 <source>
5330 *: none
5331 recording: ""
5332 </source>
5333 <dest>
5334 *: ""
5335 </dest>
5336 <voice>
5337 *: ""
5338 </voice>
5339</phrase>
5340<phrase>
5341 id: LANG_CLEAR_REC_DIR 5250 id: LANG_CLEAR_REC_DIR
5342 desc: 5251 desc:
5343 user: core 5252 user: core
@@ -5517,11 +5426,11 @@
5517 </source> 5426 </source>
5518 <dest> 5427 <dest>
5519 *: none 5428 *: none
5520 recording: "Stop" 5429 recording: "~Stop"
5521 </dest> 5430 </dest>
5522 <voice> 5431 <voice>
5523 *: none 5432 *: none
5524 recording: "Stop" 5433 recording: "~Stop"
5525 </voice> 5434 </voice>
5526</phrase> 5435</phrase>
5527<phrase> 5436<phrase>
@@ -5946,10 +5855,10 @@
5946 *: "Rockbox Info" 5855 *: "Rockbox Info"
5947 </source> 5856 </source>
5948 <dest> 5857 <dest>
5949 *: "Rockbox Info" 5858 *: "~Rockbox Info"
5950 </dest> 5859 </dest>
5951 <voice> 5860 <voice>
5952 *: "Rockbox Info" 5861 *: "~Rockbox Info"
5953 </voice> 5862 </voice>
5954</phrase> 5863</phrase>
5955<phrase> 5864<phrase>
@@ -5960,7 +5869,7 @@
5960 *: "Buffer:" 5869 *: "Buffer:"
5961 </source> 5870 </source>
5962 <dest> 5871 <dest>
5963 *: "Buffer:" 5872 *: "~Buffer:"
5964 </dest> 5873 </dest>
5965 <voice> 5874 <voice>
5966 *: "Dimensione buffer" 5875 *: "Dimensione buffer"
@@ -5976,7 +5885,7 @@
5976 </source> 5885 </source>
5977 <dest> 5886 <dest>
5978 *: "Batteria: %d%% %dh %dm" 5887 *: "Batteria: %d%% %dh %dm"
5979 ipodmini1g,ipodmini2g,iriverh10: "Batt: %d%% %dh %dm" 5888 ipodmini1g,ipodmini2g,iriverh10: "~Batt: %d%% %dh %dm"
5980 </dest> 5889 </dest>
5981 <voice> 5890 <voice>
5982 *: "Livello Batteria" 5891 *: "Livello Batteria"
@@ -6020,14 +5929,14 @@
6020 xduoox3: "mSD1:" 5929 xduoox3: "mSD1:"
6021 </source> 5930 </source>
6022 <dest> 5931 <dest>
6023 *: "Int:" 5932 *: "~Int:"
6024 hibylinux: "mSD:" 5933 hibylinux: "~mSD:"
6025 xduoox3: "MSD1:" 5934 xduoox3: "~mSD1:"
6026 </dest> 5935 </dest>
6027 <voice> 5936 <voice>
6028 *: "Interno" 5937 *: "Interno"
6029 hibylinux: "micro S D" 5938 hibylinux: "~micro S D"
6030 xduoox3: "Micro SD 1" 5939 xduoox3: "~Micro S D 1"
6031 </voice> 5940 </voice>
6032</phrase> 5941</phrase>
6033<phrase> 5942<phrase>
@@ -6043,17 +5952,17 @@
6043 </source> 5952 </source>
6044 <dest> 5953 <dest>
6045 *: none 5954 *: none
6046 hibylinux: "USB:" 5955 hibylinux: "~USB:"
6047 multivolume: "HD1" 5956 multivolume: "~HD1"
6048 sansac200*,sansaclipplus,sansae200*,sansafuze*: "MSD:" 5957 sansac200*,sansaclipplus,sansae200*,sansafuze*: "~mSD:"
6049 xduoox3: "MSD2:" 5958 xduoox3: "~mSD2:"
6050 </dest> 5959 </dest>
6051 <voice> 5960 <voice>
6052 *: none 5961 *: none
6053 hibylinux: "U S B" 5962 hibylinux: "~U S B"
6054 multivolume: "HD 1" 5963 multivolume: "~H D 1"
6055 sansac200*,sansaclipplus,sansae200*,sansafuze*: "Micro S D" 5964 sansac200*,sansaclipplus,sansae200*,sansafuze*: "~micro S D"
6056 xduoox3: "Micro SD 2" 5965 xduoox3: "~micro SD 2"
6057 </voice> 5966 </voice>
6058</phrase> 5967</phrase>
6059<phrase> 5968<phrase>
@@ -6134,66 +6043,10 @@
6134 *: "Playlist" 6043 *: "Playlist"
6135 </source> 6044 </source>
6136 <dest> 6045 <dest>
6137 *: "Playlist" 6046 *: "~Playlist"
6138 </dest>
6139 <voice>
6140 *: "Playlist"
6141 </voice>
6142</phrase>
6143<phrase>
6144 id: LANG_INSERT
6145 desc: deprecated
6146 user: core
6147 <source>
6148 *: ""
6149 </source>
6150 <dest>
6151 *: ""
6152 </dest>
6153 <voice>
6154 *: ""
6155 </voice>
6156</phrase>
6157<phrase>
6158 id: LANG_INSERT_FIRST
6159 desc: deprecated
6160 user: core
6161 <source>
6162 *: ""
6163 </source>
6164 <dest>
6165 *: ""
6166 </dest> 6047 </dest>
6167 <voice> 6048 <voice>
6168 *: "" 6049 *: "~Playlist"
6169 </voice>
6170</phrase>
6171<phrase>
6172 id: LANG_INSERT_LAST
6173 desc: deprecated
6174 user: core
6175 <source>
6176 *: ""
6177 </source>
6178 <dest>
6179 *: ""
6180 </dest>
6181 <voice>
6182 *: ""
6183 </voice>
6184</phrase>
6185<phrase>
6186 id: LANG_INSERT_SHUFFLED
6187 desc: deprecated
6188 user: core
6189 <source>
6190 *: ""
6191 </source>
6192 <dest>
6193 *: ""
6194 </dest>
6195 <voice>
6196 *: ""
6197 </voice> 6050 </voice>
6198</phrase> 6051</phrase>
6199<phrase> 6052<phrase>
@@ -6253,20 +6106,6 @@
6253 </voice> 6106 </voice>
6254</phrase> 6107</phrase>
6255<phrase> 6108<phrase>
6256 id: LANG_REPLACE
6257 desc: deprecated
6258 user: core
6259 <source>
6260 *: ""
6261 </source>
6262 <dest>
6263 *: ""
6264 </dest>
6265 <voice>
6266 *: ""
6267 </voice>
6268</phrase>
6269<phrase>
6270 id: LANG_PLAYLIST_INSERT_COUNT 6109 id: LANG_PLAYLIST_INSERT_COUNT
6271 desc: splash number of tracks inserted 6110 desc: splash number of tracks inserted
6272 user: core 6111 user: core
@@ -6351,34 +6190,6 @@
6351 </voice> 6190 </voice>
6352</phrase> 6191</phrase>
6353<phrase> 6192<phrase>
6354 id: LANG_CATALOG_VIEW
6355 desc: in onplay playlist catalogue submenu
6356 user: core
6357 <source>
6358 *: "View Catalogue"
6359 </source>
6360 <dest>
6361 *: "Visualizza catalogo"
6362 </dest>
6363 <voice>
6364 *: "Visualizza catalogo"
6365 </voice>
6366</phrase>
6367<phrase>
6368 id: LANG_CATALOG_ADD_TO
6369 desc: deprecated
6370 user: core
6371 <source>
6372 *: ""
6373 </source>
6374 <dest>
6375 *: ""
6376 </dest>
6377 <voice>
6378 *: ""
6379 </voice>
6380</phrase>
6381<phrase>
6382 id: LANG_CATALOG_ADD_TO_NEW 6193 id: LANG_CATALOG_ADD_TO_NEW
6383 desc: in onplay playlist catalogue submenu 6194 desc: in onplay playlist catalogue submenu
6384 user: core 6195 user: core
@@ -6554,10 +6365,10 @@
6554 *: "Album" 6365 *: "Album"
6555 </source> 6366 </source>
6556 <dest> 6367 <dest>
6557 *: "Album" 6368 *: "~Album"
6558 </dest> 6369 </dest>
6559 <voice> 6370 <voice>
6560 *: "Album" 6371 *: "~Album"
6561 </voice> 6372 </voice>
6562</phrase> 6373</phrase>
6563<phrase> 6374<phrase>
@@ -6624,10 +6435,10 @@
6624 *: "Playlist" 6435 *: "Playlist"
6625 </source> 6436 </source>
6626 <dest> 6437 <dest>
6627 *: "Playlist" 6438 *: "~Playlist"
6628 </dest> 6439 </dest>
6629 <voice> 6440 <voice>
6630 *: "Playlist" 6441 *: "~Playlist"
6631 </voice> 6442 </voice>
6632</phrase> 6443</phrase>
6633<phrase> 6444<phrase>
@@ -6638,10 +6449,10 @@
6638 *: "Bitrate" 6449 *: "Bitrate"
6639 </source> 6450 </source>
6640 <dest> 6451 <dest>
6641 *: "Bitrate" 6452 *: "~Bitrate"
6642 </dest> 6453 </dest>
6643 <voice> 6454 <voice>
6644 *: "Bitrate" 6455 *: "~Bit rate"
6645 </voice> 6456 </voice>
6646</phrase> 6457</phrase>
6647<phrase> 6458<phrase>
@@ -6666,7 +6477,7 @@
6666 *: "Discnum" 6477 *: "Discnum"
6667 </source> 6478 </source>
6668 <dest> 6479 <dest>
6669 *: "Discnum" 6480 *: "Numdisco"
6670 </dest> 6481 </dest>
6671 <voice> 6482 <voice>
6672 *: "Numero disco" 6483 *: "Numero disco"
@@ -6729,20 +6540,6 @@
6729 </voice> 6540 </voice>
6730</phrase> 6541</phrase>
6731<phrase> 6542<phrase>
6732 id: LANG_ID3_ALBUM_GAIN
6733 desc: in tag viewer
6734 user: core
6735 <source>
6736 *: "Album Gain"
6737 </source>
6738 <dest>
6739 *: "Guadagno Album"
6740 </dest>
6741 <voice>
6742 *: "Guadagno Album"
6743 </voice>
6744</phrase>
6745<phrase>
6746 id: LANG_ID3_PATH 6543 id: LANG_ID3_PATH
6747 desc: in tag viewer 6544 desc: in tag viewer
6748 user: core 6545 user: core
@@ -7153,20 +6950,6 @@
7153 </voice> 6950 </voice>
7154</phrase> 6951</phrase>
7155<phrase> 6952<phrase>
7156 id: LANG_PLAYLIST_CONTROL_UPDATE_ERROR
7157 desc: Playlist error
7158 user: core
7159 <source>
7160 *: "Error updating playlist control file"
7161 </source>
7162 <dest>
7163 *: "Errore di aggiornamento file controllo playlist"
7164 </dest>
7165 <voice>
7166 *: "Errore di aggiornamento file controllo playlist"
7167 </voice>
7168</phrase>
7169<phrase>
7170 id: LANG_PLAYLIST_ACCESS_ERROR 6953 id: LANG_PLAYLIST_ACCESS_ERROR
7171 desc: Playlist error 6954 desc: Playlist error
7172 user: core 6955 user: core
@@ -7352,23 +7135,6 @@
7352 </voice> 7135 </voice>
7353</phrase> 7136</phrase>
7354<phrase> 7137<phrase>
7355 id: LANG_DB_INF
7356 desc: -inf db for values below measurement
7357 user: core
7358 <source>
7359 *: none
7360 recording: "-inf"
7361 </source>
7362 <dest>
7363 *: none
7364 recording: "-inf"
7365 </dest>
7366 <voice>
7367 *: none
7368 recording: "meno infinito"
7369 </voice>
7370</phrase>
7371<phrase>
7372 id: LANG_BOOT_CHANGED 7138 id: LANG_BOOT_CHANGED
7373 desc: File browser discovered the boot file was changed 7139 desc: File browser discovered the boot file was changed
7374 user: core 7140 user: core
@@ -7594,23 +7360,6 @@
7594 </voice> 7360 </voice>
7595</phrase> 7361</phrase>
7596<phrase> 7362<phrase>
7597 id: LANG_BATTERY_TRICKLE_CHARGE
7598 desc: in info display, shows that trickle charge is running
7599 user: core
7600 <source>
7601 *: none
7602 charging: "Battery: Trickle Chg"
7603 </source>
7604 <dest>
7605 *: none
7606 charging: "Batteria: Mantenimento carica"
7607 </dest>
7608 <voice>
7609 *: none
7610 charging: "Mantenimento carica"
7611 </voice>
7612</phrase>
7613<phrase>
7614 id: LANG_WARNING_BATTERY_LOW 7363 id: LANG_WARNING_BATTERY_LOW
7615 desc: general warning 7364 desc: general warning
7616 user: core 7365 user: core
@@ -8265,7 +8014,7 @@
8265 *: "" 8014 *: ""
8266 </dest> 8015 </dest>
8267 <voice> 8016 <voice>
8268 *: "decibel" 8017 *: "~decibel"
8269 </voice> 8018 </voice>
8270</phrase> 8019</phrase>
8271<phrase> 8020<phrase>
@@ -8307,7 +8056,7 @@
8307 *: "" 8056 *: ""
8308 </dest> 8057 </dest>
8309 <voice> 8058 <voice>
8310 *: "pixel" 8059 *: "~pixel"
8311 </voice> 8060 </voice>
8312</phrase> 8061</phrase>
8313<phrase> 8062<phrase>
@@ -8335,7 +8084,7 @@
8335 *: "" 8084 *: ""
8336 </dest> 8085 </dest>
8337 <voice> 8086 <voice>
8338 *: "hertz" 8087 *: "~hertz"
8339 </voice> 8088 </voice>
8340</phrase> 8089</phrase>
8341<phrase> 8090<phrase>
@@ -8559,7 +8308,7 @@
8559 *: "" 8308 *: ""
8560 </dest> 8309 </dest>
8561 <voice> 8310 <voice>
8562 *: ".....Oh" 8311 *: "~O"
8563 </voice> 8312 </voice>
8564</phrase> 8313</phrase>
8565<phrase> 8314<phrase>
@@ -8573,7 +8322,7 @@
8573 *: "" 8322 *: ""
8574 </dest> 8323 </dest>
8575 <voice> 8324 <voice>
8576 *: ".....PI" 8325 *: "~P"
8577 </voice> 8326 </voice>
8578</phrase> 8327</phrase>
8579<phrase> 8328<phrase>
@@ -8587,7 +8336,7 @@
8587 *: "" 8336 *: ""
8588 </dest> 8337 </dest>
8589 <voice> 8338 <voice>
8590 *: ".....KU" 8339 *: "~Q"
8591 </voice> 8340 </voice>
8592</phrase> 8341</phrase>
8593<phrase> 8342<phrase>
@@ -8629,7 +8378,7 @@
8629 *: "" 8378 *: ""
8630 </dest> 8379 </dest>
8631 <voice> 8380 <voice>
8632 *: ".....TI" 8381 *: "~T"
8633 </voice> 8382 </voice>
8634</phrase> 8383</phrase>
8635<phrase> 8384<phrase>
@@ -8755,7 +8504,7 @@
8755 *: "" 8504 *: ""
8756 </dest> 8505 </dest>
8757 <voice> 8506 <voice>
8758 *: "file" 8507 *: "fail"
8759 </voice> 8508 </voice>
8760</phrase> 8509</phrase>
8761<phrase> 8510<phrase>
@@ -8783,7 +8532,7 @@
8783 *: "" 8532 *: ""
8784 </dest> 8533 </dest>
8785 <voice> 8534 <voice>
8786 *: "audio" 8535 *: "~audio"
8787 </voice> 8536 </voice>
8788</phrase> 8537</phrase>
8789<phrase> 8538<phrase>
@@ -8825,7 +8574,7 @@
8825 *: "" 8574 *: ""
8826 </dest> 8575 </dest>
8827 <voice> 8576 <voice>
8828 *: "plugin" 8577 *: "~plugin"
8829 </voice> 8578 </voice>
8830</phrase> 8579</phrase>
8831<phrase> 8580<phrase>
@@ -8867,7 +8616,7 @@
8867 *: "" 8616 *: ""
8868 </dest> 8617 </dest>
8869 <voice> 8618 <voice>
8870 *: "firmware" 8619 *: "~firmware"
8871 </voice> 8620 </voice>
8872</phrase> 8621</phrase>
8873<phrase> 8622<phrase>
@@ -8912,7 +8661,7 @@
8912 *: "" 8661 *: ""
8913 </dest> 8662 </dest>
8914 <voice> 8663 <voice>
8915 *: "cuesheet" 8664 *: "~cuesheet"
8916 </voice> 8665 </voice>
8917</phrase> 8666</phrase>
8918<phrase> 8667<phrase>
@@ -9139,7 +8888,7 @@
9139 *: "" 8888 *: ""
9140 </dest> 8889 </dest>
9141 <voice> 8890 <voice>
9142 *: "P M" 8891 *: "~P M"
9143 </voice> 8892 </voice>
9144</phrase> 8893</phrase>
9145<phrase> 8894<phrase>
@@ -9153,7 +8902,7 @@
9153 *: "" 8902 *: ""
9154 </dest> 8903 </dest>
9155 <voice> 8904 <voice>
9156 *: "A M" 8905 *: "~A M"
9157 </voice> 8906 </voice>
9158</phrase> 8907</phrase>
9159<phrase> 8908<phrase>
@@ -9567,7 +9316,7 @@
9567 *: "" 9316 *: ""
9568 </dest> 9317 </dest>
9569 <voice> 9318 <voice>
9570 *: "OK" 9319 *: "~OK"
9571 </voice> 9320 </voice>
9572</phrase> 9321</phrase>
9573<phrase> 9322<phrase>
@@ -9648,7 +9397,7 @@
9648 </source> 9397 </source>
9649 <dest> 9398 <dest>
9650 *: none 9399 *: none
9651 serial_port: "Auto" 9400 serial_port: "~Auto"
9652 </dest> 9401 </dest>
9653 <voice> 9402 <voice>
9654 *: none 9403 *: none
@@ -9865,7 +9614,7 @@
9865 </source> 9614 </source>
9866 <dest> 9615 <dest>
9867 *: none 9616 *: none
9868 agc: "AGC" 9617 agc: "~AGC"
9869 </dest> 9618 </dest>
9870 <voice> 9619 <voice>
9871 *: none 9620 *: none
@@ -9933,7 +9682,7 @@
9933 </source> 9682 </source>
9934 <dest> 9683 <dest>
9935 *: none 9684 *: none
9936 recording: "CLIP:" 9685 recording: "~CLIP:"
9937 </dest> 9686 </dest>
9938 <voice> 9687 <voice>
9939 *: none 9688 *: none
@@ -10244,10 +9993,10 @@
10244 *: "Timestretch" 9993 *: "Timestretch"
10245 </source> 9994 </source>
10246 <dest> 9995 <dest>
10247 *: "Timestretch" 9996 *: "~Timestretch"
10248 </dest> 9997 </dest>
10249 <voice> 9998 <voice>
10250 *: "Timestretch" 9999 *: "~Time stretch"
10251 </voice> 10000 </voice>
10252</phrase> 10001</phrase>
10253<phrase> 10002<phrase>
@@ -10404,11 +10153,11 @@
10404 </source> 10153 </source>
10405 <dest> 10154 <dest>
10406 *: none 10155 *: none
10407 pitchscreen: "Rate" 10156 pitchscreen: "~Rate"
10408 </dest> 10157 </dest>
10409 <voice> 10158 <voice>
10410 *: none 10159 *: none
10411 pitchscreen: "Rate" 10160 pitchscreen: "~Rate"
10412 </voice> 10161 </voice>
10413</phrase> 10162</phrase>
10414<phrase> 10163<phrase>
@@ -10438,11 +10187,11 @@
10438 </source> 10187 </source>
10439 <dest> 10188 <dest>
10440 *: none 10189 *: none
10441 usb_hid: "Multimedia" 10190 usb_hid: "~Multimedia"
10442 </dest> 10191 </dest>
10443 <voice> 10192 <voice>
10444 *: none 10193 *: none
10445 usb_hid: "Multimedia" 10194 usb_hid: "~Multimedia"
10446 </voice> 10195 </voice>
10447</phrase> 10196</phrase>
10448<phrase> 10197<phrase>
@@ -10489,11 +10238,11 @@
10489 </source> 10238 </source>
10490 <dest> 10239 <dest>
10491 *: none 10240 *: none
10492 usb_hid: "Mouse" 10241 usb_hid: "~Mouse"
10493 </dest> 10242 </dest>
10494 <voice> 10243 <voice>
10495 *: none 10244 *: none
10496 usb_hid: "Mouse" 10245 usb_hid: "~Mouse"
10497 </voice> 10246 </voice>
10498</phrase> 10247</phrase>
10499<phrase> 10248<phrase>
@@ -10511,20 +10260,6 @@
10511 </voice> 10260 </voice>
10512</phrase> 10261</phrase>
10513<phrase> 10262<phrase>
10514 id: LANG_SCROLLBAR_POSITION
10515 desc: in Settings -> General -> Display -> Status-/Scrollbar
10516 user: core
10517 <source>
10518 *: "Scroll Bar Position"
10519 </source>
10520 <dest>
10521 *: "Posizione Barra di Scorrimento"
10522 </dest>
10523 <voice>
10524 *: "Posizione Barra di Scorrimento"
10525 </voice>
10526</phrase>
10527<phrase>
10528 id: LANG_COMPRESSOR 10263 id: LANG_COMPRESSOR
10529 desc: in sound settings 10264 desc: in sound settings
10530 user: core 10265 user: core
@@ -10709,10 +10444,10 @@
10709 *: "Auto" 10444 *: "Auto"
10710 </source> 10445 </source>
10711 <dest> 10446 <dest>
10712 *: "Auto" 10447 *: "~Auto"
10713 </dest> 10448 </dest>
10714 <voice> 10449 <voice>
10715 *: "Auto" 10450 *: "~Auto"
10716 </voice> 10451 </voice>
10717</phrase> 10452</phrase>
10718<phrase> 10453<phrase>
@@ -10723,10 +10458,10 @@
10723 *: "Knee" 10458 *: "Knee"
10724 </source> 10459 </source>
10725 <dest> 10460 <dest>
10726 *: "Knee" 10461 *: "~Knee"
10727 </dest> 10462 </dest>
10728 <voice> 10463 <voice>
10729 *: "Knee" 10464 *: "~Knee"
10730 </voice> 10465 </voice>
10731</phrase> 10466</phrase>
10732<phrase> 10467<phrase>
@@ -10737,10 +10472,10 @@
10737 *: "Hard Knee" 10472 *: "Hard Knee"
10738 </source> 10473 </source>
10739 <dest> 10474 <dest>
10740 *: "Hard Knee" 10475 *: "Knee Hard"
10741 </dest> 10476 </dest>
10742 <voice> 10477 <voice>
10743 *: "Hard Knee" 10478 *: "Knee Hard"
10744 </voice> 10479 </voice>
10745</phrase> 10480</phrase>
10746<phrase> 10481<phrase>
@@ -10751,10 +10486,10 @@
10751 *: "Soft Knee" 10486 *: "Soft Knee"
10752 </source> 10487 </source>
10753 <dest> 10488 <dest>
10754 *: "Soft Knee" 10489 *: "Knee Soft"
10755 </dest> 10490 </dest>
10756 <voice> 10491 <voice>
10757 *: "Soft Knee" 10492 *: "Knee Soft"
10758 </voice> 10493 </voice>
10759</phrase> 10494</phrase>
10760<phrase> 10495<phrase>
@@ -10786,20 +10521,6 @@
10786 </voice> 10521 </voice>
10787</phrase> 10522</phrase>
10788<phrase> 10523<phrase>
10789 id: LANG_STATUSBAR_CUSTOM
10790 desc: if this translation is compatible with LANG_CHANNEL_CUSTOM, then please use the same translation. it can be combined later then
10791 user: core
10792 <source>
10793 *: "Custom"
10794 </source>
10795 <dest>
10796 *: "Personalizzata"
10797 </dest>
10798 <voice>
10799 *: "Personalizzata"
10800 </voice>
10801</phrase>
10802<phrase>
10803 id: VOICE_EXT_SBS 10524 id: VOICE_EXT_SBS
10804 desc: spoken only, for file extension 10525 desc: spoken only, for file extension
10805 user: core 10526 user: core
@@ -10848,20 +10569,6 @@
10848 </voice> 10569 </voice>
10849</phrase> 10570</phrase>
10850<phrase> 10571<phrase>
10851 id: LANG_INSERT_LAST_SHUFFLED
10852 desc: deprecated
10853 user: core
10854 <source>
10855 *: ""
10856 </source>
10857 <dest>
10858 *: ""
10859 </dest>
10860 <voice>
10861 *: ""
10862 </voice>
10863</phrase>
10864<phrase>
10865 id: LANG_QUEUE_LAST_SHUFFLED 10572 id: LANG_QUEUE_LAST_SHUFFLED
10866 desc: in onplay menu. queue a playlist randomly at end of dynamic playlist 10573 desc: in onplay menu. queue a playlist randomly at end of dynamic playlist
10867 user: core 10574 user: core
@@ -11383,7 +11090,7 @@
11383 *: "PictureFlow" 11090 *: "PictureFlow"
11384 </source> 11091 </source>
11385 <dest> 11092 <dest>
11386 *: "PictureFlow" 11093 *: "~PictureFlow"
11387 </dest> 11094 </dest>
11388 <voice> 11095 <voice>
11389 *: "Apri Picture Flow" 11096 *: "Apri Picture Flow"
@@ -11399,11 +11106,11 @@
11399 </source> 11106 </source>
11400 <dest> 11107 <dest>
11401 *: none 11108 *: none
11402 touchscreen: "OK" 11109 touchscreen: "~OK"
11403 </dest> 11110 </dest>
11404 <voice> 11111 <voice>
11405 *: none 11112 *: none
11406 touchscreen: "OK" 11113 touchscreen: "~OK"
11407 </voice> 11114 </voice>
11408</phrase> 11115</phrase>
11409<phrase> 11116<phrase>
@@ -11455,20 +11162,6 @@
11455 </voice> 11162 </voice>
11456</phrase> 11163</phrase>
11457<phrase> 11164<phrase>
11458 id: LANG_SET_AS_START_DIR
11459 desc: deprecated
11460 user: core
11461 <source>
11462 *: ""
11463 </source>
11464 <dest>
11465 *: ""
11466 </dest>
11467 <voice>
11468 *: ""
11469 </voice>
11470</phrase>
11471<phrase>
11472 id: LANG_RESET_START_DIR 11165 id: LANG_RESET_START_DIR
11473 desc: reset the browser start directory 11166 desc: reset the browser start directory
11474 user: core 11167 user: core
@@ -11570,20 +11263,6 @@
11570 </voice> 11263 </voice>
11571</phrase> 11264</phrase>
11572<phrase> 11265<phrase>
11573 id: LANG_SET_AS_PLAYLISTCAT_DIR
11574 desc: deprecated
11575 user: core
11576 <source>
11577 *: ""
11578 </source>
11579 <dest>
11580 *: ""
11581 </dest>
11582 <voice>
11583 *: ""
11584 </voice>
11585</phrase>
11586<phrase>
11587 id: LANG_RESET_PLAYLISTCAT_DIR 11266 id: LANG_RESET_PLAYLISTCAT_DIR
11588 desc: 11267 desc:
11589 user: core 11268 user: core
@@ -11660,20 +11339,6 @@
11660 </voice> 11339 </voice>
11661</phrase> 11340</phrase>
11662<phrase> 11341<phrase>
11663 id: LANG_AUTOMATIC
11664 desc: deprecated
11665 user: core
11666 <source>
11667 *: ""
11668 </source>
11669 <dest>
11670 *: ""
11671 </dest>
11672 <voice>
11673 *: ""
11674 </voice>
11675</phrase>
11676<phrase>
11677 id: LANG_SLEEP_TIMER_DURATION 11342 id: LANG_SLEEP_TIMER_DURATION
11678 desc: default sleep timer duration in minutes 11343 desc: default sleep timer duration in minutes
11679 user: core 11344 user: core
@@ -12248,10 +11913,10 @@
12248 *: "Android Debug Bridge" 11913 *: "Android Debug Bridge"
12249 </source> 11914 </source>
12250 <dest> 11915 <dest>
12251 *: "Android Debug Bridge" 11916 *: "~Android Debug Bridge"
12252 </dest> 11917 </dest>
12253 <voice> 11918 <voice>
12254 *: "Android Debug Bridge" 11919 *: "~Android Debug Bridge"
12255 </voice> 11920 </voice>
12256</phrase> 11921</phrase>
12257<phrase> 11922<phrase>
@@ -12363,10 +12028,10 @@
12363 *: "Haas Surround" 12028 *: "Haas Surround"
12364 </source> 12029 </source>
12365 <dest> 12030 <dest>
12366 *: "Haas Surround" 12031 *: "~Haas Surround"
12367 </dest> 12032 </dest>
12368 <voice> 12033 <voice>
12369 *: "Haas Surround" 12034 *: "~Haas Surround"
12370 </voice> 12035 </voice>
12371</phrase> 12036</phrase>
12372<phrase> 12037<phrase>
@@ -12391,10 +12056,10 @@
12391 *: "Dry / Wet Mix" 12056 *: "Dry / Wet Mix"
12392 </source> 12057 </source>
12393 <dest> 12058 <dest>
12394 *: "Dry / Wet Mix" 12059 *: "Mix Dry / Wet"
12395 </dest> 12060 </dest>
12396 <voice> 12061 <voice>
12397 *: "Dry / Wet Mix" 12062 *: "Mix Dry / Wet"
12398 </voice> 12063 </voice>
12399</phrase> 12064</phrase>
12400<phrase> 12065<phrase>
@@ -12542,10 +12207,10 @@
12542 desc: playing time screen 12207 desc: playing time screen
12543 user: core 12208 user: core
12544 <source> 12209 <source>
12545 *: "Average bitrate: %ld kbps" 12210 *: "Average bitrate:"
12546 </source> 12211 </source>
12547 <dest> 12212 <dest>
12548 *: "Bitrate medio: %ld kbps" 12213 *: "Bitrate medio:"
12549 </dest> 12214 </dest>
12550 <voice> 12215 <voice>
12551 *: "Bitrate medio" 12216 *: "Bitrate medio"
@@ -12702,10 +12367,10 @@
12702 *: "Zoom" 12367 *: "Zoom"
12703 </source> 12368 </source>
12704 <dest> 12369 <dest>
12705 *: "Zoom" 12370 *: "~Zoom"
12706 </dest> 12371 </dest>
12707 <voice> 12372 <voice>
12708 *: "Zoom" 12373 *: "~Zoom"
12709 </voice> 12374 </voice>
12710</phrase> 12375</phrase>
12711<phrase> 12376<phrase>
@@ -12864,20 +12529,6 @@
12864 </voice> 12529 </voice>
12865</phrase> 12530</phrase>
12866<phrase> 12531<phrase>
12867 id: LANG_NO_VIEWERS
12868 desc: text for splash to indicate that no viewers are available
12869 user: core
12870 <source>
12871 *: "No viewers found"
12872 </source>
12873 <dest>
12874 *: "Nessun visualizzatore trovato"
12875 </dest>
12876 <voice>
12877 *: "Nessun visualizzatore trovato"
12878 </voice>
12879</phrase>
12880<phrase>
12881 id: LANG_NO_REM_CONTROL 12532 id: LANG_NO_REM_CONTROL
12882 desc: Item for menus 12533 desc: Item for menus
12883 user: core 12534 user: core
@@ -12909,20 +12560,6 @@
12909 </voice> 12560 </voice>
12910</phrase> 12561</phrase>
12911<phrase> 12562<phrase>
12912 id: LANG_ADDED_TO_PLAYLIST
12913 desc: in the pictureflow splash messages
12914 user: core
12915 <source>
12916 *: "Added to playlist"
12917 </source>
12918 <dest>
12919 *: "Aggiunto alla playlist"
12920 </dest>
12921 <voice>
12922 *: "Aggiunto alla playlist"
12923 </voice>
12924</phrase>
12925<phrase>
12926 id: LANG_SWAP_CHANNELS 12563 id: LANG_SWAP_CHANNELS
12927 desc: in sound_settings 12564 desc: in sound_settings
12928 user: core 12565 user: core
@@ -12946,11 +12583,11 @@
12946 </source> 12583 </source>
12947 <dest> 12584 <dest>
12948 *: none 12585 *: none
12949 es9018: "Bypass" 12586 es9018: "~Bypass"
12950 </dest> 12587 </dest>
12951 <voice> 12588 <voice>
12952 *: none 12589 *: none
12953 es9018: "Bypass" 12590 es9018: "~Bypass"
12954 </voice> 12591 </voice>
12955</phrase> 12592</phrase>
12956<phrase> 12593<phrase>
@@ -13069,20 +12706,6 @@
13069 </voice> 12706 </voice>
13070</phrase> 12707</phrase>
13071<phrase> 12708<phrase>
13072 id: LANG_PROPERTIES_ALBUM
13073 desc: deprecated
13074 user: core
13075 <source>
13076 *: ""
13077 </source>
13078 <dest>
13079 *: ""
13080 </dest>
13081 <voice>
13082 *: ""
13083 </voice>
13084</phrase>
13085<phrase>
13086 id: LANG_PROPERTIES_TIME 12709 id: LANG_PROPERTIES_TIME
13087 desc: in properties plugin 12710 desc: in properties plugin
13088 user: core 12711 user: core
@@ -13198,20 +12821,6 @@
13198 </voice> 12821 </voice>
13199</phrase> 12822</phrase>
13200<phrase> 12823<phrase>
13201 id: LANG_PROPERTIES_ARTIST
13202 desc: deprecated
13203 user: core
13204 <source>
13205 *: ""
13206 </source>
13207 <dest>
13208 *: ""
13209 </dest>
13210 <voice>
13211 *: ""
13212 </voice>
13213</phrase>
13214<phrase>
13215 id: LANG_REVERBERATION 12824 id: LANG_REVERBERATION
13216 desc: in mikmod settings menu 12825 desc: in mikmod settings menu
13217 user: core 12826 user: core
@@ -13233,10 +12842,10 @@
13233 desc: playing time screen 12842 desc: playing time screen
13234 user: core 12843 user: core
13235 <source> 12844 <source>
13236 *: "Track %d / %d %d%%" 12845 *: "Track:"
13237 </source> 12846 </source>
13238 <dest> 12847 <dest>
13239 *: "Traccia %d / %d %d%%" 12848 *: "Traccia:"
13240 </dest> 12849 </dest>
13241 <voice> 12850 <voice>
13242 *: "Traccia" 12851 *: "Traccia"
@@ -13257,20 +12866,6 @@
13257 </voice> 12866 </voice>
13258</phrase> 12867</phrase>
13259<phrase> 12868<phrase>
13260 id: LANG_PROPERTIES_TITLE
13261 desc: deprecated
13262 user: core
13263 <source>
13264 *: ""
13265 </source>
13266 <dest>
13267 *: ""
13268 </dest>
13269 <voice>
13270 *: ""
13271 </voice>
13272</phrase>
13273<phrase>
13274 id: LANG_REMOTE_CONTROL 12869 id: LANG_REMOTE_CONTROL
13275 desc: Item for menus 12870 desc: Item for menus
13276 user: core 12871 user: core
@@ -13425,11 +13020,11 @@
13425 lowmem: none 13020 lowmem: none
13426 </source> 13021 </source>
13427 <dest> 13022 <dest>
13428 *: "Surround" 13023 *: "~Surround"
13429 lowmem: none 13024 lowmem: none
13430 </dest> 13025 </dest>
13431 <voice> 13026 <voice>
13432 *: "Surround" 13027 *: "~Surround"
13433 lowmem: none 13028 lowmem: none
13434 </voice> 13029 </voice>
13435</phrase> 13030</phrase>
@@ -13532,20 +13127,6 @@
13532 </voice> 13127 </voice>
13533</phrase> 13128</phrase>
13534<phrase> 13129<phrase>
13535 id: LANG_PROPERTIES_DURATION
13536 desc: deprecated
13537 user: core
13538 <source>
13539 *: ""
13540 </source>
13541 <dest>
13542 *: ""
13543 </dest>
13544 <voice>
13545 *: ""
13546 </voice>
13547</phrase>
13548<phrase>
13549 id: LANG_BACKLIGHT_BRIGHTNESS 13130 id: LANG_BACKLIGHT_BRIGHTNESS
13550 desc: in the mpegplayer settings menu 13131 desc: in the mpegplayer settings menu
13551 user: core 13132 user: core
@@ -13901,10 +13482,10 @@
13901 desc: playing time screen 13482 desc: playing time screen
13902 user: core 13483 user: core
13903 <source> 13484 <source>
13904 *: "Average track size: %s" 13485 *: "Average track size:"
13905 </source> 13486 </source>
13906 <dest> 13487 <dest>
13907 *: "Dimensione media delle traccie: %s" 13488 *: "Dimensione media delle tracce:"
13908 </dest> 13489 </dest>
13909 <voice> 13490 <voice>
13910 *: "Dimensione media delle traccie" 13491 *: "Dimensione media delle traccie"
@@ -13999,10 +13580,10 @@
13999 desc: playing time screen 13580 desc: playing time screen
14000 user: core 13581 user: core
14001 <source> 13582 <source>
14002 *: "Playlist remaining: %s" 13583 *: "Playlist remaining:"
14003 </source> 13584 </source>
14004 <dest> 13585 <dest>
14005 *: "Playlist rimanente: %s" 13586 *: "Playlist rimanente:"
14006 </dest> 13587 </dest>
14007 <voice> 13588 <voice>
14008 *: "Playlist rimanente" 13589 *: "Playlist rimanente"
@@ -14111,10 +13692,10 @@
14111 desc: playing time screen 13692 desc: playing time screen
14112 user: core 13693 user: core
14113 <source> 13694 <source>
14114 *: "Track remaining: %s" 13695 *: "Track remaining:"
14115 </source> 13696 </source>
14116 <dest> 13697 <dest>
14117 *: "Traccia rimanente: %s" 13698 *: "Traccia rimanente:"
14118 </dest> 13699 </dest>
14119 <voice> 13700 <voice>
14120 *: "Traccia rimanente" 13701 *: "Traccia rimanente"
@@ -14329,20 +13910,6 @@
14329 </voice> 13910 </voice>
14330</phrase> 13911</phrase>
14331<phrase> 13912<phrase>
14332 id: LANG_PLAYLIST_CLEARED
14333 desc: in the pictureflow splash messages
14334 user: core
14335 <source>
14336 *: "Playlist Cleared"
14337 </source>
14338 <dest>
14339 *: "Playlist Svuotata"
14340 </dest>
14341 <voice>
14342 *: "Playlist Svuotata"
14343 </voice>
14344</phrase>
14345<phrase>
14346 id: LANG_FILTER_SHORT 13913 id: LANG_FILTER_SHORT
14347 desc: in sound settings 13914 desc: in sound settings
14348 user: core 13915 user: core
@@ -14589,10 +14156,10 @@
14589 desc: playing time screen 14156 desc: playing time screen
14590 user: core 14157 user: core
14591 <source> 14158 <source>
14592 *: "Track elapsed: %s / %s %ld%%" 14159 *: "Track elapsed:"
14593 </source> 14160 </source>
14594 <dest> 14161 <dest>
14595 *: "Traccia trascorsa: %s / %s %ld%%" 14162 *: "Traccia trascorsa:"
14596 </dest> 14163 </dest>
14597 <voice> 14164 <voice>
14598 *: "Traccia trascorsa" 14165 *: "Traccia trascorsa"
@@ -14603,10 +14170,10 @@
14603 desc: playing time screen 14170 desc: playing time screen
14604 user: core 14171 user: core
14605 <source> 14172 <source>
14606 *: "Storage: %s (done %s, remaining %s)" 14173 *: "Storage (Done / Remaining):"
14607 </source> 14174 </source>
14608 <dest> 14175 <dest>
14609 *: "Memoria: %s (fatto %s, restante %s)" 14176 *: "Memoria (Usata / Rimanente):"
14610 </dest> 14177 </dest>
14611 <voice> 14178 <voice>
14612 *: "Memoria" 14179 *: "Memoria"
@@ -14701,10 +14268,10 @@
14701 desc: playing time screen 14268 desc: playing time screen
14702 user: core 14269 user: core
14703 <source> 14270 <source>
14704 *: "Playlist elapsed: %s / %s %ld%%" 14271 *: "Playlist elapsed:"
14705 </source> 14272 </source>
14706 <dest> 14273 <dest>
14707 *: "Playlist trascorsa: %s / %s %ld%%" 14274 *: "Playlist trascorsa:"
14708 </dest> 14275 </dest>
14709 <voice> 14276 <voice>
14710 *: "Playlist trascorsa" 14277 *: "Playlist trascorsa"
@@ -14735,7 +14302,7 @@
14735 *: "Rifletto..." 14302 *: "Rifletto..."
14736 </dest> 14303 </dest>
14737 <voice> 14304 <voice>
14738 *: "" 14305 *: "Rifletto"
14739 </voice> 14306 </voice>
14740</phrase> 14307</phrase>
14741<phrase> 14308<phrase>
@@ -14879,20 +14446,6 @@
14879 </voice> 14446 </voice>
14880</phrase> 14447</phrase>
14881<phrase> 14448<phrase>
14882 id: LANG_CLEAR_PLAYLIST
14883 desc: deprecated
14884 user: core
14885 <source>
14886 *: ""
14887 </source>
14888 <dest>
14889 *: ""
14890 </dest>
14891 <voice>
14892 *: ""
14893 </voice>
14894</phrase>
14895<phrase>
14896 id: LANG_NOT_A_VBR_FILE 14449 id: LANG_NOT_A_VBR_FILE
14897 desc: in vbrfix plugin 14450 desc: in vbrfix plugin
14898 user: core 14451 user: core
@@ -15117,10 +14670,10 @@
15117 *: "Timeout" 14670 *: "Timeout"
15118 </source> 14671 </source>
15119 <dest> 14672 <dest>
15120 *: "Timeout" 14673 *: "~Timeout"
15121 </dest> 14674 </dest>
15122 <voice> 14675 <voice>
15123 *: "Timeout" 14676 *: "~Timeout"
15124 </voice> 14677 </voice>
15125</phrase> 14678</phrase>
15126<phrase> 14679<phrase>
@@ -15282,11 +14835,11 @@
15282 lowmem: none 14835 lowmem: none
15283 </source> 14836 </source>
15284 <dest> 14837 <dest>
15285 *: "Sample Rate" 14838 *: "~Sample Rate"
15286 lowmem: none 14839 lowmem: none
15287 </dest> 14840 </dest>
15288 <voice> 14841 <voice>
15289 *: "Sample Rate" 14842 *: "~Sample Rate"
15290 lowmem: none 14843 lowmem: none
15291 </voice> 14844 </voice>
15292</phrase> 14845</phrase>
@@ -15507,20 +15060,6 @@
15507 </voice> 15060 </voice>
15508</phrase> 15061</phrase>
15509<phrase> 15062<phrase>
15510 id: LANG_CLEAR_LIST_AND_PLAY_NEXT
15511 desc: deprecated
15512 user: core
15513 <source>
15514 *: ""
15515 </source>
15516 <dest>
15517 *: ""
15518 </dest>
15519 <voice>
15520 *: ""
15521 </voice>
15522</phrase>
15523<phrase>
15524 id: LANG_DAC_POWER_MODE 15063 id: LANG_DAC_POWER_MODE
15525 desc: in sound settings 15064 desc: in sound settings
15526 user: core 15065 user: core
@@ -15591,7 +15130,7 @@
15591 *: "Coda..." 15130 *: "Coda..."
15592 </dest> 15131 </dest>
15593 <voice> 15132 <voice>
15594 *: "Coda..." 15133 *: "Coda"
15595 </voice> 15134 </voice>
15596</phrase> 15135</phrase>
15597<phrase> 15136<phrase>
@@ -15637,20 +15176,6 @@
15637 </voice> 15176 </voice>
15638</phrase> 15177</phrase>
15639<phrase> 15178<phrase>
15640 id: LANG_CLEAR_LIST_AND_PLAY_SHUFFLED
15641 desc: deprecated
15642 user: core
15643 <source>
15644 *: ""
15645 </source>
15646 <dest>
15647 *: ""
15648 </dest>
15649 <voice>
15650 *: ""
15651 </voice>
15652</phrase>
15653<phrase>
15654 id: LANG_SOFTLOCK_DISABLE_ALL_NOTIFY 15179 id: LANG_SOFTLOCK_DISABLE_ALL_NOTIFY
15655 desc: disable all softlock notifications 15180 desc: disable all softlock notifications
15656 user: core 15181 user: core
@@ -15716,11 +15241,11 @@
15716 </source> 15241 </source>
15717 <dest> 15242 <dest>
15718 *: none 15243 *: none
15719 filter_roll_off: "Super Slow" 15244 filter_roll_off: "Super Lento"
15720 </dest> 15245 </dest>
15721 <voice> 15246 <voice>
15722 *: none 15247 *: none
15723 filter_roll_off: "Super Slow" 15248 filter_roll_off: "Super Lento"
15724 </voice> 15249 </voice>
15725</phrase> 15250</phrase>
15726<phrase> 15251<phrase>
@@ -15733,11 +15258,11 @@
15733 </source> 15258 </source>
15734 <dest> 15259 <dest>
15735 *: none 15260 *: none
15736 es9218: "Linear Fast" 15261 es9218: "Lineare Veloce"
15737 </dest> 15262 </dest>
15738 <voice> 15263 <voice>
15739 *: none 15264 *: none
15740 es9218: "Linear Fast" 15265 es9218: "Lineare Veloce"
15741 </voice> 15266 </voice>
15742</phrase> 15267</phrase>
15743<phrase> 15268<phrase>
@@ -15750,11 +15275,11 @@
15750 </source> 15275 </source>
15751 <dest> 15276 <dest>
15752 *: none 15277 *: none
15753 es9218: "Linear Slow" 15278 es9218: "Lineare Lento"
15754 </dest> 15279 </dest>
15755 <voice> 15280 <voice>
15756 *: none 15281 *: none
15757 es9218: "Linear Slow" 15282 es9218: "Lineare Lento"
15758 </voice> 15283 </voice>
15759</phrase> 15284</phrase>
15760<phrase> 15285<phrase>
@@ -15767,11 +15292,11 @@
15767 </source> 15292 </source>
15768 <dest> 15293 <dest>
15769 *: none 15294 *: none
15770 es9218: "Minimum Fast" 15295 es9218: "Minimo Veloce"
15771 </dest> 15296 </dest>
15772 <voice> 15297 <voice>
15773 *: none 15298 *: none
15774 es9218: "Minimum Fast" 15299 es9218: "Minimo Veloce"
15775 </voice> 15300 </voice>
15776</phrase> 15301</phrase>
15777<phrase> 15302<phrase>
@@ -15784,11 +15309,11 @@
15784 </source> 15309 </source>
15785 <dest> 15310 <dest>
15786 *: none 15311 *: none
15787 es9218: "Minimum Slow" 15312 es9218: "Minimo Lento"
15788 </dest> 15313 </dest>
15789 <voice> 15314 <voice>
15790 *: none 15315 *: none
15791 es9218: "Minimum Slow" 15316 es9218: "Minimo Lento"
15792 </voice> 15317 </voice>
15793</phrase> 15318</phrase>
15794<phrase> 15319<phrase>
@@ -15801,11 +15326,11 @@
15801 </source> 15326 </source>
15802 <dest> 15327 <dest>
15803 *: none 15328 *: none
15804 es9218: "Apodizing type 1" 15329 es9218: "Apodizing tipo 1"
15805 </dest> 15330 </dest>
15806 <voice> 15331 <voice>
15807 *: none 15332 *: none
15808 es9218: "Apodizing type 1" 15333 es9218: "Apodizing tipo 1"
15809 </voice> 15334 </voice>
15810</phrase> 15335</phrase>
15811<phrase> 15336<phrase>
@@ -15818,11 +15343,11 @@
15818 </source> 15343 </source>
15819 <dest> 15344 <dest>
15820 *: none 15345 *: none
15821 es9218: "Apodizing type 2" 15346 es9218: "Apodizing tipo 2"
15822 </dest> 15347 </dest>
15823 <voice> 15348 <voice>
15824 *: none 15349 *: none
15825 es9218: "Apodizing type 2" 15350 es9218: "Apodizing tipo 2"
15826 </voice> 15351 </voice>
15827</phrase> 15352</phrase>
15828<phrase> 15353<phrase>
@@ -15835,11 +15360,11 @@
15835 </source> 15360 </source>
15836 <dest> 15361 <dest>
15837 *: none 15362 *: none
15838 es9218: "Hybrid Fast" 15363 es9218: "Ibrido Veloce"
15839 </dest> 15364 </dest>
15840 <voice> 15365 <voice>
15841 *: none 15366 *: none
15842 es9218: "Hybrid Fast" 15367 es9218: "Ibrido Veloce"
15843 </voice> 15368 </voice>
15844</phrase> 15369</phrase>
15845<phrase> 15370<phrase>
@@ -15852,151 +15377,11 @@
15852 </source> 15377 </source>
15853 <dest> 15378 <dest>
15854 *: none 15379 *: none
15855 es9218: "Brick Wall" 15380 es9218: "~Brick Wall"
15856 </dest> 15381 </dest>
15857 <voice> 15382 <voice>
15858 *: none 15383 *: none
15859 es9218: "Brick Wall" 15384 es9218: "~Brick Wall"
15860 </voice>
15861</phrase>
15862<phrase>
15863 id: LANG_PLAYLIST_RELOAD_AFTER_SAVE
15864 desc: deprecated
15865 user: core
15866 <source>
15867 *: ""
15868 </source>
15869 <dest>
15870 *: ""
15871 </dest>
15872 <voice>
15873 *: ""
15874 </voice>
15875</phrase>
15876<phrase>
15877 id: LANG_PROPERTIES_ALBUMARTIST
15878 desc: deprecated
15879 user: core
15880 <source>
15881 *: ""
15882 </source>
15883 <dest>
15884 *: ""
15885 </dest>
15886 <voice>
15887 *: ""
15888 </voice>
15889</phrase>
15890<phrase>
15891 id: LANG_PROPERTIES_GENRE
15892 desc: deprecated
15893 user: core
15894 <source>
15895 *: ""
15896 </source>
15897 <dest>
15898 *: ""
15899 </dest>
15900 <voice>
15901 *: ""
15902 </voice>
15903</phrase>
15904<phrase>
15905 id: LANG_PROPERTIES_COMMENT
15906 desc: deprecated
15907 user: core
15908 <source>
15909 *: ""
15910 </source>
15911 <dest>
15912 *: ""
15913 </dest>
15914 <voice>
15915 *: ""
15916 </voice>
15917</phrase>
15918<phrase>
15919 id: LANG_PROPERTIES_COMPOSER
15920 desc: deprecated
15921 user: core
15922 <source>
15923 *: ""
15924 </source>
15925 <dest>
15926 *: ""
15927 </dest>
15928 <voice>
15929 *: ""
15930 </voice>
15931</phrase>
15932<phrase>
15933 id: LANG_PROPERTIES_YEAR
15934 desc: deprecated
15935 user: core
15936 <source>
15937 *: ""
15938 </source>
15939 <dest>
15940 *: ""
15941 </dest>
15942 <voice>
15943 *: ""
15944 </voice>
15945</phrase>
15946<phrase>
15947 id: LANG_PROPERTIES_TRACKNUM
15948 desc: deprecated
15949 user: core
15950 <source>
15951 *: ""
15952 </source>
15953 <dest>
15954 *: ""
15955 </dest>
15956 <voice>
15957 *: ""
15958 </voice>
15959</phrase>
15960<phrase>
15961 id: LANG_PROPERTIES_DISCNUM
15962 desc: deprecated
15963 user: core
15964 <source>
15965 *: ""
15966 </source>
15967 <dest>
15968 *: ""
15969 </dest>
15970 <voice>
15971 *: ""
15972 </voice>
15973</phrase>
15974<phrase>
15975 id: LANG_PROPERTIES_FREQUENCY
15976 desc: deprecated
15977 user: core
15978 <source>
15979 *: ""
15980 </source>
15981 <dest>
15982 *: ""
15983 </dest>
15984 <voice>
15985 *: ""
15986 </voice>
15987</phrase>
15988<phrase>
15989 id: LANG_PROPERTIES_BITRATE
15990 desc: deprecated
15991 user: core
15992 <source>
15993 *: ""
15994 </source>
15995 <dest>
15996 *: ""
15997 </dest>
15998 <voice>
15999 *: ""
16000 </voice> 15385 </voice>
16001</phrase> 15386</phrase>
16002<phrase> 15387<phrase>
@@ -16341,7 +15726,7 @@
16341 *: "Imposta Come..." 15726 *: "Imposta Come..."
16342 </dest> 15727 </dest>
16343 <voice> 15728 <voice>
16344 *: "Imposta Come..." 15729 *: "Imposta Come"
16345 </voice> 15730 </voice>
16346</phrase> 15731</phrase>
16347<phrase> 15732<phrase>
@@ -16400,7 +15785,7 @@
16400 *: "Aggiungi alla Playlist..." 15785 *: "Aggiungi alla Playlist..."
16401 </dest> 15786 </dest>
16402 <voice> 15787 <voice>
16403 *: "Aggiungi alla Playlist..." 15788 *: "Aggiungi alla Playlist"
16404 </voice> 15789 </voice>
16405</phrase> 15790</phrase>
16406<phrase> 15791<phrase>
@@ -16428,7 +15813,7 @@
16428 *: "Riproduzione Brano Successivo..." 15813 *: "Riproduzione Brano Successivo..."
16429 </dest> 15814 </dest>
16430 <voice> 15815 <voice>
16431 *: "Riproduzione Brano Successivo..." 15816 *: "Riproduzione Brano Successivo"
16432 </voice> 15817 </voice>
16433</phrase> 15818</phrase>
16434<phrase> 15819<phrase>
@@ -16770,10 +16155,10 @@
16770 *: "Generating maze..." 16155 *: "Generating maze..."
16771 </source> 16156 </source>
16772 <dest> 16157 <dest>
16773 *: "Generating maze..." 16158 *: "Generazione del labirinto..."
16774 </dest> 16159 </dest>
16775 <voice> 16160 <voice>
16776 *: "Generating maze..." 16161 *: "Generazione del labirinto"
16777 </voice> 16162 </voice>
16778</phrase> 16163</phrase>
16779<phrase> 16164<phrase>
@@ -16874,3 +16259,157 @@
16874 *: "Italiano" 16259 *: "Italiano"
16875 </voice> 16260 </voice>
16876</phrase> 16261</phrase>
16262<phrase>
16263 id: LANG_STEREOSW_MODE
16264 desc: Stereo Switch Mode
16265 user: core
16266 <source>
16267 *: "Stereo Switch Mode"
16268 </source>
16269 <dest>
16270 *: "Modalità di Commutazione Stereo"
16271 </dest>
16272 <voice>
16273 *: "Modalità di Commutazione Stereo"
16274 </voice>
16275</phrase>
16276<phrase>
16277 id: LANG_REVERSE
16278 desc: in settings_menu
16279 user: core
16280 <source>
16281 *: "Reverse"
16282 </source>
16283 <dest>
16284 *: "Inversione"
16285 </dest>
16286 <voice>
16287 *: "Inversione"
16288 </voice>
16289</phrase>
16290<phrase>
16291 id: LANG_ALWAYS_ZERO
16292 desc: in settings_menu
16293 user: core
16294 <source>
16295 *: "Always 0"
16296 </source>
16297 <dest>
16298 *: "Sempre 0"
16299 </dest>
16300 <voice>
16301 *: "Sempre 0"
16302 </voice>
16303</phrase>
16304<phrase>
16305 id: LANG_ALWAYS_ONE
16306 desc: in settings_menu
16307 user: core
16308 <source>
16309 *: "Always 1"
16310 </source>
16311 <dest>
16312 *: "Sempre 1"
16313 </dest>
16314 <voice>
16315 *: "Sempre 1"
16316 </voice>
16317</phrase>
16318<phrase>
16319 id: LANG_LEGAL_NOTICES
16320 desc: in system menu
16321 user: core
16322 <source>
16323 *: "Legal Notices"
16324 </source>
16325 <dest>
16326 *: "Note Legali"
16327 </dest>
16328 <voice>
16329 *: "Note Legali"
16330 </voice>
16331</phrase>
16332<phrase>
16333 id: LANG_ERROR_FORMATSTR
16334 desc: for general use
16335 user: core
16336 <source>
16337 *: "Error: %s"
16338 </source>
16339 <dest>
16340 *: "Errore: %s"
16341 </dest>
16342 <voice>
16343 *: "Errore"
16344 </voice>
16345</phrase>
16346<phrase>
16347 id: LANG_MIKMOD_SETTINGS
16348 desc: mikmod plugin
16349 user: core
16350 <source>
16351 *: "Mikmod Settings"
16352 </source>
16353 <dest>
16354 *: "Impostazioni Mikmod"
16355 </dest>
16356 <voice>
16357 *: "Impostazioni Mik mod"
16358 </voice>
16359</phrase>
16360<phrase>
16361 id: LANG_MIKMOD_MENU
16362 desc: mikmod plugin
16363 user: core
16364 <source>
16365 *: "Mikmod Menu"
16366 </source>
16367 <dest>
16368 *: "Menu Mikmod"
16369 </dest>
16370 <voice>
16371 *: "Menu Mik mod"
16372 </voice>
16373</phrase>
16374<phrase>
16375 id: LANG_CHESSBOX_MENU
16376 desc: chessbox plugin
16377 user: core
16378 <source>
16379 *: "Chessbox Menu"
16380 </source>
16381 <dest>
16382 *: "Menu Chessbox"
16383 </dest>
16384 <voice>
16385 *: "Menu Chess box"
16386 </voice>
16387</phrase>
16388<phrase>
16389 id: VOICE_INVALID_VOICE_FILE
16390 desc: played if the voice file fails to load
16391 user: core
16392 <source>
16393 *: ""
16394 </source>
16395 <dest>
16396 *: ""
16397 </dest>
16398 <voice>
16399 *: "Fail della voce non valido"
16400 </voice>
16401</phrase>
16402<phrase>
16403 id: LANG_PERCENT_FORMAT
16404 desc: percent formatting ( `10%` is default , for `10 %` use '%ld %%' , for `%10` use '%%%ld' and so on)
16405 user: core
16406 <source>
16407 *: "%ld%%"
16408 </source>
16409 <dest>
16410 *: "~%ld%%"
16411 </dest>
16412 <voice>
16413 *: none
16414 </voice>
16415</phrase>
diff --git a/apps/onplay.c b/apps/onplay.c
index 4880af58f3..d468c0a545 100644
--- a/apps/onplay.c
+++ b/apps/onplay.c
@@ -65,12 +65,9 @@
65#include "shortcuts.h" 65#include "shortcuts.h"
66#include "misc.h" 66#include "misc.h"
67 67
68static int context;
69static const char *selected_file = NULL;
70static char selected_file_path[MAX_PATH];
71static int selected_file_attr = 0;
72static int onplay_result = ONPLAY_OK; 68static int onplay_result = ONPLAY_OK;
73static bool in_queue_submenu = false; 69static bool in_queue_submenu = false;
70
74static bool (*ctx_current_playlist_insert)(int position, bool queue, bool create_new); 71static bool (*ctx_current_playlist_insert)(int position, bool queue, bool create_new);
75static int (*ctx_add_to_playlist)(const char* playlist, bool new_playlist); 72static int (*ctx_add_to_playlist)(const char* playlist, bool new_playlist);
76extern struct menu_item_ex file_menu; /* settings_menu.c */ 73extern struct menu_item_ex file_menu; /* settings_menu.c */
@@ -84,6 +81,14 @@ extern struct menu_item_ex file_menu; /* settings_menu.c */
84 MENU_ITEM_COUNT(sizeof( name##_)/sizeof(*name##_)), \ 81 MENU_ITEM_COUNT(sizeof( name##_)/sizeof(*name##_)), \
85 { (void*)name##_},{.callback_and_desc = & name##__}}; 82 { (void*)name##_},{.callback_and_desc = & name##__}};
86 83
84static struct selected_file
85{
86 char buf[MAX_PATH];
87 const char *path;
88 int attr;
89 int context;
90} selected_file;
91
87static struct clipboard 92static struct clipboard
88{ 93{
89 char path[MAX_PATH]; /* Clipped file's path */ 94 char path[MAX_PATH]; /* Clipped file's path */
@@ -91,6 +96,14 @@ static struct clipboard
91 unsigned int flags; /* Operation type flags */ 96 unsigned int flags; /* Operation type flags */
92} clipboard; 97} clipboard;
93 98
99/* set selected file (doesn't touch buffer) */
100static void selected_file_set(int context, const char *path, int attr)
101{
102 selected_file.path = path;
103 selected_file.attr = attr;
104 selected_file.context = context;
105}
106
94/* Empty the clipboard */ 107/* Empty the clipboard */
95static void clipboard_clear_selection(struct clipboard *clip) 108static void clipboard_clear_selection(struct clipboard *clip)
96{ 109{
@@ -149,20 +162,18 @@ static int bookmark_menu_callback(int action,
149 struct gui_synclist *this_list) 162 struct gui_synclist *this_list)
150{ 163{
151 (void) this_list; 164 (void) this_list;
152 switch (action) 165 if (action == ACTION_REQUEST_MENUITEM)
153 { 166 {
154 case ACTION_REQUEST_MENUITEM: 167 /* hide loading bookmarks menu if no bookmarks exist */
155 /* hide loading bookmarks menu if no bookmarks exist */ 168 if (this_item == &bookmark_load_menu_item)
156 if (this_item == &bookmark_load_menu_item) 169 {
157 { 170 if (!bookmark_exists())
158 if (!bookmark_exists()) 171 return ACTION_EXIT_MENUITEM;
159 return ACTION_EXIT_MENUITEM; 172 }
160 }
161 break;
162 case ACTION_EXIT_MENUITEM:
163 settings_save();
164 break;
165 } 173 }
174 else if (action == ACTION_EXIT_MENUITEM)
175 settings_save();
176
166 return action; 177 return action;
167} 178}
168 179
@@ -244,20 +255,20 @@ static struct add_to_pl_param addtopl_replace_shuffled = {PLAYLIST_INSERT_LAST_S
244static void op_playlist_insert_selected(int position, bool queue) 255static void op_playlist_insert_selected(int position, bool queue)
245{ 256{
246#ifdef HAVE_TAGCACHE 257#ifdef HAVE_TAGCACHE
247 if (context == CONTEXT_STD && ctx_current_playlist_insert != NULL) 258 if (selected_file.context == CONTEXT_STD && ctx_current_playlist_insert != NULL)
248 { 259 {
249 ctx_current_playlist_insert(position, queue, false); 260 ctx_current_playlist_insert(position, queue, false);
250 return; 261 return;
251 } 262 }
252#endif 263#endif
253 if ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_AUDIO) 264 if ((selected_file.attr & FILE_ATTR_MASK) == FILE_ATTR_AUDIO)
254 playlist_insert_track(NULL, selected_file, position, queue, true); 265 playlist_insert_track(NULL, selected_file.path, position, queue, true);
255 else if ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_M3U) 266 else if ((selected_file.attr & FILE_ATTR_MASK) == FILE_ATTR_M3U)
256 playlist_insert_playlist(NULL, selected_file, position, queue); 267 playlist_insert_playlist(NULL, selected_file.path, position, queue);
257 else if (selected_file_attr & ATTR_DIRECTORY) 268 else if (selected_file.attr & ATTR_DIRECTORY)
258 { 269 {
259#ifdef HAVE_TAGCACHE 270#ifdef HAVE_TAGCACHE
260 if (context == CONTEXT_ID3DB) 271 if (selected_file.context == CONTEXT_ID3DB)
261 { 272 {
262 tagtree_current_playlist_insert(position, queue); 273 tagtree_current_playlist_insert(position, queue);
263 return; 274 return;
@@ -269,14 +280,14 @@ static void op_playlist_insert_selected(int position, bool queue)
269 280
270 const char *lines[] = { 281 const char *lines[] = {
271 ID2P(LANG_RECURSE_DIRECTORY_QUESTION), 282 ID2P(LANG_RECURSE_DIRECTORY_QUESTION),
272 selected_file 283 selected_file.path
273 }; 284 };
274 const struct text_message message={lines, 2}; 285 const struct text_message message={lines, 2};
275 /* Ask if user wants to recurse directory */ 286 /* Ask if user wants to recurse directory */
276 recurse = (gui_syncyesno_run(&message, NULL, NULL)==YESNO_YES); 287 recurse = (gui_syncyesno_run(&message, NULL, NULL)==YESNO_YES);
277 } 288 }
278 289
279 playlist_insert_directory(NULL, selected_file, position, queue, 290 playlist_insert_directory(NULL, selected_file.path, position, queue,
280 recurse == RECURSE_ON); 291 recurse == RECURSE_ON);
281 } 292 }
282} 293}
@@ -336,7 +347,7 @@ static bool view_playlist(void)
336{ 347{
337 bool result; 348 bool result;
338 349
339 result = playlist_viewer_ex(selected_file, NULL); 350 result = playlist_viewer_ex(selected_file.path, NULL);
340 351
341 if (result == PLAYLIST_VIEWER_OK && 352 if (result == PLAYLIST_VIEWER_OK &&
342 onplay_result == ONPLAY_OK) 353 onplay_result == ONPLAY_OK)
@@ -431,7 +442,7 @@ static int treeplaylist_callback(int action,
431 struct gui_synclist *this_list) 442 struct gui_synclist *this_list)
432{ 443{
433 (void)this_list; 444 (void)this_list;
434 int sel_file_attr = (selected_file_attr & FILE_ATTR_MASK); 445 int sel_file_attr = (selected_file.attr & FILE_ATTR_MASK);
435 446
436 switch (action) 447 switch (action)
437 { 448 {
@@ -440,7 +451,7 @@ static int treeplaylist_callback(int action,
440 { 451 {
441 if (sel_file_attr != FILE_ATTR_AUDIO && 452 if (sel_file_attr != FILE_ATTR_AUDIO &&
442 sel_file_attr != FILE_ATTR_M3U && 453 sel_file_attr != FILE_ATTR_M3U &&
443 (selected_file_attr & ATTR_DIRECTORY) == 0) 454 (selected_file.attr & ATTR_DIRECTORY) == 0)
444 return ACTION_EXIT_MENUITEM; 455 return ACTION_EXIT_MENUITEM;
445 } 456 }
446 else if (this_item == &queue_menu) 457 else if (this_item == &queue_menu)
@@ -471,7 +482,7 @@ static int treeplaylist_callback(int action,
471 return ACTION_EXIT_MENUITEM; 482 return ACTION_EXIT_MENUITEM;
472 483
473 if (sel_file_attr != FILE_ATTR_M3U && 484 if (sel_file_attr != FILE_ATTR_M3U &&
474 (selected_file_attr & ATTR_DIRECTORY) == 0) 485 (selected_file.attr & ATTR_DIRECTORY) == 0)
475 return ACTION_EXIT_MENUITEM; 486 return ACTION_EXIT_MENUITEM;
476 } 487 }
477 488
@@ -494,10 +505,8 @@ static int treeplaylist_callback(int action,
494 505
495void onplay_show_playlist_menu(const char* path, int attr, void (*playlist_insert_cb)) 506void onplay_show_playlist_menu(const char* path, int attr, void (*playlist_insert_cb))
496{ 507{
497 context = CONTEXT_STD;
498 ctx_current_playlist_insert = playlist_insert_cb; 508 ctx_current_playlist_insert = playlist_insert_cb;
499 selected_file = path; 509 selected_file_set(CONTEXT_STD, path, attr);
500 selected_file_attr = attr;
501 in_queue_submenu = false; 510 in_queue_submenu = false;
502 do_menu(&tree_playlist_menu, NULL, NULL, false); 511 do_menu(&tree_playlist_menu, NULL, NULL, false);
503} 512}
@@ -505,13 +514,13 @@ void onplay_show_playlist_menu(const char* path, int attr, void (*playlist_inser
505/* playlist catalog options */ 514/* playlist catalog options */
506static bool cat_add_to_a_playlist(void) 515static bool cat_add_to_a_playlist(void)
507{ 516{
508 return catalog_add_to_a_playlist(selected_file, selected_file_attr, 517 return catalog_add_to_a_playlist(selected_file.path, selected_file.attr,
509 false, NULL, ctx_add_to_playlist); 518 false, NULL, ctx_add_to_playlist);
510} 519}
511 520
512static bool cat_add_to_a_new_playlist(void) 521static bool cat_add_to_a_new_playlist(void)
513{ 522{
514 return catalog_add_to_a_playlist(selected_file, selected_file_attr, 523 return catalog_add_to_a_playlist(selected_file.path, selected_file.attr,
515 true, NULL, ctx_add_to_playlist); 524 true, NULL, ctx_add_to_playlist);
516} 525}
517 526
@@ -529,10 +538,8 @@ MAKE_ONPLAYMENU(cat_playlist_menu, ID2P(LANG_ADD_TO_PL),
529 538
530void onplay_show_playlist_cat_menu(const char* track_name, int attr, void (*add_to_pl_cb)) 539void onplay_show_playlist_cat_menu(const char* track_name, int attr, void (*add_to_pl_cb))
531{ 540{
532 context = CONTEXT_STD;
533 ctx_add_to_playlist = add_to_pl_cb; 541 ctx_add_to_playlist = add_to_pl_cb;
534 selected_file = track_name; 542 selected_file_set(CONTEXT_STD, track_name, attr);
535 selected_file_attr = attr;
536 do_menu(&cat_playlist_menu, NULL, NULL, false); 543 do_menu(&cat_playlist_menu, NULL, NULL, false);
537} 544}
538 545
@@ -542,24 +549,22 @@ static int cat_playlist_callback(int action,
542{ 549{
543 (void)this_item; 550 (void)this_item;
544 (void)this_list; 551 (void)this_list;
545 if (!selected_file || 552 if (!selected_file.path ||
546 (((selected_file_attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO) && 553 (((selected_file.attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO) &&
547 ((selected_file_attr & FILE_ATTR_MASK) != FILE_ATTR_M3U) && 554 ((selected_file.attr & FILE_ATTR_MASK) != FILE_ATTR_M3U) &&
548 ((selected_file_attr & ATTR_DIRECTORY) == 0))) 555 ((selected_file.attr & ATTR_DIRECTORY) == 0)))
549 { 556 {
550 return ACTION_EXIT_MENUITEM; 557 return ACTION_EXIT_MENUITEM;
551 } 558 }
552 559
553 switch (action) 560 if (action == ACTION_REQUEST_MENUITEM)
554 { 561 {
555 case ACTION_REQUEST_MENUITEM: 562 if ((audio_status() & AUDIO_STATUS_PLAY)
556 if ((audio_status() & AUDIO_STATUS_PLAY) || context != CONTEXT_WPS) 563 || selected_file.context != CONTEXT_WPS)
557 { 564 {
558 return action; 565 return action;
559 } 566 }
560 else 567 return ACTION_EXIT_MENUITEM;
561 return ACTION_EXIT_MENUITEM;
562 break;
563 } 568 }
564 return action; 569 return action;
565} 570}
@@ -579,13 +584,13 @@ static void splash_failed(int lang_what, int err)
579 584
580static bool clipboard_cut(void) 585static bool clipboard_cut(void)
581{ 586{
582 return clipboard_clip(&clipboard, selected_file, selected_file_attr, 587 return clipboard_clip(&clipboard, selected_file.path, selected_file.attr,
583 PASTE_CUT); 588 PASTE_CUT);
584} 589}
585 590
586static bool clipboard_copy(void) 591static bool clipboard_copy(void)
587{ 592{
588 return clipboard_clip(&clipboard, selected_file, selected_file_attr, 593 return clipboard_clip(&clipboard, selected_file.path, selected_file.attr,
589 PASTE_COPY); 594 PASTE_COPY);
590} 595}
591 596
@@ -597,9 +602,6 @@ static int clipboard_paste(void)
597 602
598 int rc = copy_move_fileobject(clipboard.path, getcwd(NULL, 0), clipboard.flags); 603 int rc = copy_move_fileobject(clipboard.path, getcwd(NULL, 0), clipboard.flags);
599 604
600
601 clear_screen_buffer(true);
602
603 switch (rc) 605 switch (rc)
604 { 606 {
605 case FORC_CANCELLED: 607 case FORC_CANCELLED:
@@ -643,13 +645,10 @@ static int ratingitem_callback(int action,
643{ 645{
644 (void)this_item; 646 (void)this_item;
645 (void)this_list; 647 (void)this_list;
646 switch (action) 648 if (action == ACTION_REQUEST_MENUITEM)
647 { 649 {
648 case ACTION_REQUEST_MENUITEM: 650 if (!selected_file.path || !global_settings.runtimedb || !tagcache_is_usable())
649 if (!selected_file || !global_settings.runtimedb || 651 return ACTION_EXIT_MENUITEM;
650 !tagcache_is_usable())
651 return ACTION_EXIT_MENUITEM;
652 break;
653 } 652 }
654 return action; 653 return action;
655} 654}
@@ -676,13 +675,10 @@ static int view_cue_item_callback(int action,
676 (void)this_item; 675 (void)this_item;
677 (void)this_list; 676 (void)this_list;
678 struct mp3entry* id3 = audio_current_track(); 677 struct mp3entry* id3 = audio_current_track();
679 switch (action) 678 if (action == ACTION_REQUEST_MENUITEM)
680 { 679 {
681 case ACTION_REQUEST_MENUITEM: 680 if (!selected_file.path || !id3 || !id3->cuesheet)
682 if (!selected_file 681 return ACTION_EXIT_MENUITEM;
683 || !id3 || !id3->cuesheet)
684 return ACTION_EXIT_MENUITEM;
685 break;
686 } 682 }
687 return action; 683 return action;
688} 684}
@@ -712,7 +708,7 @@ MENUITEM_FUNCTION(pitch_screen_item, 0, ID2P(LANG_PITCH),
712 708
713static int clipboard_delete_selected_fileobject(void) 709static int clipboard_delete_selected_fileobject(void)
714{ 710{
715 int rc = delete_fileobject(selected_file); 711 int rc = delete_fileobject(selected_file.path);
716 if (rc < FORC_SUCCESS) { 712 if (rc < FORC_SUCCESS) {
717 splash_failed(LANG_DELETE, rc); 713 splash_failed(LANG_DELETE, rc);
718 } else if (rc == FORC_CANCELLED) { 714 } else if (rc == FORC_CANCELLED) {
@@ -747,7 +743,7 @@ static int clipboard_create_dir(void)
747 743
748static int clipboard_rename_selected_file(void) 744static int clipboard_rename_selected_file(void)
749{ 745{
750 int rc = rename_file(selected_file); 746 int rc = rename_file(selected_file.path);
751 747
752 show_result(rc, LANG_RENAME); 748 show_result(rc, LANG_RENAME);
753 749
@@ -777,7 +773,7 @@ MENUITEM_FUNCTION(create_dir_item, 0, ID2P(LANG_CREATE_DIR),
777/* other items */ 773/* other items */
778static bool list_viewers(void) 774static bool list_viewers(void)
779{ 775{
780 int ret = filetype_list_viewers(selected_file); 776 int ret = filetype_list_viewers(selected_file.path);
781 if (ret == PLUGIN_USB_CONNECTED) 777 if (ret == PLUGIN_USB_CONNECTED)
782 onplay_result = ONPLAY_RELOAD_DIR; 778 onplay_result = ONPLAY_RELOAD_DIR;
783 return false; 779 return false;
@@ -786,19 +782,19 @@ static bool list_viewers(void)
786#ifdef HAVE_TAGCACHE 782#ifdef HAVE_TAGCACHE
787static bool prepare_database_sel(void *param) 783static bool prepare_database_sel(void *param)
788{ 784{
789 if (context == CONTEXT_ID3DB && 785 if (selected_file.context == CONTEXT_ID3DB &&
790 (selected_file_attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO) 786 (selected_file.attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO)
791 { 787 {
792 if (!strcmp(param, "properties")) 788 if (!strcmp(param, "properties"))
793 strmemccpy(selected_file_path, MAKE_ACT_STR(ACTIVITY_DATABASEBROWSER), 789 strmemccpy(selected_file.buf, MAKE_ACT_STR(ACTIVITY_DATABASEBROWSER),
794 sizeof(selected_file_path)); 790 sizeof(selected_file.buf));
795 else if (!tagtree_get_subentry_filename(selected_file_path, MAX_PATH)) 791 else if (!tagtree_get_subentry_filename(selected_file.buf, MAX_PATH))
796 { 792 {
797 onplay_result = ONPLAY_RELOAD_DIR; 793 onplay_result = ONPLAY_RELOAD_DIR;
798 return false; 794 return false;
799 } 795 }
800 796
801 selected_file = selected_file_path; 797 selected_file.path = selected_file.buf;
802 } 798 }
803 return true; 799 return true;
804} 800}
@@ -810,7 +806,7 @@ static bool onplay_load_plugin(void *param)
810 if (!prepare_database_sel(param)) 806 if (!prepare_database_sel(param))
811 return false; 807 return false;
812#endif 808#endif
813 int ret = filetype_load_plugin((const char*)param, selected_file); 809 int ret = filetype_load_plugin((const char*)param, selected_file.path);
814 if (ret == PLUGIN_USB_CONNECTED) 810 if (ret == PLUGIN_USB_CONNECTED)
815 onplay_result = ONPLAY_RELOAD_DIR; 811 onplay_result = ONPLAY_RELOAD_DIR;
816 else if (ret == PLUGIN_GOTO_PLUGIN) 812 else if (ret == PLUGIN_GOTO_PLUGIN)
@@ -835,7 +831,7 @@ MENUITEM_FUNCTION_W_PARAM(pictureflow_item, 0, ID2P(LANG_ONPLAY_PICTUREFLOW),
835#endif 831#endif
836static bool onplay_add_to_shortcuts(void) 832static bool onplay_add_to_shortcuts(void)
837{ 833{
838 shortcuts_add(SHORTCUT_BROWSER, selected_file); 834 shortcuts_add(SHORTCUT_BROWSER, selected_file.path);
839 return false; 835 return false;
840} 836}
841MENUITEM_FUNCTION(add_to_faves_item, 0, ID2P(LANG_ADD_TO_FAVES), 837MENUITEM_FUNCTION(add_to_faves_item, 0, ID2P(LANG_ADD_TO_FAVES),
@@ -844,7 +840,7 @@ MENUITEM_FUNCTION(add_to_faves_item, 0, ID2P(LANG_ADD_TO_FAVES),
844 840
845static void set_dir_helper(char* dirnamebuf, size_t bufsz) 841static void set_dir_helper(char* dirnamebuf, size_t bufsz)
846{ 842{
847 path_append(dirnamebuf, selected_file, PA_SEP_HARD, bufsz); 843 path_append(dirnamebuf, selected_file.path, PA_SEP_HARD, bufsz);
848 settings_save(); 844 settings_save();
849} 845}
850 846
@@ -882,7 +878,7 @@ MENUITEM_FUNCTION(set_startdir_item, 0, ID2P(LANG_START_DIR),
882 878
883static bool set_catalogdir(void) 879static bool set_catalogdir(void)
884{ 880{
885 catalog_set_directory(selected_file); 881 catalog_set_directory(selected_file.path);
886 settings_save(); 882 settings_save();
887 return false; 883 return false;
888} 884}
@@ -893,7 +889,7 @@ MENUITEM_FUNCTION(set_catalogdir_item, 0, ID2P(LANG_PLAYLIST_DIR),
893static bool set_databasedir(void) 889static bool set_databasedir(void)
894{ 890{
895 struct tagcache_stat *tc_stat = tagcache_get_stat(); 891 struct tagcache_stat *tc_stat = tagcache_get_stat();
896 if (strcasecmp(selected_file, tc_stat->db_path)) 892 if (strcasecmp(selected_file.path, tc_stat->db_path))
897 { 893 {
898 splash(HZ, ID2P(LANG_PLEASE_REBOOT)); 894 splash(HZ, ID2P(LANG_PLEASE_REBOOT));
899 } 895 }
@@ -927,7 +923,7 @@ static int clipboard_callback(int action,
927 case ACTION_REQUEST_MENUITEM: 923 case ACTION_REQUEST_MENUITEM:
928#ifdef HAVE_MULTIVOLUME 924#ifdef HAVE_MULTIVOLUME
929 /* no rename+delete for volumes */ 925 /* no rename+delete for volumes */
930 if ((selected_file_attr & ATTR_VOLUME) && 926 if ((selected_file.attr & ATTR_VOLUME) &&
931 (this_item == &rename_file_item || 927 (this_item == &rename_file_item ||
932 this_item == &delete_dir_item || 928 this_item == &delete_dir_item ||
933 this_item == &clipboard_cut_item || 929 this_item == &clipboard_cut_item ||
@@ -935,7 +931,7 @@ static int clipboard_callback(int action,
935 return ACTION_EXIT_MENUITEM; 931 return ACTION_EXIT_MENUITEM;
936#endif 932#endif
937#ifdef HAVE_TAGCACHE 933#ifdef HAVE_TAGCACHE
938 if (context == CONTEXT_ID3DB) 934 if (selected_file.context == CONTEXT_ID3DB)
939 { 935 {
940 if (this_item == &track_info_item || 936 if (this_item == &track_info_item ||
941 this_item == &pictureflow_item) 937 this_item == &pictureflow_item)
@@ -953,21 +949,21 @@ static int clipboard_callback(int action,
953 { 949 {
954 return action; 950 return action;
955 } 951 }
956 else if (selected_file) 952 else if (selected_file.path)
957 { 953 {
958 /* requires an actual file */ 954 /* requires an actual file */
959 if (this_item == &rename_file_item || 955 if (this_item == &rename_file_item ||
960 this_item == &clipboard_cut_item || 956 this_item == &clipboard_cut_item ||
961 this_item == &clipboard_copy_item || 957 this_item == &clipboard_copy_item ||
962 (this_item == &track_info_item && 958 (this_item == &track_info_item &&
963 (selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_AUDIO) || 959 (selected_file.attr & FILE_ATTR_MASK) == FILE_ATTR_AUDIO) ||
964 (this_item == &properties_item && 960 (this_item == &properties_item &&
965 (selected_file_attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO) || 961 (selected_file.attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO) ||
966 this_item == &add_to_faves_item) 962 this_item == &add_to_faves_item)
967 { 963 {
968 return action; 964 return action;
969 } 965 }
970 else if ((selected_file_attr & ATTR_DIRECTORY)) 966 else if ((selected_file.attr & ATTR_DIRECTORY))
971 { 967 {
972 /* only for directories */ 968 /* only for directories */
973 if (this_item == &delete_dir_item || 969 if (this_item == &delete_dir_item ||
@@ -992,7 +988,7 @@ static int clipboard_callback(int action,
992#if LCD_DEPTH > 1 988#if LCD_DEPTH > 1
993 else if (this_item == &set_backdrop_item) 989 else if (this_item == &set_backdrop_item)
994 { 990 {
995 char *suffix = strrchr(selected_file, '.'); 991 char *suffix = strrchr(selected_file.path, '.');
996 if (suffix) 992 if (suffix)
997 { 993 {
998 if (strcasecmp(suffix, ".bmp") == 0) 994 if (strcasecmp(suffix, ".bmp") == 0)
@@ -1066,8 +1062,8 @@ static int onplaymenu_callback(int action,
1066 case ACTION_REQUEST_MENUITEM: 1062 case ACTION_REQUEST_MENUITEM:
1067 if (this_item == &view_playlist_item) 1063 if (this_item == &view_playlist_item)
1068 { 1064 {
1069 if ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_M3U && 1065 if ((selected_file.attr & FILE_ATTR_MASK) == FILE_ATTR_M3U &&
1070 context == CONTEXT_TREE) 1066 selected_file.context == CONTEXT_TREE)
1071 return action; 1067 return action;
1072 } 1068 }
1073 return ACTION_EXIT_MENUITEM; 1069 return ACTION_EXIT_MENUITEM;
@@ -1075,6 +1071,8 @@ static int onplaymenu_callback(int action,
1075 case ACTION_EXIT_MENUITEM: 1071 case ACTION_EXIT_MENUITEM:
1076 return ACTION_EXIT_AFTER_THIS_MENUITEM; 1072 return ACTION_EXIT_AFTER_THIS_MENUITEM;
1077 break; 1073 break;
1074 default:
1075 break;
1078 } 1076 }
1079 return action; 1077 return action;
1080} 1078}
@@ -1085,13 +1083,13 @@ static bool hotkey_delete_item(void)
1085{ 1083{
1086#ifdef HAVE_MULTIVOLUME 1084#ifdef HAVE_MULTIVOLUME
1087 /* no delete for volumes */ 1085 /* no delete for volumes */
1088 if (selected_file_attr & ATTR_VOLUME) 1086 if (selected_file.attr & ATTR_VOLUME)
1089 return false; 1087 return false;
1090#endif 1088#endif
1091 1089
1092#ifdef HAVE_TAGCACHE 1090#ifdef HAVE_TAGCACHE
1093 if (context == CONTEXT_ID3DB && 1091 if (selected_file.context == CONTEXT_ID3DB &&
1094 (selected_file_attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO) 1092 (selected_file.attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO)
1095 return false; 1093 return false;
1096#endif 1094#endif
1097 1095
@@ -1101,10 +1099,10 @@ static bool hotkey_delete_item(void)
1101static bool hotkey_open_with(void) 1099static bool hotkey_open_with(void)
1102{ 1100{
1103 /* only open files */ 1101 /* only open files */
1104 if (selected_file_attr & ATTR_DIRECTORY) 1102 if (selected_file.attr & ATTR_DIRECTORY)
1105 return false; 1103 return false;
1106#ifdef HAVE_MULTIVOLUME 1104#ifdef HAVE_MULTIVOLUME
1107 if (selected_file_attr & ATTR_VOLUME) 1105 if (selected_file.attr & ATTR_VOLUME)
1108 return false; 1106 return false;
1109#endif 1107#endif
1110 return list_viewers(); 1108 return list_viewers();
@@ -1113,8 +1111,8 @@ static bool hotkey_open_with(void)
1113static int hotkey_tree_pl_insert_shuffled(void) 1111static int hotkey_tree_pl_insert_shuffled(void)
1114{ 1112{
1115 if ((audio_status() & AUDIO_STATUS_PLAY) || 1113 if ((audio_status() & AUDIO_STATUS_PLAY) ||
1116 (selected_file_attr & ATTR_DIRECTORY) || 1114 (selected_file.attr & ATTR_DIRECTORY) ||
1117 ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_M3U)) 1115 ((selected_file.attr & FILE_ATTR_MASK) == FILE_ATTR_M3U))
1118 { 1116 {
1119 add_to_playlist(&addtopl_insert_shuf); 1117 add_to_playlist(&addtopl_insert_shuf);
1120 } 1118 }
@@ -1127,7 +1125,7 @@ static int hotkey_tree_run_plugin(void *param)
1127 if (!prepare_database_sel(param)) 1125 if (!prepare_database_sel(param))
1128 return ONPLAY_RELOAD_DIR; 1126 return ONPLAY_RELOAD_DIR;
1129#endif 1127#endif
1130 if (filetype_load_plugin((const char*)param, selected_file) == PLUGIN_GOTO_WPS) 1128 if (filetype_load_plugin((const char*)param, selected_file.path) == PLUGIN_GOTO_WPS)
1131 return ONPLAY_START_PLAY; 1129 return ONPLAY_START_PLAY;
1132 1130
1133 return ONPLAY_RELOAD_DIR; 1131 return ONPLAY_RELOAD_DIR;
@@ -1253,15 +1251,15 @@ static int execute_hotkey(bool is_wps)
1253} 1251}
1254#endif /* HOTKEY */ 1252#endif /* HOTKEY */
1255 1253
1256int onplay(char* file, int attr, int from, bool hotkey) 1254int onplay(char* file, int attr, int from_context, bool hotkey)
1257{ 1255{
1258 const struct menu_item_ex *menu; 1256 const struct menu_item_ex *menu;
1259 onplay_result = ONPLAY_OK; 1257 onplay_result = ONPLAY_OK;
1260 context = from;
1261 ctx_current_playlist_insert = NULL; 1258 ctx_current_playlist_insert = NULL;
1262 selected_file = NULL; 1259 selected_file_set(from_context, NULL, attr);
1260
1263#ifdef HAVE_TAGCACHE 1261#ifdef HAVE_TAGCACHE
1264 if (context == CONTEXT_ID3DB && 1262 if (from_context == CONTEXT_ID3DB &&
1265 (attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO) 1263 (attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO)
1266 { 1264 {
1267 ctx_add_to_playlist = tagtree_add_to_playlist; 1265 ctx_add_to_playlist = tagtree_add_to_playlist;
@@ -1269,8 +1267,8 @@ int onplay(char* file, int attr, int from, bool hotkey)
1269 { 1267 {
1270 /* add a leading slash so that catalog_add_to_a_playlist 1268 /* add a leading slash so that catalog_add_to_a_playlist
1271 later prefills the name when creating a new playlist */ 1269 later prefills the name when creating a new playlist */
1272 snprintf(selected_file_path, MAX_PATH, "/%s", file); 1270 snprintf(selected_file.buf, MAX_PATH, "/%s", file);
1273 selected_file = selected_file_path; 1271 selected_file.path = selected_file.buf;
1274 } 1272 }
1275 } 1273 }
1276 else 1274 else
@@ -1279,22 +1277,22 @@ int onplay(char* file, int attr, int from, bool hotkey)
1279 ctx_add_to_playlist = NULL; 1277 ctx_add_to_playlist = NULL;
1280 if (file != NULL) 1278 if (file != NULL)
1281 { 1279 {
1282 strmemccpy(selected_file_path, file, MAX_PATH); 1280 strmemccpy(selected_file.buf, file, MAX_PATH);
1283 selected_file = selected_file_path; 1281 selected_file.path = selected_file.buf;
1284 } 1282 }
1285 1283
1286 } 1284 }
1287 selected_file_attr = attr;
1288 int menu_selection; 1285 int menu_selection;
1286
1289#ifdef HAVE_HOTKEY 1287#ifdef HAVE_HOTKEY
1290 if (hotkey) 1288 if (hotkey)
1291 return execute_hotkey(context == CONTEXT_WPS); 1289 return execute_hotkey(from_context == CONTEXT_WPS);
1292#else 1290#else
1293 (void)hotkey; 1291 (void)hotkey;
1294#endif 1292#endif
1295 1293
1296 push_current_activity(ACTIVITY_CONTEXTMENU); 1294 push_current_activity(ACTIVITY_CONTEXTMENU);
1297 if (context == CONTEXT_WPS) 1295 if (from_context == CONTEXT_WPS)
1298 menu = &wps_onplay_menu; 1296 menu = &wps_onplay_menu;
1299 else 1297 else
1300 menu = &tree_onplay_menu; 1298 menu = &tree_onplay_menu;
@@ -1303,23 +1301,22 @@ int onplay(char* file, int attr, int from, bool hotkey)
1303 if (get_current_activity() == ACTIVITY_CONTEXTMENU) /* Activity may have been */ 1301 if (get_current_activity() == ACTIVITY_CONTEXTMENU) /* Activity may have been */
1304 pop_current_activity(); /* popped already by menu item */ 1302 pop_current_activity(); /* popped already by menu item */
1305 1303
1306 switch (menu_selection) 1304
1307 { 1305 if (menu_selection == GO_TO_WPS)
1308 case GO_TO_WPS: 1306 return ONPLAY_START_PLAY;
1309 return ONPLAY_START_PLAY; 1307 if (menu_selection == GO_TO_ROOT)
1310 case GO_TO_ROOT: 1308 return ONPLAY_MAINMENU;
1311 case GO_TO_MAINMENU: 1309 if (menu_selection == GO_TO_MAINMENU)
1312 return ONPLAY_MAINMENU; 1310 return ONPLAY_MAINMENU;
1313 case GO_TO_PLAYLIST_VIEWER: 1311 if (menu_selection == GO_TO_PLAYLIST_VIEWER)
1314 return ONPLAY_PLAYLIST; 1312 return ONPLAY_PLAYLIST;
1315 case GO_TO_PLUGIN: 1313 if (menu_selection == GO_TO_PLUGIN)
1316 return ONPLAY_PLUGIN; 1314 return ONPLAY_PLUGIN;
1317 default: 1315
1318 return onplay_result; 1316 return onplay_result;
1319 }
1320} 1317}
1321 1318
1322int get_onplay_context(void) 1319int get_onplay_context(void)
1323{ 1320{
1324 return context; 1321 return selected_file.context;
1325} 1322}
diff --git a/apps/onplay.h b/apps/onplay.h
index ea1c2e6c38..74dc045db3 100644
--- a/apps/onplay.h
+++ b/apps/onplay.h
@@ -25,7 +25,7 @@
25#include "menu.h" 25#include "menu.h"
26#endif 26#endif
27 27
28int onplay(char* file, int attr, int from_screen, bool hotkey); 28int onplay(char* file, int attr, int from_context, bool hotkey);
29int get_onplay_context(void); 29int get_onplay_context(void);
30 30
31enum { 31enum {