summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--apps/filetree.c70
-rw-r--r--apps/filetypes.c58
-rw-r--r--apps/filetypes.h7
-rw-r--r--apps/lang/english-us.lang2
-rw-r--r--apps/lang/english.lang2
-rw-r--r--apps/lang/italiano.lang314
-rw-r--r--apps/lang/nederlands.lang665
-rw-r--r--apps/lang/norsk.lang2
-rw-r--r--apps/lang/polski.lang224
-rw-r--r--apps/lang/srpski.lang379
-rw-r--r--apps/lang/turkce.lang1081
-rw-r--r--apps/open_plugin.c31
-rw-r--r--apps/plugin.c1
-rw-r--r--apps/plugin.h1
-rw-r--r--apps/plugins/CATEGORIES2
-rw-r--r--apps/plugins/SOURCES2
-rw-r--r--apps/plugins/SUBDIRS1
-rw-r--r--apps/plugins/imageviewer/imageviewer.c4
-rw-r--r--apps/plugins/lua/include_lua/dbgettags.lua (renamed from apps/plugins/lua_scripts/dbgettags.lua)0
-rw-r--r--apps/plugins/lua/include_lua/draw_poly.lua13
-rwxr-xr-xapps/plugins/lua/include_lua/filebrowse.lua (renamed from apps/plugins/lua_scripts/filebrowse.lua)0
-rwxr-xr-xapps/plugins/lua/include_lua/fileviewers.lua (renamed from apps/plugins/lua_scripts/fileviewers.lua)0
-rw-r--r--apps/plugins/lua/lapi.c5
-rw-r--r--apps/plugins/lua/lua.make12
-rw-r--r--apps/plugins/lua/luaconf.h3
-rw-r--r--apps/plugins/lua_scripts/lua_scripts.lua (renamed from apps/plugins/lua_scripts.lua)5
-rw-r--r--apps/plugins/lua_scripts/lua_scripts.make4
-rw-r--r--apps/plugins/lua_scripts/stars.lua331
-rw-r--r--apps/plugins/mpegplayer/libmpeg2/idct_arm.S2
-rw-r--r--apps/plugins/mpegplayer/libmpeg2/idct_armv6.S2
-rw-r--r--apps/plugins/open_plugins.c26
-rw-r--r--apps/plugins/pacbox/pacbox_arm.S2
-rw-r--r--apps/plugins/picross.lua822
-rw-r--r--apps/plugins/picross/picross.make24
-rwxr-xr-xapps/plugins/picross/picross_default.picross7
-rw-r--r--apps/plugins/picross/rb.picross7
-rw-r--r--apps/radio/radio.c39
-rw-r--r--apps/recorder/jpeg_idct_arm.S2
-rw-r--r--apps/settings.h2
-rw-r--r--apps/tree.c9
-rw-r--r--docs/CREDITS2
-rw-r--r--firmware/asm/arm/lcd-as-memframe.S2
-rw-r--r--firmware/asm/arm/memcpy.S2
-rw-r--r--firmware/asm/arm/memmove.S2
-rw-r--r--firmware/asm/arm/memset.S2
-rw-r--r--firmware/asm/arm/memset16.S2
-rw-r--r--firmware/export/config.h12
-rw-r--r--firmware/target/arm/ata-as-arm.S1
-rw-r--r--firmware/target/arm/ipod/video/lcd-as-video.S2
-rw-r--r--firmware/target/mips/ingenic_x1000/app.lds5
-rw-r--r--lib/arm_support/support-arm.S2
-rw-r--r--lib/rbcodec/codecs/demac/libdemac/udiv32_arm.S3
-rw-r--r--lib/rbcodec/codecs/libtta/filter_arm.S2
-rw-r--r--lib/rbcodec/dsp/dsp_arm.S1
-rw-r--r--lib/rbcodec/dsp/dsp_arm_v6.S1
-rw-r--r--lib/unwarminder/safe_read.S2
-rw-r--r--manual/main_menu/main.tex4
-rw-r--r--manual/rockbox_interface/tagcache.tex34
-rw-r--r--tools/builds.pm6
-rwxr-xr-xtools/buildzip.pl38
-rwxr-xr-xtools/configure17
-rw-r--r--tools/root.make2
-rwxr-xr-xtools/updatelang83
-rwxr-xr-xtools/voice.pl18
-rw-r--r--utils/themeeditor/quazip/crypt.h8
-rw-r--r--utils/themeeditor/quazip/unzip.c6
-rw-r--r--utils/themeeditor/quazip/zip.c2
68 files changed, 3916 insertions, 509 deletions
diff --git a/.gitignore b/.gitignore
index 5db3eaed58..b0d692c5d0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -110,6 +110,7 @@ __pycache__
110/tools/codepages 110/tools/codepages
111/tools/rdf2binary 111/tools/rdf2binary
112/tools/mkboot 112/tools/mkboot
113/tools/mk500boot
113/tools/uclpack 114/tools/uclpack
114/tools/ipod_fw 115/tools/ipod_fw
115/tools/wavtrim 116/tools/wavtrim
diff --git a/apps/filetree.c b/apps/filetree.c
index b5f5dece5a..9550adbac2 100644
--- a/apps/filetree.c
+++ b/apps/filetree.c
@@ -224,7 +224,11 @@ static int compare(const void* p1, const void* p2)
224 struct entry* e2 = (struct entry*)p2; 224 struct entry* e2 = (struct entry*)p2;
225 int criteria; 225 int criteria;
226 226
227 if (e1->attr & ATTR_DIRECTORY && e2->attr & ATTR_DIRECTORY) 227 if (cmp_data.sort_dir == SORT_AS_FILE)
228 { /* treat as two files */
229 criteria = global_settings.sort_file;
230 }
231 else if (e1->attr & ATTR_DIRECTORY && e2->attr & ATTR_DIRECTORY)
228 { /* two directories */ 232 { /* two directories */
229 criteria = cmp_data.sort_dir; 233 criteria = cmp_data.sort_dir;
230 234
@@ -326,18 +330,17 @@ int ft_load(struct tree_context* c, const char* tempdir)
326 info = dir_get_info(dir, entry); 330 info = dir_get_info(dir, entry);
327 len = strlen((char *)entry->d_name); 331 len = strlen((char *)entry->d_name);
328 332
329 /* skip directories . and .. */
330 if ((info.attribute & ATTR_DIRECTORY) &&
331 (((len == 1) && (!strncmp((char *)entry->d_name, ".", 1))) ||
332 ((len == 2) && (!strncmp((char *)entry->d_name, "..", 2))))) {
333 continue;
334 }
335
336 /* Skip FAT volume ID */ 333 /* Skip FAT volume ID */
337 if (info.attribute & ATTR_VOLUME_ID) { 334 if (info.attribute & ATTR_VOLUME_ID) {
338 continue; 335 continue;
339 } 336 }
340 337
338 dptr->attr = info.attribute;
339 int dir_attr = (dptr->attr & ATTR_DIRECTORY);
340 /* skip directories . and .. */
341 if (dir_attr && is_dotdir_name(entry->d_name))
342 continue;
343
341 /* filter out dotfiles and hidden files */ 344 /* filter out dotfiles and hidden files */
342 if (*c->dirfilter != SHOW_ALL && 345 if (*c->dirfilter != SHOW_ALL &&
343 ((entry->d_name[0]=='.') || 346 ((entry->d_name[0]=='.') ||
@@ -345,48 +348,45 @@ int ft_load(struct tree_context* c, const char* tempdir)
345 continue; 348 continue;
346 } 349 }
347 350
348 dptr->attr = info.attribute;
349 int dir_attr = (dptr->attr & ATTR_DIRECTORY);
350
351 /* check for known file types */ 351 /* check for known file types */
352 if ( !(dir_attr) ) 352 if ( !(dir_attr) )
353 dptr->attr |= filetype_get_attr((char *)entry->d_name); 353 dptr->attr |= filetype_get_attr((char *)entry->d_name);
354 354
355 int file_attr = (dptr->attr & FILE_ATTR_MASK); 355 int file_attr = (dptr->attr & FILE_ATTR_MASK);
356 356
357#define CHK_FT(show,attr) (*c->dirfilter == (show) && file_attr != (attr))
357 /* filter out non-visible files */ 358 /* filter out non-visible files */
358 if ((!(dir_attr) && ((*c->dirfilter == SHOW_PLAYLIST && 359 if ((!(dir_attr) && (CHK_FT(SHOW_PLAYLIST, FILE_ATTR_M3U) ||
359 file_attr != FILE_ATTR_M3U) || 360 (CHK_FT(SHOW_MUSIC, FILE_ATTR_AUDIO) && file_attr != FILE_ATTR_M3U) ||
360 ((*c->dirfilter == SHOW_MUSIC && file_attr != FILE_ATTR_AUDIO) &&
361 file_attr != FILE_ATTR_M3U) ||
362 (*c->dirfilter == SHOW_SUPPORTED && !filetype_supported(dptr->attr)))) || 361 (*c->dirfilter == SHOW_SUPPORTED && !filetype_supported(dptr->attr)))) ||
363 (*c->dirfilter == SHOW_WPS && file_attr != FILE_ATTR_WPS) || 362 CHK_FT(SHOW_WPS, FILE_ATTR_WPS) ||
364 (*c->dirfilter == SHOW_FONT && file_attr != FILE_ATTR_FONT) || 363 CHK_FT(SHOW_FONT, FILE_ATTR_FONT) ||
365 (*c->dirfilter == SHOW_SBS && file_attr != FILE_ATTR_SBS) || 364 CHK_FT(SHOW_SBS, FILE_ATTR_SBS) ||
366#if CONFIG_TUNER 365#if CONFIG_TUNER
367 (*c->dirfilter == SHOW_FMS && file_attr != FILE_ATTR_FMS) || 366 CHK_FT(SHOW_FMS, FILE_ATTR_FMS) ||
367 CHK_FT(SHOW_FMR, FILE_ATTR_FMR) ||
368#endif 368#endif
369#ifdef HAVE_REMOTE_LCD 369#ifdef HAVE_REMOTE_LCD
370 (*c->dirfilter == SHOW_RWPS && file_attr != FILE_ATTR_RWPS) || 370 CHK_FT(SHOW_RWPS, FILE_ATTR_RWPS) ||
371 (*c->dirfilter == SHOW_RSBS && file_attr != FILE_ATTR_RSBS) || 371 CHK_FT(SHOW_RSBS, FILE_ATTR_RSBS) ||
372#if CONFIG_TUNER 372#if CONFIG_TUNER
373 (*c->dirfilter == SHOW_RFMS && file_attr != FILE_ATTR_RFMS) || 373 CHK_FT(SHOW_RFMS, FILE_ATTR_RFMS) ||
374#endif
375#endif 374#endif
376#if CONFIG_TUNER
377 (*c->dirfilter == SHOW_FMR && file_attr != FILE_ATTR_FMR) ||
378#endif 375#endif
379 (*c->dirfilter == SHOW_M3U && file_attr != FILE_ATTR_M3U) || 376 CHK_FT(SHOW_M3U, FILE_ATTR_M3U) ||
380 (*c->dirfilter == SHOW_CFG && file_attr != FILE_ATTR_CFG) || 377 CHK_FT(SHOW_CFG, FILE_ATTR_CFG) ||
381 (*c->dirfilter == SHOW_LNG && file_attr != FILE_ATTR_LNG) || 378 CHK_FT(SHOW_LNG, FILE_ATTR_LNG) ||
382 (*c->dirfilter == SHOW_MOD && file_attr != FILE_ATTR_MOD) || 379 CHK_FT(SHOW_MOD, FILE_ATTR_MOD) ||
383 (*c->dirfilter == SHOW_PLUGINS && file_attr != FILE_ATTR_ROCK && 380 /* show first level directories */
384 file_attr != FILE_ATTR_LUA && 381 ((!(dir_attr) || c->dirlevel > 0) &&
385 file_attr != FILE_ATTR_OPX) || 382 CHK_FT(SHOW_PLUGINS, FILE_ATTR_ROCK) &&
383 file_attr != FILE_ATTR_LUA &&
384 file_attr != FILE_ATTR_OPX) ||
386 (callback_show_item && !callback_show_item(entry->d_name, dptr->attr, c))) 385 (callback_show_item && !callback_show_item(entry->d_name, dptr->attr, c)))
387 { 386 {
388 continue; 387 continue;
389 } 388 }
389#undef CHK_FT
390 390
391 if (len > c->cache.name_buffer_size - name_buffer_used - 1) { 391 if (len > c->cache.name_buffer_size - name_buffer_used - 1) {
392 /* Tell the world that we ran out of buffer space */ 392 /* Tell the world that we ran out of buffer space */
@@ -408,7 +408,9 @@ int ft_load(struct tree_context* c, const char* tempdir)
408 c->dirlength = files_in_dir; 408 c->dirlength = files_in_dir;
409 closedir(dir); 409 closedir(dir);
410 410
411 cmp_data.sort_dir = c->sort_dir; 411 /* allow directories to be sorted into file list */
412 cmp_data.sort_dir = (*c->dirfilter == SHOW_PLUGINS) ? SORT_AS_FILE : c->sort_dir;
413
412 if (global_settings.sort_case) 414 if (global_settings.sort_case)
413 { 415 {
414 if (global_settings.interpret_numbers == SORT_INTERPRET_AS_NUMBER) 416 if (global_settings.interpret_numbers == SORT_INTERPRET_AS_NUMBER)
@@ -753,7 +755,7 @@ int ft_enter(struct tree_context* c)
753 return rc; 755 return rc;
754 } 756 }
755 757
756 plugin = filetype_get_plugin(file, plugin_path, sizeof(plugin_path)); 758 plugin = filetype_get_plugin(file->attr, plugin_path, sizeof(plugin_path));
757 if (plugin) 759 if (plugin)
758 { 760 {
759#ifdef PLUGINS_RUN_IN_BROWSER /* Stay in the filetree to run a plugin */ 761#ifdef PLUGINS_RUN_IN_BROWSER /* Stay in the filetree to run a plugin */
diff --git a/apps/filetypes.c b/apps/filetypes.c
index bda7018381..38ed7650e3 100644
--- a/apps/filetypes.c
+++ b/apps/filetypes.c
@@ -604,11 +604,11 @@ int filetype_get_icon(int attr)
604 return filetypes[index].icon; 604 return filetypes[index].icon;
605} 605}
606 606
607char* filetype_get_plugin(const struct entry* file, char *buffer, size_t buffer_len) 607static int filetype_get_plugin_index(int attr)
608{ 608{
609 int index = find_attr(file->attr); 609 int index = find_attr(attr);
610 if (index < 0 || !buffer) 610 if (index < 0)
611 return NULL; 611 return -1;
612 struct file_type *ft_indexed = &filetypes[index]; 612 struct file_type *ft_indexed = &filetypes[index];
613 613
614 /* attempt to find a suitable viewer by file extension */ 614 /* attempt to find a suitable viewer by file extension */
@@ -621,17 +621,27 @@ char* filetype_get_plugin(const struct entry* file, char *buffer, size_t buffer_
621 ft = &filetypes[i]; 621 ft = &filetypes[i];
622 if (ft->plugin == NULL || ft->extension == NULL) 622 if (ft->plugin == NULL || ft->extension == NULL)
623 continue; 623 continue;
624 else if (strcmp(ft->extension, ft_indexed->extension) == 0) 624 else if (ft->plugin != NULL &&
625 strcmp(ft->extension, ft_indexed->extension) == 0)
625 { 626 {
626 /*splashf(HZ*3, "Found %d %s %s", i, ft->extension, ft->plugin);*/ 627 /*splashf(HZ*3, "Found %d %s %s", i, ft->extension, ft->plugin);*/
627 ft_indexed = ft; 628 return i;
628 break;
629 } 629 }
630 } 630 }
631 } 631 }
632 if (ft_indexed->plugin == NULL) 632 if (ft_indexed->plugin == NULL)
633 index = -1;
634 return index; /* Not Found */
635}
636
637char* filetype_get_plugin(int attr, char *buffer, size_t buffer_len)
638{
639 int index = filetype_get_plugin_index(attr);
640 if (index < 0 || !buffer)
633 return NULL; 641 return NULL;
634 642
643 struct file_type *ft_indexed = &filetypes[index];
644
635 snprintf(buffer, buffer_len, "%s/%s." ROCK_EXTENSION, 645 snprintf(buffer, buffer_len, "%s/%s." ROCK_EXTENSION,
636 PLUGIN_DIR, ft_indexed->plugin); 646 PLUGIN_DIR, ft_indexed->plugin);
637 return buffer; 647 return buffer;
@@ -674,24 +684,48 @@ static int openwith_get_talk(int selected_item, void * data)
674 return 0; 684 return 0;
675} 685}
676 686
677int filetype_list_viewers(const char* current_file) 687char* filetype_get_viewer(char *buffer, size_t buffer_len, const char* current_file)
678{ 688{
689 int attr = filetype_get_attr(current_file);
690
679 struct simplelist_info info; 691 struct simplelist_info info;
680 simplelist_info_init(&info, str(LANG_ONPLAY_OPEN_WITH), viewer_count, NULL); 692 simplelist_info_init(&info, str(LANG_ONPLAY_OPEN_WITH), viewer_count, NULL);
693
694 int default_index = filetype_get_plugin_index(attr);
695
696 if (default_index >= 0)
697 {
698 for (int i = 0; i < viewer_count; i++)
699 if (viewers[i] == default_index)
700 {
701 info.selection = i;
702 break;
703 }
704 }
705
681 info.get_name = openwith_get_name; 706 info.get_name = openwith_get_name;
682 info.get_icon = global_settings.show_icons?openwith_get_icon:NULL; 707 info.get_icon = global_settings.show_icons?openwith_get_icon:NULL;
683 info.get_talk = openwith_get_talk; 708 info.get_talk = openwith_get_talk;
684 709
685 int ret = simplelist_show_list(&info); 710 simplelist_show_list(&info);
686 711
687 if (info.selection >= 0) /* run user selected viewer */ 712 if (info.selection >= 0) /* run user selected viewer */
688 { 713 {
689 char plugin[MAX_PATH];
690 int i = viewers[info.selection]; 714 int i = viewers[info.selection];
691 snprintf(plugin, MAX_PATH, "%s/%s." ROCK_EXTENSION, 715 snprintf(buffer, buffer_len, "%s/%s." ROCK_EXTENSION,
692 PLUGIN_DIR, filetypes[i].plugin); 716 PLUGIN_DIR, filetypes[i].plugin);
693 ret = plugin_load(plugin, current_file); 717 return buffer;
694 } 718 }
719 return NULL;
720
721}
722
723int filetype_list_viewers(const char* current_file)
724{
725 int ret = PLUGIN_ERROR;
726 char plugin[MAX_PATH];
727 if (filetype_get_viewer(plugin, sizeof(plugin), current_file) != NULL)
728 ret = plugin_load(plugin, current_file);
695 return ret; 729 return ret;
696} 730}
697 731
diff --git a/apps/filetypes.h b/apps/filetypes.h
index 2886fa2850..4039daf497 100644
--- a/apps/filetypes.h
+++ b/apps/filetypes.h
@@ -74,14 +74,17 @@ int filetype_get_color(const char* name, int attr);
74#endif 74#endif
75int filetype_get_icon(int attr); 75int filetype_get_icon(int attr);
76/* return the plugin filename associated with the file */ 76/* return the plugin filename associated with the file */
77char* filetype_get_plugin(const struct entry* file, char *buffer, size_t buffer_len); 77char* filetype_get_plugin(int attr, char *buffer, size_t buffer_len);
78 78
79/* returns true if the attr is supported */ 79/* returns true if the attr is supported */
80bool filetype_supported(int attr); 80bool filetype_supported(int attr);
81 81
82/* List avialable viewers */ 82/* List avialable viewers and start selected plugin with current_file as argument */
83int filetype_list_viewers(const char* current_file); 83int filetype_list_viewers(const char* current_file);
84 84
85/* return the plugin filename the user selected for the file Returns NULL if canceled */
86char* filetype_get_viewer(char *buffer, size_t buffer_len, const char* current_file);
87
85/* start a plugin with file as the argument (called from onplay.c) */ 88/* start a plugin with file as the argument (called from onplay.c) */
86int filetype_load_plugin(const char* plugin, const char* file); 89int filetype_load_plugin(const char* plugin, const char* file);
87 90
diff --git a/apps/lang/english-us.lang b/apps/lang/english-us.lang
index 8cd7dcd10d..387593d990 100644
--- a/apps/lang/english-us.lang
+++ b/apps/lang/english-us.lang
@@ -14137,7 +14137,7 @@
14137 *: "No viewers found" 14137 *: "No viewers found"
14138 </source> 14138 </source>
14139 <dest> 14139 <dest>
14140 *: "No viewers found" 14140 *: "No viewers found"
14141 </dest> 14141 </dest>
14142 <voice> 14142 <voice>
14143 *: "No viewers found" 14143 *: "No viewers found"
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 3a1f52c9b1..6bba65f6a9 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -12915,7 +12915,7 @@
12915 *: "No viewers found" 12915 *: "No viewers found"
12916 </source> 12916 </source>
12917 <dest> 12917 <dest>
12918 *: "No viewers found" 12918 *: "No viewers found"
12919 </dest> 12919 </dest>
12920 <voice> 12920 <voice>
12921 *: "No viewers found" 12921 *: "No viewers found"
diff --git a/apps/lang/italiano.lang b/apps/lang/italiano.lang
index b6b97df22f..6174d6bb39 100644
--- a/apps/lang/italiano.lang
+++ b/apps/lang/italiano.lang
@@ -2260,15 +2260,15 @@
2260 desc: in lcd settings 2260 desc: in lcd settings
2261 user: core 2261 user: core
2262 <source> 2262 <source>
2263 *: none 2263 *: "Backlight on Lock"
2264 hold_button: "Backlight on Hold" 2264 hold_button: "Backlight on Hold"
2265 </source> 2265 </source>
2266 <dest> 2266 <dest>
2267 *: none 2267 *: "Backlight on Lock"
2268 hold_button: "Retroilluminazione Sul tasto di blocco" 2268 hold_button: "Retroilluminazione Sul tasto di blocco"
2269 </dest> 2269 </dest>
2270 <voice> 2270 <voice>
2271 *: none 2271 *: "Backlight on Lock"
2272 hold_button: "RetroIlluminazione sul tasto di blocco" 2272 hold_button: "RetroIlluminazione sul tasto di blocco"
2273 </voice> 2273 </voice>
2274</phrase> 2274</phrase>
@@ -6330,7 +6330,7 @@
6330 *: "Searching... %d found (%s)" 6330 *: "Searching... %d found (%s)"
6331 </source> 6331 </source>
6332 <dest> 6332 <dest>
6333 *: "Ricerca... %d trovato (%i)" 6333 *: "Ricerca... %d trovato (%s)"
6334 </dest> 6334 </dest>
6335 <voice> 6335 <voice>
6336 *: "Trovato" 6336 *: "Trovato"
@@ -15861,16 +15861,16 @@
15861</phrase> 15861</phrase>
15862<phrase> 15862<phrase>
15863 id: LANG_PLAYLIST_RELOAD_AFTER_SAVE 15863 id: LANG_PLAYLIST_RELOAD_AFTER_SAVE
15864 desc: reload playlist after saving 15864 desc: deprecated
15865 user: core 15865 user: core
15866 <source> 15866 <source>
15867 *: "Reload After Saving" 15867 *: ""
15868 </source> 15868 </source>
15869 <dest> 15869 <dest>
15870 *: "Ricarica Dopo Il Salvataggio" 15870 *: ""
15871 </dest> 15871 </dest>
15872 <voice> 15872 <voice>
15873 *: "Ricarica Dopo Il Salvataggio" 15873 *: ""
15874 </voice> 15874 </voice>
15875</phrase> 15875</phrase>
15876<phrase> 15876<phrase>
@@ -16105,10 +16105,10 @@
16105 *: "Album Art" 16105 *: "Album Art"
16106 </source> 16106 </source>
16107 <dest> 16107 <dest>
16108 *: "Album Art" 16108 *: "Copertina Album"
16109 </dest> 16109 </dest>
16110 <voice> 16110 <voice>
16111 *: "Album Art" 16111 *: "Copertina Album"
16112 </voice> 16112 </voice>
16113</phrase> 16113</phrase>
16114<phrase> 16114<phrase>
@@ -16566,3 +16566,297 @@
16566 *: "Vai all'Ultimo Album" 16566 *: "Vai all'Ultimo Album"
16567 </voice> 16567 </voice>
16568</phrase> 16568</phrase>
16569<phrase>
16570 id: LANG_DATABASE_DIR
16571 desc: in database settings menu
16572 user: core
16573 <source>
16574 *: "Database Directory"
16575 </source>
16576 <dest>
16577 *: "Directory Del Database"
16578 </dest>
16579 <voice>
16580 *: "Directory Del Database"
16581 </voice>
16582</phrase>
16583<phrase>
16584 id: LANG_REMOVE_QUEUED_TRACKS
16585 desc: Confirmation dialog
16586 user: core
16587 <source>
16588 *: "Remove Queued Tracks?"
16589 </source>
16590 <dest>
16591 *: "Rimuovere Le Tracce In Coda?"
16592 </dest>
16593 <voice>
16594 *: "Rimuovere Le Tracce In Coda?"
16595 </voice>
16596</phrase>
16597<phrase>
16598 id: LANG_QUICK_IGNORE_DIRACHE
16599 desc: in Settings
16600 user: core
16601 <source>
16602 *: "Quick (Ignore Directory Cache)"
16603 </source>
16604 <dest>
16605 *: "Veloce (Ignora Cache Della Directory)"
16606 </dest>
16607 <voice>
16608 *: "Veloce (Ignora Cache Della Directory)"
16609 </voice>
16610</phrase>
16611<phrase>
16612 id: LANG_WPS
16613 desc: in Settings
16614 user: core
16615 <source>
16616 *: "What's Playing Screen"
16617 </source>
16618 <dest>
16619 *: "Schermata Di Riproduzione"
16620 </dest>
16621 <voice>
16622 *: "Schermata Di Riproduzione"
16623 </voice>
16624</phrase>
16625<phrase>
16626 id: LANG_DEFAULT_BROWSER
16627 desc: in Settings
16628 user: core
16629 <source>
16630 *: "Default Browser"
16631 </source>
16632 <dest>
16633 *: "Browser Predefinito"
16634 </dest>
16635 <voice>
16636 *: "Browser Predefinito"
16637 </voice>
16638</phrase>
16639<phrase>
16640 id: LANG_AMAZE_MENU
16641 desc: Amaze game
16642 user: core
16643 <source>
16644 *: "Amaze Main Menu"
16645 </source>
16646 <dest>
16647 *: "Menu Principale Labirinto"
16648 </dest>
16649 <voice>
16650 *: "Menu Principale Labirinto"
16651 </voice>
16652</phrase>
16653<phrase>
16654 id: LANG_SET_MAZE_SIZE
16655 desc: Maze size in Amaze game
16656 user: core
16657 <source>
16658 *: "Set Maze Size"
16659 </source>
16660 <dest>
16661 *: "Imposta la dimensione del labirinto"
16662 </dest>
16663 <voice>
16664 *: "Imposta la dimensione del labirinto"
16665 </voice>
16666</phrase>
16667<phrase>
16668 id: LANG_VIEW_MAP
16669 desc: Map in Amaze game
16670 user: core
16671 <source>
16672 *: "View Map"
16673 </source>
16674 <dest>
16675 *: "Visualizza Mappa"
16676 </dest>
16677 <voice>
16678 *: "Visualizza Mappa"
16679 </voice>
16680</phrase>
16681<phrase>
16682 id: LANG_SHOW_COMPASS
16683 desc: Compass in Amaze game
16684 user: core
16685 <source>
16686 *: "Show Compass"
16687 </source>
16688 <dest>
16689 *: "Mostra la bussola"
16690 </dest>
16691 <voice>
16692 *: "Mostra la bussola"
16693 </voice>
16694</phrase>
16695<phrase>
16696 id: LANG_SHOW_MAP
16697 desc: Map in Amaze game
16698 user: core
16699 <source>
16700 *: "Show Map"
16701 </source>
16702 <dest>
16703 *: "Mostra la mappa"
16704 </dest>
16705 <voice>
16706 *: "Mostra la mappa"
16707 </voice>
16708</phrase>
16709<phrase>
16710 id: LANG_REMEMBER_PATH
16711 desc: Map in Amaze game
16712 user: core
16713 <source>
16714 *: "Remember Path"
16715 </source>
16716 <dest>
16717 *: "Ricorda il percorso"
16718 </dest>
16719 <voice>
16720 *: "Ricorda il percorso"
16721 </voice>
16722</phrase>
16723<phrase>
16724 id: LANG_USE_LARGE_TILES
16725 desc: Map in Amaze game
16726 user: core
16727 <source>
16728 *: "Use Large Tiles"
16729 </source>
16730 <dest>
16731 *: "Usa Piastrelle Grandi"
16732 </dest>
16733 <voice>
16734 *: "Usa Piastrelle Grandi"
16735 </voice>
16736</phrase>
16737<phrase>
16738 id: LANG_SHOW_SOLUTION
16739 desc: Map in Amaze game
16740 user: core
16741 <source>
16742 *: "Show Solution"
16743 </source>
16744 <dest>
16745 *: "Mostra la soluzione"
16746 </dest>
16747 <voice>
16748 *: "Mostra la soluzione"
16749 </voice>
16750</phrase>
16751<phrase>
16752 id: LANG_QUIT_WITHOUT_SAVING
16753 desc:
16754 user: core
16755 <source>
16756 *: "Quit without saving"
16757 </source>
16758 <dest>
16759 *: "Esci senza salvare"
16760 </dest>
16761 <voice>
16762 *: "Esci senza salvare"
16763 </voice>
16764</phrase>
16765<phrase>
16766 id: LANG_GENERATING_MAZE
16767 desc: Amaze game
16768 user: core
16769 <source>
16770 *: "Generating maze..."
16771 </source>
16772 <dest>
16773 *: "Generating maze..."
16774 </dest>
16775 <voice>
16776 *: "Generating maze..."
16777 </voice>
16778</phrase>
16779<phrase>
16780 id: LANG_YOU_WIN
16781 desc: Success in game
16782 user: core
16783 <source>
16784 *: "You win!"
16785 </source>
16786 <dest>
16787 *: "Hai vinto!"
16788 </dest>
16789 <voice>
16790 *: "Hai vinto!"
16791 </voice>
16792</phrase>
16793<phrase>
16794 id: LANG_YOU_CHEATED
16795 desc: Cheated in game
16796 user: core
16797 <source>
16798 *: "You cheated!"
16799 </source>
16800 <dest>
16801 *: "Hai barato!"
16802 </dest>
16803 <voice>
16804 *: "Hai barato!"
16805 </voice>
16806</phrase>
16807<phrase>
16808 id: LANG_DIFFICULTY_EASY
16809 desc: Game difficulty
16810 user: core
16811 <source>
16812 *: "Easy"
16813 </source>
16814 <dest>
16815 *: "Facile"
16816 </dest>
16817 <voice>
16818 *: "Facile"
16819 </voice>
16820</phrase>
16821<phrase>
16822 id: LANG_DIFFICULTY_MEDIUM
16823 desc: Game difficulty
16824 user: core
16825 <source>
16826 *: "Medium"
16827 </source>
16828 <dest>
16829 *: "Medio"
16830 </dest>
16831 <voice>
16832 *: "Medio"
16833 </voice>
16834</phrase>
16835<phrase>
16836 id: LANG_DIFFICULTY_HARD
16837 desc: Game difficulty
16838 user: core
16839 <source>
16840 *: "Hard"
16841 </source>
16842 <dest>
16843 *: "Impegnativo"
16844 </dest>
16845 <voice>
16846 *: "Impegnativo"
16847 </voice>
16848</phrase>
16849<phrase>
16850 id: LANG_DIFFICULTY_EXPERT
16851 desc: Game difficulty
16852 user: core
16853 <source>
16854 *: "Expert"
16855 </source>
16856 <dest>
16857 *: "Esperto"
16858 </dest>
16859 <voice>
16860 *: "Esperto"
16861 </voice>
16862</phrase>
diff --git a/apps/lang/nederlands.lang b/apps/lang/nederlands.lang
index 83139cc6de..4cf1f99d3a 100644
--- a/apps/lang/nederlands.lang
+++ b/apps/lang/nederlands.lang
@@ -1171,10 +1171,10 @@
1171 *: "Database" 1171 *: "Database"
1172 </source> 1172 </source>
1173 <dest> 1173 <dest>
1174 *: "Database" 1174 *: "Databank"
1175 </dest> 1175 </dest>
1176 <voice> 1176 <voice>
1177 *: "Database" 1177 *: "Databank"
1178 </voice> 1178 </voice>
1179</phrase> 1179</phrase>
1180<phrase> 1180<phrase>
@@ -3182,7 +3182,7 @@
3182 <voice> 3182 <voice>
3183 *: none 3183 *: none
3184 battery_types: "Nikkelmetaalhydride" 3184 battery_types: "Nikkelmetaalhydride"
3185 xduoox3: "Ouder 1500 milliampère per uur" 3185 xduoox3: "Ouder 1500 milliampère uur"
3186 </voice> 3186 </voice>
3187</phrase> 3187</phrase>
3188<phrase> 3188<phrase>
@@ -3577,58 +3577,58 @@
3577</phrase> 3577</phrase>
3578<phrase> 3578<phrase>
3579 id: LANG_INSERT 3579 id: LANG_INSERT
3580 desc: in onplay menu. insert a track/playlist into dynamic playlist. 3580 desc: deprecated
3581 user: core 3581 user: core
3582 <source> 3582 <source>
3583 *: "Insert" 3583 *: ""
3584 </source> 3584 </source>
3585 <dest> 3585 <dest>
3586 *: "Invoegen" 3586 *: ""
3587 </dest> 3587 </dest>
3588 <voice> 3588 <voice>
3589 *: "Invoegen" 3589 *: ""
3590 </voice> 3590 </voice>
3591</phrase> 3591</phrase>
3592<phrase> 3592<phrase>
3593 id: LANG_INSERT_FIRST 3593 id: LANG_INSERT_FIRST
3594 desc: in onplay menu. insert a track/playlist into dynamic playlist. 3594 desc: deprecated
3595 user: core 3595 user: core
3596 <source> 3596 <source>
3597 *: "Insert Next" 3597 *: ""
3598 </source> 3598 </source>
3599 <dest> 3599 <dest>
3600 *: "Invoegen als volgende" 3600 *: ""
3601 </dest> 3601 </dest>
3602 <voice> 3602 <voice>
3603 *: "Invoegen als volgende" 3603 *: ""
3604 </voice> 3604 </voice>
3605</phrase> 3605</phrase>
3606<phrase> 3606<phrase>
3607 id: LANG_INSERT_LAST 3607 id: LANG_INSERT_LAST
3608 desc: in onplay menu. append a track/playlist into dynamic playlist. 3608 desc: deprecated
3609 user: core 3609 user: core
3610 <source> 3610 <source>
3611 *: "Insert Last" 3611 *: ""
3612 </source> 3612 </source>
3613 <dest> 3613 <dest>
3614 *: "Invoegen als laatste" 3614 *: ""
3615 </dest> 3615 </dest>
3616 <voice> 3616 <voice>
3617 *: "Invoegen als laatste" 3617 *: ""
3618 </voice> 3618 </voice>
3619</phrase> 3619</phrase>
3620<phrase> 3620<phrase>
3621 id: LANG_INSERT_SHUFFLED 3621 id: LANG_INSERT_SHUFFLED
3622 desc: in onplay menu. insert a track/playlist randomly into dynamic playlist 3622 desc: deprecated
3623 user: core 3623 user: core
3624 <source> 3624 <source>
3625 *: "Insert Shuffled" 3625 *: ""
3626 </source> 3626 </source>
3627 <dest> 3627 <dest>
3628 *: "Geschud invoegen" 3628 *: ""
3629 </dest> 3629 </dest>
3630 <voice> 3630 <voice>
3631 *: "Geschud invoegen" 3631 *: ""
3632 </voice> 3632 </voice>
3633</phrase> 3633</phrase>
3634<phrase> 3634<phrase>
@@ -3861,20 +3861,23 @@
3861 user: core 3861 user: core
3862 <source> 3862 <source>
3863 *: none 3863 *: none
3864 multivolume: "HD1" 3864 hibylinux: "USB:"
3865 multivolume: "HD1:"
3865 sansac200*,sansaclipplus,sansae200*,sansafuze*: "mSD:" 3866 sansac200*,sansaclipplus,sansae200*,sansafuze*: "mSD:"
3866 xduoox3: "mSD2:" 3867 xduoox3: "mSD2:"
3867 </source> 3868 </source>
3868 <dest> 3869 <dest>
3869 *: none 3870 *: none
3871 hibylinux: "USB:"
3870 multivolume: "HD1" 3872 multivolume: "HD1"
3871 sansac200*,sansaclipplus,sansae200*,sansafuze*: "mSD:" 3873 sansac200*,sansaclipplus,sansae200*,sansafuze*: "mSD:"
3872 xduoox3: "mSD2:" 3874 xduoox3: "mSD2:"
3873 </dest> 3875 </dest>
3874 <voice> 3876 <voice>
3875 *: none 3877 *: none
3878 hibylinux: "U S B"
3876 multivolume: "HD1" 3879 multivolume: "HD1"
3877 sansac200*,sansaclipplus,sansae200*,sansafuze*: "mSD:" 3880 sansac200*,sansaclipplus,sansae200*,sansafuze*: "micro S D"
3878 xduoox3: "micro S D 2" 3881 xduoox3: "micro S D 2"
3879 </voice> 3882 </voice>
3880</phrase> 3883</phrase>
@@ -7043,16 +7046,16 @@
7043</phrase> 7046</phrase>
7044<phrase> 7047<phrase>
7045 id: LANG_CATALOG_ADD_TO 7048 id: LANG_CATALOG_ADD_TO
7046 desc: in onplay playlist catalogue submenu 7049 desc: deprecated
7047 user: core 7050 user: core
7048 <source> 7051 <source>
7049 *: "Add to Playlist" 7052 *: ""
7050 </source> 7053 </source>
7051 <dest> 7054 <dest>
7052 *: "Toevoegen aan afspeellijst" 7055 *: ""
7053 </dest> 7056 </dest>
7054 <voice> 7057 <voice>
7055 *: "Toevoegen aan afspeellijst" 7058 *: ""
7056 </voice> 7059 </voice>
7057</phrase> 7060</phrase>
7058<phrase> 7061<phrase>
@@ -7266,15 +7269,15 @@
7266 desc: in lcd settings 7269 desc: in lcd settings
7267 user: core 7270 user: core
7268 <source> 7271 <source>
7269 *: none 7272 *: "Backlight on Lock"
7270 hold_button: "Backlight on Hold" 7273 hold_button: "Backlight on Hold"
7271 </source> 7274 </source>
7272 <dest> 7275 <dest>
7273 *: none 7276 *: "Verlichting met vergrendeling"
7274 hold_button: "Verlichting met Hold-knop" 7277 hold_button: "Verlichting met Hold-knop"
7275 </dest> 7278 </dest>
7276 <voice> 7279 <voice>
7277 *: none 7280 *: "Verlichting met vergrendeling"
7278 hold_button: "Verlichting met Hold-knop" 7281 hold_button: "Verlichting met Hold-knop"
7279 </voice> 7282 </voice>
7280</phrase> 7283</phrase>
@@ -8479,19 +8482,17 @@
8479</phrase> 8482</phrase>
8480<phrase> 8483<phrase>
8481 id: LANG_SET_AS_REC_DIR 8484 id: LANG_SET_AS_REC_DIR
8482 desc: used in the onplay menu to set a recording dir 8485 desc: deprecated
8483 user: core 8486 user: core
8484 <source> 8487 <source>
8485 *: none 8488 *: none
8486 recording: "Set As Recording Directory" 8489 recording: ""
8487 </source> 8490 </source>
8488 <dest> 8491 <dest>
8489 *: none 8492 *: ""
8490 recording: "Instellen Als Opnamemap"
8491 </dest> 8493 </dest>
8492 <voice> 8494 <voice>
8493 *: none 8495 *: ""
8494 recording: "Instellen Als Opnamemap"
8495 </voice> 8496 </voice>
8496</phrase> 8497</phrase>
8497<phrase> 8498<phrase>
@@ -10562,16 +10563,16 @@
10562</phrase> 10563</phrase>
10563<phrase> 10564<phrase>
10564 id: LANG_INSERT_LAST_SHUFFLED 10565 id: LANG_INSERT_LAST_SHUFFLED
10565 desc: in onplay menu. insert a playlist randomly at end of dynamic playlist 10566 desc: deprecated
10566 user: core 10567 user: core
10567 <source> 10568 <source>
10568 *: "Insert Last Shuffled" 10569 *: ""
10569 </source> 10570 </source>
10570 <dest> 10571 <dest>
10571 *: "Geschud onderaan wachtrij plaatsen" 10572 *: ""
10572 </dest> 10573 </dest>
10573 <voice> 10574 <voice>
10574 *: "Geschud onderaan wachtrij plaatsen" 10575 *: ""
10575 </voice> 10576 </voice>
10576</phrase> 10577</phrase>
10577<phrase> 10578<phrase>
@@ -11476,16 +11477,16 @@
11476</phrase> 11477</phrase>
11477<phrase> 11478<phrase>
11478 id: LANG_SET_AS_START_DIR 11479 id: LANG_SET_AS_START_DIR
11479 desc: used in the onplay menu to set a starting browser dir 11480 desc: deprecated
11480 user: core 11481 user: core
11481 <source> 11482 <source>
11482 *: "Start File Browser Here" 11483 *: ""
11483 </source> 11484 </source>
11484 <dest> 11485 <dest>
11485 *: "Bestandsbeheer hier starten" 11486 *: ""
11486 </dest> 11487 </dest>
11487 <voice> 11488 <voice>
11488 *: "Bestandsbeheer hier starten" 11489 *: ""
11489 </voice> 11490 </voice>
11490</phrase> 11491</phrase>
11491<phrase> 11492<phrase>
@@ -11608,16 +11609,16 @@
11608</phrase> 11609</phrase>
11609<phrase> 11610<phrase>
11610 id: LANG_SET_AS_PLAYLISTCAT_DIR 11611 id: LANG_SET_AS_PLAYLISTCAT_DIR
11611 desc: used in the onplay menu to set a playlist catalogue dir 11612 desc: deprecated
11612 user: core 11613 user: core
11613 <source> 11614 <source>
11614 *: "Set As Playlist Catalogue Directory" 11615 *: ""
11615 </source> 11616 </source>
11616 <dest> 11617 <dest>
11617 *: "Instellen als afspeellijstcatalogusmap" 11618 *: ""
11618 </dest> 11619 </dest>
11619 <voice> 11620 <voice>
11620 *: "Instellen als afspeellijstcatalogusmap" 11621 *: ""
11621 </voice> 11622 </voice>
11622</phrase> 11623</phrase>
11623<phrase> 11624<phrase>
@@ -11667,16 +11668,16 @@
11667</phrase> 11668</phrase>
11668<phrase> 11669<phrase>
11669 id: LANG_AUTOMATIC 11670 id: LANG_AUTOMATIC
11670 desc: generic automatic 11671 desc: deprecated
11671 user: core 11672 user: core
11672 <source> 11673 <source>
11673 *: "Automatic" 11674 *: ""
11674 </source> 11675 </source>
11675 <dest> 11676 <dest>
11676 *: "Automatisch" 11677 *: ""
11677 </dest> 11678 </dest>
11678 <voice> 11679 <voice>
11679 *: "Automatisch" 11680 *: ""
11680 </voice> 11681 </voice>
11681</phrase> 11682</phrase>
11682<phrase> 11683<phrase>
@@ -14800,16 +14801,16 @@
14800</phrase> 14801</phrase>
14801<phrase> 14802<phrase>
14802 id: LANG_CLEAR_PLAYLIST 14803 id: LANG_CLEAR_PLAYLIST
14803 desc: in the pictureflow main menu 14804 desc: deprecated
14804 user: core 14805 user: core
14805 <source> 14806 <source>
14806 *: "Clear playlist" 14807 *: ""
14807 </source> 14808 </source>
14808 <dest> 14809 <dest>
14809 *: "Afspeellijst wissen" 14810 *: ""
14810 </dest> 14811 </dest>
14811 <voice> 14812 <voice>
14812 *: "Afspeellijst wissen" 14813 *: ""
14813 </voice> 14814 </voice>
14814</phrase> 14815</phrase>
14815<phrase> 14816<phrase>
@@ -14856,7 +14857,7 @@
14856</phrase> 14857</phrase>
14857<phrase> 14858<phrase>
14858 id: LANG_DIRECT 14859 id: LANG_DIRECT
14859 desc: in the pictureflow settings 14860 desc: in the pictureflow settings, also a volume adjustment mode
14860 user: core 14861 user: core
14861 <source> 14862 <source>
14862 *: "Direct" 14863 *: "Direct"
@@ -15855,16 +15856,16 @@
15855</phrase> 15856</phrase>
15856<phrase> 15857<phrase>
15857 id: LANG_PLAYLIST_RELOAD_AFTER_SAVE 15858 id: LANG_PLAYLIST_RELOAD_AFTER_SAVE
15858 desc: reload playlist after saving 15859 desc: deprecated
15859 user: core 15860 user: core
15860 <source> 15861 <source>
15861 *: "Reload After Saving" 15862 *: ""
15862 </source> 15863 </source>
15863 <dest> 15864 <dest>
15864 *: "Herladen na Opslaan" 15865 *: ""
15865 </dest> 15866 </dest>
15866 <voice> 15867 <voice>
15867 *: "Herladen na Opslaan" 15868 *: ""
15868 </voice> 15869 </voice>
15869</phrase> 15870</phrase>
15870<phrase> 15871<phrase>
@@ -16029,7 +16030,7 @@
16029 *: "dAY" 16030 *: "dAY"
16030 </source> 16031 </source>
16031 <dest> 16032 <dest>
16032 *: "dAG" 16033 *: "dAY"
16033 </dest> 16034 </dest>
16034 <voice> 16035 <voice>
16035 *: "" 16036 *: ""
@@ -16324,3 +16325,547 @@
16324 ipod4g,ipodcolor,ipodmini1g,ipodmini2g,ipodnano1g,ipodvideo: "Instellingen wissen wanneer de houd schakelaar aan staat tijdens het opstarten" 16325 ipod4g,ipodcolor,ipodmini1g,ipodmini2g,ipodnano1g,ipodvideo: "Instellingen wissen wanneer de houd schakelaar aan staat tijdens het opstarten"
16325 </voice> 16326 </voice>
16326</phrase> 16327</phrase>
16328<phrase>
16329 id: LANG_REWIND_ACROSS_TRACKS
16330 desc: in playback settings menu
16331 user: core
16332 <source>
16333 *: "Rewind Across Tracks"
16334 </source>
16335 <dest>
16336 *: "Terugspoelen Over Tracks"
16337 </dest>
16338 <voice>
16339 *: "Terugspoelen over tracks"
16340 </voice>
16341</phrase>
16342<phrase>
16343 id: LANG_SET_AS
16344 desc: used in the onplay menu
16345 user: core
16346 <source>
16347 *: "Set As..."
16348 </source>
16349 <dest>
16350 *: "Set As..."
16351 </dest>
16352 <voice>
16353 *: "Set As..."
16354 </voice>
16355</phrase>
16356<phrase>
16357 id: LANG_PLAYLIST_DIR
16358 desc: used in the onplay menu
16359 user: core
16360 <source>
16361 *: "Playlist Directory"
16362 </source>
16363 <dest>
16364 *: "Afspeellijstmap"
16365 </dest>
16366 <voice>
16367 *: "Afspeellijst map"
16368 </voice>
16369</phrase>
16370<phrase>
16371 id: LANG_START_DIR
16372 desc: used in the onplay menu
16373 user: core
16374 <source>
16375 *: "Start Directory"
16376 </source>
16377 <dest>
16378 *: "Startmap"
16379 </dest>
16380 <voice>
16381 *: "Start map"
16382 </voice>
16383</phrase>
16384<phrase>
16385 id: LANG_RECORDING_DIR
16386 desc: used in the onplay menu
16387 user: core
16388 <source>
16389 *: none
16390 recording: "Recording Directory"
16391 </source>
16392 <dest>
16393 *: none
16394 recording: "Opnamemap"
16395 </dest>
16396 <voice>
16397 *: none
16398 recording: "Opname map"
16399 </voice>
16400</phrase>
16401<phrase>
16402 id: LANG_ADD_TO_PL
16403 desc: used in the onplay menu
16404 user: core
16405 <source>
16406 *: "Add to Playlist..."
16407 </source>
16408 <dest>
16409 *: "Voeg toe aan Afspeellijst..."
16410 </dest>
16411 <voice>
16412 *: "Voeg toe aan Afspeellijst..."
16413 </voice>
16414</phrase>
16415<phrase>
16416 id: LANG_ADD_TO_EXISTING_PL
16417 desc: used in the onplay menu
16418 user: core
16419 <source>
16420 *: "Add to Existing Playlist"
16421 </source>
16422 <dest>
16423 *: "Voeg toe aan Bestaande Afspeellijst"
16424 </dest>
16425 <voice>
16426 *: "Voeg toe aan Bestaande Afspeellijst"
16427 </voice>
16428</phrase>
16429<phrase>
16430 id: LANG_PLAYING_NEXT
16431 desc: used in the onplay menu
16432 user: core
16433 <source>
16434 *: "Playing Next..."
16435 </source>
16436 <dest>
16437 *: "Hier Na..."
16438 </dest>
16439 <voice>
16440 *: "Hier na..."
16441 </voice>
16442</phrase>
16443<phrase>
16444 id: LANG_PLAY_NEXT
16445 desc: used in the onplay menu
16446 user: core
16447 <source>
16448 *: "Play Next"
16449 </source>
16450 <dest>
16451 *: "Speel volgende"
16452 </dest>
16453 <voice>
16454 *: "Speel volgende"
16455 </voice>
16456</phrase>
16457<phrase>
16458 id: LANG_ADD_SHUFFLED
16459 desc: used in the onplay menu
16460 user: core
16461 <source>
16462 *: "Add Shuffled"
16463 </source>
16464 <dest>
16465 *: "Voeg Shuffled toe"
16466 </dest>
16467 <voice>
16468 *: "Voeg Shuffled toe"
16469 </voice>
16470</phrase>
16471<phrase>
16472 id: LANG_PLAY_LAST
16473 desc: used in the onplay menu
16474 user: core
16475 <source>
16476 *: "Play Last"
16477 </source>
16478 <dest>
16479 *: "Laatste Afspelen"
16480 </dest>
16481 <voice>
16482 *: "Laatste Afspelen"
16483 </voice>
16484</phrase>
16485<phrase>
16486 id: LANG_PLAY_LAST_SHUFFLED
16487 desc: used in the onplay menu
16488 user: core
16489 <source>
16490 *: "Play Last Shuffled"
16491 </source>
16492 <dest>
16493 *: "Speel Laatst Geshuffled"
16494 </dest>
16495 <voice>
16496 *: "Speel Laatst Geshuffled"
16497 </voice>
16498</phrase>
16499<phrase>
16500 id: LANG_VOLUME_ADJUST_MODE
16501 desc: in system settings
16502 user: core
16503 <source>
16504 *: none
16505 perceptual_volume: "Volume Adjustment Mode"
16506 </source>
16507 <dest>
16508 *: none
16509 perceptual_volume: "Volume Aanpas Modus"
16510 </dest>
16511 <voice>
16512 *: none
16513 perceptual_volume: "Volume Aanpas Modus"
16514 </voice>
16515</phrase>
16516<phrase>
16517 id: LANG_VOLUME_ADJUST_NORM_STEPS
16518 desc: in system settings
16519 user: core
16520 <source>
16521 *: none
16522 perceptual_volume: "Number of Volume Steps"
16523 </source>
16524 <dest>
16525 *: none
16526 perceptual_volume: "Aantal Volumestappen"
16527 </dest>
16528 <voice>
16529 *: none
16530 perceptual_volume: "Aantal Volumestappen"
16531 </voice>
16532</phrase>
16533<phrase>
16534 id: LANG_PERCEPTUAL
16535 desc: in system settings -> volume adjustment mode
16536 user: core
16537 <source>
16538 *: none
16539 perceptual_volume: "Perceptual"
16540 </source>
16541 <dest>
16542 *: none
16543 perceptual_volume: "Perceptueel"
16544 </dest>
16545 <voice>
16546 *: none
16547 perceptual_volume: "Perceptueel"
16548 </voice>
16549</phrase>
16550<phrase>
16551 id: LANG_SHOW_TRACKS_WHILE_BROWSING
16552 desc: in PictureFlow Main Menu
16553 user: core
16554 <source>
16555 *: "Show Tracks While Browsing"
16556 </source>
16557 <dest>
16558 *: "Toon Tracks Tijdens Browsen"
16559 </dest>
16560 <voice>
16561 *: "Toon Tracks Tijdens Browsen"
16562 </voice>
16563</phrase>
16564<phrase>
16565 id: LANG_GOTO_LAST_ALBUM
16566 desc: in PictureFlow Main Menu
16567 user: core
16568 <source>
16569 *: "Go to Last Album"
16570 </source>
16571 <dest>
16572 *: "Ga naar Laatste Album"
16573 </dest>
16574 <voice>
16575 *: "Ga naar Laatste Album"
16576 </voice>
16577</phrase>
16578<phrase>
16579 id: LANG_DATABASE_DIR
16580 desc: in database settings menu
16581 user: core
16582 <source>
16583 *: "Database Directory"
16584 </source>
16585 <dest>
16586 *: "Databankmap"
16587 </dest>
16588 <voice>
16589 *: "Databank map"
16590 </voice>
16591</phrase>
16592<phrase>
16593 id: LANG_REMOVE_QUEUED_TRACKS
16594 desc: Confirmation dialog
16595 user: core
16596 <source>
16597 *: "Remove Queued Tracks?"
16598 </source>
16599 <dest>
16600 *: "Verwijder Queued Tracks?"
16601 </dest>
16602 <voice>
16603 *: "Verwijder Queued Tracks?"
16604 </voice>
16605</phrase>
16606<phrase>
16607 id: LANG_QUICK_IGNORE_DIRACHE
16608 desc: in Settings
16609 user: core
16610 <source>
16611 *: "Quick (Ignore Directory Cache)"
16612 </source>
16613 <dest>
16614 *: "Snel (Negeer Mapcache)"
16615 </dest>
16616 <voice>
16617 *: "Snel (Negeer Map cache)"
16618 </voice>
16619</phrase>
16620<phrase>
16621 id: LANG_WPS
16622 desc: in Settings
16623 user: core
16624 <source>
16625 *: "What's Playing Screen"
16626 </source>
16627 <dest>
16628 *: "Wat er nu Speelt Scherm"
16629 </dest>
16630 <voice>
16631 *: "Wat er nu Speelt Scherm"
16632 </voice>
16633</phrase>
16634<phrase>
16635 id: LANG_DEFAULT_BROWSER
16636 desc: in Settings
16637 user: core
16638 <source>
16639 *: "Default Browser"
16640 </source>
16641 <dest>
16642 *: "Standaard Browser"
16643 </dest>
16644 <voice>
16645 *: "Standaard Browser"
16646 </voice>
16647</phrase>
16648<phrase>
16649 id: LANG_AMAZE_MENU
16650 desc: Amaze game
16651 user: core
16652 <source>
16653 *: "Amaze Main Menu"
16654 </source>
16655 <dest>
16656 *: "Amaze Hoofdmenu"
16657 </dest>
16658 <voice>
16659 *: "Amaze Hoofdmenu"
16660 </voice>
16661</phrase>
16662<phrase>
16663 id: LANG_SET_MAZE_SIZE
16664 desc: Maze size in Amaze game
16665 user: core
16666 <source>
16667 *: "Set Maze Size"
16668 </source>
16669 <dest>
16670 *: "Stel Doolhofgrootte in"
16671 </dest>
16672 <voice>
16673 *: "Stel Doolhofgrootte in"
16674 </voice>
16675</phrase>
16676<phrase>
16677 id: LANG_VIEW_MAP
16678 desc: Map in Amaze game
16679 user: core
16680 <source>
16681 *: "View Map"
16682 </source>
16683 <dest>
16684 *: "Bekijk Kaart"
16685 </dest>
16686 <voice>
16687 *: "Bekijk Kaart"
16688 </voice>
16689</phrase>
16690<phrase>
16691 id: LANG_SHOW_COMPASS
16692 desc: Compass in Amaze game
16693 user: core
16694 <source>
16695 *: "Show Compass"
16696 </source>
16697 <dest>
16698 *: "Toon Kompas"
16699 </dest>
16700 <voice>
16701 *: "Toon Kompas"
16702 </voice>
16703</phrase>
16704<phrase>
16705 id: LANG_SHOW_MAP
16706 desc: Map in Amaze game
16707 user: core
16708 <source>
16709 *: "Show Map"
16710 </source>
16711 <dest>
16712 *: "Toon Kaart"
16713 </dest>
16714 <voice>
16715 *: "Toon Kaart"
16716 </voice>
16717</phrase>
16718<phrase>
16719 id: LANG_REMEMBER_PATH
16720 desc: Map in Amaze game
16721 user: core
16722 <source>
16723 *: "Remember Path"
16724 </source>
16725 <dest>
16726 *: "Onthoud Pad"
16727 </dest>
16728 <voice>
16729 *: "Onthoud Pad"
16730 </voice>
16731</phrase>
16732<phrase>
16733 id: LANG_USE_LARGE_TILES
16734 desc: Map in Amaze game
16735 user: core
16736 <source>
16737 *: "Use Large Tiles"
16738 </source>
16739 <dest>
16740 *: "Gebruik Grote Tegels"
16741 </dest>
16742 <voice>
16743 *: "Gebruik Grote Tegels"
16744 </voice>
16745</phrase>
16746<phrase>
16747 id: LANG_SHOW_SOLUTION
16748 desc: Map in Amaze game
16749 user: core
16750 <source>
16751 *: "Show Solution"
16752 </source>
16753 <dest>
16754 *: "Toon Oplossing"
16755 </dest>
16756 <voice>
16757 *: "Toon Oplossing"
16758 </voice>
16759</phrase>
16760<phrase>
16761 id: LANG_QUIT_WITHOUT_SAVING
16762 desc:
16763 user: core
16764 <source>
16765 *: "Quit without saving"
16766 </source>
16767 <dest>
16768 *: "Stoppen zonder op te slaan"
16769 </dest>
16770 <voice>
16771 *: "Stoppen zonder op te slaan"
16772 </voice>
16773</phrase>
16774<phrase>
16775 id: LANG_GENERATING_MAZE
16776 desc: Amaze game
16777 user: core
16778 <source>
16779 *: "Generating maze..."
16780 </source>
16781 <dest>
16782 *: "Doolhof maken..."
16783 </dest>
16784 <voice>
16785 *: "Doolhof maken..."
16786 </voice>
16787</phrase>
16788<phrase>
16789 id: LANG_YOU_WIN
16790 desc: Success in game
16791 user: core
16792 <source>
16793 *: "You win!"
16794 </source>
16795 <dest>
16796 *: "Jij wint!"
16797 </dest>
16798 <voice>
16799 *: "Jij wint!"
16800 </voice>
16801</phrase>
16802<phrase>
16803 id: LANG_YOU_CHEATED
16804 desc: Cheated in game
16805 user: core
16806 <source>
16807 *: "You cheated!"
16808 </source>
16809 <dest>
16810 *: "Je hebt valsgespeeld!"
16811 </dest>
16812 <voice>
16813 *: "Je hebt valsgespeeld!"
16814 </voice>
16815</phrase>
16816<phrase>
16817 id: LANG_DIFFICULTY_EASY
16818 desc: Game difficulty
16819 user: core
16820 <source>
16821 *: "Easy"
16822 </source>
16823 <dest>
16824 *: "Gemakkelijk"
16825 </dest>
16826 <voice>
16827 *: "Gemakkelijk"
16828 </voice>
16829</phrase>
16830<phrase>
16831 id: LANG_DIFFICULTY_MEDIUM
16832 desc: Game difficulty
16833 user: core
16834 <source>
16835 *: "Medium"
16836 </source>
16837 <dest>
16838 *: "Medium"
16839 </dest>
16840 <voice>
16841 *: "Medium"
16842 </voice>
16843</phrase>
16844<phrase>
16845 id: LANG_DIFFICULTY_HARD
16846 desc: Game difficulty
16847 user: core
16848 <source>
16849 *: "Hard"
16850 </source>
16851 <dest>
16852 *: "Moeilijk"
16853 </dest>
16854 <voice>
16855 *: "Moeilijk"
16856 </voice>
16857</phrase>
16858<phrase>
16859 id: LANG_DIFFICULTY_EXPERT
16860 desc: Game difficulty
16861 user: core
16862 <source>
16863 *: "Expert"
16864 </source>
16865 <dest>
16866 *: "Expert"
16867 </dest>
16868 <voice>
16869 *: "Expert"
16870 </voice>
16871</phrase>
diff --git a/apps/lang/norsk.lang b/apps/lang/norsk.lang
index b823d962b1..d2d5730413 100644
--- a/apps/lang/norsk.lang
+++ b/apps/lang/norsk.lang
@@ -13547,7 +13547,7 @@
13547 *: "No viewers found" 13547 *: "No viewers found"
13548 </source> 13548 </source>
13549 <dest> 13549 <dest>
13550 *: "No viewers found" 13550 *: "No viewers found"
13551 </dest> 13551 </dest>
13552 <voice> 13552 <voice>
13553 *: "No viewers found" 13553 *: "No viewers found"
diff --git a/apps/lang/polski.lang b/apps/lang/polski.lang
index a06124e82c..028cd5d758 100644
--- a/apps/lang/polski.lang
+++ b/apps/lang/polski.lang
@@ -16642,3 +16642,227 @@
16642 *: "Przeglądarka domyślna" 16642 *: "Przeglądarka domyślna"
16643 </voice> 16643 </voice>
16644</phrase> 16644</phrase>
16645<phrase>
16646 id: LANG_AMAZE_MENU
16647 desc: Amaze game
16648 user: core
16649 <source>
16650 *: "Amaze Main Menu"
16651 </source>
16652 <dest>
16653 *: "Menu główne Amaze"
16654 </dest>
16655 <voice>
16656 *: "Menu główne Amejz"
16657 </voice>
16658</phrase>
16659<phrase>
16660 id: LANG_SET_MAZE_SIZE
16661 desc: Maze size in Amaze game
16662 user: core
16663 <source>
16664 *: "Set Maze Size"
16665 </source>
16666 <dest>
16667 *: "Ustaw rozmiar labiryntu"
16668 </dest>
16669 <voice>
16670 *: "Ustaw rozmiar labiryntu"
16671 </voice>
16672</phrase>
16673<phrase>
16674 id: LANG_VIEW_MAP
16675 desc: Map in Amaze game
16676 user: core
16677 <source>
16678 *: "View Map"
16679 </source>
16680 <dest>
16681 *: "Wyświetl mapę"
16682 </dest>
16683 <voice>
16684 *: "Wyświetl mapę"
16685 </voice>
16686</phrase>
16687<phrase>
16688 id: LANG_SHOW_COMPASS
16689 desc: Compass in Amaze game
16690 user: core
16691 <source>
16692 *: "Show Compass"
16693 </source>
16694 <dest>
16695 *: "Pokaż kompas"
16696 </dest>
16697 <voice>
16698 *: "Pokaż kompas"
16699 </voice>
16700</phrase>
16701<phrase>
16702 id: LANG_SHOW_MAP
16703 desc: Map in Amaze game
16704 user: core
16705 <source>
16706 *: "Show Map"
16707 </source>
16708 <dest>
16709 *: "Pokaż mapę"
16710 </dest>
16711 <voice>
16712 *: "Pokaż mapę"
16713 </voice>
16714</phrase>
16715<phrase>
16716 id: LANG_REMEMBER_PATH
16717 desc: Map in Amaze game
16718 user: core
16719 <source>
16720 *: "Remember Path"
16721 </source>
16722 <dest>
16723 *: "Zapamiętuj ścieżkę"
16724 </dest>
16725 <voice>
16726 *: "Zapamiętuj ścieżkę"
16727 </voice>
16728</phrase>
16729<phrase>
16730 id: LANG_USE_LARGE_TILES
16731 desc: Map in Amaze game
16732 user: core
16733 <source>
16734 *: "Use Large Tiles"
16735 </source>
16736 <dest>
16737 *: "Używaj dużych płytek"
16738 </dest>
16739 <voice>
16740 *: "Używaj dużych płytek"
16741 </voice>
16742</phrase>
16743<phrase>
16744 id: LANG_SHOW_SOLUTION
16745 desc: Map in Amaze game
16746 user: core
16747 <source>
16748 *: "Show Solution"
16749 </source>
16750 <dest>
16751 *: "Pokaż rozwiązanie"
16752 </dest>
16753 <voice>
16754 *: "Pokaż rozwiązanie"
16755 </voice>
16756</phrase>
16757<phrase>
16758 id: LANG_QUIT_WITHOUT_SAVING
16759 desc:
16760 user: core
16761 <source>
16762 *: "Quit without saving"
16763 </source>
16764 <dest>
16765 *: "Wyjdź bez zapisywania"
16766 </dest>
16767 <voice>
16768 *: "Wyjdź bez zapisywania"
16769 </voice>
16770</phrase>
16771<phrase>
16772 id: LANG_GENERATING_MAZE
16773 desc: Amaze game
16774 user: core
16775 <source>
16776 *: "Generating maze..."
16777 </source>
16778 <dest>
16779 *: "Generowanie labiryntu..."
16780 </dest>
16781 <voice>
16782 *: "Generowanie labiryntu"
16783 </voice>
16784</phrase>
16785<phrase>
16786 id: LANG_YOU_WIN
16787 desc: Success in game
16788 user: core
16789 <source>
16790 *: "You win!"
16791 </source>
16792 <dest>
16793 *: "Wygrana!"
16794 </dest>
16795 <voice>
16796 *: "Wygrana!"
16797 </voice>
16798</phrase>
16799<phrase>
16800 id: LANG_YOU_CHEATED
16801 desc: Cheated in game
16802 user: core
16803 <source>
16804 *: "You cheated!"
16805 </source>
16806 <dest>
16807 *: "Oszustwo!"
16808 </dest>
16809 <voice>
16810 *: "Oszustwo!"
16811 </voice>
16812</phrase>
16813<phrase>
16814 id: LANG_DIFFICULTY_EASY
16815 desc: Game difficulty
16816 user: core
16817 <source>
16818 *: "Easy"
16819 </source>
16820 <dest>
16821 *: "Åatwa"
16822 </dest>
16823 <voice>
16824 *: "Åatwa"
16825 </voice>
16826</phrase>
16827<phrase>
16828 id: LANG_DIFFICULTY_MEDIUM
16829 desc: Game difficulty
16830 user: core
16831 <source>
16832 *: "Medium"
16833 </source>
16834 <dest>
16835 *: "Åšrednia"
16836 </dest>
16837 <voice>
16838 *: "Åšrednia"
16839 </voice>
16840</phrase>
16841<phrase>
16842 id: LANG_DIFFICULTY_HARD
16843 desc: Game difficulty
16844 user: core
16845 <source>
16846 *: "Hard"
16847 </source>
16848 <dest>
16849 *: "Trudna"
16850 </dest>
16851 <voice>
16852 *: "Trudna"
16853 </voice>
16854</phrase>
16855<phrase>
16856 id: LANG_DIFFICULTY_EXPERT
16857 desc: Game difficulty
16858 user: core
16859 <source>
16860 *: "Expert"
16861 </source>
16862 <dest>
16863 *: "Ekspercka"
16864 </dest>
16865 <voice>
16866 *: "Ekspercka"
16867 </voice>
16868</phrase>
diff --git a/apps/lang/srpski.lang b/apps/lang/srpski.lang
index e9b97e9777..76f04d4d8f 100644
--- a/apps/lang/srpski.lang
+++ b/apps/lang/srpski.lang
@@ -2241,16 +2241,16 @@
2241 desc: in lcd settings 2241 desc: in lcd settings
2242 user: core 2242 user: core
2243 <source> 2243 <source>
2244 *: none 2244 *: "Backlight on Lock"
2245 hold_button: "Backlight on Hold" 2245 hold_button: "Backlight on Hold"
2246 </source> 2246 </source>
2247 <dest> 2247 <dest>
2248 *: none 2248 *: "ПозадинÑко оÑветљење на Lock"
2249 hold_button: "ПозадинÑко оÑветљење на Hold" 2249 hold_button: "ПозадинÑко оÑветљење на Hold"
2250 </dest> 2250 </dest>
2251 <voice> 2251 <voice>
2252 *: none 2252 *: "ПозадинÑко оÑветљење на Лок"
2253 hold_button: "ПозадинÑко оÑветљење на Hold" 2253 hold_button: "ПозадинÑко оÑветљење на Холд"
2254 </voice> 2254 </voice>
2255</phrase> 2255</phrase>
2256<phrase> 2256<phrase>
@@ -5312,12 +5312,10 @@
5312 recording: "" 5312 recording: ""
5313 </source> 5313 </source>
5314 <dest> 5314 <dest>
5315 *: none 5315 *: ""
5316 recording: ""
5317 </dest> 5316 </dest>
5318 <voice> 5317 <voice>
5319 *: none 5318 *: ""
5320 recording: ""
5321 </voice> 5319 </voice>
5322</phrase> 5320</phrase>
5323<phrase> 5321<phrase>
@@ -6019,18 +6017,21 @@
6019 user: core 6017 user: core
6020 <source> 6018 <source>
6021 *: none 6019 *: none
6022 multivolume: "HD1" 6020 hibylinux: "USB:"
6021 multivolume: "HD1:"
6023 sansac200*,sansaclipplus,sansae200*,sansafuze*: "mSD:" 6022 sansac200*,sansaclipplus,sansae200*,sansafuze*: "mSD:"
6024 xduoox3: "mSD2:" 6023 xduoox3: "mSD2:"
6025 </source> 6024 </source>
6026 <dest> 6025 <dest>
6027 *: none 6026 *: none
6027 hibylinux: "USB:"
6028 multivolume: "HD1" 6028 multivolume: "HD1"
6029 sansac200*,sansaclipplus,sansae200*,sansafuze*: "mSD:" 6029 sansac200*,sansaclipplus,sansae200*,sansafuze*: "mSD:"
6030 xduoox3: "mSD2:" 6030 xduoox3: "mSD2:"
6031 </dest> 6031 </dest>
6032 <voice> 6032 <voice>
6033 *: none 6033 *: none
6034 hibylinux: "У Ð•Ñ Ð‘Ðµ"
6034 multivolume: "Ха Де један" 6035 multivolume: "Ха Де један"
6035 sansac200*,sansaclipplus,sansae200*,sansafuze*: "мајкро Ð•Ñ Ð”Ðµ" 6036 sansac200*,sansaclipplus,sansae200*,sansafuze*: "мајкро Ð•Ñ Ð”Ðµ"
6036 xduoox3: "мајкро Ð•Ñ Ð”Ðµ два" 6037 xduoox3: "мајкро Ð•Ñ Ð”Ðµ два"
@@ -9581,7 +9582,7 @@
9581 </dest> 9582 </dest>
9582 <voice> 9583 <voice>
9583 *: none 9584 *: none
9584 recording: "Величина" 9585 recording: ""
9585 </voice> 9586 </voice>
9586</phrase> 9587</phrase>
9587<phrase> 9588<phrase>
@@ -9674,7 +9675,7 @@
9674 </dest> 9675 </dest>
9675 <voice> 9676 <voice>
9676 *: none 9677 *: none
9677 recording: "Време дељења" 9678 recording: ""
9678 </voice> 9679 </voice>
9679</phrase> 9680</phrase>
9680<phrase> 9681<phrase>
@@ -9705,7 +9706,7 @@
9705 </dest> 9706 </dest>
9706 <voice> 9707 <voice>
9707 *: none 9708 *: none
9708 recording: "КЛИП" 9709 recording: ""
9709 </voice> 9710 </voice>
9710</phrase> 9711</phrase>
9711<phrase> 9712<phrase>
@@ -9739,7 +9740,7 @@
9739 </dest> 9740 </dest>
9740 <voice> 9741 <voice>
9741 *: none 9742 *: none
9742 recording: "Име фајла" 9743 recording: ""
9743 </voice> 9744 </voice>
9744</phrase> 9745</phrase>
9745<phrase> 9746<phrase>
@@ -11692,16 +11693,16 @@
11692</phrase> 11693</phrase>
11693<phrase> 11694<phrase>
11694 id: LANG_AUTOMATIC 11695 id: LANG_AUTOMATIC
11695 desc: generic automatic 11696 desc: deprecated
11696 user: core 11697 user: core
11697 <source> 11698 <source>
11698 *: "Automatic" 11699 *: ""
11699 </source> 11700 </source>
11700 <dest> 11701 <dest>
11701 *: "ÐутоматÑки" 11702 *: ""
11702 </dest> 11703 </dest>
11703 <voice> 11704 <voice>
11704 *: "ÐутоматÑки" 11705 *: ""
11705 </voice> 11706 </voice>
11706</phrase> 11707</phrase>
11707<phrase> 11708<phrase>
@@ -12899,7 +12900,7 @@
12899 *: "ОÑобине директоријума" 12900 *: "ОÑобине директоријума"
12900 </dest> 12901 </dest>
12901 <voice> 12902 <voice>
12902 *: "ОÑобине директоријума" 12903 *: ""
12903 </voice> 12904 </voice>
12904</phrase> 12905</phrase>
12905<phrase> 12906<phrase>
@@ -13118,7 +13119,7 @@
13118 *: "РедоÑлед Rockbox главног менија" 13119 *: "РедоÑлед Rockbox главног менија"
13119 </dest> 13120 </dest>
13120 <voice> 13121 <voice>
13121 *: "РедоÑлед Ð Ð¾ÐºÐ±Ð¾ÐºÑ Ð³Ð»Ð°Ð²Ð½Ð¾Ð³ менија" 13122 *: ""
13122 </voice> 13123 </voice>
13123</phrase> 13124</phrase>
13124<phrase> 13125<phrase>
@@ -13132,7 +13133,7 @@
13132 *: "ОÑобине фајла" 13133 *: "ОÑобине фајла"
13133 </dest> 13134 </dest>
13134 <voice> 13135 <voice>
13135 *: "ОÑобине фајла" 13136 *: ""
13136 </voice> 13137 </voice>
13137</phrase> 13138</phrase>
13138<phrase> 13139<phrase>
@@ -13280,16 +13281,16 @@
13280</phrase> 13281</phrase>
13281<phrase> 13282<phrase>
13282 id: LANG_CLEAR_PLAYLIST 13283 id: LANG_CLEAR_PLAYLIST
13283 desc: in the pictureflow main menu 13284 desc: deprecated
13284 user: core 13285 user: core
13285 <source> 13286 <source>
13286 *: "Clear playlist" 13287 *: ""
13287 </source> 13288 </source>
13288 <dest> 13289 <dest>
13289 *: "ОчиÑти плејлиÑту" 13290 *: ""
13290 </dest> 13291 </dest>
13291 <voice> 13292 <voice>
13292 *: "ОчиÑти плејлиÑту" 13293 *: ""
13293 </voice> 13294 </voice>
13294</phrase> 13295</phrase>
13295<phrase> 13296<phrase>
@@ -15858,16 +15859,16 @@
15858</phrase> 15859</phrase>
15859<phrase> 15860<phrase>
15860 id: LANG_PLAYLIST_RELOAD_AFTER_SAVE 15861 id: LANG_PLAYLIST_RELOAD_AFTER_SAVE
15861 desc: reload playlist after saving 15862 desc: deprecated
15862 user: core 15863 user: core
15863 <source> 15864 <source>
15864 *: "Reload After Saving" 15865 *: ""
15865 </source> 15866 </source>
15866 <dest> 15867 <dest>
15867 *: "Поново учитај након чувања" 15868 *: ""
15868 </dest> 15869 </dest>
15869 <voice> 15870 <voice>
15870 *: "Поново учитај након чувања" 15871 *: ""
15871 </voice> 15872 </voice>
15872</phrase> 15873</phrase>
15873<phrase> 15874<phrase>
@@ -16535,3 +16536,325 @@
16535 perceptual_volume: "Перцептуално" 16536 perceptual_volume: "Перцептуално"
16536 </voice> 16537 </voice>
16537</phrase> 16538</phrase>
16539<phrase>
16540 id: LANG_SHOW_TRACKS_WHILE_BROWSING
16541 desc: in PictureFlow Main Menu
16542 user: core
16543 <source>
16544 *: "Show Tracks While Browsing"
16545 </source>
16546 <dest>
16547 *: "Прикажи нумере током прегледа"
16548 </dest>
16549 <voice>
16550 *: "Прикажи нумере током прегледа"
16551 </voice>
16552</phrase>
16553<phrase>
16554 id: LANG_GOTO_LAST_ALBUM
16555 desc: in PictureFlow Main Menu
16556 user: core
16557 <source>
16558 *: "Go to Last Album"
16559 </source>
16560 <dest>
16561 *: "Иди на поÑледњи албум"
16562 </dest>
16563 <voice>
16564 *: "Иди на поÑледњи албум"
16565 </voice>
16566</phrase>
16567<phrase>
16568 id: LANG_DATABASE_DIR
16569 desc: in database settings menu
16570 user: core
16571 <source>
16572 *: "Database Directory"
16573 </source>
16574 <dest>
16575 *: "Директоријум базе података"
16576 </dest>
16577 <voice>
16578 *: "Директоријум базе података"
16579 </voice>
16580</phrase>
16581<phrase>
16582 id: LANG_REMOVE_QUEUED_TRACKS
16583 desc: Confirmation dialog
16584 user: core
16585 <source>
16586 *: "Remove Queued Tracks?"
16587 </source>
16588 <dest>
16589 *: "Да уклоним нумере из реда?"
16590 </dest>
16591 <voice>
16592 *: "Да уклоним нумере из реда?"
16593 </voice>
16594</phrase>
16595<phrase>
16596 id: LANG_QUICK_IGNORE_DIRACHE
16597 desc: in Settings
16598 user: core
16599 <source>
16600 *: "Quick (Ignore Directory Cache)"
16601 </source>
16602 <dest>
16603 *: "Брзо (игнориши кеш директоријума)"
16604 </dest>
16605 <voice>
16606 *: "Брзо (игнориши кеш директоријума)"
16607 </voice>
16608</phrase>
16609<phrase>
16610 id: LANG_WPS
16611 desc: in Settings
16612 user: core
16613 <source>
16614 *: "What's Playing Screen"
16615 </source>
16616 <dest>
16617 *: "Екран шта Ñе пушта"
16618 </dest>
16619 <voice>
16620 *: "Екран шта Ñе пушта"
16621 </voice>
16622</phrase>
16623<phrase>
16624 id: LANG_DEFAULT_BROWSER
16625 desc: in Settings
16626 user: core
16627 <source>
16628 *: "Default Browser"
16629 </source>
16630 <dest>
16631 *: "Подраз. прегледач"
16632 </dest>
16633 <voice>
16634 *: "Подраз. прегледач"
16635 </voice>
16636</phrase>
16637<phrase>
16638 id: LANG_AMAZE_MENU
16639 desc: Amaze game
16640 user: core
16641 <source>
16642 *: "Amaze Main Menu"
16643 </source>
16644 <dest>
16645 *: "Amaze главни мени"
16646 </dest>
16647 <voice>
16648 *: "Ðмејз главни мени"
16649 </voice>
16650</phrase>
16651<phrase>
16652 id: LANG_SET_MAZE_SIZE
16653 desc: Maze size in Amaze game
16654 user: core
16655 <source>
16656 *: "Set Maze Size"
16657 </source>
16658 <dest>
16659 *: "ПоÑтави величину лавиринта"
16660 </dest>
16661 <voice>
16662 *: "ПоÑтави величину лавиринта"
16663 </voice>
16664</phrase>
16665<phrase>
16666 id: LANG_VIEW_MAP
16667 desc: Map in Amaze game
16668 user: core
16669 <source>
16670 *: "View Map"
16671 </source>
16672 <dest>
16673 *: "Погледај мапу"
16674 </dest>
16675 <voice>
16676 *: "Погледај мапу"
16677 </voice>
16678</phrase>
16679<phrase>
16680 id: LANG_SHOW_COMPASS
16681 desc: Compass in Amaze game
16682 user: core
16683 <source>
16684 *: "Show Compass"
16685 </source>
16686 <dest>
16687 *: "Прикажи компаÑ"
16688 </dest>
16689 <voice>
16690 *: "Прикажи компаÑ"
16691 </voice>
16692</phrase>
16693<phrase>
16694 id: LANG_SHOW_MAP
16695 desc: Map in Amaze game
16696 user: core
16697 <source>
16698 *: "Show Map"
16699 </source>
16700 <dest>
16701 *: "Прикажи мапу"
16702 </dest>
16703 <voice>
16704 *: "Прикажи мапу"
16705 </voice>
16706</phrase>
16707<phrase>
16708 id: LANG_REMEMBER_PATH
16709 desc: Map in Amaze game
16710 user: core
16711 <source>
16712 *: "Remember Path"
16713 </source>
16714 <dest>
16715 *: "Запамти путању"
16716 </dest>
16717 <voice>
16718 *: "Запамти путању"
16719 </voice>
16720</phrase>
16721<phrase>
16722 id: LANG_USE_LARGE_TILES
16723 desc: Map in Amaze game
16724 user: core
16725 <source>
16726 *: "Use Large Tiles"
16727 </source>
16728 <dest>
16729 *: "КориÑти велике плочице"
16730 </dest>
16731 <voice>
16732 *: "КориÑти велике плочице"
16733 </voice>
16734</phrase>
16735<phrase>
16736 id: LANG_SHOW_SOLUTION
16737 desc: Map in Amaze game
16738 user: core
16739 <source>
16740 *: "Show Solution"
16741 </source>
16742 <dest>
16743 *: "Прикажи решење"
16744 </dest>
16745 <voice>
16746 *: "Прикажи решење"
16747 </voice>
16748</phrase>
16749<phrase>
16750 id: LANG_QUIT_WITHOUT_SAVING
16751 desc:
16752 user: core
16753 <source>
16754 *: "Quit without saving"
16755 </source>
16756 <dest>
16757 *: "ÐапуÑти без чувања"
16758 </dest>
16759 <voice>
16760 *: "ÐапуÑти без чувања"
16761 </voice>
16762</phrase>
16763<phrase>
16764 id: LANG_GENERATING_MAZE
16765 desc: Amaze game
16766 user: core
16767 <source>
16768 *: "Generating maze..."
16769 </source>
16770 <dest>
16771 *: "Лавиринт Ñе генерише..."
16772 </dest>
16773 <voice>
16774 *: "Лавиринт Ñе генерише..."
16775 </voice>
16776</phrase>
16777<phrase>
16778 id: LANG_YOU_WIN
16779 desc: Success in game
16780 user: core
16781 <source>
16782 *: "You win!"
16783 </source>
16784 <dest>
16785 *: "Победили Ñте!"
16786 </dest>
16787 <voice>
16788 *: "Победили Ñте!"
16789 </voice>
16790</phrase>
16791<phrase>
16792 id: LANG_YOU_CHEATED
16793 desc: Cheated in game
16794 user: core
16795 <source>
16796 *: "You cheated!"
16797 </source>
16798 <dest>
16799 *: "Варали Ñте!"
16800 </dest>
16801 <voice>
16802 *: "Варали Ñте!"
16803 </voice>
16804</phrase>
16805<phrase>
16806 id: LANG_DIFFICULTY_EASY
16807 desc: Game difficulty
16808 user: core
16809 <source>
16810 *: "Easy"
16811 </source>
16812 <dest>
16813 *: "Лако"
16814 </dest>
16815 <voice>
16816 *: "Лако"
16817 </voice>
16818</phrase>
16819<phrase>
16820 id: LANG_DIFFICULTY_MEDIUM
16821 desc: Game difficulty
16822 user: core
16823 <source>
16824 *: "Medium"
16825 </source>
16826 <dest>
16827 *: "Средње"
16828 </dest>
16829 <voice>
16830 *: "Средње"
16831 </voice>
16832</phrase>
16833<phrase>
16834 id: LANG_DIFFICULTY_HARD
16835 desc: Game difficulty
16836 user: core
16837 <source>
16838 *: "Hard"
16839 </source>
16840 <dest>
16841 *: "Тешко"
16842 </dest>
16843 <voice>
16844 *: "Тешко"
16845 </voice>
16846</phrase>
16847<phrase>
16848 id: LANG_DIFFICULTY_EXPERT
16849 desc: Game difficulty
16850 user: core
16851 <source>
16852 *: "Expert"
16853 </source>
16854 <dest>
16855 *: "Стручњак"
16856 </dest>
16857 <voice>
16858 *: "Стручњак"
16859 </voice>
16860</phrase>
diff --git a/apps/lang/turkce.lang b/apps/lang/turkce.lang
index 5b1688eed3..b9c30d8d5a 100644
--- a/apps/lang/turkce.lang
+++ b/apps/lang/turkce.lang
@@ -139,10 +139,10 @@
139 *: "Loading... %d%% done (%s)" 139 *: "Loading... %d%% done (%s)"
140 </source> 140 </source>
141 <dest> 141 <dest>
142 *: "Yükleniyor... %%%d bitti (%s)" 142 *: "Yükleniyor... %d%% bitti (%s)"
143 </dest> 143 </dest>
144 <voice> 144 <voice>
145 *: "Yükleniyor... %%%d tamamlandı (%s)" 145 *: "Yükleniyor"
146 </voice> 146 </voice>
147</phrase> 147</phrase>
148<phrase> 148<phrase>
@@ -1601,7 +1601,7 @@
1601 *: "DoÄŸrusal (%)" 1601 *: "DoÄŸrusal (%)"
1602 </dest> 1602 </dest>
1603 <voice> 1603 <voice>
1604 *: "Doğrusal (%)" 1604 *: "Doğrusal yüzde"
1605 </voice> 1605 </voice>
1606</phrase> 1606</phrase>
1607<phrase> 1607<phrase>
@@ -1754,7 +1754,7 @@
1754 </dest> 1754 </dest>
1755 <voice> 1755 <voice>
1756 *: none 1756 *: none
1757 gigabeat*,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh10_5gb,mrobe100,sansac200*,sansae200*,gogearsa9200,samsungyh*,iriverh100,iriverh120,iriverh300,rtc: "" 1757 gigabeat*,gogearsa9200,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh100,iriverh10_5gb,iriverh120,iriverh300,mrobe100,rtc,samsungyh*,sansac200*,sansae200*: ""
1758 </voice> 1758 </voice>
1759</phrase> 1759</phrase>
1760<phrase> 1760<phrase>
@@ -1779,7 +1779,6 @@
1779 *: none 1779 *: none
1780 gigabeatfx,mrobe500: "POWER = Geri Döndür" 1780 gigabeatfx,mrobe500: "POWER = Geri Döndür"
1781 gigabeats: "LEFT = Revert" 1781 gigabeats: "LEFT = Revert"
1782 sansafuzeplus: "BACK = Geri Döndür"
1783 gogearsa9200: "LEFT = Geri Döndür" 1782 gogearsa9200: "LEFT = Geri Döndür"
1784 iaudiom5,iaudiox5: "RECORD = Geri Döndür" 1783 iaudiom5,iaudiox5: "RECORD = Geri Döndür"
1785 ipod*,mpiohd300,sansac200*: "MENU = Geri Döndür" 1784 ipod*,mpiohd300,sansac200*: "MENU = Geri Döndür"
@@ -1788,11 +1787,12 @@
1788 mrobe100: "DISPLAY = Geri Döndür" 1787 mrobe100: "DISPLAY = Geri Döndür"
1789 rtc: "OFF = Geri Döndür" 1788 rtc: "OFF = Geri Döndür"
1790 samsungyh*: "REW = Geri Döndür" 1789 samsungyh*: "REW = Geri Döndür"
1790 sansafuzeplus: "BACK = Geri Döndür"
1791 vibe500: "C = Geri Döndür" 1791 vibe500: "C = Geri Döndür"
1792 </dest> 1792 </dest>
1793 <voice> 1793 <voice>
1794 *: none 1794 *: none
1795 gogearsa9200,iaudiom5,iaudiox5,ipod*,sansac200*,iriverh10,iriverh10_5gb,sansae200*,iriverh100,iriverh120,iriverh300,mrobe100,rtc,samsungyh*: "" 1795 gigabeat*,gogearsa9200,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh100,iriverh10_5gb,iriverh120,iriverh300,mrobe100,rtc,samsungyh*,sansac200*,sansae200*: ""
1796 </voice> 1796 </voice>
1797</phrase> 1797</phrase>
1798<phrase> 1798<phrase>
@@ -1978,7 +1978,7 @@
1978 *: "May" 1978 *: "May"
1979 </source> 1979 </source>
1980 <dest> 1980 <dest>
1981 *: "May" 1981 *: "Mayıs"
1982 </dest> 1982 </dest>
1983 <voice> 1983 <voice>
1984 *: "Mayıs" 1984 *: "Mayıs"
@@ -2172,19 +2172,22 @@
2172 user: core 2172 user: core
2173 <source> 2173 <source>
2174 *: none 2174 *: none
2175 multivolume: "HD1" 2175 hibylinux: "USB:"
2176 multivolume: "HD1:"
2176 sansac200*,sansaclipplus,sansae200*,sansafuze*: "mSD:" 2177 sansac200*,sansaclipplus,sansae200*,sansafuze*: "mSD:"
2177 xduoox3: "mSD2:" 2178 xduoox3: "mSD2:"
2178 </source> 2179 </source>
2179 <dest> 2180 <dest>
2180 *: none 2181 *: none
2181 multivolume: "HD1" 2182 hibylinux: "USB:"
2182 sansac200*,sansaclipplus,sansae200*,sansafuze*: "mikro-SD:" 2183 multivolume: "HardDisk1:"
2183 xduoox3: "mikro-SD2:" 2184 sansac200*,sansaclipplus,sansae200*,sansafuze*: "mikroSD:"
2185 xduoox3: "mikroSD2:"
2184 </dest> 2186 </dest>
2185 <voice> 2187 <voice>
2186 *: none 2188 *: none
2187 multivolume: "H D 1" 2189 hibylinux: "U S B"
2190 multivolume: "Hard Disk 1"
2188 sansac200*,sansaclipplus,sansae200*,sansafuze*: "mikroSD" 2191 sansac200*,sansaclipplus,sansae200*,sansafuze*: "mikroSD"
2189 xduoox3: "mikroSD2" 2192 xduoox3: "mikroSD2"
2190 </voice> 2193 </voice>
@@ -2652,7 +2655,7 @@
2652 *: "Edit mode: %s %s" 2655 *: "Edit mode: %s %s"
2653 </source> 2656 </source>
2654 <dest> 2657 <dest>
2655 *: "Düzenleme Modu: %s" 2658 *: "Düzenleme Modu: %s %s"
2656 </dest> 2659 </dest>
2657 <voice> 2660 <voice>
2658 *: "" 2661 *: ""
@@ -3887,16 +3890,16 @@
3887</phrase> 3890</phrase>
3888<phrase> 3891<phrase>
3889 id: LANG_AUTOMATIC 3892 id: LANG_AUTOMATIC
3890 desc: generic automatic 3893 desc: deprecated
3891 user: core 3894 user: core
3892 <source> 3895 <source>
3893 *: "Automatic" 3896 *: ""
3894 </source> 3897 </source>
3895 <dest> 3898 <dest>
3896 *: "Otomatik" 3899 *: ""
3897 </dest> 3900 </dest>
3898 <voice> 3901 <voice>
3899 *: "Otomatik" 3902 *: ""
3900 </voice> 3903 </voice>
3901</phrase> 3904</phrase>
3902<phrase> 3905<phrase>
@@ -4112,10 +4115,10 @@
4112 *: "Queued %d tracks (%s)" 4115 *: "Queued %d tracks (%s)"
4113 </source> 4116 </source>
4114 <dest> 4117 <dest>
4115 *: "Kuyruğa Alınan %d Parça (%s)" 4118 *: "Sırada %d Tane Parça (%s)"
4116 </dest> 4119 </dest>
4117 <voice> 4120 <voice>
4118 *: "Kuyruğa Alınan %d Parça (%s)" 4121 *: "tane parça sırada"
4119 </voice> 4122 </voice>
4120</phrase> 4123</phrase>
4121<phrase> 4124<phrase>
@@ -4691,16 +4694,16 @@
4691</phrase> 4694</phrase>
4692<phrase> 4695<phrase>
4693 id: LANG_SET_AS_PLAYLISTCAT_DIR 4696 id: LANG_SET_AS_PLAYLISTCAT_DIR
4694 desc: used in the onplay menu to set a playlist catalogue dir 4697 desc: deprecated
4695 user: core 4698 user: core
4696 <source> 4699 <source>
4697 *: "Set As Playlist Catalogue Directory" 4700 *: ""
4698 </source> 4701 </source>
4699 <dest> 4702 <dest>
4700 *: "Oynatma Listesi Katalog Dizini Olarak Ayarla" 4703 *: ""
4701 </dest> 4704 </dest>
4702 <voice> 4705 <voice>
4703 *: "Oynatma Listesi Katalog Dizini Olarak Ayarla" 4706 *: ""
4704 </voice> 4707 </voice>
4705</phrase> 4708</phrase>
4706<phrase> 4709<phrase>
@@ -4812,16 +4815,16 @@
4812</phrase> 4815</phrase>
4813<phrase> 4816<phrase>
4814 id: LANG_INSERT 4817 id: LANG_INSERT
4815 desc: in onplay menu. insert a track/playlist into dynamic playlist. 4818 desc: deprecated
4816 user: core 4819 user: core
4817 <source> 4820 <source>
4818 *: "Insert" 4821 *: ""
4819 </source> 4822 </source>
4820 <dest> 4823 <dest>
4821 *: "Tak" 4824 *: ""
4822 </dest> 4825 </dest>
4823 <voice> 4826 <voice>
4824 *: "Tak" 4827 *: ""
4825 </voice> 4828 </voice>
4826</phrase> 4829</phrase>
4827<phrase> 4830<phrase>
@@ -4871,16 +4874,16 @@
4871</phrase> 4874</phrase>
4872<phrase> 4875<phrase>
4873 id: LANG_SET_AS_START_DIR 4876 id: LANG_SET_AS_START_DIR
4874 desc: used in the onplay menu to set a starting browser dir 4877 desc: deprecated
4875 user: core 4878 user: core
4876 <source> 4879 <source>
4877 *: "Start File Browser Here" 4880 *: ""
4878 </source> 4881 </source>
4879 <dest> 4882 <dest>
4880 *: "Dosya Tarayıcısını Buradan Başlat " 4883 *: ""
4881 </dest> 4884 </dest>
4882 <voice> 4885 <voice>
4883 *: "Dosya Tarayıcısını Buradan Başlat" 4886 *: ""
4884 </voice> 4887 </voice>
4885</phrase> 4888</phrase>
4886<phrase> 4889<phrase>
@@ -5656,10 +5659,10 @@
5656 *: "%d Hz Band Gain" 5659 *: "%d Hz Band Gain"
5657 </source> 5660 </source>
5658 <dest> 5661 <dest>
5659 *: "%d Hz Band Kazancı" 5662 *: "%d Hz Bant Kazancı"
5660 </dest> 5663 </dest>
5661 <voice> 5664 <voice>
5662 *: "%d Hz Band Kazancı" 5665 *: "hertz bant kazancı"
5663 </voice> 5666 </voice>
5664</phrase> 5667</phrase>
5665<phrase> 5668<phrase>
@@ -7284,19 +7287,17 @@
7284</phrase> 7287</phrase>
7285<phrase> 7288<phrase>
7286 id: LANG_SET_AS_REC_DIR 7289 id: LANG_SET_AS_REC_DIR
7287 desc: used in the onplay menu to set a recording dir 7290 desc: deprecated
7288 user: core 7291 user: core
7289 <source> 7292 <source>
7290 *: none 7293 *: none
7291 recording: "Set As Recording Directory" 7294 recording: ""
7292 </source> 7295 </source>
7293 <dest> 7296 <dest>
7294 *: none 7297 *: ""
7295 recording: "Kayıt Dizini Olarak Ayarla"
7296 </dest> 7298 </dest>
7297 <voice> 7299 <voice>
7298 *: none 7300 *: ""
7299 recording: "Kayıt Dizini Olarak Ayarla"
7300 </voice> 7301 </voice>
7301</phrase> 7302</phrase>
7302<phrase> 7303<phrase>
@@ -7335,16 +7336,16 @@
7335 desc: in lcd settings 7336 desc: in lcd settings
7336 user: core 7337 user: core
7337 <source> 7338 <source>
7338 *: none 7339 *: "Backlight on Lock"
7339 hold_button: "Backlight on Hold" 7340 hold_button: "Backlight on Hold"
7340 </source> 7341 </source>
7341 <dest> 7342 <dest>
7342 *: none 7343 *: "Arka aydınlatma Kilitle"
7343 hold_button: "Beklemede Arka Işık" 7344 hold_button: "Arka aydınlatma Beklemede tut"
7344 </dest> 7345 </dest>
7345 <voice> 7346 <voice>
7346 *: none 7347 *: "Arka aydınlatma Kilitle"
7347 hold_button: "Beklemede Arka Işık" 7348 hold_button: "Arka aydınlatma Beklemede tut"
7348 </voice> 7349 </voice>
7349</phrase> 7350</phrase>
7350<phrase> 7351<phrase>
@@ -7616,16 +7617,16 @@
7616</phrase> 7617</phrase>
7617<phrase> 7618<phrase>
7618 id: LANG_INSERT_FIRST 7619 id: LANG_INSERT_FIRST
7619 desc: in onplay menu. insert a track/playlist into dynamic playlist. 7620 desc: deprecated
7620 user: core 7621 user: core
7621 <source> 7622 <source>
7622 *: "Insert Next" 7623 *: ""
7623 </source> 7624 </source>
7624 <dest> 7625 <dest>
7625 *: "Sonrakini Ekle" 7626 *: ""
7626 </dest> 7627 </dest>
7627 <voice> 7628 <voice>
7628 *: "Sonrakini Ekle" 7629 *: ""
7629 </voice> 7630 </voice>
7630</phrase> 7631</phrase>
7631<phrase> 7632<phrase>
@@ -7988,16 +7989,16 @@
7988</phrase> 7989</phrase>
7989<phrase> 7990<phrase>
7990 id: LANG_CATALOG_ADD_TO 7991 id: LANG_CATALOG_ADD_TO
7991 desc: in onplay playlist catalogue submenu 7992 desc: deprecated
7992 user: core 7993 user: core
7993 <source> 7994 <source>
7994 *: "Add to Playlist" 7995 *: ""
7995 </source> 7996 </source>
7996 <dest> 7997 <dest>
7997 *: "Oynatma listesine ekle" 7998 *: ""
7998 </dest> 7999 </dest>
7999 <voice> 8000 <voice>
8000 *: "Oynatma listesine ekle" 8001 *: ""
8001 </voice> 8002 </voice>
8002</phrase> 8003</phrase>
8003<phrase> 8004<phrase>
@@ -8322,11 +8323,11 @@
8322 </source> 8323 </source>
8323 <dest> 8324 <dest>
8324 *: none 8325 *: none
8325 recording: "-inf" 8326 recording: "-sonsuz"
8326 </dest> 8327 </dest>
8327 <voice> 8328 <voice>
8328 *: none 8329 *: none
8329 recording: "eksi sonsuzluk" 8330 recording: "eksi sonsuz"
8330 </voice> 8331 </voice>
8331</phrase> 8332</phrase>
8332<phrase> 8333<phrase>
@@ -8575,16 +8576,16 @@
8575</phrase> 8576</phrase>
8576<phrase> 8577<phrase>
8577 id: LANG_INSERT_SHUFFLED 8578 id: LANG_INSERT_SHUFFLED
8578 desc: in onplay menu. insert a track/playlist randomly into dynamic playlist 8579 desc: deprecated
8579 user: core 8580 user: core
8580 <source> 8581 <source>
8581 *: "Insert Shuffled" 8582 *: ""
8582 </source> 8583 </source>
8583 <dest> 8584 <dest>
8584 *: "Karışık Ekle" 8585 *: ""
8585 </dest> 8586 </dest>
8586 <voice> 8587 <voice>
8587 *: "Karışık Ekle" 8588 *: ""
8588 </voice> 8589 </voice>
8589</phrase> 8590</phrase>
8590<phrase> 8591<phrase>
@@ -8803,16 +8804,16 @@
8803</phrase> 8804</phrase>
8804<phrase> 8805<phrase>
8805 id: LANG_INSERT_LAST_SHUFFLED 8806 id: LANG_INSERT_LAST_SHUFFLED
8806 desc: in onplay menu. insert a playlist randomly at end of dynamic playlist 8807 desc: deprecated
8807 user: core 8808 user: core
8808 <source> 8809 <source>
8809 *: "Insert Last Shuffled" 8810 *: ""
8810 </source> 8811 </source>
8811 <dest> 8812 <dest>
8812 *: "Son Karıştırılanı Ekle" 8813 *: ""
8813 </dest> 8814 </dest>
8814 <voice> 8815 <voice>
8815 *: "Son Karıştırılanı Ekle" 8816 *: ""
8816 </voice> 8817 </voice>
8817</phrase> 8818</phrase>
8818<phrase> 8819<phrase>
@@ -8910,31 +8911,16 @@
8910</phrase> 8911</phrase>
8911<phrase> 8912<phrase>
8912 id: LANG_ALARM_MOD_KEYS 8913 id: LANG_ALARM_MOD_KEYS
8913 desc: Shown key functions in alarm menu (for the RTC alarm mod). 8914 desc: deprecated
8914 user: core 8915 user: core
8915 <source> 8916 <source>
8916 *: none 8917 *: ""
8917 alarm: "PLAY=Set OFF=Cancel"
8918 gigabeats: "SELECT=Set POWER=Cancel"
8919 ipod*: "SELECT=Set MENU=Cancel"
8920 iriverh10,iriverh10_5gb: "SELECT=Set PREV=Cancel"
8921 mpiohd300: "ENTER=Set MENU=Cancel"
8922 sansafuzeplus: "SELECT=Set BACK=Cancel"
8923 vibe500: "OK=Set C=Cancel"
8924 </source> 8918 </source>
8925 <dest> 8919 <dest>
8926 *: none 8920 *: ""
8927 alarm: "OYNAT=KAPALI olarak ayarla=Ä°ptal"
8928 gigabeats: "SELECT=GÜÇ Ayarla=İptal"
8929 ipod*: "SELECT=Ayarla,MENÜ=İptal"
8930 iriverh10,iriverh10_5gb: "SELECT=Ayarla PREV=Ä°ptal"
8931 mpiohd300: "ENTER=Ayarla MENÜ=İptal"
8932 sansafuzeplus: "SELECT=GERÄ° Ayarla=Ä°ptal"
8933 vibe500: "Tamam=Ayarla, C=Ä°ptal"
8934 </dest> 8921 </dest>
8935 <voice> 8922 <voice>
8936 *: none 8923 *: ""
8937 alarm,ipod*: ""
8938 </voice> 8924 </voice>
8939</phrase> 8925</phrase>
8940<phrase> 8926<phrase>
@@ -9893,16 +9879,16 @@
9893</phrase> 9879</phrase>
9894<phrase> 9880<phrase>
9895 id: LANG_INSERT_LAST 9881 id: LANG_INSERT_LAST
9896 desc: in onplay menu. append a track/playlist into dynamic playlist. 9882 desc: deprecated
9897 user: core 9883 user: core
9898 <source> 9884 <source>
9899 *: "Insert Last" 9885 *: ""
9900 </source> 9886 </source>
9901 <dest> 9887 <dest>
9902 *: "Sona Ekle" 9888 *: ""
9903 </dest> 9889 </dest>
9904 <voice> 9890 <voice>
9905 *: "Sona Ekle" 9891 *: ""
9906 </voice> 9892 </voice>
9907</phrase> 9893</phrase>
9908<phrase> 9894<phrase>
@@ -10290,10 +10276,10 @@
10290</phrase> 10276</phrase>
10291<phrase> 10277<phrase>
10292 id: LANG_AUDIOSCROBBLER 10278 id: LANG_AUDIOSCROBBLER
10293 desc: "Last.fm Log" in the playback menu 10279 desc: "Last.fm Logger" in Plugin/apps/scrobbler
10294 user: core 10280 user: core
10295 <source> 10281 <source>
10296 *: "Last.fm Log" 10282 *: "Last.fm Logger"
10297 </source> 10283 </source>
10298 <dest> 10284 <dest>
10299 *: "Last.fm Günlüğü" 10285 *: "Last.fm Günlüğü"
@@ -11392,10 +11378,10 @@
11392 *: "Q" 11378 *: "Q"
11393 </source> 11379 </source>
11394 <dest> 11380 <dest>
11395 *: "Q" 11381 *: "Kalite"
11396 </dest> 11382 </dest>
11397 <voice> 11383 <voice>
11398 *: "Q" 11384 *: "Kalite"
11399 </voice> 11385 </voice>
11400</phrase> 11386</phrase>
11401<phrase> 11387<phrase>
@@ -12533,11 +12519,11 @@
12533 </source> 12519 </source>
12534 <dest> 12520 <dest>
12535 *: none 12521 *: none
12536 es9018: "Bypass" 12522 es9018: "Ellemeden Geçir"
12537 </dest> 12523 </dest>
12538 <voice> 12524 <voice>
12539 *: none 12525 *: none
12540 es9018: "Bypass" 12526 es9018: "Ellemeden Geçir"
12541 </voice> 12527 </voice>
12542</phrase> 12528</phrase>
12543<phrase> 12529<phrase>
@@ -12669,11 +12655,11 @@
12669 </source> 12655 </source>
12670 <dest> 12656 <dest>
12671 *: none 12657 *: none
12672 es9218: "Brick Wall" 12658 es9218: "Tuğla Duvar (güçlü ses)"
12673 </dest> 12659 </dest>
12674 <voice> 12660 <voice>
12675 *: none 12661 *: none
12676 es9218: "Brick Wall" 12662 es9218: "Tuğla Duvar (güçlü ses)"
12677 </voice> 12663 </voice>
12678</phrase> 12664</phrase>
12679<phrase> 12665<phrase>
@@ -13949,7 +13935,7 @@
13949 *: "" 13935 *: ""
13950 </dest> 13936 </dest>
13951 <voice> 13937 <voice>
13952 *: "Bishop" 13938 *: "Fil"
13953 </voice> 13939 </voice>
13954</phrase> 13940</phrase>
13955<phrase> 13941<phrase>
@@ -14666,58 +14652,58 @@
14666</phrase> 14652</phrase>
14667<phrase> 14653<phrase>
14668 id: LANG_PROPERTIES_ARTIST 14654 id: LANG_PROPERTIES_ARTIST
14669 desc: in properties plugin 14655 desc: deprecated
14670 user: core 14656 user: core
14671 <source> 14657 <source>
14672 *: "[Artist]" 14658 *: ""
14673 </source> 14659 </source>
14674 <dest> 14660 <dest>
14675 *: "[Sanatçı]" 14661 *: ""
14676 </dest> 14662 </dest>
14677 <voice> 14663 <voice>
14678 *: "Sanatçı" 14664 *: ""
14679 </voice> 14665 </voice>
14680</phrase> 14666</phrase>
14681<phrase> 14667<phrase>
14682 id: LANG_PROPERTIES_TITLE 14668 id: LANG_PROPERTIES_TITLE
14683 desc: in properties plugin 14669 desc: deprecated
14684 user: core 14670 user: core
14685 <source> 14671 <source>
14686 *: "[Title]" 14672 *: ""
14687 </source> 14673 </source>
14688 <dest> 14674 <dest>
14689 *: "[Başlık]" 14675 *: ""
14690 </dest> 14676 </dest>
14691 <voice> 14677 <voice>
14692 *: "Başlık" 14678 *: ""
14693 </voice> 14679 </voice>
14694</phrase> 14680</phrase>
14695<phrase> 14681<phrase>
14696 id: LANG_PROPERTIES_ALBUM 14682 id: LANG_PROPERTIES_ALBUM
14697 desc: in properties plugin 14683 desc: deprecated
14698 user: core 14684 user: core
14699 <source> 14685 <source>
14700 *: "[Album]" 14686 *: ""
14701 </source> 14687 </source>
14702 <dest> 14688 <dest>
14703 *: "[Albüm]" 14689 *: ""
14704 </dest> 14690 </dest>
14705 <voice> 14691 <voice>
14706 *: "Albüm" 14692 *: ""
14707 </voice> 14693 </voice>
14708</phrase> 14694</phrase>
14709<phrase> 14695<phrase>
14710 id: LANG_PROPERTIES_DURATION 14696 id: LANG_PROPERTIES_DURATION
14711 desc: in properties plugin 14697 desc: deprecated
14712 user: core 14698 user: core
14713 <source> 14699 <source>
14714 *: "[Duration]" 14700 *: ""
14715 </source> 14701 </source>
14716 <dest> 14702 <dest>
14717 *: "[Süre]" 14703 *: ""
14718 </dest> 14704 </dest>
14719 <voice> 14705 <voice>
14720 *: "Süre" 14706 *: ""
14721 </voice> 14707 </voice>
14722</phrase> 14708</phrase>
14723<phrase> 14709<phrase>
@@ -15051,16 +15037,16 @@
15051</phrase> 15037</phrase>
15052<phrase> 15038<phrase>
15053 id: LANG_CLEAR_PLAYLIST 15039 id: LANG_CLEAR_PLAYLIST
15054 desc: in the pictureflow main menu 15040 desc: deprecated
15055 user: core 15041 user: core
15056 <source> 15042 <source>
15057 *: "Clear playlist" 15043 *: ""
15058 </source> 15044 </source>
15059 <dest> 15045 <dest>
15060 *: "Oynatma listesini temizle" 15046 *: ""
15061 </dest> 15047 </dest>
15062 <voice> 15048 <voice>
15063 *: "Oynatma listesini temizle" 15049 *: ""
15064 </voice> 15050 </voice>
15065</phrase> 15051</phrase>
15066<phrase> 15052<phrase>
@@ -15107,7 +15093,7 @@
15107</phrase> 15093</phrase>
15108<phrase> 15094<phrase>
15109 id: LANG_DIRECT 15095 id: LANG_DIRECT
15110 desc: in the pictureflow settings 15096 desc: in the pictureflow settings, also a volume adjustment mode
15111 user: core 15097 user: core
15112 <source> 15098 <source>
15113 *: "Direct" 15099 *: "Direct"
@@ -15455,10 +15441,10 @@
15455 *: "Track" 15441 *: "Track"
15456 </source> 15442 </source>
15457 <dest> 15443 <dest>
15458 *: "Track" 15444 *: "Parça"
15459 </dest> 15445 </dest>
15460 <voice> 15446 <voice>
15461 *: "Track" 15447 *: "Parça"
15462 </voice> 15448 </voice>
15463</phrase> 15449</phrase>
15464<phrase> 15450<phrase>
@@ -15750,16 +15736,16 @@
15750</phrase> 15736</phrase>
15751<phrase> 15737<phrase>
15752 id: LANG_CLEAR_LIST_AND_PLAY_NEXT 15738 id: LANG_CLEAR_LIST_AND_PLAY_NEXT
15753 desc: in onplay menu. Replace current playlist with selected tracks 15739 desc: deprecated
15754 user: core 15740 user: core
15755 <source> 15741 <source>
15756 *: "Clear List & Play Next" 15742 *: ""
15757 </source> 15743 </source>
15758 <dest> 15744 <dest>
15759 *: "Listeyi Temizle ve Sonrakini Oynat" 15745 *: ""
15760 </dest> 15746 </dest>
15761 <voice> 15747 <voice>
15762 *: "Listeyi Temizle ve Sonrakini Oynat" 15748 *: ""
15763 </voice> 15749 </voice>
15764</phrase> 15750</phrase>
15765<phrase> 15751<phrase>
@@ -15820,16 +15806,16 @@
15820</phrase> 15806</phrase>
15821<phrase> 15807<phrase>
15822 id: LANG_CLEAR_LIST_AND_PLAY_SHUFFLED 15808 id: LANG_CLEAR_LIST_AND_PLAY_SHUFFLED
15823 desc: in onplay menu. Replace current playlist with selected tracks in random order. 15809 desc: deprecated
15824 user: core 15810 user: core
15825 <source> 15811 <source>
15826 *: "Clear List & Play Shuffled" 15812 *: ""
15827 </source> 15813 </source>
15828 <dest> 15814 <dest>
15829 *: "Listeyi Temizle ve Karışık Oynat" 15815 *: ""
15830 </dest> 15816 </dest>
15831 <voice> 15817 <voice>
15832 *: "Listeyi Temizle ve Karışık Oynat" 15818 *: ""
15833 </voice> 15819 </voice>
15834</phrase> 15820</phrase>
15835<phrase> 15821<phrase>
@@ -15876,142 +15862,142 @@
15876</phrase> 15862</phrase>
15877<phrase> 15863<phrase>
15878 id: LANG_PLAYLIST_RELOAD_AFTER_SAVE 15864 id: LANG_PLAYLIST_RELOAD_AFTER_SAVE
15879 desc: reload playlist after saving 15865 desc: deprecated
15880 user: core 15866 user: core
15881 <source> 15867 <source>
15882 *: "Reload After Saving" 15868 *: ""
15883 </source> 15869 </source>
15884 <dest> 15870 <dest>
15885 *: "Kaydettikten Sonra Yeniden Yükle" 15871 *: ""
15886 </dest> 15872 </dest>
15887 <voice> 15873 <voice>
15888 *: "Kaydettikten Sonra Yeniden Yükle" 15874 *: ""
15889 </voice> 15875 </voice>
15890</phrase> 15876</phrase>
15891<phrase> 15877<phrase>
15892 id: LANG_PROPERTIES_ALBUMARTIST 15878 id: LANG_PROPERTIES_ALBUMARTIST
15893 desc: in properties plugin 15879 desc: deprecated
15894 user: core 15880 user: core
15895 <source> 15881 <source>
15896 *: "[Album Artist]" 15882 *: ""
15897 </source> 15883 </source>
15898 <dest> 15884 <dest>
15899 *: "[Albüm sanatçısı]" 15885 *: ""
15900 </dest> 15886 </dest>
15901 <voice> 15887 <voice>
15902 *: "Albüm sanatçısı" 15888 *: ""
15903 </voice> 15889 </voice>
15904</phrase> 15890</phrase>
15905<phrase> 15891<phrase>
15906 id: LANG_PROPERTIES_GENRE 15892 id: LANG_PROPERTIES_GENRE
15907 desc: in properties plugin 15893 desc: deprecated
15908 user: core 15894 user: core
15909 <source> 15895 <source>
15910 *: "[Genre]" 15896 *: ""
15911 </source> 15897 </source>
15912 <dest> 15898 <dest>
15913 *: "[Tür]" 15899 *: ""
15914 </dest> 15900 </dest>
15915 <voice> 15901 <voice>
15916 *: "Tür" 15902 *: ""
15917 </voice> 15903 </voice>
15918</phrase> 15904</phrase>
15919<phrase> 15905<phrase>
15920 id: LANG_PROPERTIES_COMMENT 15906 id: LANG_PROPERTIES_COMMENT
15921 desc: in properties plugin 15907 desc: deprecated
15922 user: core 15908 user: core
15923 <source> 15909 <source>
15924 *: "[Comment]" 15910 *: ""
15925 </source> 15911 </source>
15926 <dest> 15912 <dest>
15927 *: "[Yorum]" 15913 *: ""
15928 </dest> 15914 </dest>
15929 <voice> 15915 <voice>
15930 *: "Yorum Yap" 15916 *: ""
15931 </voice> 15917 </voice>
15932</phrase> 15918</phrase>
15933<phrase> 15919<phrase>
15934 id: LANG_PROPERTIES_COMPOSER 15920 id: LANG_PROPERTIES_COMPOSER
15935 desc: in properties plugin 15921 desc: deprecated
15936 user: core 15922 user: core
15937 <source> 15923 <source>
15938 *: "[Composer]" 15924 *: ""
15939 </source> 15925 </source>
15940 <dest> 15926 <dest>
15941 *: "[Besteci]" 15927 *: ""
15942 </dest> 15928 </dest>
15943 <voice> 15929 <voice>
15944 *: "Besteci" 15930 *: ""
15945 </voice> 15931 </voice>
15946</phrase> 15932</phrase>
15947<phrase> 15933<phrase>
15948 id: LANG_PROPERTIES_YEAR 15934 id: LANG_PROPERTIES_YEAR
15949 desc: in properties plugin 15935 desc: deprecated
15950 user: core 15936 user: core
15951 <source> 15937 <source>
15952 *: "[Year]" 15938 *: ""
15953 </source> 15939 </source>
15954 <dest> 15940 <dest>
15955 *: "[Yıl]" 15941 *: ""
15956 </dest> 15942 </dest>
15957 <voice> 15943 <voice>
15958 *: "Yıl" 15944 *: ""
15959 </voice> 15945 </voice>
15960</phrase> 15946</phrase>
15961<phrase> 15947<phrase>
15962 id: LANG_PROPERTIES_TRACKNUM 15948 id: LANG_PROPERTIES_TRACKNUM
15963 desc: in properties plugin 15949 desc: deprecated
15964 user: core 15950 user: core
15965 <source> 15951 <source>
15966 *: "[Tracknum]" 15952 *: ""
15967 </source> 15953 </source>
15968 <dest> 15954 <dest>
15969 *: "[Parça numarası]" 15955 *: ""
15970 </dest> 15956 </dest>
15971 <voice> 15957 <voice>
15972 *: "Parça numarası" 15958 *: ""
15973 </voice> 15959 </voice>
15974</phrase> 15960</phrase>
15975<phrase> 15961<phrase>
15976 id: LANG_PROPERTIES_DISCNUM 15962 id: LANG_PROPERTIES_DISCNUM
15977 desc: in properties plugin 15963 desc: deprecated
15978 user: core 15964 user: core
15979 <source> 15965 <source>
15980 *: "[Discnum]" 15966 *: ""
15981 </source> 15967 </source>
15982 <dest> 15968 <dest>
15983 *: "[Disknumarası]" 15969 *: ""
15984 </dest> 15970 </dest>
15985 <voice> 15971 <voice>
15986 *: "Disk numarası" 15972 *: ""
15987 </voice> 15973 </voice>
15988</phrase> 15974</phrase>
15989<phrase> 15975<phrase>
15990 id: LANG_PROPERTIES_FREQUENCY 15976 id: LANG_PROPERTIES_FREQUENCY
15991 desc: in properties plugin 15977 desc: deprecated
15992 user: core 15978 user: core
15993 <source> 15979 <source>
15994 *: "[Frequency]" 15980 *: ""
15995 </source> 15981 </source>
15996 <dest> 15982 <dest>
15997 *: "[Frekans]" 15983 *: ""
15998 </dest> 15984 </dest>
15999 <voice> 15985 <voice>
16000 *: "Frekans" 15986 *: ""
16001 </voice> 15987 </voice>
16002</phrase> 15988</phrase>
16003<phrase> 15989<phrase>
16004 id: LANG_PROPERTIES_BITRATE 15990 id: LANG_PROPERTIES_BITRATE
16005 desc: in properties plugin 15991 desc: deprecated
16006 user: core 15992 user: core
16007 <source> 15993 <source>
16008 *: "[Bitrate]" 15994 *: ""
16009 </source> 15995 </source>
16010 <dest> 15996 <dest>
16011 *: "[Bithızı]" 15997 *: ""
16012 </dest> 15998 </dest>
16013 <voice> 15999 <voice>
16014 *: "bit hızı" 16000 *: ""
16015 </voice> 16001 </voice>
16016</phrase> 16002</phrase>
16017<phrase> 16003<phrase>
@@ -16036,7 +16022,7 @@
16036 *: "dAY" 16022 *: "dAY"
16037 </source> 16023 </source>
16038 <dest> 16024 <dest>
16039 *: "Gün" 16025 *: "dAY"
16040 </dest> 16026 </dest>
16041 <voice> 16027 <voice>
16042 *: "" 16028 *: ""
@@ -16112,3 +16098,766 @@
16112 *: "Azalan" 16098 *: "Azalan"
16113 </voice> 16099 </voice>
16114</phrase> 16100</phrase>
16101<phrase>
16102 id: LANG_ALBUM_ART
16103 desc: in Settings
16104 user: core
16105 <source>
16106 *: "Album Art"
16107 </source>
16108 <dest>
16109 *: "Albüm Kapağı"
16110 </dest>
16111 <voice>
16112 *: "Albüm Kapağı"
16113 </voice>
16114</phrase>
16115<phrase>
16116 id: LANG_PREFER_EMBEDDED
16117 desc: in Settings
16118 user: core
16119 <source>
16120 *: "Prefer Embedded"
16121 </source>
16122 <dest>
16123 *: "Dahili olanı Tercih et"
16124 </dest>
16125 <voice>
16126 *: "Dahili olanı Tercih et"
16127 </voice>
16128</phrase>
16129<phrase>
16130 id: LANG_PREFER_IMAGE_FILE
16131 desc: in Settings
16132 user: core
16133 <source>
16134 *: "Prefer Image File"
16135 </source>
16136 <dest>
16137 *: "Görsel Dosyasını Tercih et"
16138 </dest>
16139 <voice>
16140 *: "Görsel Dosyasını Tercih et"
16141 </voice>
16142</phrase>
16143<phrase>
16144 id: LANG_FM_SYNC_RDS_TIME
16145 desc: in radio screen and Settings
16146 user: core
16147 <source>
16148 *: none
16149 rds: "Sync RDS Time"
16150 </source>
16151 <dest>
16152 *: none
16153 rds: "RDS (radyoVeriSistemi) Saatini EÅŸle"
16154 </dest>
16155 <voice>
16156 *: none
16157 rds: "RDS (radyoVeriSistemi) Saatini EÅŸle"
16158 </voice>
16159</phrase>
16160<phrase>
16161 id: LANG_SORT_ALBUMS_BY
16162 desc: in Settings
16163 user: core
16164 <source>
16165 *: "Sort albums by"
16166 </source>
16167 <dest>
16168 *: "Albümleri şuna göre sırala:"
16169 </dest>
16170 <voice>
16171 *: "Albümleri şuna göre sırala:"
16172 </voice>
16173</phrase>
16174<phrase>
16175 id: LANG_ARTIST_PLUS_NAME
16176 desc: in Settings
16177 user: core
16178 <source>
16179 *: "Artist + Name"
16180 </source>
16181 <dest>
16182 *: "Artist + Ä°sim"
16183 </dest>
16184 <voice>
16185 *: "Artist Ve Ä°sim"
16186 </voice>
16187</phrase>
16188<phrase>
16189 id: LANG_ARTIST_PLUS_YEAR
16190 desc: in Settings
16191 user: core
16192 <source>
16193 *: "Artist + Year"
16194 </source>
16195 <dest>
16196 *: "Artist + Yıl"
16197 </dest>
16198 <voice>
16199 *: "Artist Ve Yıl"
16200 </voice>
16201</phrase>
16202<phrase>
16203 id: LANG_YEAR_SORT_ORDER
16204 desc: in Settings
16205 user: core
16206 <source>
16207 *: "Year sort order"
16208 </source>
16209 <dest>
16210 *: "Yıla göre sırala"
16211 </dest>
16212 <voice>
16213 *: "Yıla göre sırala"
16214 </voice>
16215</phrase>
16216<phrase>
16217 id: LANG_SHOW_YEAR_IN_ALBUM_TITLE
16218 desc: in Settings
16219 user: core
16220 <source>
16221 *: "Show year in album title"
16222 </source>
16223 <dest>
16224 *: "Albüm İsminde Yılı da Yaz"
16225 </dest>
16226 <voice>
16227 *: "Albüm İsminde Yılı da Yaz"
16228 </voice>
16229</phrase>
16230<phrase>
16231 id: LANG_WAIT_FOR_CACHE
16232 desc: in Settings
16233 user: core
16234 <source>
16235 *: "Cache needs to finish updating first!"
16236 </source>
16237 <dest>
16238 *: "Önbelleğin güncellenmesini bitirmesi gerek önce!"
16239 </dest>
16240 <voice>
16241 *: "Önbelleğin güncellenmesini bitirmesi gerek önce!"
16242 </voice>
16243</phrase>
16244<phrase>
16245 id: LANG_TRACK_INFO
16246 desc: Track Info Title
16247 user: core
16248 <source>
16249 *: "Track Info"
16250 </source>
16251 <dest>
16252 *: "Parça Bilgisi"
16253 </dest>
16254 <voice>
16255 *: "Parça Bilgisi"
16256 </voice>
16257</phrase>
16258<phrase>
16259 id: LANG_PLAY
16260 desc: play selected file/directory, in playlist context menu
16261 user: core
16262 <source>
16263 *: "Play"
16264 </source>
16265 <dest>
16266 *: "Oynat"
16267 </dest>
16268 <voice>
16269 *: "Oynat"
16270 </voice>
16271</phrase>
16272<phrase>
16273 id: LANG_PLAY_SHUFFLED
16274 desc: play selected files in shuffled order, in playlist context menu
16275 user: core
16276 <source>
16277 *: "Play Shuffled"
16278 </source>
16279 <dest>
16280 *: "Karılmış Oynat"
16281 </dest>
16282 <voice>
16283 *: "Karılmış Oynat"
16284 </voice>
16285</phrase>
16286<phrase>
16287 id: LANG_KEEP_CURRENT_TRACK_ON_REPLACE
16288 desc: used in the playlist settings menu
16289 user: core
16290 <source>
16291 *: "Keep Current Track When Replacing Playlist"
16292 </source>
16293 <dest>
16294 *: "Oynatma Listesi Yenilendiğinde Şuanki Parçayı Tut"
16295 </dest>
16296 <voice>
16297 *: "Oynatma Listesi Yenilendiğinde Şuanki Parçayı Tut"
16298 </voice>
16299</phrase>
16300<phrase>
16301 id: LANG_CLEAR_SETTINGS_ON_HOLD
16302 desc: in the system sub menu
16303 user: core
16304 <source>
16305 *: none
16306 clear_settings_on_hold,iriverh10: "Clear settings when reset button is held during startup"
16307 ipod4g,ipodcolor,ipodmini1g,ipodmini2g,ipodnano1g,ipodvideo: "Clear settings when hold switch is on during startup"
16308 </source>
16309 <dest>
16310 *: none
16311 clear_settings_on_hold,iriverh10: "Başlangıç sırasında Reset tuşu basılı tutulduğunda ayarları sıfırla"
16312 ipod4g,ipodcolor,ipodmini1g,ipodmini2g,ipodnano1g,ipodvideo: "Başlangıç sırasında Hold tuşu basılı tutulduğunda ayarları sıfırla"
16313 </dest>
16314 <voice>
16315 *: none
16316 clear_settings_on_hold,iriverh10: "Başlangıç sırasında Reset tuşu basılı tutulduğunda ayarları sıfırla"
16317 ipod4g,ipodcolor,ipodmini1g,ipodmini2g,ipodnano1g,ipodvideo: "Başlangıç sırasında Hold tuşu basılı tutulduğunda ayarları sıfırla"
16318 </voice>
16319</phrase>
16320<phrase>
16321 id: LANG_REWIND_ACROSS_TRACKS
16322 desc: in playback settings menu
16323 user: core
16324 <source>
16325 *: "Rewind Across Tracks"
16326 </source>
16327 <dest>
16328 *: "Parçalar içerisinde Geriye Sar"
16329 </dest>
16330 <voice>
16331 *: "Parçalar içerisinde Geriye Sar"
16332 </voice>
16333</phrase>
16334<phrase>
16335 id: LANG_SET_AS
16336 desc: used in the onplay menu
16337 user: core
16338 <source>
16339 *: "Set As..."
16340 </source>
16341 <dest>
16342 *: "Şöyle Ayarlansın..."
16343 </dest>
16344 <voice>
16345 *: "Şöyle Ayarlansın..."
16346 </voice>
16347</phrase>
16348<phrase>
16349 id: LANG_PLAYLIST_DIR
16350 desc: used in the onplay menu
16351 user: core
16352 <source>
16353 *: "Playlist Directory"
16354 </source>
16355 <dest>
16356 *: "Oynatma Listesi Dizini"
16357 </dest>
16358 <voice>
16359 *: "Oynatma Listesi Dizini"
16360 </voice>
16361</phrase>
16362<phrase>
16363 id: LANG_START_DIR
16364 desc: used in the onplay menu
16365 user: core
16366 <source>
16367 *: "Start Directory"
16368 </source>
16369 <dest>
16370 *: "Başlangıç Dizini"
16371 </dest>
16372 <voice>
16373 *: "Başlangıç Dizini"
16374 </voice>
16375</phrase>
16376<phrase>
16377 id: LANG_RECORDING_DIR
16378 desc: used in the onplay menu
16379 user: core
16380 <source>
16381 *: none
16382 recording: "Recording Directory"
16383 </source>
16384 <dest>
16385 *: none
16386 recording: "Kayıt etme Dizini"
16387 </dest>
16388 <voice>
16389 *: none
16390 recording: "Kayıt etme Dizini"
16391 </voice>
16392</phrase>
16393<phrase>
16394 id: LANG_ADD_TO_PL
16395 desc: used in the onplay menu
16396 user: core
16397 <source>
16398 *: "Add to Playlist..."
16399 </source>
16400 <dest>
16401 *: "Oynatma Listesine ekle..."
16402 </dest>
16403 <voice>
16404 *: "Oynatma Listesine ekle..."
16405 </voice>
16406</phrase>
16407<phrase>
16408 id: LANG_ADD_TO_EXISTING_PL
16409 desc: used in the onplay menu
16410 user: core
16411 <source>
16412 *: "Add to Existing Playlist"
16413 </source>
16414 <dest>
16415 *: "Var olan bir Oynatma Listesine ekle"
16416 </dest>
16417 <voice>
16418 *: "Var olan bir Oynatma Listesine ekle"
16419 </voice>
16420</phrase>
16421<phrase>
16422 id: LANG_PLAYING_NEXT
16423 desc: used in the onplay menu
16424 user: core
16425 <source>
16426 *: "Playing Next..."
16427 </source>
16428 <dest>
16429 *: "Bir Sonraki Oynanıyor..."
16430 </dest>
16431 <voice>
16432 *: "Bir Sonraki Oynanıyor..."
16433 </voice>
16434</phrase>
16435<phrase>
16436 id: LANG_PLAY_NEXT
16437 desc: used in the onplay menu
16438 user: core
16439 <source>
16440 *: "Play Next"
16441 </source>
16442 <dest>
16443 *: "Bir Sonrakini Oynat"
16444 </dest>
16445 <voice>
16446 *: "Bir Sonrakini Oynat"
16447 </voice>
16448</phrase>
16449<phrase>
16450 id: LANG_ADD_SHUFFLED
16451 desc: used in the onplay menu
16452 user: core
16453 <source>
16454 *: "Add Shuffled"
16455 </source>
16456 <dest>
16457 *: "Karılmışı Ekle"
16458 </dest>
16459 <voice>
16460 *: "Karılmışı Ekle"
16461 </voice>
16462</phrase>
16463<phrase>
16464 id: LANG_PLAY_LAST
16465 desc: used in the onplay menu
16466 user: core
16467 <source>
16468 *: "Play Last"
16469 </source>
16470 <dest>
16471 *: "Sonuncuyu Oynat"
16472 </dest>
16473 <voice>
16474 *: "Sonuncuyu Oynat"
16475 </voice>
16476</phrase>
16477<phrase>
16478 id: LANG_PLAY_LAST_SHUFFLED
16479 desc: used in the onplay menu
16480 user: core
16481 <source>
16482 *: "Play Last Shuffled"
16483 </source>
16484 <dest>
16485 *: "Son Karılmış olanı Oynat"
16486 </dest>
16487 <voice>
16488 *: "Son Karılmış olanı Oynat"
16489 </voice>
16490</phrase>
16491<phrase>
16492 id: LANG_VOLUME_ADJUST_MODE
16493 desc: in system settings
16494 user: core
16495 <source>
16496 *: none
16497 perceptual_volume: "Volume Adjustment Mode"
16498 </source>
16499 <dest>
16500 *: none
16501 perceptual_volume: "Ses Seviyesi Ayarlaması Modu"
16502 </dest>
16503 <voice>
16504 *: none
16505 perceptual_volume: "Ses Seviyesi Ayarlaması Modu"
16506 </voice>
16507</phrase>
16508<phrase>
16509 id: LANG_VOLUME_ADJUST_NORM_STEPS
16510 desc: in system settings
16511 user: core
16512 <source>
16513 *: none
16514 perceptual_volume: "Number of Volume Steps"
16515 </source>
16516 <dest>
16517 *: none
16518 perceptual_volume: "Ses Seviyesi Adımı Miktarı"
16519 </dest>
16520 <voice>
16521 *: none
16522 perceptual_volume: "Ses Seviyesi Adımı Miktarı"
16523 </voice>
16524</phrase>
16525<phrase>
16526 id: LANG_PERCEPTUAL
16527 desc: in system settings -> volume adjustment mode
16528 user: core
16529 <source>
16530 *: none
16531 perceptual_volume: "Perceptual"
16532 </source>
16533 <dest>
16534 *: none
16535 perceptual_volume: "Algısal"
16536 </dest>
16537 <voice>
16538 *: none
16539 perceptual_volume: "Algısal"
16540 </voice>
16541</phrase>
16542<phrase>
16543 id: LANG_SHOW_TRACKS_WHILE_BROWSING
16544 desc: in PictureFlow Main Menu
16545 user: core
16546 <source>
16547 *: "Show Tracks While Browsing"
16548 </source>
16549 <dest>
16550 *: "Tarar iken Parçaları Göster"
16551 </dest>
16552 <voice>
16553 *: "Tarar iken Parçaları Göster"
16554 </voice>
16555</phrase>
16556<phrase>
16557 id: LANG_GOTO_LAST_ALBUM
16558 desc: in PictureFlow Main Menu
16559 user: core
16560 <source>
16561 *: "Go to Last Album"
16562 </source>
16563 <dest>
16564 *: "Sondaki Albüme Git"
16565 </dest>
16566 <voice>
16567 *: "Sondaki Albüme Git"
16568 </voice>
16569</phrase>
16570<phrase>
16571 id: LANG_DATABASE_DIR
16572 desc: in database settings menu
16573 user: core
16574 <source>
16575 *: "Database Directory"
16576 </source>
16577 <dest>
16578 *: "Veritabanı Dizini"
16579 </dest>
16580 <voice>
16581 *: "Veritabanı Dizini"
16582 </voice>
16583</phrase>
16584<phrase>
16585 id: LANG_REMOVE_QUEUED_TRACKS
16586 desc: Confirmation dialog
16587 user: core
16588 <source>
16589 *: "Remove Queued Tracks?"
16590 </source>
16591 <dest>
16592 *: "Sıralanmış Parçaları Silmeyi lütfeder misin?"
16593 </dest>
16594 <voice>
16595 *: "Sıralanmış Parçaları Silmeyi lütfeder misin?"
16596 </voice>
16597</phrase>
16598<phrase>
16599 id: LANG_QUICK_IGNORE_DIRACHE
16600 desc: in Settings
16601 user: core
16602 <source>
16603 *: "Quick (Ignore Directory Cache)"
16604 </source>
16605 <dest>
16606 *: "Hızlı (Dizin Önbelleğini Görmezden gelerek)"
16607 </dest>
16608 <voice>
16609 *: "Hızlı (Dizin Önbelleğini Görmezden gelerek)"
16610 </voice>
16611</phrase>
16612<phrase>
16613 id: LANG_WPS
16614 desc: in Settings
16615 user: core
16616 <source>
16617 *: "What's Playing Screen"
16618 </source>
16619 <dest>
16620 *: "Ne oynuyor? Ekranı"
16621 </dest>
16622 <voice>
16623 *: "Ne oynuyor? Ekranı"
16624 </voice>
16625</phrase>
16626<phrase>
16627 id: LANG_DEFAULT_BROWSER
16628 desc: in Settings
16629 user: core
16630 <source>
16631 *: "Default Browser"
16632 </source>
16633 <dest>
16634 *: "Varsayılan Tarayıcı"
16635 </dest>
16636 <voice>
16637 *: "Varsayılan Tarayıcı"
16638 </voice>
16639</phrase>
16640<phrase>
16641 id: LANG_AMAZE_MENU
16642 desc: Amaze game
16643 user: core
16644 <source>
16645 *: "Amaze Main Menu"
16646 </source>
16647 <dest>
16648 *: "Amaze Ana Menü"
16649 </dest>
16650 <voice>
16651 *: "Amaze Ana Menü"
16652 </voice>
16653</phrase>
16654<phrase>
16655 id: LANG_SET_MAZE_SIZE
16656 desc: Maze size in Amaze game
16657 user: core
16658 <source>
16659 *: "Set Maze Size"
16660 </source>
16661 <dest>
16662 *: "Labirent boyutunu Ayarla"
16663 </dest>
16664 <voice>
16665 *: "Labirent boyutunu Ayarla"
16666 </voice>
16667</phrase>
16668<phrase>
16669 id: LANG_VIEW_MAP
16670 desc: Map in Amaze game
16671 user: core
16672 <source>
16673 *: "View Map"
16674 </source>
16675 <dest>
16676 *: "Haritaya Bak"
16677 </dest>
16678 <voice>
16679 *: "Haritaya Bak"
16680 </voice>
16681</phrase>
16682<phrase>
16683 id: LANG_SHOW_COMPASS
16684 desc: Compass in Amaze game
16685 user: core
16686 <source>
16687 *: "Show Compass"
16688 </source>
16689 <dest>
16690 *: "Pusulayı Göster"
16691 </dest>
16692 <voice>
16693 *: "Pusulayı Göster"
16694 </voice>
16695</phrase>
16696<phrase>
16697 id: LANG_SHOW_MAP
16698 desc: Map in Amaze game
16699 user: core
16700 <source>
16701 *: "Show Map"
16702 </source>
16703 <dest>
16704 *: "Haritayı Göster"
16705 </dest>
16706 <voice>
16707 *: "Haritayı Göster"
16708 </voice>
16709</phrase>
16710<phrase>
16711 id: LANG_REMEMBER_PATH
16712 desc: Map in Amaze game
16713 user: core
16714 <source>
16715 *: "Remember Path"
16716 </source>
16717 <dest>
16718 *: "Patikayı Hatırla"
16719 </dest>
16720 <voice>
16721 *: "Patikayı Hatırla"
16722 </voice>
16723</phrase>
16724<phrase>
16725 id: LANG_USE_LARGE_TILES
16726 desc: Map in Amaze game
16727 user: core
16728 <source>
16729 *: "Use Large Tiles"
16730 </source>
16731 <dest>
16732 *: "Büyük Karolar Kullan"
16733 </dest>
16734 <voice>
16735 *: "Büyük Karolar Kullan"
16736 </voice>
16737</phrase>
16738<phrase>
16739 id: LANG_SHOW_SOLUTION
16740 desc: Map in Amaze game
16741 user: core
16742 <source>
16743 *: "Show Solution"
16744 </source>
16745 <dest>
16746 *: "Çözümü Göster"
16747 </dest>
16748 <voice>
16749 *: "Çözümü Göster"
16750 </voice>
16751</phrase>
16752<phrase>
16753 id: LANG_QUIT_WITHOUT_SAVING
16754 desc:
16755 user: core
16756 <source>
16757 *: "Quit without saving"
16758 </source>
16759 <dest>
16760 *: "Kaydetmeden Çık"
16761 </dest>
16762 <voice>
16763 *: "Kaydetmeden Çık"
16764 </voice>
16765</phrase>
16766<phrase>
16767 id: LANG_GENERATING_MAZE
16768 desc: Amaze game
16769 user: core
16770 <source>
16771 *: "Generating maze..."
16772 </source>
16773 <dest>
16774 *: "Labirent OluÅŸturuluyor..."
16775 </dest>
16776 <voice>
16777 *: "Labirent OluÅŸturuluyor..."
16778 </voice>
16779</phrase>
16780<phrase>
16781 id: LANG_YOU_WIN
16782 desc: Success in game
16783 user: core
16784 <source>
16785 *: "You win!"
16786 </source>
16787 <dest>
16788 *: "Kazandın!"
16789 </dest>
16790 <voice>
16791 *: "Kazandın!"
16792 </voice>
16793</phrase>
16794<phrase>
16795 id: LANG_YOU_CHEATED
16796 desc: Cheated in game
16797 user: core
16798 <source>
16799 *: "You cheated!"
16800 </source>
16801 <dest>
16802 *: "Hile yaptın!"
16803 </dest>
16804 <voice>
16805 *: "Hile yaptın!"
16806 </voice>
16807</phrase>
16808<phrase>
16809 id: LANG_DIFFICULTY_EASY
16810 desc: Game difficulty
16811 user: core
16812 <source>
16813 *: "Easy"
16814 </source>
16815 <dest>
16816 *: "Kolay"
16817 </dest>
16818 <voice>
16819 *: "Kolay"
16820 </voice>
16821</phrase>
16822<phrase>
16823 id: LANG_DIFFICULTY_MEDIUM
16824 desc: Game difficulty
16825 user: core
16826 <source>
16827 *: "Medium"
16828 </source>
16829 <dest>
16830 *: "Orta"
16831 </dest>
16832 <voice>
16833 *: "Orta"
16834 </voice>
16835</phrase>
16836<phrase>
16837 id: LANG_DIFFICULTY_HARD
16838 desc: Game difficulty
16839 user: core
16840 <source>
16841 *: "Hard"
16842 </source>
16843 <dest>
16844 *: "Zor"
16845 </dest>
16846 <voice>
16847 *: "Zor"
16848 </voice>
16849</phrase>
16850<phrase>
16851 id: LANG_DIFFICULTY_EXPERT
16852 desc: Game difficulty
16853 user: core
16854 <source>
16855 *: "Expert"
16856 </source>
16857 <dest>
16858 *: "Çok Zor"
16859 </dest>
16860 <voice>
16861 *: "Çok Zor"
16862 </voice>
16863</phrase>
diff --git a/apps/open_plugin.c b/apps/open_plugin.c
index afe59b38e3..8b5fce1d29 100644
--- a/apps/open_plugin.c
+++ b/apps/open_plugin.c
@@ -26,16 +26,12 @@
26#include "pathfuncs.h" 26#include "pathfuncs.h"
27#include "splash.h" 27#include "splash.h"
28#include "lang.h" 28#include "lang.h"
29#include "filetypes.h"
29 30
30/* Define LOGF_ENABLE to enable logf output in this file */ 31/* Define LOGF_ENABLE to enable logf output in this file */
31/*#define LOGF_ENABLE*/ 32/*#define LOGF_ENABLE*/
32#include "logf.h" 33#include "logf.h"
33 34
34#define ROCK_EXT "rock"
35#define ROCK_LEN sizeof(ROCK_EXT)
36#define OP_EXT "opx"
37#define OP_LEN sizeof(OP_EXT)
38
39static const uint32_t open_plugin_csum = OPEN_PLUGIN_CHECKSUM; 35static const uint32_t open_plugin_csum = OPEN_PLUGIN_CHECKSUM;
40 36
41static const int op_entry_sz = sizeof(struct open_plugin_entry_t); 37static const int op_entry_sz = sizeof(struct open_plugin_entry_t);
@@ -279,7 +275,6 @@ struct open_plugin_entry_t * open_plugin_get_entry(void)
279*/ 275*/
280uint32_t open_plugin_add_path(const char *key, const char *plugin, const char *parameter) 276uint32_t open_plugin_add_path(const char *key, const char *plugin, const char *parameter)
281{ 277{
282 size_t len;
283 uint32_t hash; 278 uint32_t hash;
284 int32_t lang_id; 279 int32_t lang_id;
285 char *pos = "\0"; 280 char *pos = "\0";
@@ -306,12 +301,15 @@ uint32_t open_plugin_add_path(const char *key, const char *plugin, const char *p
306 301
307 while (plugin) 302 while (plugin)
308 { 303 {
304 int fattr = filetype_get_attr(plugin);
305
309 /* name */ 306 /* name */
310 if (path_basename(plugin, (const char **)&pos) == 0) 307 if (path_basename(plugin, (const char **)&pos) == 0)
311 pos = "\0"; 308 pos = "\0";
312 309
313 len = strlcpy(op_entry->name, pos, OPEN_PLUGIN_NAMESZ); 310 strlcpy(op_entry->name, pos, OPEN_PLUGIN_NAMESZ);
314 if (len > ROCK_LEN && strcasecmp(&(pos[len-ROCK_LEN]), "." ROCK_EXT) == 0) 311
312 if (fattr == FILE_ATTR_ROCK)
315 { 313 {
316 /* path */ 314 /* path */
317 strmemccpy(op_entry->path, plugin, OPEN_PLUGIN_BUFSZ); 315 strmemccpy(op_entry->path, plugin, OPEN_PLUGIN_BUFSZ);
@@ -320,11 +318,21 @@ uint32_t open_plugin_add_path(const char *key, const char *plugin, const char *p
320 parameter = ""; 318 parameter = "";
321 strmemccpy(op_entry->param, parameter, OPEN_PLUGIN_BUFSZ); 319 strmemccpy(op_entry->param, parameter, OPEN_PLUGIN_BUFSZ);
322 } 320 }
323 else if (len > OP_LEN && strcasecmp(&(pos[len-OP_LEN]), "." OP_EXT) == 0) 321 else if (fattr == FILE_ATTR_OPX)
324 { 322 {
325 /* get the entry from the opx file */ 323 /* get the entry from the opx file */
326 op_load_entry(0, OPEN_PLUGIN_LANG_IGNORE, op_entry, plugin); 324 op_load_entry(0, OPEN_PLUGIN_LANG_IGNORE, op_entry, plugin);
327 } 325 }
326 else if(!parameter && lang_id != LANG_SHORTCUTS)
327 {
328 strmemccpy(op_entry->param, plugin, OPEN_PLUGIN_BUFSZ);
329 plugin = filetype_get_viewer(op_entry->path, OPEN_PLUGIN_BUFSZ, plugin);
330 if (!plugin)
331 {
332 logf("OP no plugin found to run %s", op_entry->param);
333 break;
334 }
335 }
328 else 336 else
329 { 337 {
330 break; 338 break;
@@ -349,6 +357,8 @@ uint32_t open_plugin_add_path(const char *key, const char *plugin, const char *p
349static bool callback_show_item(char *name, int attr, struct tree_context *tc) 357static bool callback_show_item(char *name, int attr, struct tree_context *tc)
350{ 358{
351 (void)name; 359 (void)name;
360 (void)tc;
361#if 0
352 if(attr & ATTR_DIRECTORY) 362 if(attr & ATTR_DIRECTORY)
353 { 363 {
354 if (strstr(tc->currdir, PLUGIN_DIR) != NULL) 364 if (strstr(tc->currdir, PLUGIN_DIR) != NULL)
@@ -364,6 +374,9 @@ static bool callback_show_item(char *name, int attr, struct tree_context *tc)
364 return true; 374 return true;
365 } 375 }
366 return false; 376 return false;
377#endif
378 return attr & ATTR_DIRECTORY ||
379 (filetype_supported(attr) && (attr & FILE_ATTR_AUDIO) != FILE_ATTR_AUDIO);
367} 380}
368 381
369/* open_plugin_browse() 382/* open_plugin_browse()
diff --git a/apps/plugin.c b/apps/plugin.c
index bd93cb8b5c..931b8f1fd4 100644
--- a/apps/plugin.c
+++ b/apps/plugin.c
@@ -837,6 +837,7 @@ static const struct plugin_api rockbox_api = {
837#endif 837#endif
838 playlist_get_first_index, 838 playlist_get_first_index,
839 playlist_get_display_index, 839 playlist_get_display_index,
840 filetype_get_plugin,
840}; 841};
841 842
842static int plugin_buffer_handle; 843static int plugin_buffer_handle;
diff --git a/apps/plugin.h b/apps/plugin.h
index 24eb28b2bd..df519f28cf 100644
--- a/apps/plugin.h
+++ b/apps/plugin.h
@@ -974,6 +974,7 @@ struct plugin_api {
974#endif 974#endif
975 int (*playlist_get_first_index)(const struct playlist_info* playlist); 975 int (*playlist_get_first_index)(const struct playlist_info* playlist);
976 int (*playlist_get_display_index)(void); 976 int (*playlist_get_display_index)(void);
977 char* (*filetype_get_plugin)(int attr, char *buffer, size_t buffer_len);
977}; 978};
978 979
979/* plugin header */ 980/* plugin header */
diff --git a/apps/plugins/CATEGORIES b/apps/plugins/CATEGORIES
index 28b8b67c68..c91d02ade8 100644
--- a/apps/plugins/CATEGORIES
+++ b/apps/plugins/CATEGORIES
@@ -57,7 +57,6 @@ lastfm_scrobbler_viewer,viewers
57logo,demos 57logo,demos
58lrcplayer,apps 58lrcplayer,apps
59lua,viewers 59lua,viewers
60lua_scripts,demos
61fractals,demos 60fractals,demos
62main_menu_config,apps 61main_menu_config,apps
63matrix,demos 62matrix,demos
@@ -82,6 +81,7 @@ pacbox,games
82pdbox,viewers 81pdbox,viewers
83pegbox,games 82pegbox,games
84periodic_table,apps 83periodic_table,apps
84picross,games
85pictureflow,demos 85pictureflow,demos
86pitch_detector,apps 86pitch_detector,apps
87pitch_screen,viewers 87pitch_screen,viewers
diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES
index edc801362f..8028758ef0 100644
--- a/apps/plugins/SOURCES
+++ b/apps/plugins/SOURCES
@@ -116,7 +116,7 @@ metronome.c
116/* Lua needs at least 160 KB to work in */ 116/* Lua needs at least 160 KB to work in */
117#if PLUGIN_BUFFER_SIZE >= 0x80000 117#if PLUGIN_BUFFER_SIZE >= 0x80000
118boomshine.lua 118boomshine.lua
119lua_scripts.lua 119picross.lua
120#ifdef HAVE_LCD_COLOR 120#ifdef HAVE_LCD_COLOR
121pixel-painter.lua 121pixel-painter.lua
122#endif /* HAVE_LCD_COLOR */ 122#endif /* HAVE_LCD_COLOR */
diff --git a/apps/plugins/SUBDIRS b/apps/plugins/SUBDIRS
index b9c18b5fd9..7884989d1c 100644
--- a/apps/plugins/SUBDIRS
+++ b/apps/plugins/SUBDIRS
@@ -87,4 +87,5 @@ mpegplayer
87#if PLUGIN_BUFFER_SIZE >= 0x80000 87#if PLUGIN_BUFFER_SIZE >= 0x80000
88lua 88lua
89lua_scripts 89lua_scripts
90picross
90#endif 91#endif
diff --git a/apps/plugins/imageviewer/imageviewer.c b/apps/plugins/imageviewer/imageviewer.c
index d1a512c4fd..9d5aea7f15 100644
--- a/apps/plugins/imageviewer/imageviewer.c
+++ b/apps/plugins/imageviewer/imageviewer.c
@@ -1033,7 +1033,7 @@ enum plugin_status plugin_start(const void* parameter)
1033 long greysize; /* helper */ 1033 long greysize; /* helper */
1034#endif 1034#endif
1035 1035
1036 if(!parameter) return PLUGIN_ERROR; 1036 if(!parameter) {rb->splash(HZ*2, "No file"); return PLUGIN_ERROR; }
1037 1037
1038 rb->strcpy(np_file, parameter); 1038 rb->strcpy(np_file, parameter);
1039 if (get_image_type(np_file, false) == IMAGE_UNKNOWN) 1039 if (get_image_type(np_file, false) == IMAGE_UNKNOWN)
@@ -1051,8 +1051,6 @@ enum plugin_status plugin_start(const void* parameter)
1051 1051
1052 get_pic_list(); 1052 get_pic_list();
1053 1053
1054 if(!entries) return PLUGIN_ERROR;
1055
1056#ifdef USEGSLIB 1054#ifdef USEGSLIB
1057 if (!grey_init(buf, buf_size, GREY_ON_COP, 1055 if (!grey_init(buf, buf_size, GREY_ON_COP,
1058 LCD_WIDTH, LCD_HEIGHT, &greysize)) 1056 LCD_WIDTH, LCD_HEIGHT, &greysize))
diff --git a/apps/plugins/lua_scripts/dbgettags.lua b/apps/plugins/lua/include_lua/dbgettags.lua
index 8e9f26393d..8e9f26393d 100644
--- a/apps/plugins/lua_scripts/dbgettags.lua
+++ b/apps/plugins/lua/include_lua/dbgettags.lua
diff --git a/apps/plugins/lua/include_lua/draw_poly.lua b/apps/plugins/lua/include_lua/draw_poly.lua
index 23e02d0955..d5bc83ae39 100644
--- a/apps/plugins/lua/include_lua/draw_poly.lua
+++ b/apps/plugins/lua/include_lua/draw_poly.lua
@@ -46,7 +46,9 @@ local _poly = {} do
46 local flood_fill 46 local flood_fill
47 47
48 -- draws a non-filled figure based on points in t-points 48 -- draws a non-filled figure based on points in t-points
49 local function polyline(img, x, y, t_pts, color, bClosed, bClip, scale_x, scale_y) 49 local function polyline(img, x, y, t_pts, color, bClosed, bClip, scale_x, scale_y, b_size_only)
50 local draw_fn = _line
51 if b_size_only == true then draw_fn = function() end end
50 scale_x = scale_x or 1 52 scale_x = scale_x or 1
51 scale_y = scale_y or 1 53 scale_y = scale_y or 1
52 54
@@ -69,8 +71,7 @@ local _poly = {} do
69 else 71 else
70 pt2 = {t_pts[i] * scale_x, t_pts[i + 1] * scale_y} 72 pt2 = {t_pts[i] * scale_x, t_pts[i + 1] * scale_y}
71 end-- first and last point 73 end-- first and last point
72 74 draw_fn(img, pt1[1] + x, pt1[2] + y, pt2[1] + x, pt2[2] + y, color, bClip)
73 _line(img, pt1[1] + x, pt1[2] + y, pt2[1] + x, pt2[2] + y, color, bClip)
74 if pt1[1] > max_x then max_x = pt1[1] end 75 if pt1[1] > max_x then max_x = pt1[1] end
75 if pt1[2] > max_y then max_y = pt1[2] end 76 if pt1[2] > max_y then max_y = pt1[2] end
76 end 77 end
@@ -80,12 +81,12 @@ local _poly = {} do
80 end 81 end
81 82
82 -- draws a closed figure based on points in t_pts 83 -- draws a closed figure based on points in t_pts
83 _poly.polygon = function(img, x, y, t_pts, color, fillcolor, bClip, scale_x, scale_y) 84 _poly.polygon = function(img, x, y, t_pts, color, fillcolor, bClip, scale_x, scale_y, b_size_only)
84 scale_x = scale_x or 1 85 scale_x = scale_x or 1
85 scale_y = scale_y or 1 86 scale_y = scale_y or 1
86 if #t_pts < 2 then error("not enough points", 3) end 87 if #t_pts < 2 then error("not enough points", 3) end
87 88
88 if fillcolor then 89 if fillcolor and b_size_only ~= true then
89 flood_fill = flood_fill or require("draw_floodfill") 90 flood_fill = flood_fill or require("draw_floodfill")
90 local x_min, x_max = 0, 0 91 local x_min, x_max = 0, 0
91 local y_min, y_max = 0, 0 92 local y_min, y_max = 0, 0
@@ -119,7 +120,7 @@ local _poly = {} do
119 _NIL, _NIL, _NIL, _NIL, bClip, BSAND, fillcolor) 120 _NIL, _NIL, _NIL, _NIL, bClip, BSAND, fillcolor)
120 end 121 end
121 122
122 polyline(img, x, y, t_pts, color, true, bClip, scale_x, scale_y) 123 return polyline(img, x, y, t_pts, color, true, bClip, scale_x, scale_y, b_size_only)
123 end 124 end
124 125
125 -- expose internal functions to the outside through _poly table 126 -- expose internal functions to the outside through _poly table
diff --git a/apps/plugins/lua_scripts/filebrowse.lua b/apps/plugins/lua/include_lua/filebrowse.lua
index 0640ec3764..0640ec3764 100755
--- a/apps/plugins/lua_scripts/filebrowse.lua
+++ b/apps/plugins/lua/include_lua/filebrowse.lua
diff --git a/apps/plugins/lua_scripts/fileviewers.lua b/apps/plugins/lua/include_lua/fileviewers.lua
index c686f3eeda..c686f3eeda 100755
--- a/apps/plugins/lua_scripts/fileviewers.lua
+++ b/apps/plugins/lua/include_lua/fileviewers.lua
diff --git a/apps/plugins/lua/lapi.c b/apps/plugins/lua/lapi.c
index 6426cd94a9..120f8c8313 100644
--- a/apps/plugins/lua/lapi.c
+++ b/apps/plugins/lua/lapi.c
@@ -1057,8 +1057,11 @@ static const char *aux_upvalue (StkId fi, int n, TValue **val) {
1057 } 1057 }
1058 else { 1058 else {
1059 Proto *p = f->l.p; 1059 Proto *p = f->l.p;
1060 if (!(1 <= n && n <= p->sizeupvalues)) return NULL; 1060 if (!(1 <= n && n <= p->nups)) // not a valid upvalue
1061 return NULL;
1061 *val = f->l.upvals[n-1]->v; 1062 *val = f->l.upvals[n-1]->v;
1063 if (!(1 <= n && n <= p->sizeupvalues)) // don't have a name for this upvalue
1064 return "";
1062 return getstr(p->upvalues[n-1]); 1065 return getstr(p->upvalues[n-1]);
1063 } 1066 }
1064} 1067}
diff --git a/apps/plugins/lua/lua.make b/apps/plugins/lua/lua.make
index 60dfd24cdd..c85182880b 100644
--- a/apps/plugins/lua/lua.make
+++ b/apps/plugins/lua/lua.make
@@ -16,14 +16,7 @@ LUA_OBJ := $(call c2obj, $(LUA_SRC))
16OTHER_SRC += $(LUA_SRC) 16OTHER_SRC += $(LUA_SRC)
17 17
18LUA_INCLUDEDIR := $(LUA_SRCDIR)/include_lua 18LUA_INCLUDEDIR := $(LUA_SRCDIR)/include_lua
19LUA_INCLUDELIST := $(addprefix $(LUA_BUILDDIR)/,audio.lua blit.lua color.lua \ 19LUA_INCLUDELIST := $(wildcard $(LUA_INCLUDEDIR)/*.lua)
20 draw.lua draw_floodfill.lua draw_poly.lua draw_num.lua \
21 draw_text.lua files.lua image.lua image_save.lua lcd.lua \
22 math_ex.lua print.lua timer.lua playlist.lua pcm.lua \
23 sound.lua rbcompat.lua rbsettings.lua poly_points.lua \
24 printtable.lua printmenus.lua printsubmenu.lua \
25 menubuttons.lua menucoresettings.lua create_kbd_layout.lua \
26 temploader.lua)
27 20
28ifndef APP_TYPE 21ifndef APP_TYPE
29 ROCKS += $(LUA_BUILDDIR)/lua.rock 22 ROCKS += $(LUA_BUILDDIR)/lua.rock
@@ -31,6 +24,7 @@ else
31 ### simulator 24 ### simulator
32 ROCKS += $(LUA_BUILDDIR)/lua.rock 25 ROCKS += $(LUA_BUILDDIR)/lua.rock
33endif 26endif
27all: $(subst $(LUA_INCLUDEDIR)/,$(LUA_BUILDDIR)/,$(LUA_INCLUDELIST))
34 28
35$(LUA_BUILDDIR)/lua.rock: $(LUA_OBJ) $(TLSFLIB) $(LUA_BUILDDIR)/actions.lua $(LUA_BUILDDIR)/buttons.lua $(LUA_BUILDDIR)/settings.lua \ 29$(LUA_BUILDDIR)/lua.rock: $(LUA_OBJ) $(TLSFLIB) $(LUA_BUILDDIR)/actions.lua $(LUA_BUILDDIR)/buttons.lua $(LUA_BUILDDIR)/settings.lua \
36 $(LUA_BUILDDIR)/rocklib_aux.o $(LUA_BUILDDIR)/rb_defines.lua $(LUA_BUILDDIR)/sound_defines.lua \ 30 $(LUA_BUILDDIR)/rocklib_aux.o $(LUA_BUILDDIR)/rb_defines.lua $(LUA_BUILDDIR)/sound_defines.lua \
@@ -66,7 +60,7 @@ $(LUA_BUILDDIR)/rocklib_aux.o: $(LUA_BUILDDIR)/rocklib_aux.c
66 $(call PRINTS,CC $(<F))$(CC) $(INCLUDES) $(PLUGINFLAGS) -I $(LUA_SRCDIR) -c $< -o $@ 60 $(call PRINTS,CC $(<F))$(CC) $(INCLUDES) $(PLUGINFLAGS) -I $(LUA_SRCDIR) -c $< -o $@
67 61
68$(LUA_BUILDDIR)/%.lua: $(LUA_INCLUDEDIR)/%.lua | $(LUA_BUILDDIR) 62$(LUA_BUILDDIR)/%.lua: $(LUA_INCLUDEDIR)/%.lua | $(LUA_BUILDDIR)
69 $(call PRINTS,CP $(subst $(LUA_INCLUDEDIR)/,,$<))cp $< $@ 63 $(call PRINTS,CP $(notdir $<))cp $< $@
70 64
71$(LUA_BUILDDIR)/lua.refmap: $(LUA_OBJ) $(TLSFLIB) 65$(LUA_BUILDDIR)/lua.refmap: $(LUA_OBJ) $(TLSFLIB)
72 66
diff --git a/apps/plugins/lua/luaconf.h b/apps/plugins/lua/luaconf.h
index f7dd99b19e..77d4057118 100644
--- a/apps/plugins/lua/luaconf.h
+++ b/apps/plugins/lua/luaconf.h
@@ -818,6 +818,7 @@ extern long rb_pow(long, long);
818/*else*/ 818/*else*/
819#define LUA_USER_H "lua_user.h" 819#define LUA_USER_H "lua_user.h"
820#define LUA_DISABLE_BYTECODE 820#define LUA_DISABLE_BYTECODE
821#ifndef SIMULATOR
821#define LUA_OPTIMIZE_DEBUG 2 /* Lua Compact Debug -- Terry Ellison 2015 */ 822#define LUA_OPTIMIZE_DEBUG 2 /* Lua Compact Debug -- Terry Ellison 2015 */
822 823#endif
823#endif 824#endif
diff --git a/apps/plugins/lua_scripts.lua b/apps/plugins/lua_scripts/lua_scripts.lua
index 43593d96b0..331611d389 100644
--- a/apps/plugins/lua_scripts.lua
+++ b/apps/plugins/lua_scripts/lua_scripts.lua
@@ -21,7 +21,7 @@
21 ****************************************************************************/ 21 ****************************************************************************/
22]] 22]]
23 23
24local scrpath = rb.current_path() .. "/lua_scripts/" 24local scrpath = rb.current_path()
25 25
26package.path = scrpath .. "/?.lua;" .. package.path --add lua_scripts directory to path 26package.path = scrpath .. "/?.lua;" .. package.path --add lua_scripts directory to path
27require("printmenus") 27require("printmenus")
@@ -29,7 +29,6 @@ require("printmenus")
29rb.actions = nil 29rb.actions = nil
30package.loaded["actions"] = nil 30package.loaded["actions"] = nil
31 31
32local excludedsrc = ";filebrowse.lua;fileviewers.lua;printmenu.lua;dbgettags.lua;"
33-------------------------------------------------------------------------------- 32--------------------------------------------------------------------------------
34local Icon_Plugin = 0x9 33local Icon_Plugin = 0x9
35 34
@@ -47,7 +46,7 @@ local function get_files(path, norecurse, finddir, findfile, f_t, d_t)
47 if name:len() <= 2 and (name == "." or name == "..") then 46 if name:len() <= 2 and (name == "." or name == "..") then
48 return false 47 return false
49 end 48 end
50 if string.find(excludedsrc, ";" .. name .. ";") then 49 if string.sub(name, 1, 1) == '.' then
51 return false 50 return false
52 end 51 end
53 if string.sub(name, -4) == ".lua" then 52 if string.sub(name, -4) == ".lua" then
diff --git a/apps/plugins/lua_scripts/lua_scripts.make b/apps/plugins/lua_scripts/lua_scripts.make
index 2f46f9d74a..9151ab6d1c 100644
--- a/apps/plugins/lua_scripts/lua_scripts.make
+++ b/apps/plugins/lua_scripts/lua_scripts.make
@@ -10,7 +10,6 @@
10LUASCR_SRCDIR := $(APPSDIR)/plugins/lua_scripts 10LUASCR_SRCDIR := $(APPSDIR)/plugins/lua_scripts
11LUASCR_BUILDDIR := $(BUILDDIR)/apps/plugins/lua_scripts 11LUASCR_BUILDDIR := $(BUILDDIR)/apps/plugins/lua_scripts
12LUASCRS := $(wildcard $(LUASCR_SRCDIR)/*.lua) 12LUASCRS := $(wildcard $(LUASCR_SRCDIR)/*.lua)
13
14#DUMMY := $(info [${LUASCRS}]) 13#DUMMY := $(info [${LUASCRS}])
15 14
16DUMMY : all 15DUMMY : all
@@ -18,7 +17,6 @@ DUMMY : all
18all: $(subst $(LUASCR_SRCDIR)/,$(LUASCR_BUILDDIR)/,$(LUASCRS)) 17all: $(subst $(LUASCR_SRCDIR)/,$(LUASCR_BUILDDIR)/,$(LUASCRS))
19 18
20$(LUASCR_BUILDDIR)/%.lua: $(LUASCR_SRCDIR)/%.lua | $(LUASCR_BUILDDIR) 19$(LUASCR_BUILDDIR)/%.lua: $(LUASCR_SRCDIR)/%.lua | $(LUASCR_BUILDDIR)
21 $(call PRINTS,CP $(subst $(LUASCR_SRCDIR)/,,$<))cp $< $@ 20 $(call PRINTS,CP $(subst $(APPSDIR)/,,$<))cp $< $@
22
23$(LUASCR_BUILDDIR): 21$(LUASCR_BUILDDIR):
24 $(call PRINTS,MKDIR $@)mkdir -p $(LUASCR_BUILDDIR)/ 22 $(call PRINTS,MKDIR $@)mkdir -p $(LUASCR_BUILDDIR)/
diff --git a/apps/plugins/lua_scripts/stars.lua b/apps/plugins/lua_scripts/stars.lua
index 14fae0c4b7..e05007afb6 100644
--- a/apps/plugins/lua_scripts/stars.lua
+++ b/apps/plugins/lua_scripts/stars.lua
@@ -17,7 +17,7 @@
17]]-- 17]]--
18--https://nullprogram.com/blog/2011/06/13/ [Infinite Parallax Starfield] 18--https://nullprogram.com/blog/2011/06/13/ [Infinite Parallax Starfield]
19 19
20-- Imports 20-- Imports
21local _clr = require("color") -- clrset, clrinc provides device independent colors 21local _clr = require("color") -- clrset, clrinc provides device independent colors
22local _lcd = require("lcd") -- lcd helper functions 22local _lcd = require("lcd") -- lcd helper functions
23local _draw = require("draw") -- draw all the things (primitives) 23local _draw = require("draw") -- draw all the things (primitives)
@@ -32,13 +32,13 @@ local BLACK = _clr.set(0, 0, 0, 0)
32local RED = _clr.set(WHITE, 100) 32local RED = _clr.set(WHITE, 100)
33local GREEN = _clr.set(WHITE, 0, 100) 33local GREEN = _clr.set(WHITE, 0, 100)
34local BGREEN = _clr.set(WHITE, 0, 255) 34local BGREEN = _clr.set(WHITE, 0, 255)
35local BLUE = _clr.set(WHITE, 0, 0, 100) 35local BLUE = _clr.set(WHITE, 0, 0, 255)
36 36
37local STAR_SEED = 0x9d2c5680; 37local STAR_SEED = 0x811C9DC5;
38local STAR_TILE_SIZE = math.max(rb.LCD_WIDTH, rb.LCD_HEIGHT) * 4; 38local STAR_TILE_SIZE = math.max(rb.LCD_WIDTH, rb.LCD_HEIGHT) * 4;
39local bxor, band, rshift, lshift, arshift = bit.bxor, bit.band, bit.rshift, bit.lshift, bit.arshift 39local bxor, band, rshift, lshift, arshift = bit.bxor, bit.band, bit.rshift, bit.lshift, bit.arshift
40local random, randomseed = math.random, math.randomseed 40local random, randomseed = math.random, math.randomseed
41local start_x, start_y, start_z 41local start_x, start_y, start_z, scale_x, scale_y
42 42
43-- load users coords from file if it exists 43-- load users coords from file if it exists
44local fname = rb.PLUGIN_DATA_DIR .. "/stars.pos" 44local fname = rb.PLUGIN_DATA_DIR .. "/stars.pos"
@@ -53,6 +53,10 @@ if file then
53 start_y = tonumber(line) or 0 53 start_y = tonumber(line) or 0
54 elseif v == 3 then 54 elseif v == 3 then
55 start_z = tonumber(line) or 0 55 start_z = tonumber(line) or 0
56 elseif v == 4 then
57 scale_x = tonumber(line) or 1
58 elseif v == 5 then
59 scale_y = tonumber(line) or 1
56 else 60 else
57 break; 61 break;
58 end 62 end
@@ -62,15 +66,15 @@ end
62 66
63-- Robert Jenkins' 96 bit Mix Function. 67-- Robert Jenkins' 96 bit Mix Function.
64local function mix (a, b, c) 68local function mix (a, b, c)
65 a=a-b; a=a-c; a=bxor(a, (rshift(c, 13))); 69 a=a-b; a=a-c; a=bxor(a, (rshift(c, 13)))
66 b=b-c; b=b-a; b=bxor(b, (lshift(a, 8))); 70 b=b-c; b=b-a; b=bxor(b, (lshift(a, 8)))
67 c=c-a; c=c-b; c=bxor(c, (rshift(b, 13))); 71 c=c-a; c=c-b; c=bxor(c, (rshift(b, 13)))
68 a=a-b; a=a-c; a=bxor(a, (rshift(c, 12))); 72 a=a-b; a=a-c; a=bxor(a, (rshift(c, 12)))
69 b=b-c; b=b-a; b=bxor(b, (lshift(a, 16))); 73 b=b-c; b=b-a; b=bxor(b, (lshift(a, 16)))
70 c=c-a; c=c-b; c=bxor(c, (rshift(b, 5))); 74 c=c-a; c=c-b; c=bxor(c, (rshift(b, 5)))
71 a=a-b; a=a-c; a=bxor(a, (rshift(c, 3))); 75 a=a-b; a=a-c; a=bxor(a, (rshift(c, 3)))
72 b=b-c; b=b-a; b=bxor(b, (lshift(a, 10))); 76 b=b-c; b=b-a; b=bxor(b, (lshift(a, 10)))
73 c=c-a; c=c-b; c=bxor(c, (rshift(b, 15))); 77 c=c-a; c=c-b; c=bxor(c, (rshift(b, 15)))
74 78
75 return c 79 return c
76end 80end
@@ -94,13 +98,13 @@ local function s_bytes_nib(bits, value)
94 return bbuffer 98 return bbuffer
95end 99end
96 100
97--[[ given table t and total elems desired uses random elems of t 101--[[ given table t and total elems desired uses random elems of t
98 and random numbers between 1 and max_v if #t < total_elems]] 102 and random numbers between 1 and max_v if #t < total_elems]]
99function randomize_table(t, total_elems, max_v) 103function randomize_table(t, total_elems, max_v)
100 local rand_t = {} 104 local rand_t = {}
101 local i = 1 105 local i = 1
102 repeat 106 repeat
103 local v = t[random(1, total_elems)] 107 local v = t[random(i, total_elems)]
104 if v then 108 if v then
105 rand_t[i] = v 109 rand_t[i] = v
106 else 110 else
@@ -111,21 +115,30 @@ function randomize_table(t, total_elems, max_v)
111 return rand_t 115 return rand_t
112end 116end
113 117
114local function drawship(img, x, y, color, ship_t) 118local function drawship(img, ship_t)
115 --_poly.polyline(img, x, y, ship_t, color, true, true) 119 --_poly.polyline(img, x, y, ship_t, color, true, true)
116 _poly.polygon(img, x, y, ship_t, color, BLACK, true) 120 _poly.polygon(img, ship_t.x, ship_t.y, ship_t.disp_t, ship_t.color, ship_t.fillcolor, true)
117end 121end
118 122
119local function draw_astroid(img, x, y, size, shape, color, scale_x, scale_y) 123local function draw_astroid(img, x, y, shape, color, fillcolor, scale_x, scale_y)
120 --the random number generator gets seeded with the hash so we get the same figure each time 124 --the random number generator gets seeded with the hash so we get the same figure each time
121 randomseed(shape) 125 randomseed(shape)
126 local move_x, move_y
122 -- we also use the 4 bytes of the hash as 4 coord pairs and randomly generate 8 more (16) half the size (8) 127 -- we also use the 4 bytes of the hash as 4 coord pairs and randomly generate 8 more (16) half the size (8)
123 local uniq_t = randomize_table(s_bytes_nib(32, shape), 16, 8) 128 local uniq_t = randomize_table(s_bytes_nib(32, shape), 16, 8)
124 _poly.polyline(img, x, y, uniq_t, color, true, true, scale_x or 1, scale_y or 1) 129 move_x, move_y = _poly.polyline(img, 0, 0, uniq_t, color, true, true, scale_x or 1, scale_y or 1, true)
125 --_poly.polygon(img, x, y, uniq_t, color, color, true, scale_x or 1, scale_y or 1) --filled figures 130 x = x - move_x / 2
131 y = y - move_y / 2
132 if fillcolor then
133 _poly.polygon(img, x, y, uniq_t, color, fillcolor, true, scale_x or 1, scale_y or 1) --filled figures
134 else
135 _poly.polyline(img, x, y, uniq_t, color, true, true, scale_x or 1, scale_y or 1)
136 end
137
138 return x, y, move_x, move_y
126end 139end
127 140
128local function drawStars (img, xoff, yoff, starscale, color, scale_x, scale_y) 141local function drawStars(img, drawFn, xoff, yoff, starscale, color, scale_x, scale_y)
129 local size = STAR_TILE_SIZE / starscale 142 local size = STAR_TILE_SIZE / starscale
130 local s_x, s_y = scale_x, scale_y 143 local s_x, s_y = scale_x, scale_y
131 local w, h = rb.LCD_WIDTH, rb.LCD_HEIGHT 144 local w, h = rb.LCD_WIDTH, rb.LCD_HEIGHT
@@ -139,100 +152,245 @@ local function drawStars (img, xoff, yoff, starscale, color, scale_x, scale_y)
139 for j = sy, h + sy + size*3, size do 152 for j = sy, h + sy + size*3, size do
140 local hash = mix(STAR_SEED, (i / size), (j / size)) 153 local hash = mix(STAR_SEED, (i / size), (j / size))
141 for n = 0, 2 do 154 for n = 0, 2 do
142 local px = (hash % size) + (i - xoff); 155 local px = (hash % size) + (i - xoff)
143 hash = arshift(hash, 3) 156 hash = arshift(hash, 3)
144 157
145 local py = (hash % size) + (j - yoff); 158 local py = (hash % size) + (j - yoff)
146 hash = arshift(hash, 3) 159 hash = arshift(hash, 3)
147
148 if px > 0 and px < w and py > 0 and py < h then 160 if px > 0 and px < w and py > 0 and py < h then
149 if n > 0 and starscale < 5 then 161 drawFn(img, px, py, color, n, hash)
150 draw_astroid(img, px, py, n, hash, color, s_x, s_y)
151 else
152 if scale_x > 1 then
153 img:set(px, py, color)
154 img:set(px + 1, py, color)
155 elseif scale_y > 1 then
156 img:set(px, py, color)
157 img:set(px, py + 1, color)
158 else
159 img:set(px, py, color)
160 end
161 end
162 end 162 end
163 end 163 end
164 end 164 end
165 end 165 end
166end 166end
167 167
168local function update_lcd()
169 rb.lcd_puts(0,0, "[Infinite Starfield]")
170 _lcd:update()
171 rb.sleep(100)
172 update_lcd = _lcd.update
173end
174
175local backlight_on
176local function turn_on_backlight()
177 rb.backlight_force_on();
178 backlight_on = function() end
179end
180backlight_on = turn_on_backlight
181
168do 182do
169 local act = rb.actions 183 local act = rb.actions
170 local quit = false 184 local quit = false
171 local last_action = 0 185 --local last_action = 0
172 local x,y,z = start_x or 0, start_y or 0, start_z or 8 186 local x,y,z = start_x or 0, start_y or 0, start_z or 8
173 local x_fast = rb.LCD_WIDTH / 4 187 local s_x, s_y = scale_x or 1, scale_y or 1
174 local y_fast = rb.LCD_HEIGHT / 4 188 local ship_t = {x = (rb.LCD_WIDTH - 0xF) / 2,
175 local ship_x = (rb.LCD_WIDTH - 0xF) / 2 189 y = rb.LCD_HEIGHT - (rb.LCD_HEIGHT / 3),
176 local ship_y = rb.LCD_HEIGHT - (rb.LCD_HEIGHT / 3) 190 color = BGREEN,
177 local scale_x, scale_y = 1, 1 191 fillcolor = BLACK,
178 -- vector draw the ship points for each direction (<>^v) 192 -- ship vector coords x,y, x,y,...
179 local ship_lt_t = {0,7, 15,0, 9,7, 15,15, 0,7} 193 lt_t = {0,7, 15,0, 9,7, 15,15, 0,7},
180 local ship_rt_t = {0,0, 5,7, 0,15, 15,7, 0,0} 194 rt_t = {0,0, 5,7, 0,15, 15,7, 0,0},
181 local ship_up_t = {0,15, 7,0, 15,15, 7,9, 0,15} 195 up_t = {0,15, 7,0, 15,15, 7,9, 0,15},
182 local ship_dn_t = {0,0, 7,15, 15,0, 7,5, 0,0} 196 dn_t = {0,0, 7,15, 15,0, 7,5, 0,0}
183 local ship_t = ship_up_t 197 }
198 ship_t.disp_t = ship_t.up_t
199
200 local fast = {x = 1, y = 1, count = 0, inc_x = rb.LCD_WIDTH / 16, inc_y = rb.LCD_HEIGHT / 16}
201
202 local last = {sx = s_x, sy = s_y, dx = 0, dy = 0, inc_x = 0, inc_y = 0}
203
204 local function draw_points(img, x, y, color, n, hash)
205 if s_x > s_y then
206 img:line(x, y, x + s_x, y, color, true)
207 elseif s_y > s_x then
208 img:line(x, y, x, y + s_y, color, true)
209 else
210 img:set(x, y, color, true)
211 end
212 end
213
214 function action_drift()
215 if last.dx > 0 then
216 last.dx = last.dx - 1
217 x = x + last.dx
218 elseif last.dx < 0 then
219 last.dx = last.dx + 1
220 x = x + last.dx
221 end
222 if last.dy > 0 then
223 last.dy = last.dy - 1
224 y = y + last.dy
225 elseif last.dy < 0 then
226 last.dy = last.dy + 1
227 y = y + last.dy
228 end
229 if last.dx == 0 and last.dy == 0 then
230 rockev.suspend("timer")
231 end
232 rockev.trigger("action", true, act.ACTION_REDRAW)
233 end
184 234
185 function action_event(action) 235 function action_event(action)
236 backlight_on()
186 if action == act.PLA_EXIT or action == act.PLA_CANCEL then 237 if action == act.PLA_EXIT or action == act.PLA_CANCEL then
187 quit = true 238 quit = true
188 start_x, start_y, start_z = x, y, z 239 start_x, start_y, start_z = x, y, z
240 scale_x, scale_y = last.sx, last.sy
189 elseif action == act.PLA_RIGHT_REPEAT then 241 elseif action == act.PLA_RIGHT_REPEAT then
190 x = x + x_fast 242 fast.count = fast.count + 1
191 scale_x = scale_x + 1 243 if fast.count % 10 == 0 then
192 scale_y = 1 244 fast.x = fast.x + fast.inc_x
245 if fast.count > 100 then s_x = s_x + 1 end
246 end
247 x = x + fast.x + last.inc_x
248 s_y = last.sy
249 last.dx = fast.x
250 ship_t.disp_t = ship_t.rt_t
193 elseif action == act.PLA_LEFT_REPEAT then 251 elseif action == act.PLA_LEFT_REPEAT then
194 x = x - x_fast 252 fast.count = fast.count + 1
195 scale_x = scale_x + 1 253 if fast.count % 10 == 0 then
196 scale_y = 1 254 fast.x = fast.x + fast.inc_x
255 if fast.count > 100 then s_x = s_x + 1 end
256 end
257 x = x - fast.x + last.inc_x
258 s_y = last.sy
259 last.dx = -fast.x
260 ship_t.disp_t = ship_t.lt_t
197 elseif action == act.PLA_UP_REPEAT then 261 elseif action == act.PLA_UP_REPEAT then
198 y = y - y_fast 262 fast.count = fast.count + 1
199 scale_y = scale_y + 1 263 if fast.count % 10 == 0 then
200 scale_x = 1 264 fast.y = fast.y + fast.inc_y
265 if fast.count > 100 then s_y = s_y + 1 end
266 end
267 y = y - fast.y + last.inc_y
268 s_x = last.sx
269 last.dy = -fast.y
270 ship_t.disp_t = ship_t.up_t
201 elseif action == act.PLA_DOWN_REPEAT then 271 elseif action == act.PLA_DOWN_REPEAT then
202 y = y + y_fast 272 fast.count = fast.count + 1
203 scale_y = scale_y + 1 273 if fast.count % 10 == 0 then
204 scale_x = 1 274 fast.y = fast.y + fast.inc_y
275 if fast.count > 100 then s_y = s_y + 1 end
276 end
277 y = y + fast.y + last.inc_y
278 s_x = last.sx
279 last.dy = fast.y
280 ship_t.disp_t = ship_t.dn_t
205 elseif action == act.PLA_RIGHT then 281 elseif action == act.PLA_RIGHT then
206 x = x + 1 282 last.inc_x = last.inc_x + 1
207 ship_t = ship_rt_t 283 x = x + last.dx + 1
284 if last.inc_x < 0 then
285 last.inc_x = 0
286 end
287 last.dx = last.inc_x
288 ship_t.disp_t = ship_t.rt_t
208 elseif action == act.PLA_LEFT then 289 elseif action == act.PLA_LEFT then
209 x = x - 1 290 last.inc_x = last.inc_x - 1
210 ship_t = ship_lt_t 291 x = x + last.dx - 1
292 if last.inc_x > 0 then
293 last.inc_x = 0
294 end
295 last.dx = last.inc_x
296 ship_t.disp_t = ship_t.lt_t
211 elseif action == act.PLA_UP then 297 elseif action == act.PLA_UP then
212 y = y - 1 298 last.inc_y = last.inc_y - 1
213 ship_t = ship_up_t 299 y = y + last.dy - 1
300 if last.inc_y > 0 then
301 last.inc_y = 0
302 end
303 last.dy = last.inc_y
304 ship_t.disp_t = ship_t.up_t
214 elseif action == act.PLA_DOWN then 305 elseif action == act.PLA_DOWN then
215 y = y + 1 306 last.inc_y = last.inc_y + 1
216 ship_t = ship_dn_t 307 y = y + last.dy + 1
308 if last.inc_y < 0 then
309 last.inc_y = 0
310 end
311 last.dy = last.inc_y
312 ship_t.disp_t = ship_t.dn_t
313 elseif action == act.PLA_SELECT_REPEAT then
314 rockev.suspend("timer", true)
315 if s_x < 10 and s_y < 10 then
316 s_x = last.sx + 1
317 s_y = last.sy + 1
318 last.sx = s_x
319 last.sy = s_y
320 end
217 elseif action == act.PLA_SELECT then 321 elseif action == act.PLA_SELECT then
218 z = z + 4 322 s_x = last.sx + 1
219 if z > 16 then z = 0 end 323 s_y = last.sy + 1
324 if s_x > 10 or s_y > 10 then
325 s_x = 1
326 s_y = 1
327 end
328 last.sx = s_x
329 last.sy = s_y
220 elseif action == act.ACTION_NONE then 330 elseif action == act.ACTION_NONE then
221 scale_x = 1 331 if fast.count > 100 then
222 scale_y = 1 332 z = (random(0, 400) / 100) * 4
333 end
334 fast.count = 0
335 fast.x = fast.inc_x
336 fast.y = fast.inc_y
337 s_x = last.sx
338 s_y = last.sy
339 backlight_on = turn_on_backlight
340 rb.backlight_use_settings()
341 if last.dx ~= 0 or last.dy ~= 0 then
342 rockev.suspend("timer", false)
343 else
344 last.inc_x = 0
345 last.inc_y = 0
346 end
223 end 347 end
224 348
225 _lcd:clear(BLACK) 349 _lcd:clear(BLACK)
226 for i = 0, z, 4 do 350 for i = 0, z, 4 do
227 drawStars(_LCD, x, y, i+1, RED, scale_x, scale_y) 351 drawStars(_LCD, draw_points, x, y, i+1, RED, s_x, s_y)
228 drawStars(_LCD, x, y, i+2, GREEN, scale_x, scale_y) 352 drawStars(_LCD, draw_points, x, y, i+2, GREEN, s_x, s_y)
229 drawStars(_LCD, x, y, i+3, BLUE, scale_x, scale_y) 353 drawStars(_LCD, draw_points, x, y, i+3, BLUE, s_x, s_y)
230 drawStars(_LCD, x, y, i+4, WHITE, scale_x, scale_y) 354 drawStars(_LCD, draw_points, x, y, i+4, WHITE, s_x, s_y)
355 end
356
357 local hit_t = {}
358 local SHIP_X, SHIP_Y = ship_t.x + 8, ship_t.y + 8 --center the ship coords
359 local function draw_asteroids(img, x, y, color, n, hash)
360 if n > 0 then
361 local x0, y0, w0, h0
362 x0,y0,w0,h0 = draw_astroid(img, x, y, hash, color, false, s_x, s_y)
363 --check bounds
364 if s_x == s_y and x0 <= SHIP_X and x0+w0 >= SHIP_X and y0+h0 >= SHIP_Y and y0 <= SHIP_Y then
365 local r_t = {x = x0, y = y0, w = w0, h= h0, hash = hash, color = color}
366 hit_t[#hit_t + 1] = r_t
367 end
368 end
231 end 369 end
232 drawship(_LCD, ship_x, ship_y, BGREEN, ship_t)
233 _lcd:update()
234 370
235 last_action = action 371 drawStars(_LCD, draw_asteroids, x, y, 1, RED, s_x, s_y)
372 drawStars(_LCD, draw_asteroids, x, y, 2, GREEN, s_x, s_y)
373 drawStars(_LCD, draw_asteroids, x, y, 3, BLUE, s_x, s_y)
374 drawStars(_LCD, draw_asteroids, x, y, 4, WHITE, s_x, s_y)
375 if fast.count < 10 and last.dx == last.dy then
376 local seen = {} -- might have multiple hits but only show unique hashes
377 for i, v in ipairs(hit_t) do
378 if i < 4 then
379 draw_astroid(_LCD, v.x + v.w / 2, v.y + v.h / 2, v.hash, WHITE, v.color, s_x, s_y)
380 end
381 end
382 for i, v in ipairs(hit_t) do
383 if not seen[v.hash] then
384 rb.lcd_puts(0, (i - 1), string.format("[%x]", v.hash))
385 end
386 seen[v.hash] = i
387 end
388 end
389
390 drawship(_LCD, ship_t)
391 update_lcd()
392
393 --last_action = action
236 end 394 end
237 395
238 function action_set_quit(bQuit) 396 function action_set_quit(bQuit)
@@ -244,13 +402,22 @@ do
244 end 402 end
245end 403end
246 404
405if not rb.backlight_force_on then
406 rb.backlight_force_on = function() end
407end
408
409if not rb.backlight_use_settings then
410 rb.backlight_use_settings = function() end
411end
412
247action_event(rb.actions.ACTION_NONE) -- we can call this now but not after registering.. 413action_event(rb.actions.ACTION_NONE) -- we can call this now but not after registering..
248local eva = rockev.register("action", action_event) 414local eva = rockev.register("action", action_event)
415local evc = rockev.register("timer", action_drift, rb.HZ/7)
249 416
250while not action_quit() do rb.sleep(rb.HZ) end 417while not action_quit() do rb.sleep(rb.HZ) end
251 418
252if start_x and start_y then 419if start_x and start_y then
253 file = io.open(fname, "w") 420 file = io.open(fname, "w")
254 file:write(start_x, "\n", start_y, "\n", start_z, "\n") 421 file:write(start_x, "\n", start_y, "\n", start_z or 0, "\n", scale_x or 1, "\n", scale_y or 1, "\n")
255 io.close( file ) 422 io.close( file )
256end 423end
diff --git a/apps/plugins/mpegplayer/libmpeg2/idct_arm.S b/apps/plugins/mpegplayer/libmpeg2/idct_arm.S
index 90eb5031c7..8ff7c90629 100644
--- a/apps/plugins/mpegplayer/libmpeg2/idct_arm.S
+++ b/apps/plugins/mpegplayer/libmpeg2/idct_arm.S
@@ -21,6 +21,8 @@
21 21
22#include "config.h" 22#include "config.h"
23 23
24 .syntax unified
25
24 .global mpeg2_idct_copy 26 .global mpeg2_idct_copy
25 .type mpeg2_idct_copy, %function 27 .type mpeg2_idct_copy, %function
26 .global mpeg2_idct_add 28 .global mpeg2_idct_add
diff --git a/apps/plugins/mpegplayer/libmpeg2/idct_armv6.S b/apps/plugins/mpegplayer/libmpeg2/idct_armv6.S
index a259721410..ad28cefcf2 100644
--- a/apps/plugins/mpegplayer/libmpeg2/idct_armv6.S
+++ b/apps/plugins/mpegplayer/libmpeg2/idct_armv6.S
@@ -21,6 +21,8 @@
21 21
22#include "config.h" 22#include "config.h"
23 23
24 .syntax unified
25
24 .global mpeg2_idct_copy 26 .global mpeg2_idct_copy
25 .type mpeg2_idct_copy, %function 27 .type mpeg2_idct_copy, %function
26 .global mpeg2_idct_add 28 .global mpeg2_idct_add
diff --git a/apps/plugins/open_plugins.c b/apps/plugins/open_plugins.c
index b608aff789..66200df8a5 100644
--- a/apps/plugins/open_plugins.c
+++ b/apps/plugins/open_plugins.c
@@ -116,10 +116,8 @@ static int op_entry_read_opx(const char *path)
116 int ret = -1; 116 int ret = -1;
117 off_t filesize; 117 off_t filesize;
118 int fd_opx; 118 int fd_opx;
119 int len;
120 119
121 len = rb->strlen(path); 120 if(rb->filetype_get_attr(path) == FILE_ATTR_OPX)
122 if(len > OP_LEN && rb->strcasecmp(&((path)[len-OP_LEN]), "." OP_EXT) == 0)
123 { 121 {
124 fd_opx = rb->open(path, O_RDONLY); 122 fd_opx = rb->open(path, O_RDONLY);
125 if (fd_opx >= 0) 123 if (fd_opx >= 0)
@@ -317,7 +315,7 @@ static int op_entry_transfer(int fd, int fd_tmp,
317 315
318static uint32_t op_entry_add_path(const char *key, const char *plugin, const char *parameter, bool use_key) 316static uint32_t op_entry_add_path(const char *key, const char *plugin, const char *parameter, bool use_key)
319{ 317{
320 int len; 318 char buf[MAX_PATH];
321 uint32_t hash; 319 uint32_t hash;
322 uint32_t newhash; 320 uint32_t newhash;
323 char *pos = "";; 321 char *pos = "";;
@@ -339,8 +337,11 @@ static uint32_t op_entry_add_path(const char *key, const char *plugin, const cha
339 else 337 else
340 hash = op_entry.hash; 338 hash = op_entry.hash;
341 339
340
341
342 if (plugin) 342 if (plugin)
343 { 343 {
344 int fattr = rb->filetype_get_attr(plugin);
344 /* name */ 345 /* name */
345 if (use_key) 346 if (use_key)
346 { 347 {
@@ -353,8 +354,21 @@ static uint32_t op_entry_add_path(const char *key, const char *plugin, const cha
353 if (op_entry.name[0] == '\0' || op_entry.lang_id >= 0) 354 if (op_entry.name[0] == '\0' || op_entry.lang_id >= 0)
354 rb->strlcpy(op_entry.name, pos, OPEN_PLUGIN_NAMESZ); 355 rb->strlcpy(op_entry.name, pos, OPEN_PLUGIN_NAMESZ);
355 356
356 len = rb->strlen(pos); 357
357 if(len > ROCK_LEN && rb->strcasecmp(&(pos[len-ROCK_LEN]), "." ROCK_EXT) == 0) 358
359 if ((!parameter || parameter[0] == '\0') && fattr != FILE_ATTR_ROCK && fattr != FILE_ATTR_OPX)
360 {
361 rb->strlcpy(op_entry.param, plugin, OPEN_PLUGIN_BUFSZ);
362 parameter = op_entry.param;
363 plugin = rb->filetype_get_plugin(fattr, buf, sizeof(buf));
364 if (!plugin)
365 {
366 rb->splashf(HZ * 2, rb->str(LANG_OPEN_PLUGIN_NOT_A_PLUGIN), pos);
367 return 0;
368 }
369 }
370
371 if(fattr == FILE_ATTR_ROCK)
358 { 372 {
359 fd_tmp = rb->open(OPEN_PLUGIN_DAT ".tmp", O_WRONLY | O_CREAT | O_TRUNC, 0666); 373 fd_tmp = rb->open(OPEN_PLUGIN_DAT ".tmp", O_WRONLY | O_CREAT | O_TRUNC, 0666);
360 if (fd_tmp < 0) 374 if (fd_tmp < 0)
diff --git a/apps/plugins/pacbox/pacbox_arm.S b/apps/plugins/pacbox/pacbox_arm.S
index 87696ce6f7..d4500ce45f 100644
--- a/apps/plugins/pacbox/pacbox_arm.S
+++ b/apps/plugins/pacbox/pacbox_arm.S
@@ -22,6 +22,8 @@
22#include "config.h" 22#include "config.h"
23#include "pacbox.h" 23#include "pacbox.h"
24 24
25.syntax unified
26
25 .section .icode,"ax",%progbits 27 .section .icode,"ax",%progbits
26 .global blit_display 28 .global blit_display
27 29
diff --git a/apps/plugins/picross.lua b/apps/plugins/picross.lua
new file mode 100644
index 0000000000..ec9b6ef7a9
--- /dev/null
+++ b/apps/plugins/picross.lua
@@ -0,0 +1,822 @@
1--[[
2 __________ __ ___.
3 Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 \/ \/ \/ \/ \/
8
9Port of Picross (aka. Picture Crossword, Nonograms, Paint By Numbers)
10Copyright (c) 2012 by Nathan Korth
11
12See http://en.wikipedia.org/wiki/Nonogram for details on how to play, and
13http://nkorth.com/picross for more puzzles.
14
15]]--
16
17require "actions"
18require "luadir"
19require("rbsettings")
20require("settings")
21
22local _nums = require("draw_num")
23local _clr = require("color") -- clrset, clrinc provides device independent colors
24local _lcd = require("lcd") -- lcd helper functions
25
26local plugindir = rb.PLUGIN_GAMES_DATA_DIR
27local userdir = plugindir .. "/.picross"
28
29local wrap = rb.settings.read('global_settings', rb.system.global_settings.list_wraparound)
30wrap = (wrap or 1) == 1
31
32do -- free up some ram by removing items we don't need
33 local function strip_functions(t, ...)
34 local t_keep = {...}
35 local keep
36 for key, val in pairs(t) do
37 keep = false
38 for _, v in ipairs(t_keep) do
39 if string.find (key, v) then
40 keep = true; break
41 end
42 end
43 if keep ~= true then
44 t[key] = nil
45 end
46 end
47 end
48
49 strip_functions(rb.actions, "PLA_", "TOUCHSCREEN", "_NONE")
50 rb.contexts = nil
51
52 _clr.inc = nil
53 rb.metadata = nil -- remove metadata settings
54 rb.system = nil -- remove system settings
55 rb.settings = nil --remove setting read/write fns
56end
57
58--colors for fg/bg ------------------------
59local WHITE = _clr.set(-1, 255, 255, 255)
60local BLACK = _clr.set(0, 0, 0, 0)
61-------------------------------------------
62
63-- set colors on color targets
64if rb.lcd_rgbpack ~= nil then
65 rb.lcd_set_background(rb.lcd_rgbpack(255, 255, 255))
66 rb.lcd_set_foreground(rb.lcd_rgbpack(0, 0, 0))
67end
68
69local TEXT_COLOR = BLACK
70
71if rb.LCD_DEPTH == 2 then TEXT_COLOR = bit.bnot(TEXT_COLOR) end
72
73--[[
74-- load images
75local img_numbers = rb.read_bmp_file(rb.current_path().."picross_numbers.bmp")
76
77-- image helper function
78function draw_image(img, x, y, w, h, tilenum)
79
80 local func = rb.lcd_bitmap_transparent_part
81 or rb.lcd_bitmap_part -- Fallback version for grayscale targets
82 or rb.lcd_mono_bitmap_part -- Fallback version for mono targets
83
84 func(img, 0, (tilenum * h), w, x, y, w, h)
85end
86]]
87
88function draw_number(x, y, w, tilenum, scale)
89 scale = scale or 1
90 _nums.print(_LCD, tilenum, x, y, w, TEXT_COLOR, nil, nil, true, scale, scale)
91end
92
93function showComplete(self)
94 if self:isComplete() then
95 rb.splash(rb.HZ * 2, "Puzzle complete!")
96 self:saveGame()
97 self.puzzleh = 50
98 self.puzzlew = 50
99 local old_boardh, old_boardw = self.boardh, self.boardw
100 local old_numbersw, old_numbersh = self.numbersw, self.numbersh
101 while self.numbersh > 0 do -- remove the number rows
102 table.remove (self.board, 1)
103 self.numbersh = self.numbersh - 1
104 end
105 self.numbersh = 0
106 self.numbersw = 0
107 self.solution = nil
108 self.boardh = self.puzzleh
109 self.boardw = self.puzzlew
110 self.freedraw = 0
111 -- find a free number
112 while rb.file_exists(string.format("%s/user_freedraw_%d.picross",
113 userdir, self.freedraw)) do
114 self.freedraw = self.freedraw + 1
115 end
116
117 for r = 1, self.boardh do
118 local old_row = self.board[r] or {}
119
120 self.board[r] = {}
121 -- copy over the last drawing
122 for c = 1, self.boardw do
123 local ch = old_row[c + old_numbersw]
124 if not ch or ch ~= '*' then
125 self.board[r][c] = '.'
126 else
127 self.board[r][c] = '*'
128 end
129 end
130 end
131 rb.splash(rb.HZ * 3, "Free Draw!")
132 self.cursor.x = 1
133 self.cursor.y = 1
134 self.showComplete = function() end --show once, then remove the reference
135 end
136end
137
138local State = {
139 puzzlew = 0,
140 puzzleh = 0,
141 numbersw = 0,
142 numbersh = 0,
143 boardw = 0,
144 boardh = 0,
145 board = {},
146 solution = {},
147 filename = '',
148 cursor = {x = 0, y = 0},
149 scale = 1,
150 freedraw = false
151}
152
153--[[
154
155Notes on how puzzles work in the code:
156
157The "board" array is bigger than the actual puzzle, so the numbers
158above and to the left of it can be stored and do not need to be recalculated
159for every draw. (The "solution" array is the same size as the puzzle, however.)
160The various width/height variables help keep track of where everything is.
161(they should be fairly self-explanatory)
162
163The width/height of the numbers section is always half the width/height of the
164puzzle. For odd-number-sized puzzles, the value must be rounded up. This is
165because strings of squares must have at least one blank space in between. For
166example, on a board 5 wide, the maximum set of row numbers is "1 1 1".
167
168Here are the values used in the "board" array:
169 ' ': empty space
170 '.': unfilled square
171 '*': filled square
172 [number]: number (not a string)
173
174The .picross puzzle files are text files which look pretty much the same as the
175"board" array, with two differences:
176
177 - puzzle files should not contain numbers, because they will be generated
178 based on the puzzle at runtime
179 - blank lines and lines starting with '#' are ignored
180
181]]--
182
183function State:initBoard()
184 if self.freedraw then
185 -- clear board (set the puzzle area to '.' and everything else to ' ')
186 self.board = {}
187 for r = 1,self.boardh do
188 self.board[r] = {}
189 for c = 1,self.boardw do
190 if r > self.numbersh and c > self.numbersw then
191 self.board[r][c] = '.'
192 else
193 self.board[r][c] = ' '
194 end
195 end
196 end
197
198 -- reset cursor
199 self.cursor.x = 1
200 self.cursor.y = 1
201 return
202 end --freedraw
203
204 -- metrics
205 self.puzzleh = #self.solution
206 self.puzzlew = #self.solution[1]
207 self.numbersh = math.floor(self.puzzleh / 2) + 1
208 self.numbersw = math.floor(self.puzzlew / 2) + 1
209 self.boardh = self.puzzleh + self.numbersh
210 self.boardw = self.puzzlew + self.numbersw
211 self.showComplete = showComplete
212
213 -- clear board (set the puzzle area to '.' and everything else to ' ')
214 self.board = {}
215 for r = 1,self.boardh do
216 self.board[r] = {}
217 for c = 1,self.boardw do
218 if r > self.numbersh and c > self.numbersw then
219 self.board[r][c] = '.'
220 else
221 self.board[r][c] = ' '
222 end
223 end
224 end
225
226 -- reset cursor
227 self.cursor.x = self.numbersw + 1
228 self.cursor.y = self.numbersh + 1
229
230 -- calculate row numbers
231 local rownums = {}
232 for r = 1,self.puzzleh do
233 rownums[r] = {}
234 local count = 0
235 for c = 1,self.puzzlew do
236 if self.solution[r][c] == '*' then
237 -- filled square
238 count = count + 1
239 else
240 -- empty square
241 if count > 0 then
242 table.insert(rownums[r], count)
243 count = 0
244 end
245 end
246 end
247 -- if there were no empty squares
248 if count > 0 then
249 table.insert(rownums[r], count)
250 count = 0
251 end
252 end
253
254 -- calculate column numbers
255 local columnnums = {}
256 for c = 1,self.puzzlew do
257 columnnums[c] = {}
258 local count = 0
259 for r = 1,self.puzzleh do
260 if self.solution[r][c] == '*' then
261 -- filled square
262 count = count + 1
263 else
264 -- empty square
265 if count > 0 then
266 table.insert(columnnums[c], count)
267 count = 0
268 end
269 end
270 end
271 -- if there were no empty squares
272 if count > 0 then
273 table.insert(columnnums[c], count)
274 count = 0
275 end
276 end
277
278 -- add row numbers to board
279 for r = 1,self.puzzleh do
280 for i,num in ipairs(rownums[r]) do
281 self.board[self.numbersh + r][self.numbersw - #rownums[r] + i] = num
282 end
283 end
284
285 -- add column numbers to board
286 for c = 1,self.puzzlew do
287 for i,num in ipairs(columnnums[c]) do
288 self.board[self.numbersh - #columnnums[c] + i][self.numbersw + c] = num
289 end
290 end
291end
292
293function State:saveGame()
294 local file
295 local boardw, boardh = self.boardw, self.boardh
296
297 if self.freedraw then
298 self.filename = string.format("%s/user_freedraw_%d.picross", userdir, self.freedraw)
299
300
301 --remove blank lines from the end
302 while boardh > 1 and not string.find(table.concat(self.board[boardh]), "\*") do
303 boardh = boardh - 1
304 end
305 --remove blank lines from right
306 local max_w = 0
307 for r = self.numbersh + 1, boardh do
308 for c = max_w + 1, boardw do
309 if self.board[r][c] == '*' then
310 max_w = c
311 end
312 end
313 end
314 boardw = max_w
315 if max_w == 0 then return end--nothing to save
316
317 file = io.open(self.filename, 'w')
318 else
319 file = io.open(plugindir .. '/picross.sav', 'w')
320 end
321
322 if file then
323 file:write("#"..self.filename.."\n")
324 for r = self.numbersh + 1, boardh do
325 for c = self.numbersw + 1, boardw do
326 file:write(self.board[r][c])
327 end
328 file:write("\n")
329 end
330 file:close()
331 if self.freedraw then
332 rb.splash(rb.HZ, "Freedraw saved.")
333 else
334 rb.splash(rb.HZ, "Game saved.")
335 end
336 return true
337 else
338 rb.splash(rb.HZ * 2, "Failed to open save file")
339 return false
340 end
341end
342
343function State:loadSave()
344 local file = io.open(plugindir .. '/picross.sav')
345 if file then
346 -- first line is commented path of original puzzle
347 path = file:read('*l')
348 path = path:sub(2,-1)
349 -- prepare original puzzle
350 if self:loadFile(path) then
351 -- load saved board
352 contents = file:read('*all')
353 file:close()
354 local r = 1
355 for line in contents:gmatch("[^\r\n]+") do
356 local c = 1
357 for char in line:gmatch('.') do
358 self.board[self.numbersh + r][self.numbersw + c] = char
359 c = c + 1
360 end
361 r = r + 1
362 end
363
364 return true
365 else
366 return false
367 end
368 else
369 return false
370 end
371end
372
373function State:loadDefault()
374 return self:loadFile(userdir .. '/picross_default.picross')
375end
376
377function State:loadFile(path)
378 local file = io.open(path)
379 if file then
380 self.freedraw = false
381 local board = {}
382 local boardwidth = 0
383 local count = 0
384 contents = file:read('*all')
385
386 for line in contents:gmatch("[^\r\n]+") do
387 count = count + 1
388 -- ignore blank lines and comments
389 if line ~= '' and line:sub(1, 1) ~= '#' then
390 table.insert(board, {}) -- add a new row
391
392 -- ensure all lines are the same width
393 if boardwidth == 0 then
394 boardwidth = #line
395 elseif #line ~= boardwidth then
396 -- a line was the wrong width
397 local err = "Invalid puzzle file!"
398 local msg =
399 string.format("%s (wrong line width ln: %d w: %d)", err, count, #line)
400 rb.splash(rb.HZ * 2, msg)
401 return false
402 end
403 local pos = 0
404 for char in line:gmatch('.') do
405 pos = pos + 1
406 if char == '*' or char == '.' then
407 table.insert(board[#board], char)
408 else
409 local err = "Invalid puzzle file!"
410 local msg = string.format("%s (invalid character ln: %d '%s' @ %d)",
411 err, count, char, pos)
412 -- invalid character in puzzle area
413 rb.splash(rb.HZ * 2, msg)
414 return false
415 end
416 end
417 else
418 -- display puzzle comments
419 --rb.splash(rb.HZ, line:sub(2,#line))
420 end
421 end
422
423 if #board == 0 then
424 -- empty file
425 rb.splash(rb.HZ * 2, "Invalid puzzle file! (empty)")
426 return false
427 end
428
429 file:close()
430
431 self.solution = board
432 self.filename = path
433 if self.puzzleh < 100 and self.puzzlew < 100 then
434 self:initBoard()
435 return true
436 else
437 -- puzzle too big
438 rb.splash(rb.HZ * 2, "Invalid puzzle file! (too big)")
439 return false
440 end
441 else
442 -- file open failed
443 rb.splash(rb.HZ * 2, "Failed to open file!")
444 return false
445 end
446end
447
448function State:drawBoard()
449 local tw, th = 10 * self.scale, 10 * self.scale -- tile width and height (including bottom+right padding)
450
451 local ofsx = rb.LCD_WIDTH/2 - 4 - (self.cursor.x * tw)
452 local ofsy = rb.LCD_HEIGHT/2 - 4 - (self.cursor.y * th)
453
454 rb.lcd_clear_display()
455
456 -- guide lines
457 for r = 0, self.puzzleh do
458 local x1, x2, y =
459 ofsx + tw - 1,
460 ofsx + ((self.boardw + 1) * tw) - 1,
461 ofsy + ((self.numbersh + 1 + r) * th) - 1
462 if r % 5 == 0 or r == self.puzzleh then
463 rb.lcd_hline(x1, x2, y)
464 else
465 for x = x1, x2, 2 do
466 rb.lcd_drawpixel(x, y)
467 end
468 end
469 end
470 for c = 0, self.puzzlew do
471 local x, y1, y2 =
472 ofsx + ((self.numbersw + 1 + c) * tw) - 1,
473 ofsy + th - 1,
474 ofsy + ((self.boardh + 1) * th) - 1
475 if c % 5 == 0 or c == self.puzzlew then
476 rb.lcd_vline(x, y1, y2)
477 else
478 for y = y1,y2, 2 do
479 rb.lcd_drawpixel(x, y)
480 end
481 end
482 end
483
484 -- cursor
485 local cx, cy = ofsx + (self.cursor.x * tw) - 1, ofsy + (self.cursor.y * th) - 1
486 rb.lcd_drawrect(cx, cy, tw + 1, th + 1)
487 local n_width = tw / self.scale / 2 - 1
488 local xc = (tw - 5 * self.scale) / 2
489 -- tiles
490 for r = 1, self.boardh do
491 for c = 1, self.boardw do
492 local x, y = ofsx + (c * tw) + 1, ofsy + (r * th) + 1
493
494 if self.board[r][c] == '.' then
495 -- unfilled square
496 elseif self.board[r][c] == '*' then
497 -- filled square
498 rb.lcd_fillrect(x, y, tw - 3, th - 3)
499 elseif self.board[r][c] == 'x' then
500 -- eliminated square
501 rb.lcd_drawline(x + 1, y + 1, x + tw - 5, y + th - 5)
502 rb.lcd_drawline(x + tw - 5, y + 1, x + 1, y + th - 5)
503 elseif self.board[r][c] == ' ' then
504 -- empty space
505 elseif self.board[r][c] > 0 and self.board[r][c] < 100 then
506 -- number
507 local num = self.board[r][c]
508 if num < 10 then
509 draw_number(x + xc, y, n_width, num, self.scale)
510 draw_number(x + xc + 1, y, n_width, num, self.scale)
511 else
512 draw_number(x, y, n_width, num, self.scale)
513 draw_number(x + 1, y, n_width, num, self.scale)
514 end
515 end
516 end
517 end
518
519 rb.lcd_update()
520end
521
522function State:isComplete()
523 for r = 1,self.puzzleh do
524 for c = 1,self.puzzlew do
525 if self.solution[r][c] == '*' and
526 self.board[self.numbersh + r][self.numbersw + c] ~= '*' then
527 return false
528 end
529 end
530 end
531
532 return true
533end
534
535function State:moveCursor(dir)
536 -- The cursor isn't allowed to move in the top-left quadrant of the board.
537 -- This has to be checked in up and left moves.
538 local in_board_area = (self.cursor.y > (self.numbersh + 1)
539 and self.cursor.x > self.numbersw + 1)
540
541 if dir == 'left' then
542 if (self.cursor.x > (self.numbersw + 1) or self.cursor.y > self.numbersh)
543 and self.cursor.x > 1 then
544 self.cursor.x = self.cursor.x - 1
545 elseif wrap == true then
546 if in_board_area then
547 self.cursor.x = 1
548 else
549 self.cursor.x = self.boardw
550 end
551 dir = 'up'
552 end
553 elseif dir == 'right' then
554 if self.cursor.x < self.boardw then
555 self.cursor.x = self.cursor.x + 1
556 elseif wrap == true then
557 if in_board_area then
558 self.cursor.x = 1
559 else
560 self.cursor.x = self.numbersw + 1
561 end
562 dir = 'down'
563 end
564 end
565
566 if dir == 'up' then
567 if (self.cursor.y > (self.numbersh + 1) or self.cursor.x > self.numbersw)
568 and self.cursor.y > 1 then
569 self.cursor.y = self.cursor.y - 1
570 elseif wrap == true then
571 if in_board_area then
572 self.cursor.y = 1
573 else
574 self.cursor.y = self.boardh
575 end
576 end
577 elseif dir == 'down' then
578 if self.cursor.y < self.boardh then
579 self.cursor.y = self.cursor.y + 1
580 elseif wrap == true then
581 if in_board_area then
582 self.cursor.y = 1
583 else
584 self.cursor.y = self.numbersh + 1
585 end
586 end
587 end
588end
589
590function State:fillSquare(mode)
591 mode = mode or 0
592 if self.cursor.x > self.numbersw and self.cursor.y > self.numbersh then
593 if self.board[self.cursor.y][self.cursor.x] == '*' and mode ~= 2 then
594 -- clear square
595 self.board[self.cursor.y][self.cursor.x] = '.'
596 elseif mode ~= 1 then -- '.' or 'x'
597 -- fill square
598 local x, y = self.cursor.x - self.numbersw, self.cursor.y - self.numbersh
599 if not self.solution or self.solution[y][x] == '*' then
600 self.board[self.cursor.y][self.cursor.x] = '*'
601 else
602 rb.splash(rb.HZ * 2, "Invalid move!")
603 -- "x" square for convenience
604 self.board[self.cursor.y][self.cursor.x] = 'x'
605 end
606 end
607 end
608
609 self:showComplete()
610end
611
612function State:eliminateSquare()
613 if not self.freedraw
614 and self.cursor.x > self.numbersw
615 and self.cursor.y > self.numbersh then
616 if self.board[self.cursor.y][self.cursor.x] == 'x' then
617 -- clear square
618 self.board[self.cursor.y][self.cursor.x] = '.'
619 else-- '.' or '*'
620 -- "x" square
621 self.board[self.cursor.y][self.cursor.x] = 'x'
622 end
623 else
624 self.board[self.cursor.y][self.cursor.x] = '.'
625 end
626end
627
628-- main code ------------------------------------------------------------------
629
630local function mainMenu()
631 local menu = {
632 "Resume",
633 "View picture",
634 "Restart puzzle",
635 "Load puzzle",
636 "Zoom " .. State.scale - 1,
637 "Save progress",
638 "Save and quit",
639 "Quit without saving"
640 }
641 local start
642
643 if State.freedraw then
644 menu[6] = "Save freedraw " .. State.freedraw --Save Progress
645 end
646 while true do
647 local s = rb.do_menu("Picross", menu, start, false)
648 start = s
649 if s == 0 then
650 -- resume
651 return
652 elseif s == 1 then
653 -- view picture
654 viewPicture()
655 start = 0 --resume
656 elseif s == 2 then
657 -- restart
658 State:initBoard()
659 return
660 elseif s == 3 then
661 -- choose puzzle
662 if puzzleList() then
663 return
664 end
665 elseif s == 4 then
666 -- zoom
667 State.scale = State.scale + 1
668 if State.scale > 4 then
669 State.scale = 1
670 end
671 menu[5] = "Zoom " .. State.scale - 1
672 elseif s == 5 then
673 -- save
674 if State:saveGame() then
675 return
676 end
677 elseif s == 6 then
678 -- save and quit
679 if State:saveGame() then
680 os.exit()
681 end
682 elseif s == 7 then
683 -- quit
684 os.exit()
685 elseif s == -2 then
686 -- back button pressed
687 return
688 else
689 -- something strange happened
690 rb.splash(rb.HZ * 2, "Invalid menu index: "..s)
691 end
692 end
693end
694
695function puzzleList()
696 if rb.dir_exists(userdir) then
697 local files = {}
698 for file in luadir.dir(userdir) do
699 if file ~= '.' and file ~= '..' then
700 table.insert(files, file)
701 end
702 end
703
704 table.sort(files)
705 local udir = userdir .. "/"
706 if #files > 0 then
707 local s = rb.do_menu("Puzzles", files, nil, false)
708 if s >= 0 and s < #files then
709 if State:loadFile(udir..files[s+1]) then
710 return true -- return to puzzle screen
711 else
712 -- puzzle failed to load, return to main menu
713 return false
714 end
715 elseif s == -2 then
716 -- back button pressed, return to main menu
717 return false
718 else
719 -- something strange happened
720 rb.splash(rb.HZ * 2, "Invalid menu index: "..s)
721 return false
722 end
723 else
724 rb.splash(rb.HZ * 2, "No puzzles found! Put .picross files in " .. userdir)
725 return false
726 end
727 else
728 rb.splash(rb.HZ * 2, "Put .picross files in " .. userdir)
729 return false
730 end
731end
732
733function viewPicture()
734 rb.lcd_clear_display()
735
736 -- draw filled squares as pixels (scaled 2x)
737 for r = State.numbersh + 1, State.boardh do
738 for c = State.numbersw + 1, State.boardw do
739 if State.board[r][c] == '*' then
740 --rb.lcd_drawpixel(c - State.numbersw, r - State.numbersh)
741 local px = (c - State.numbersw) * State.scale - State.scale + 1
742 local py = (r - State.numbersh) * State.scale - State.scale + 1
743
744 rb.lcd_fillrect(px, py, State.scale, State.scale)
745 end
746 end
747 end
748
749 rb.lcd_update()
750
751 -- exit on button press
752 while true do
753 local action = rb.get_plugin_action(0)
754
755 if action == rb.actions.PLA_EXIT
756 or action == rb.actions.PLA_CANCEL
757 or action == rb.actions.PLA_SELECT then
758 return
759 end
760
761 rb.yield()
762 end
763end
764
765if not State:loadSave() then
766 if not State:loadDefault() then
767 return;
768 end
769end
770
771local act = rb.actions
772local action = act.ACTION_NONE
773local lockdraw = false
774
775while true do
776 action = rb.get_plugin_action(0)
777 if action == rb.actions.PLA_EXIT then
778 lockdraw = false
779 mainMenu()
780 elseif action == act.PLA_UP or action == act.PLA_UP_REPEAT then
781 State:moveCursor('up')
782 elseif action == act.PLA_DOWN or action == act.PLA_DOWN_REPEAT then
783 State:moveCursor('down')
784 elseif action == act.PLA_LEFT or action == act.PLA_LEFT_REPEAT then
785 State:moveCursor('left')
786 elseif action == act.PLA_RIGHT or action == act.PLA_RIGHT_REPEAT then
787 State:moveCursor('right')
788 elseif action == act.PLA_SELECT then
789 if lockdraw then
790 lockdraw = lockdraw - 1
791 if lockdraw < 0 then
792 lockdraw = false
793 elseif lockdraw == 1 then
794 rb.splash(50, "clear")
795 else
796 rb.splash(50, "invert")
797 end
798 else
799 State:fillSquare()
800 end
801 action = act.ACTION_NONE
802 elseif action == act.PLA_SELECT_REPEAT then
803 if State.freedraw and not lockdraw then
804 lockdraw = 2
805 rb.splash(50, "draw")
806 action = act.ACTION_NONE
807 end
808 elseif action == act.PLA_CANCEL then
809 State:eliminateSquare()
810 action = act.ACTION_NONE
811 else
812 action = act.ACTION_NONE
813 end
814
815 if lockdraw and action ~= act.ACTION_NONE then
816 State:fillSquare(lockdraw)
817 end
818
819 State:drawBoard()
820
821 rb.yield()
822end
diff --git a/apps/plugins/picross/picross.make b/apps/plugins/picross/picross.make
new file mode 100644
index 0000000000..ead5ba482a
--- /dev/null
+++ b/apps/plugins/picross/picross.make
@@ -0,0 +1,24 @@
1# __________ __ ___.
2# Open \______ \ ____ ____ | | _\_ |__ _______ ___
3# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
4# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
5# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
6# \/ \/ \/ \/ \/
7# $Id$
8#
9
10PICRSCR_SRCDIR := $(APPSDIR)/plugins/picross
11PICRSCR_BUILDDIR := $(BUILDDIR)/apps/plugins/.picross
12PICRSCRS := $(wildcard $(PICRSCR_SRCDIR)/*.picross)
13
14#DUMMY := $(info [${PICRSCRS}])
15
16DUMMY : all
17
18all: $(subst $(PICRSCR_SRCDIR)/,$(PICRSCR_BUILDDIR)/,$(PICRSCRS))
19
20$(PICRSCR_BUILDDIR)/%.picross: $(PICRSCR_SRCDIR)/%.picross | $(PICRSCR_BUILDDIR)
21 $(call PRINTS,CP $(subst $(APPSDIR)/,,$<))cp $< $@
22
23$(PICRSCR_BUILDDIR):
24 $(call PRINTS,MKDIR $@)mkdir -p $(PICRSCR_BUILDDIR)/
diff --git a/apps/plugins/picross/picross_default.picross b/apps/plugins/picross/picross_default.picross
new file mode 100755
index 0000000000..ad7643b79e
--- /dev/null
+++ b/apps/plugins/picross/picross_default.picross
@@ -0,0 +1,7 @@
1# simple default puzzle
2
3****..*...*..
4*...*.*...*..
5****..*.*****
6*.....*...*..
7*.....*...*..
diff --git a/apps/plugins/picross/rb.picross b/apps/plugins/picross/rb.picross
new file mode 100644
index 0000000000..bb63b506f5
--- /dev/null
+++ b/apps/plugins/picross/rb.picross
@@ -0,0 +1,7 @@
1#open source jukebox firmware
2
3****...**...***.*..*..............
4*...*.*..*.*....*.*.*.............
5****..*..*.*....**..***...**..*..*
6*..**.*..*.*....*.*.*..*.*..*..**.
7*...*..**...***.*..****...**..*..*
diff --git a/apps/radio/radio.c b/apps/radio/radio.c
index bf8ad865dd..bf36f1d32d 100644
--- a/apps/radio/radio.c
+++ b/apps/radio/radio.c
@@ -167,6 +167,24 @@ bool in_radio_screen(void)
167 return in_screen; 167 return in_screen;
168} 168}
169 169
170/* Keep freq on the grid for the current region */
171int snap_freq_to_grid(int freq)
172{
173 const struct fm_region_data * const fmr =
174 &fm_region_data[global_settings.fm_region];
175
176 /* Range clamp if out of range or just round to nearest */
177 if (freq < fmr->freq_min)
178 freq = fmr->freq_min;
179 else if (freq > fmr->freq_max)
180 freq = fmr->freq_max;
181 else
182 freq = (freq - fmr->freq_min + fmr->freq_step/2) /
183 fmr->freq_step * fmr->freq_step + fmr->freq_min;
184
185 return freq;
186}
187
170/* TODO: Move some more of the control functionality to firmware 188/* TODO: Move some more of the control functionality to firmware
171 and clean up the mess */ 189 and clean up the mess */
172 190
@@ -186,7 +204,8 @@ void radio_start(void)
186 /* clear flag before any yielding */ 204 /* clear flag before any yielding */
187 radio_status &= ~FMRADIO_START_PAUSED; 205 radio_status &= ~FMRADIO_START_PAUSED;
188 206
189 curr_freq = global_status.last_frequency * fmr->freq_step + fmr->freq_min; 207 /* ensure the frequency is in range otherwise bad things happen --Bilgus */
208 curr_freq = snap_freq_to_grid(global_status.last_frequency * fmr->freq_step + fmr->freq_min);
190 209
191 tuner_set(RADIO_SLEEP, 0); /* wake up the tuner */ 210 tuner_set(RADIO_SLEEP, 0); /* wake up the tuner */
192 211
@@ -261,24 +280,6 @@ bool radio_hardware_present(void)
261 return tuner_get(RADIO_PRESENT); 280 return tuner_get(RADIO_PRESENT);
262} 281}
263 282
264/* Keep freq on the grid for the current region */
265int snap_freq_to_grid(int freq)
266{
267 const struct fm_region_data * const fmr =
268 &fm_region_data[global_settings.fm_region];
269
270 /* Range clamp if out of range or just round to nearest */
271 if (freq < fmr->freq_min)
272 freq = fmr->freq_min;
273 else if (freq > fmr->freq_max)
274 freq = fmr->freq_max;
275 else
276 freq = (freq - fmr->freq_min + fmr->freq_step/2) /
277 fmr->freq_step * fmr->freq_step + fmr->freq_min;
278
279 return freq;
280}
281
282void remember_frequency(void) 283void remember_frequency(void)
283{ 284{
284 const struct fm_region_data * const fmr = 285 const struct fm_region_data * const fmr =
diff --git a/apps/recorder/jpeg_idct_arm.S b/apps/recorder/jpeg_idct_arm.S
index 1f2603da1b..e706a17384 100644
--- a/apps/recorder/jpeg_idct_arm.S
+++ b/apps/recorder/jpeg_idct_arm.S
@@ -24,6 +24,8 @@
24#include "config.h" 24#include "config.h"
25#include "apps/core_asmdefs.h" 25#include "apps/core_asmdefs.h"
26 26
27 .syntax unified
28
27 .section .text 29 .section .text
28 .align 2 30 .align 2
29 .global jpeg_idct1h 31 .global jpeg_idct1h
diff --git a/apps/settings.h b/apps/settings.h
index 2277805fec..e3b11430cd 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -163,7 +163,7 @@ enum { SHOW_ALL, SHOW_SUPPORTED, SHOW_MUSIC, SHOW_PLAYLIST, SHOW_ID3DB,
163 163
164/* file and dir sort options */ 164/* file and dir sort options */
165enum { SORT_ALPHA, SORT_DATE, SORT_DATE_REVERSED, SORT_TYPE, /* available as settings */ 165enum { SORT_ALPHA, SORT_DATE, SORT_DATE_REVERSED, SORT_TYPE, /* available as settings */
166 SORT_ALPHA_REVERSED, SORT_TYPE_REVERSED }; /* internal use only */ 166 SORT_ALPHA_REVERSED, SORT_TYPE_REVERSED, SORT_AS_FILE }; /* internal use only */
167enum { SORT_INTERPRET_AS_DIGIT, SORT_INTERPRET_AS_NUMBER }; 167enum { SORT_INTERPRET_AS_DIGIT, SORT_INTERPRET_AS_NUMBER };
168 168
169/* recursive dir insert options */ 169/* recursive dir insert options */
diff --git a/apps/tree.c b/apps/tree.c
index 2e82b165af..58457c2d71 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -466,6 +466,13 @@ static int update_dir(void)
466 icon = tc.browse->icon; 466 icon = tc.browse->icon;
467 if (icon == NOICON) 467 if (icon == NOICON)
468 icon = filetype_get_icon(ATTR_DIRECTORY); 468 icon = filetype_get_icon(ATTR_DIRECTORY);
469 /* display sub directories in the title of plugin browser */
470 if (tc.dirlevel > 0 && *tc.dirfilter == SHOW_PLUGINS)
471 {
472 char *subdir = strrchr(tc.currdir, '/');
473 if (subdir)
474 title = subdir + 1; /* step past the separator */
475 }
469 } 476 }
470 else 477 else
471 { 478 {
@@ -1056,7 +1063,7 @@ int rockbox_browse(struct browse_context *browse)
1056 int last_context; 1063 int last_context;
1057 /* don't reset if its the same browse already loaded */ 1064 /* don't reset if its the same browse already loaded */
1058 if (tc.browse != browse || 1065 if (tc.browse != browse ||
1059 !(tc.currdir[1] && strcmp(tc.currdir, browse->root) == 0)) 1066 !(tc.currdir[1] && strstr(tc.currdir, browse->root) != NULL))
1060 { 1067 {
1061 tc.browse = browse; 1068 tc.browse = browse;
1062 tc.selected_item = 0; 1069 tc.selected_item = 0;
diff --git a/docs/CREDITS b/docs/CREDITS
index 363c7b7dfb..fba9aed0d3 100644
--- a/docs/CREDITS
+++ b/docs/CREDITS
@@ -718,6 +718,8 @@ Mihaly 'Hermit' Horvath
718Uwe Kleine-König 718Uwe Kleine-König
719JJ Style 719JJ Style
720Jerry Chapman 720Jerry Chapman
721Leander Lismond
722Eren Akpolat
721 723
722The libmad team 724The libmad team
723The wavpack team 725The wavpack team
diff --git a/firmware/asm/arm/lcd-as-memframe.S b/firmware/asm/arm/lcd-as-memframe.S
index d42b2a920d..f69f6e5080 100644
--- a/firmware/asm/arm/lcd-as-memframe.S
+++ b/firmware/asm/arm/lcd-as-memframe.S
@@ -24,6 +24,8 @@
24#include "config.h" 24#include "config.h"
25#include "cpu.h" 25#include "cpu.h"
26 26
27 .syntax unified
28
27/**************************************************************************** 29/****************************************************************************
28 * void lcd_copy_buffer_rect(fb_data *dst, fb_data *src, int width, 30 * void lcd_copy_buffer_rect(fb_data *dst, fb_data *src, int width,
29 * int height); 31 * int height);
diff --git a/firmware/asm/arm/memcpy.S b/firmware/asm/arm/memcpy.S
index 86fc6b7930..1fbb6660e9 100644
--- a/firmware/asm/arm/memcpy.S
+++ b/firmware/asm/arm/memcpy.S
@@ -35,6 +35,8 @@
35#define push lsr 35#define push lsr
36#endif 36#endif
37 37
38 .syntax unified
39
38/* Prototype: void *memcpy(void *dest, const void *src, size_t n); */ 40/* Prototype: void *memcpy(void *dest, const void *src, size_t n); */
39/* Prototype: void *mempcpy(void *dest, const void *src, size_t n); */ 41/* Prototype: void *mempcpy(void *dest, const void *src, size_t n); */
40 42
diff --git a/firmware/asm/arm/memmove.S b/firmware/asm/arm/memmove.S
index e5c9b42928..cf22a74622 100644
--- a/firmware/asm/arm/memmove.S
+++ b/firmware/asm/arm/memmove.S
@@ -35,6 +35,8 @@
35#define push lsr 35#define push lsr
36#endif 36#endif
37 37
38 .syntax unified
39
38 .text 40 .text
39 41
40/* 42/*
diff --git a/firmware/asm/arm/memset.S b/firmware/asm/arm/memset.S
index d727f2a5ec..ef5cdb5819 100644
--- a/firmware/asm/arm/memset.S
+++ b/firmware/asm/arm/memset.S
@@ -20,6 +20,8 @@
20 ****************************************************************************/ 20 ****************************************************************************/
21#include "config.h" 21#include "config.h"
22 22
23 .syntax unified
24
23 .section .icode,"ax",%progbits 25 .section .icode,"ax",%progbits
24 26
25 .align 2 27 .align 2
diff --git a/firmware/asm/arm/memset16.S b/firmware/asm/arm/memset16.S
index 226eac39e1..851b9207a2 100644
--- a/firmware/asm/arm/memset16.S
+++ b/firmware/asm/arm/memset16.S
@@ -20,6 +20,8 @@
20 ****************************************************************************/ 20 ****************************************************************************/
21#include "config.h" 21#include "config.h"
22 22
23 .syntax unified
24
23 .section .icode,"ax",%progbits 25 .section .icode,"ax",%progbits
24 26
25 .align 2 27 .align 2
diff --git a/firmware/export/config.h b/firmware/export/config.h
index 80d59ea836..9812db9161 100644
--- a/firmware/export/config.h
+++ b/firmware/export/config.h
@@ -1018,14 +1018,19 @@ Lyre prototype 1 */
1018 * These macros are for switching on unified syntax in inline assembly. 1018 * These macros are for switching on unified syntax in inline assembly.
1019 * Older versions of GCC emit assembly in divided syntax with no option 1019 * Older versions of GCC emit assembly in divided syntax with no option
1020 * to enable unified syntax. 1020 * to enable unified syntax.
1021 *
1022 * FIXME: This needs to be looked at after the toolchain bump
1023 */ 1021 */
1022#if (__GNUC__ < 8)
1024#define BEGIN_ARM_ASM_SYNTAX_UNIFIED ".syntax unified\n" 1023#define BEGIN_ARM_ASM_SYNTAX_UNIFIED ".syntax unified\n"
1025#define END_ARM_ASM_SYNTAX_UNIFIED ".syntax divided\n" 1024#define END_ARM_ASM_SYNTAX_UNIFIED ".syntax divided\n"
1025#else
1026#define BEGIN_ARM_ASM_SYNTAX_UNIFIED
1027#define END_ARM_ASM_SYNTAX_UNIFIED
1028#endif
1026 1029
1027#if defined(CPU_ARM) && defined(__ASSEMBLER__) 1030#if defined(CPU_ARM) && defined(__ASSEMBLER__)
1031#if (__GNUC__ < 8)
1028.syntax unified 1032.syntax unified
1033#endif
1029/* ARMv4T doesn't switch the T bit when popping pc directly, we must use BX */ 1034/* ARMv4T doesn't switch the T bit when popping pc directly, we must use BX */
1030.macro ldmpc cond="", order="ia", regs 1035.macro ldmpc cond="", order="ia", regs
1031#if ARM_ARCH == 4 && defined(USE_THUMB) 1036#if ARM_ARCH == 4 && defined(USE_THUMB)
@@ -1043,6 +1048,9 @@ Lyre prototype 1 */
1043 ldr\cond pc, [sp], #4 1048 ldr\cond pc, [sp], #4
1044#endif 1049#endif
1045.endm 1050.endm
1051#if (__GNUC__ < 8)
1052.syntax divided
1053#endif
1046#endif 1054#endif
1047 1055
1048#if defined(CPU_COLDFIRE) && defined(__ASSEMBLER__) 1056#if defined(CPU_COLDFIRE) && defined(__ASSEMBLER__)
diff --git a/firmware/target/arm/ata-as-arm.S b/firmware/target/arm/ata-as-arm.S
index 16c2928bf1..cec4a7e235 100644
--- a/firmware/target/arm/ata-as-arm.S
+++ b/firmware/target/arm/ata-as-arm.S
@@ -21,6 +21,7 @@
21 21
22#include "config.h" 22#include "config.h"
23 23
24 .syntax unified
24 25
25#if CONFIG_CPU == PP5002 26#if CONFIG_CPU == PP5002
26 /* Causes ATA retries on iPod G3 probably related to improper controller 27 /* Causes ATA retries on iPod G3 probably related to improper controller
diff --git a/firmware/target/arm/ipod/video/lcd-as-video.S b/firmware/target/arm/ipod/video/lcd-as-video.S
index 7d6caef448..dcef7c0a95 100644
--- a/firmware/target/arm/ipod/video/lcd-as-video.S
+++ b/firmware/target/arm/ipod/video/lcd-as-video.S
@@ -21,6 +21,8 @@
21 21
22#include "config.h" 22#include "config.h"
23 23
24.syntax unified
25
24 .section .icode, "ax", %progbits 26 .section .icode, "ax", %progbits
25 27
26/**************************************************************************** 28/****************************************************************************
diff --git a/firmware/target/mips/ingenic_x1000/app.lds b/firmware/target/mips/ingenic_x1000/app.lds
index fe06e1cd8d..a1e84fb9cf 100644
--- a/firmware/target/mips/ingenic_x1000/app.lds
+++ b/firmware/target/mips/ingenic_x1000/app.lds
@@ -153,3 +153,8 @@ SECTIONS
153 *(.rel.dyn); 153 *(.rel.dyn);
154 } 154 }
155} 155}
156
157#if defined(HAVE_NOCROSSREFS_TO) && defined(HAVE_INIT_ATTR)
158/* Prevent accidental references to the .init section from other sections */
159NOCROSSREFS_TO(.init .text .iram .tcsm);
160#endif
diff --git a/lib/arm_support/support-arm.S b/lib/arm_support/support-arm.S
index 3af0c70975..d12392eeb3 100644
--- a/lib/arm_support/support-arm.S
+++ b/lib/arm_support/support-arm.S
@@ -30,6 +30,8 @@
30 30
31#include <config.h> 31#include <config.h>
32 32
33.syntax unified
34
33.macro ARM_SDIV32_PRE numerator, divisor, sign 35.macro ARM_SDIV32_PRE numerator, divisor, sign
34 /* sign[31] = divisor sign */ 36 /* sign[31] = divisor sign */
35 ands \sign, \divisor, #1<<31 37 ands \sign, \divisor, #1<<31
diff --git a/lib/rbcodec/codecs/demac/libdemac/udiv32_arm.S b/lib/rbcodec/codecs/demac/libdemac/udiv32_arm.S
index 1d19160a91..514bae2949 100644
--- a/lib/rbcodec/codecs/demac/libdemac/udiv32_arm.S
+++ b/lib/rbcodec/codecs/demac/libdemac/udiv32_arm.S
@@ -29,6 +29,9 @@
29 ****************************************************************************/ 29 ****************************************************************************/
30 30
31#include "config.h" 31#include "config.h"
32
33.syntax unified
34
32/* On targets with codec iram, a header file will be generated after an initial 35/* On targets with codec iram, a header file will be generated after an initial
33 link of the APE codec, stating the amount of IRAM remaining for use by the 36 link of the APE codec, stating the amount of IRAM remaining for use by the
34 reciprocal lookup table. */ 37 reciprocal lookup table. */
diff --git a/lib/rbcodec/codecs/libtta/filter_arm.S b/lib/rbcodec/codecs/libtta/filter_arm.S
index 10f1491796..d801a52419 100644
--- a/lib/rbcodec/codecs/libtta/filter_arm.S
+++ b/lib/rbcodec/codecs/libtta/filter_arm.S
@@ -26,6 +26,8 @@
26 * void hybrid_filter(fltst *fs, int *in) 26 * void hybrid_filter(fltst *fs, int *in)
27 */ 27 */
28 28
29 .syntax unified
30
29#ifdef USE_IRAM 31#ifdef USE_IRAM
30 .section .icode, "ax", %progbits 32 .section .icode, "ax", %progbits
31#else 33#else
diff --git a/lib/rbcodec/dsp/dsp_arm.S b/lib/rbcodec/dsp/dsp_arm.S
index 864abee4b6..b17c94fe6c 100644
--- a/lib/rbcodec/dsp/dsp_arm.S
+++ b/lib/rbcodec/dsp/dsp_arm.S
@@ -22,6 +22,7 @@
22 ****************************************************************************/ 22 ****************************************************************************/
23 #include "rbcodecconfig.h" 23 #include "rbcodecconfig.h"
24 24
25 .syntax unified
25/**************************************************************************** 26/****************************************************************************
26 * void channel_mode_proc_mono(struct dsp_proc_entry *this, 27 * void channel_mode_proc_mono(struct dsp_proc_entry *this,
27 * struct dsp_buffer **buf_p) 28 * struct dsp_buffer **buf_p)
diff --git a/lib/rbcodec/dsp/dsp_arm_v6.S b/lib/rbcodec/dsp/dsp_arm_v6.S
index aa27ec90f6..facd3facbd 100644
--- a/lib/rbcodec/dsp/dsp_arm_v6.S
+++ b/lib/rbcodec/dsp/dsp_arm_v6.S
@@ -20,6 +20,7 @@
20 ****************************************************************************/ 20 ****************************************************************************/
21 #include "rbcodecconfig.h" 21 #include "rbcodecconfig.h"
22 22
23 .syntax unified
23/**************************************************************************** 24/****************************************************************************
24 * void sample_output_mono(struct sample_io_data *this, 25 * void sample_output_mono(struct sample_io_data *this,
25 * struct dsp_buffer *src, 26 * struct dsp_buffer *src,
diff --git a/lib/unwarminder/safe_read.S b/lib/unwarminder/safe_read.S
index ce4913870c..557f3dca31 100644
--- a/lib/unwarminder/safe_read.S
+++ b/lib/unwarminder/safe_read.S
@@ -20,6 +20,8 @@
20 ****************************************************************************/ 20 ****************************************************************************/
21#include "config.h" 21#include "config.h"
22 22
23.syntax unified
24
23.data 25.data
24was_aborted: 26was_aborted:
25 .word 0 27 .word 0
diff --git a/manual/main_menu/main.tex b/manual/main_menu/main.tex
index 9a75689940..fced43ab98 100644
--- a/manual/main_menu/main.tex
+++ b/manual/main_menu/main.tex
@@ -284,7 +284,7 @@ settings. With a shortcut,
284 a \fname{.cfg} loaded) 284 a \fname{.cfg} loaded)
285 \item The file browser can be opened with the cursor positioned at 285 \item The file browser can be opened with the cursor positioned at
286 a specified file or folder 286 a specified file or folder
287 \item A file's or folder's ``Current Playlist'' context menu item can 287 \item A file's or folder's ``Playing Next...'' context menu item can
288 be displayed 288 be displayed
289 \item A setting can be configured (any which can be added to the 289 \item A setting can be configured (any which can be added to the
290 \setting{Quick Screen}) 290 \setting{Quick Screen})
@@ -307,7 +307,7 @@ each item to be displayed. Each shortcut looks like the following:
307 data: <what the shortcut actually links to> 307 data: <what the shortcut actually links to>
308 name: <what the shortcut should be displayed as> 308 name: <what the shortcut should be displayed as>
309 icon: <number of the theme icon to use (see \wikilink{CustomIcons})> 309 icon: <number of the theme icon to use (see \wikilink{CustomIcons})>
310 talkclip: <filename of a talk clip to speak when voice menus are enabled> 310 talkclip: <full path to a talk clip to speak when voice menus are enabled> (example: \fname{/.rockbox/filename.talk})
311\end{example} 311\end{example}
312 312
313Only ``type'' and ``data'' are required (except if type is ``separator'' in which case 313Only ``type'' and ``data'' are required (except if type is ``separator'' in which case
diff --git a/manual/rockbox_interface/tagcache.tex b/manual/rockbox_interface/tagcache.tex
index 91c0255750..3c3e6d2df8 100644
--- a/manual/rockbox_interface/tagcache.tex
+++ b/manual/rockbox_interface/tagcache.tex
@@ -47,30 +47,34 @@ with logging
47 \item[Load To RAM] 47 \item[Load To RAM]
48 The database can either be kept on \disk{} (to save memory), or 48 The database can either be kept on \disk{} (to save memory), or
49 loaded into RAM (for fast browsing). Setting this to \setting{Yes} loads 49 loaded into RAM (for fast browsing). Setting this to \setting{Yes} loads
50 the database to RAM, allowing faster browsing and searching. Setting this 50 the database to RAM, beginning with the next reboot, allowing faster browsing and
51 option to \setting{No} keeps the database on the \disk{}, meaning slower 51 searching. Setting this option to \setting{No} keeps the database on the \disk{},
52 browsing but it does not use extra RAM and saves some battery on boot up. 52 meaning slower browsing but it does not use extra RAM and saves some battery on
53 53 boot up.
54
54 \opt{HAVE_DISK_STORAGE}{ 55 \opt{HAVE_DISK_STORAGE}{
55 If you browse your music frequently using the database, you should 56 If you browse your music frequently using the database, you should
56 load to RAM, as this will reduce the overall battery consumption because 57 load to RAM, as this will reduce the overall battery consumption because
57 the disk will not need to spin on each search. 58 the disk will not need to spin on each search.
58 } 59 }
59 60
60 \note{When Load to RAM is turned on, and the directory cache is enabled as well, 61 \note{When Load to RAM is turned on, and the directory cache (see
61 it may take an unexpectedly long amount of time for disk activity to 62 \reference{ref:dircache}) is enabled as well, it may take an unexpectedly long amount
62 wind down after booting, depending on your library size and player. 63 of time for disk activity to wind down after booting, depending on your library size
64 and player.
63 65
64 This can be mitigated by choosing the \setting{Quick} option instead, which causes 66 This can be mitigated by choosing the \setting{Quick} option instead, which causes
65 the database to ignore cached file references. In that case, you may notice brief 67 the database to ignore cached file references. In that case, you should expect brief
66 moments of disk activity once the path for a database entry has to be retrieved. 68 moments of disk activity whenever the path for a database entry has to be retrieved.
67 69
68 Set to \setting{On}, if you plan to take advantage the database's Update function, 70 Setting this to \setting{On} may be preferable for reducing disk accesses if you plan to
69 or use a WPS that displays multiple upcoming tracks from the current playlist. 71 take advantage of \setting{Auto Update}, have enabled \setting{Gather Runtime Data}
70 Otherwise, you may notice file names instead of metadata being displayed for those 72 (see below for both), enabled \setting{Automatic resume} (see
71 tracks.} 73 \reference{ref:Autoresumeconfigactual}), or use a WPS that displays multiple upcoming
74 tracks from the current playlist. In the latter case, metadata will not be displayed
75 for those tracks otherwise.}
72 } 76 }
73 77
74\item[Auto Update] 78\item[Auto Update]
75 If \setting{Auto update} is set to \setting{on}, each time the \dap{} 79 If \setting{Auto update} is set to \setting{on}, each time the \dap{}
76 boots, the database will automatically be updated. 80 boots, the database will automatically be updated.
diff --git a/tools/builds.pm b/tools/builds.pm
index 0c83548cf2..47fa7d2aef 100644
--- a/tools/builds.pm
+++ b/tools/builds.pm
@@ -440,7 +440,11 @@ $releasenotes="/wiki/ReleaseNotes315";
440 manualok => 1, # Remove once status moves to 3 440 manualok => 1, # Remove once status moves to 3
441 }, 441 },
442 'aigoerosq' => { 442 'aigoerosq' => {
443 name => 'AIGO EROS Q / K', 443 name => 'AIGO EROS Q / K (Hosted)',
444 status => 2,
445 },
446 'erosqnative' => {
447 name => 'AIGO EROS Q / K (Native)',
444 status => 2, 448 status => 2,
445 }, 449 },
446 'ihifi770' => { 450 'ihifi770' => {
diff --git a/tools/buildzip.pl b/tools/buildzip.pl
index 43c304ff12..65aca59e13 100755
--- a/tools/buildzip.pl
+++ b/tools/buildzip.pl
@@ -167,6 +167,13 @@ sub make_install {
167 glob_install("$src/rocks/$t/*", "$libdir/rocks/$t", "-m 0755"); 167 glob_install("$src/rocks/$t/*", "$libdir/rocks/$t", "-m 0755");
168 } 168 }
169 169
170 if(-e "$src/rocks/games/sgt_puzzles") {
171 unless (glob_mkdir("$libdir/rocks/games/sgt_puzzles")) {
172 return 0;
173 }
174 glob_install("$src/rocks/games/sgt_puzzles/*", "$libdir/rocks/games/sgt_puzzles", "-m 0755");
175 }
176
170 # rocks/viewers/lua 177 # rocks/viewers/lua
171 unless (glob_mkdir("$libdir/rocks/viewers/lua")) { 178 unless (glob_mkdir("$libdir/rocks/viewers/lua")) {
172 return 0; 179 return 0;
@@ -183,6 +190,14 @@ sub make_install {
183 #glob_copy("$ROOT/apps/plugins/lua_scripts/*.lua", "$temp_dir/rocks/demos/lua_scripts/"); 190 #glob_copy("$ROOT/apps/plugins/lua_scripts/*.lua", "$temp_dir/rocks/demos/lua_scripts/");
184 } 191 }
185 192
193 #lua picross puzzles
194 if(-e "$ROOT/apps/plugins/picross") {
195 unless (glob_mkdir("$libdir/rocks/games/.picross")) {
196 return 0;
197 }
198 glob_install("$ROOT/apps/plugins/picross/*.picross", "$libdir/rocks/games/.picross");
199 }
200
186 # all the rest directories 201 # all the rest directories
187 foreach my $t (@userstuff) { 202 foreach my $t (@userstuff) {
188 unless (glob_mkdir("$userdir/$t")) { 203 unless (glob_mkdir("$userdir/$t")) {
@@ -373,9 +388,12 @@ sub buildzip {
373 } 388 }
374 } 389 }
375 390
376 # create the file so the database does not try indexing a folder 391 # create the file so the database indexer skips this folder
377 open(IGNORE, ">$temp_dir/database.ignore") || die "can't open database.ignore"; 392 open(IGNORE, ">$temp_dir/database.ignore") || die "can't open database.ignore";
378 close(IGNORE); 393 close(IGNORE);
394 # create the file so the talkclip generation skips this folder
395 open(IGNORE, ">$temp_dir/talkclips.ignore") || die "can't open talkclips.ignore";
396 close(IGNORE);
379 397
380 # the samsung ypr0 has a loader script that's needed in the zip 398 # the samsung ypr0 has a loader script that's needed in the zip
381 if ($modelname =~ /samsungypr[01]/) { 399 if ($modelname =~ /samsungypr[01]/) {
@@ -444,6 +462,12 @@ sub buildzip {
444 glob_copy("$ROOT/apps/plugins/lua_scripts/*.lua", "$temp_dir/rocks/demos/lua_scripts/"); 462 glob_copy("$ROOT/apps/plugins/lua_scripts/*.lua", "$temp_dir/rocks/demos/lua_scripts/");
445 } 463 }
446 464
465 #lua picross puzzles
466 if(-e "$ROOT/apps/plugins/picross") {
467 glob_mkdir("$temp_dir/rocks/games/.picross");
468 glob_copy("$ROOT/apps/plugins/picross/*.picross", "$temp_dir/rocks/games/.picross/");
469 }
470
447 # exclude entries for the image file types not supported by the imageviewer for the target. 471 # exclude entries for the image file types not supported by the imageviewer for the target.
448 my $viewers = "$ROOT/apps/plugins/viewers.config"; 472 my $viewers = "$ROOT/apps/plugins/viewers.config";
449 my $c="cat $viewers | gcc $cppdef -I. -I$firmdir/export -E -P -include config.h -"; 473 my $c="cat $viewers | gcc $cppdef -I. -I$firmdir/export -E -P -include config.h -";
@@ -505,7 +529,13 @@ sub buildzip {
505 foreach my $line (@rock_targetdirs) { 529 foreach my $line (@rock_targetdirs) {
506 if ($line =~ /([^,]*),(.*)/) { 530 if ($line =~ /([^,]*),(.*)/) {
507 my ($plugin, $dir)=($1, $2); 531 my ($plugin, $dir)=($1, $2);
508 move("$temp_dir/rocks/${plugin}.rock", "$temp_dir/rocks/$dir/${plugin}.rock"); 532 if($dir eq 'games' and substr(${plugin}, 0, 4) eq "sgt-") {
533 glob_mkdir("$temp_dir/rocks/$dir/sgt_puzzles");
534 move("$temp_dir/rocks/${plugin}.rock", "$temp_dir/rocks/$dir/sgt_puzzles/${plugin}.rock");
535 }
536 else {
537 move("$temp_dir/rocks/${plugin}.rock", "$temp_dir/rocks/$dir/${plugin}.rock");
538 }
509 if(-e "$temp_dir/rocks/${plugin}.ovl") { 539 if(-e "$temp_dir/rocks/${plugin}.ovl") {
510 # if there's an "overlay" file for the .rock, move that as 540 # if there's an "overlay" file for the .rock, move that as
511 # well 541 # well
@@ -533,6 +563,10 @@ sub buildzip {
533 copy("$ROOT/apps/plugins/sokoban.levels", "$temp_dir/rocks/games/sokoban.levels"); # sokoban levels 563 copy("$ROOT/apps/plugins/sokoban.levels", "$temp_dir/rocks/games/sokoban.levels"); # sokoban levels
534 copy("$ROOT/apps/plugins/snake2.levels", "$temp_dir/rocks/games/snake2.levels"); # snake2 levels 564 copy("$ROOT/apps/plugins/snake2.levels", "$temp_dir/rocks/games/snake2.levels"); # snake2 levels
535 copy("$ROOT/apps/plugins/rockbox-fonts.config", "$temp_dir/rocks/viewers/"); 565 copy("$ROOT/apps/plugins/rockbox-fonts.config", "$temp_dir/rocks/viewers/");
566 # picross files
567 copy("$ROOT/apps/plugins/picross_default.picross", "$temp_dir/rocks/games/picross_default.picross");
568 copy("$ROOT/apps/plugins/bitmaps/native/picross_numbers.bmp",
569 "$temp_dir/rocks/games/picross_numbers.bmp");
536 } 570 }
537 571
538 if(-e "$temp_dir/rocks/demos/pictureflow.rock") { 572 if(-e "$temp_dir/rocks/demos/pictureflow.rock") {
diff --git a/tools/configure b/tools/configure
index 8a2e499a29..1a03f3f010 100755
--- a/tools/configure
+++ b/tools/configure
@@ -4409,15 +4409,14 @@ gccver=`$CC -dumpversion`;
4409# system etc to be able to see it easier 4409# system etc to be able to see it easier
4410if [ $uname = "Darwin" ]; then 4410if [ $uname = "Darwin" ]; then
4411 ldver=`$LD -v 2>&1 | sed -e 's/[^0-9.-]//g'` 4411 ldver=`$LD -v 2>&1 | sed -e 's/[^0-9.-]//g'`
4412 # Convert LD version to a number major*100 + minor
4413 ldnum1=`echo $ldver | cut -d . -f1`
4414 ldnum2=`echo $ldver | cut -d . -f2`
4415 ldnum=`(expr $ldnum1 "*" 100 + $ldnum2) 2>/dev/null`
4412else 4416else
4413 ldver=`$LD --version | sed -n '1p' | sed -e 's/.* \([0-9]*\)\.\([0-9]*\).*/\1\2/'` 4417 ldnum=`$LD --version | sed -n '1p' | sed -e 's/.* \([0-9]*\)\.\([0-9]*\).*/\1\2/'`
4414fi 4418fi
4415 4419
4416# Convert LD version to a number major*100 + minor
4417ldnum1=`echo $ldver | cut -d . -f1`
4418ldnum2=`echo $ldver | cut -d . -f2`
4419ldnum=`(expr $ldnum1 "*" 100 + $ldnum2) 2>/dev/null`
4420
4421if test "$ldnum" -ge "227"; then 4420if test "$ldnum" -ge "227"; then
4422 have_nocrossrefs_to="#define HAVE_NOCROSSREFS_TO" 4421 have_nocrossrefs_to="#define HAVE_NOCROSSREFS_TO"
4423else 4422else
@@ -4533,7 +4532,11 @@ if [ -z "$arch" ]; then
4533 elif [ -n "$(echo $cpp_defines | grep -w __arm__)" ]; then 4532 elif [ -n "$(echo $cpp_defines | grep -w __arm__)" ]; then
4534 arch="arm" 4533 arch="arm"
4535 # cpp defines like "#define __ARM_ARCH_4TE__ 1" (where we want to extract the 4) 4534 # cpp defines like "#define __ARM_ARCH_4TE__ 1" (where we want to extract the 4)
4536 arch_version="$(echo $cpp_defines | tr ' ' '\012' | grep __ARM_ARCH | sed -e 's,.*\([0-9]\).*,\1,' | grep -v __ARM_ARCH)" 4535 arch_version="$(echo $cpp_defines | tr ' ' '\012' | grep __ARM_ARCH | sed -e 's,.*\([0-9]\).*,\1,' | grep -v __ARM_ARCH | head -1)"
4536 if test "$gccnum" -ge "800"; then
4537 # GCC8+ can natively emit unified asm syntax
4538 GCCOPTS="$GCCOPTS -masm-syntax-unified"
4539 fi
4537 elif [ -n "$(echo $cpp_defines | grep -w __mips__)" ]; then 4540 elif [ -n "$(echo $cpp_defines | grep -w __mips__)" ]; then
4538 arch="mips" 4541 arch="mips"
4539 arch_version="$(echo $cpp_defines | tr ' ' '\012' | grep _MIPS_ARCH_MIPS | sed -e 's,.*\([0-9][0-9]\).*,\1,' | grep -v _MIPS_ARCH_MIPS)" 4542 arch_version="$(echo $cpp_defines | tr ' ' '\012' | grep _MIPS_ARCH_MIPS | sed -e 's,.*\([0-9][0-9]\).*,\1,' | grep -v _MIPS_ARCH_MIPS)"
diff --git a/tools/root.make b/tools/root.make
index 37aeaadaff..4adb4f4d3d 100644
--- a/tools/root.make
+++ b/tools/root.make
@@ -437,6 +437,8 @@ help:
437 @echo "tools - builds the tools only" 437 @echo "tools - builds the tools only"
438 @echo "voice - creates the voice clips (voice builds only)" 438 @echo "voice - creates the voice clips (voice builds only)"
439 @echo "voicetools - builds the voice tools only" 439 @echo "voicetools - builds the voice tools only"
440 @echo "talkclips - builds talkclips for everything under TALKDIR, skipping existing clips"
441 @echo "talkclips-force - builds talkclips for everything under TALKDIR, overwriting all existing clips"
440 @echo "install - installs your build (at PREFIX, defaults to simdisk/ for simulators (no fonts))" 442 @echo "install - installs your build (at PREFIX, defaults to simdisk/ for simulators (no fonts))"
441 @echo "fullinstall - installs your build (like install, but with fonts)" 443 @echo "fullinstall - installs your build (like install, but with fonts)"
442 @echo "symlinkinstall - like fullinstall, but with links instead of copying files. (Good for developing on simulator)" 444 @echo "symlinkinstall - like fullinstall, but with links instead of copying files. (Good for developing on simulator)"
diff --git a/tools/updatelang b/tools/updatelang
index 61d57de532..6f0012c573 100755
--- a/tools/updatelang
+++ b/tools/updatelang
@@ -47,7 +47,7 @@ sub parselangfile {
47 next; 47 next;
48 } elsif($line =~ /^ *#/) { 48 } elsif($line =~ /^ *#/) {
49 push(@comments, "$line\n") if ($pos eq 'lang'); 49 push(@comments, "$line\n") if ($pos eq 'lang');
50 # comments are ignored! 50 # comments are ignored, but retained!
51 next; 51 next;
52 } elsif ($pos eq 'phrase' && $line =~ /^([^:]+): ?(.*)$/) { 52 } elsif ($pos eq 'phrase' && $line =~ /^([^:]+): ?(.*)$/) {
53 $thisphrase{$pos}->{$1} = $2; 53 $thisphrase{$pos}->{$1} = $2;
@@ -124,6 +124,37 @@ sub combinetgts {
124 return %combined; 124 return %combined;
125} 125}
126 126
127sub reduceformat($) {
128 my ($in) = @_;
129 my $out = "";
130 my $infmt = 0;
131
132 for (my $i = 0; $i < length($in) ; $i++) {
133 my $c = substr($in, $i, 1);
134 if (!$infmt && ($c eq '%')) {
135 # First char in a format string!
136 $infmt = 1;
137 next;
138 }
139 next if (!$infmt);
140
141 if ($c ne '%') {
142 # Ignore literal %, otherwise dump specifier over
143 $out .= $c;
144 }
145
146 # Look for a terminating field:
147 my $count = $c =~ tr/sSdDuUxXzZ%//;
148 if ($count) {
149 $infmt = 0;
150 next;
151 }
152 }
153
154 return $out;
155}
156
157
127################## 158##################
128 159
129if($#ARGV != 2) { 160if($#ARGV != 2) {
@@ -332,6 +363,43 @@ foreach my $id (@langorder) {
332 $lang{$id}{'notes'} .= "### The <dest> section for '$id:$tgt' is identical to english!\n"; 363 $lang{$id}{'notes'} .= "### The <dest> section for '$id:$tgt' is identical to english!\n";
333# print "#!! '$id:$tgt' dest identical ('$lp{$tgt}')\n"; 364# print "#!! '$id:$tgt' dest identical ('$lp{$tgt}')\n";
334 } 365 }
366 if ($id eq 'LANG_VOICED_DATE_FORMAT') {
367 my $sane = $lp{$tgt};
368 $sane =~ tr/YAmd//d;
369 if (length($sane) != 0) {
370 $lang{$id}{'notes'} .= "### The <dest> section for '$id:$tgt' has illegal characters! Restoring from English!\n";
371 $lang{$id}{'notes'} .= "### the previously used one is commented below:\n";
372 $lang{$id}{'notes'} .= "### $lang{$id}{dest}{$tgt}\n";
373 $lang{$id}{'dest'}{$tgt} = $english{$id}{'dest'}{$tgt};
374 }
375 }
376 my $count1 = $ep{$tgt} =~ tr/%//;
377 my $count2 = 0;
378 if (defined($lp{$tgt})) {
379 $count2 = $lp{$tgt} =~ tr/%//;
380 }
381 if ($count1 || $count2) {
382 my $fmt1 = reduceformat($ep{$tgt});
383 my $fmt2 = "";
384 if ($count2) {
385 $fmt2 = reduceformat($lp{$tgt});
386 }
387 if ($fmt1 ne $fmt2) {
388 $lang{$id}{'notes'} .= "### The <dest> section for '$id:$tgt' has incorrect format specifiers! Copying from English!\n";
389 $lang{$id}{'notes'} .= "### the previously used one is commented below:\n";
390 $lang{$id}{'notes'} .= "### $lang{$id}{dest}{$tgt}\n";
391 $lang{$id}{'dest'}{$tgt} = $english{$id}{'dest'}{$tgt};
392# print "#!! '$id:$tgt' dest does not match src format args: '$fmt1' vs '$fmt2'\n";
393 }
394 }
395 if (defined($lp{$tgt})) {
396 $count2 = $lp{$tgt} =~ tr/"//;
397 if ($count2 > 0) {
398 # If it has suspicious characters that are not allowed
399 $lang{$id}{'notes'} .= "### The <dest> section for '$id:$tgt' has some suspicious characters, please double-check!\n";
400# print "#!! '$id:$tgt' suspicious characters\n";
401 }
402 }
335 } 403 }
336} 404}
337 405
@@ -365,13 +433,17 @@ foreach my $id (@langorder) {
365 $lang{$id}{'voice'}{$tgt} = $english{$id}{'voice'}{$tgt}; 433 $lang{$id}{'voice'}{$tgt} = $english{$id}{'voice'}{$tgt};
366 } elsif ($lp{$tgt} ne $ep{$tgt}) { 434 } elsif ($lp{$tgt} ne $ep{$tgt}) {
367 if ($lp{$tgt} eq '' && $ep{$tgt} ne '') { 435 if ($lp{$tgt} eq '' && $ep{$tgt} ne '') {
368 # If the lang voice string is blank, complain, and copy from English 436 # If the lang voice string is blank, complain and copy from translation
369# print "#!! '$id:$tgt' voice is blank ('$lp{$tgt}' vs '$ep{$tgt}')\n"; 437# print "#!! '$id:$tgt' voice is blank ('$lp{$tgt}' vs '$ep{$tgt}')\n";
370 if ($lang{$id}{'dest'}{$tgt} ne '' && 438 if ($lang{$id}{'dest'}{$tgt} ne '' &&
371 $lang{$id}{'dest'}{$tgt} ne $english{$id}{'dest'}{$tgt}) { 439 $lang{$id}{'dest'}{$tgt} ne $english{$id}{'dest'}{$tgt}) {
372 $lang{$id}{'notes'} .= "### The <voice> section for '$id:$tgt' is blank! Copying from translated <dest>!\n"; 440 $lang{$id}{'notes'} .= "### The <voice> section for '$id:$tgt' is blank! Copying from translated <dest>!\n";
373 $lang{$id}{'voice'}{$tgt} = $lang{$id}{'dest'}{$tgt}; 441 $lang{$id}{'voice'}{$tgt} = $lang{$id}{'dest'}{$tgt};
374 442 if ($lang{$id}{'voice'}{$tgt} =~ /%"/) {
443 # If it has suspicious characters that are not normally voiced..
444 $lang{$id}{'notes'} .= "### The <voice> section for '$id:$tgt' has some suspicious characters, please double-check!\n";
445 #print "#!! '$id:$tgt' suspicious characters\n";
446 }
375 } else { 447 } else {
376 $lang{$id}{'notes'} .= "### The <voice> section for '$id:$tgt' is blank! Copying from english!\n"; 448 $lang{$id}{'notes'} .= "### The <voice> section for '$id:$tgt' is blank! Copying from english!\n";
377 449
@@ -397,6 +469,11 @@ foreach my $id (@langorder) {
397 $lang{$id}{'notes'} .= "### The <voice> section for '$id:$tgt' is identical to english!\n"; 469 $lang{$id}{'notes'} .= "### The <voice> section for '$id:$tgt' is identical to english!\n";
398 } 470 }
399 } 471 }
472 if (defined($lp{$tgt}) && ($lp{$tgt} =~ /%"/)) {
473 # If it has suspicious characters that are not normally voiced..
474 $lang{$id}{'notes'} .= "### The <voice> section for '$id:$tgt' has some suspicious characters, please double-check!\n";
475# print "#!! '$id:$tgt' suspicious characters\n";
476 }
400 } 477 }
401} 478}
402 479
diff --git a/tools/voice.pl b/tools/voice.pl
index 337407e187..9efc844c10 100755
--- a/tools/voice.pl
+++ b/tools/voice.pl
@@ -17,6 +17,7 @@
17 17
18use strict; 18use strict;
19use warnings; 19use warnings;
20use utf8;
20use File::Basename; 21use File::Basename;
21use File::Copy; 22use File::Copy;
22use vars qw($V $C $t $l $e $E $s $S $i $v $f $F); 23use vars qw($V $C $t $l $e $E $s $S $i $v $f $F);
@@ -25,8 +26,8 @@ use IPC::Open3;
25use Digest::MD5 qw(md5_hex); 26use Digest::MD5 qw(md5_hex);
26use DirHandle; 27use DirHandle;
27use open ':encoding(utf8)'; 28use open ':encoding(utf8)';
28use open ':std'; 29use Encode::Locale;
29use utf8; 30use Encode;
30 31
31sub printusage { 32sub printusage {
32 print <<USAGE 33 print <<USAGE
@@ -562,6 +563,7 @@ sub gentalkclips {
562 my ($dir, $tts_object, $encoder, $encoder_opts, $tts_engine_opts, $i) = @_; 563 my ($dir, $tts_object, $encoder, $encoder_opts, $tts_engine_opts, $i) = @_;
563 my $d = new DirHandle $dir; 564 my $d = new DirHandle $dir;
564 while (my $file = $d->read) { 565 while (my $file = $d->read) {
566 $file = Encode::decode( locale_fs => $file);
565 my ($voice, $wav, $enc); 567 my ($voice, $wav, $enc);
566 my $format = $tts_object->{'format'}; 568 my $format = $tts_object->{'format'};
567 569
@@ -580,13 +582,13 @@ sub gentalkclips {
580 if ($file eq '.' || $file eq '..' || $file =~ /\.talk$/) { 582 if ($file eq '.' || $file eq '..' || $file =~ /\.talk$/) {
581 next; 583 next;
582 } 584 }
583 # Element is a dir 585
584 if ( -d $path) { 586 if ( -d $path) { # Element is a dir
585 $enc = sprintf("%s/_dirname.talk", $path); 587 $enc = sprintf("%s/_dirname.talk", $path);
586 gentalkclips($path, $tts_object, $encoder, $encoder_opts, $tts_engine_opts, $i); 588 if (! -e "$path/talkclips.ignore") { # Skip directories containing "talkclips.ignore"
587 } 589 gentalkclips($path, $tts_object, $encoder, $encoder_opts, $tts_engine_opts, $i);
588 # Element is a file 590 }
589 else { 591 } else { # Element is a file
590 $enc = sprintf("%s.talk", $path); 592 $enc = sprintf("%s.talk", $path);
591 $voice =~ s/\.[^\.]*$//; # Trim extension 593 $voice =~ s/\.[^\.]*$//; # Trim extension
592 } 594 }
diff --git a/utils/themeeditor/quazip/crypt.h b/utils/themeeditor/quazip/crypt.h
index 82748c5715..2316f0c604 100644
--- a/utils/themeeditor/quazip/crypt.h
+++ b/utils/themeeditor/quazip/crypt.h
@@ -32,7 +32,7 @@
32/*********************************************************************** 32/***********************************************************************
33 * Return the next byte in the pseudo-random sequence 33 * Return the next byte in the pseudo-random sequence
34 */ 34 */
35static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab) 35static int decrypt_byte(unsigned long* pkeys, const uint32_t* pcrc_32_tab)
36{ 36{
37 (void) pcrc_32_tab; /* avoid "unused parameter" warning */ 37 (void) pcrc_32_tab; /* avoid "unused parameter" warning */
38 unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an 38 unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
@@ -46,7 +46,7 @@ static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
46/*********************************************************************** 46/***********************************************************************
47 * Update the encryption keys with the next byte of plain text 47 * Update the encryption keys with the next byte of plain text
48 */ 48 */
49static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c) 49static int update_keys(unsigned long* pkeys,const uint32_t* pcrc_32_tab,int c)
50{ 50{
51 (*(pkeys+0)) = CRC32((*(pkeys+0)), c); 51 (*(pkeys+0)) = CRC32((*(pkeys+0)), c);
52 (*(pkeys+1)) += (*(pkeys+0)) & 0xff; 52 (*(pkeys+1)) += (*(pkeys+0)) & 0xff;
@@ -63,7 +63,7 @@ static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int
63 * Initialize the encryption keys and the random header according to 63 * Initialize the encryption keys and the random header according to
64 * the given password. 64 * the given password.
65 */ 65 */
66static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab) 66static void init_keys(const char* passwd,unsigned long* pkeys,const uint32_t* pcrc_32_tab)
67{ 67{
68 *(pkeys+0) = 305419896L; 68 *(pkeys+0) = 305419896L;
69 *(pkeys+1) = 591751049L; 69 *(pkeys+1) = 591751049L;
@@ -93,7 +93,7 @@ static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting)
93 unsigned char *buf; /* where to write header */ 93 unsigned char *buf; /* where to write header */
94 int bufSize; 94 int bufSize;
95 unsigned long* pkeys; 95 unsigned long* pkeys;
96 const unsigned long* pcrc_32_tab; 96 const uint32_t* pcrc_32_tab;
97 unsigned long crcForCrypting; 97 unsigned long crcForCrypting;
98{ 98{
99 int n; /* index in random header */ 99 int n; /* index in random header */
diff --git a/utils/themeeditor/quazip/unzip.c b/utils/themeeditor/quazip/unzip.c
index ace7a08837..59bab3ccc1 100644
--- a/utils/themeeditor/quazip/unzip.c
+++ b/utils/themeeditor/quazip/unzip.c
@@ -147,7 +147,7 @@ typedef struct
147 int encrypted; 147 int encrypted;
148# ifndef NOUNCRYPT 148# ifndef NOUNCRYPT
149 unsigned long keys[3]; /* keys defining the pseudo-random sequence */ 149 unsigned long keys[3]; /* keys defining the pseudo-random sequence */
150 const unsigned long* pcrc_32_tab; 150 const uint32_t* pcrc_32_tab;
151# endif 151# endif
152} unz_s; 152} unz_s;
153 153
@@ -204,7 +204,7 @@ local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX)
204 uLong *pX; 204 uLong *pX;
205{ 205{
206 uLong x ; 206 uLong x ;
207 int i; 207 int i = 0;
208 int err; 208 int err;
209 209
210 err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); 210 err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
@@ -232,7 +232,7 @@ local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX)
232 uLong *pX; 232 uLong *pX;
233{ 233{
234 uLong x ; 234 uLong x ;
235 int i; 235 int i = 0;
236 int err; 236 int err;
237 237
238 err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); 238 err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
diff --git a/utils/themeeditor/quazip/zip.c b/utils/themeeditor/quazip/zip.c
index 13463fe336..77c8726b3a 100644
--- a/utils/themeeditor/quazip/zip.c
+++ b/utils/themeeditor/quazip/zip.c
@@ -130,7 +130,7 @@ typedef struct
130 int encrypt; 130 int encrypt;
131#ifndef NOCRYPT 131#ifndef NOCRYPT
132 unsigned long keys[3]; /* keys defining the pseudo-random sequence */ 132 unsigned long keys[3]; /* keys defining the pseudo-random sequence */
133 const unsigned long* pcrc_32_tab; 133 const uint32_t* pcrc_32_tab;
134 int crypt_header_size; 134 int crypt_header_size;
135#endif 135#endif
136} curfile_info; 136} curfile_info;