diff options
| author | Jonathan Gordon <rockbox@jdgordon.info> | 2007-08-12 02:10:45 +0000 |
|---|---|---|
| committer | Jonathan Gordon <rockbox@jdgordon.info> | 2007-08-12 02:10:45 +0000 |
| commit | eff14cceec3c71a90c6a675b0bd7b297bd151e7a (patch) | |
| tree | ed37fcf62fd857e313e7f4cbacb706127a0b3227 /apps | |
| parent | ca42a2f0dd244b44468c79ac0a4b5c5d448218bf (diff) | |
| download | rockbox-eff14cceec3c71a90c6a675b0bd7b297bd151e7a.zip rockbox-eff14cceec3c71a90c6a675b0bd7b297bd151e7a.tar.gz rockbox-eff14cceec3c71a90c6a675b0bd7b297bd151e7a.tar.bz2 rockbox-eff14cceec3c71a90c6a675b0bd7b297bd151e7a.tar.xz | |
Change the way the MAX_FILETYPES define works. It now allocates enough filetype icons as it needed last boot + 8, this means we should never have to edit the define again.
If you get the "filetypes array full" splash, do a clean reboot and it shuold go away. if it doesnt make sure you file a bug report and let us know you did reboot and it stayed there... it means that define does actually need increeasing.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14287 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
| -rw-r--r-- | apps/filetypes.c | 62 | ||||
| -rw-r--r-- | apps/settings.h | 8 | ||||
| -rw-r--r-- | apps/settings_list.c | 1 |
3 files changed, 46 insertions, 25 deletions
diff --git a/apps/filetypes.c b/apps/filetypes.c index 785a317..1e7224a 100644 --- a/apps/filetypes.c +++ b/apps/filetypes.c @@ -41,20 +41,12 @@ #include "icons.h" #include "logf.h" -/* max filetypes (plugins & icons stored here) */ -#if CONFIG_CODEC == SWCODEC -#define MAX_FILETYPES 80 -#else -#define MAX_FILETYPES 48 -#endif - /* a table for the know file types */ const struct filetype inbuilt_filetypes[] = { { "mp3", FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA }, { "mp2", FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA }, { "mpa", FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA }, #if CONFIG_CODEC == SWCODEC - /* Temporary hack to allow playlist creation */ { "mp1", FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA }, { "ogg", FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA }, { "wma", FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA }, @@ -104,7 +96,7 @@ const struct filetype inbuilt_filetypes[] = { { "cue", FILE_ATTR_CUE, Icon_Bookmark, VOICE_EXT_CUESHEET }, #ifdef BOOTFILE_EXT { BOOTFILE_EXT, FILE_ATTR_MOD, Icon_Firmware, VOICE_EXT_AJZ }, -#endif /* #ifndef SIMULATOR */ +#endif /* #ifndef BOOTFILE_EXT */ }; void tree_get_filetypes(const struct filetype** types, int* count) @@ -123,14 +115,14 @@ struct file_type { char* plugin; /* Which plugin to use, NULL if unknown, or builtin */ char* extension; /* NULL for none */ }; -static struct file_type filetypes[MAX_FILETYPES]; -static int custom_filetype_icons[MAX_FILETYPES]; +static struct file_type *filetypes; +static int *custom_filetype_icons; static bool custom_icons_loaded = false; #ifdef HAVE_LCD_COLOR -static int custom_colors[MAX_FILETYPES+1]; +static int *custom_colors; #endif -static int filetype_count = 0; static unsigned char heighest_attr = 0; +static int max_types = 0, filetype_count; static char *filetypes_strdup(char* string) { @@ -150,7 +142,10 @@ void read_color_theme_file(void) { int fd; char *ext, *color; int i; - for (i = 0; i < MAX_FILETYPES+1; i++) { + + if (max_types == 0) + return; + for (i = 0; i < filetype_count+1; i++) { custom_colors[i] = -1; } snprintf(buffer, MAX_PATH, "%s/%s.colours", THEME_DIR, @@ -169,7 +164,7 @@ void read_color_theme_file(void) { } if (!strcasecmp(ext, "???")) { - custom_colors[MAX_FILETYPES] = hex_to_rgb(color); + custom_colors[filetype_count] = hex_to_rgb(color); continue; } for (i=1; i<filetype_count; i++) @@ -195,6 +190,8 @@ void read_viewer_theme_file(void) global_status.viewer_icon_count = 0; custom_icons_loaded = false; custom_filetype_icons[0] = Icon_Folder; + if (max_types == 0) + return; for (i=1; i<filetype_count; i++) { custom_filetype_icons[i] = filetypes[i].icon; @@ -236,6 +233,16 @@ void read_viewer_theme_file(void) void filetype_init(void) { + max_types = global_status.filetype_count + 8; /* always make a bit more room + for more types */ + filetypes = (struct file_type *)buffer_alloc(sizeof(struct file_type)* + max_types); + custom_filetype_icons = (int*)buffer_alloc(sizeof(int)*max_types); +#ifdef HAVE_LCD_COLOR + /* the extra item here is for the unknown types + which use the last array element */ + custom_colors = (int*)buffer_alloc(sizeof(int)*max_types+1); +#endif /* set the directory item first */ filetypes[0].extension = NULL; filetypes[0].plugin = NULL; @@ -251,6 +258,10 @@ void filetype_init(void) #ifdef HAVE_LCD_COLOR read_color_theme_file(); #endif + if (global_status.filetype_count == 0) + global_status.filetype_count = MAX_FILETYPES; + else global_status.filetype_count = filetype_count; + status_save(); } /* remove all white spaces from string */ @@ -272,14 +283,14 @@ static void rm_whitespaces(char* str) static void read_builtin_types(void) { int count = sizeof(inbuilt_filetypes)/sizeof(*inbuilt_filetypes), i; - for(i=0; i<count && (filetype_count < MAX_FILETYPES); i++) + for(i=0; i<count && (filetype_count<max_types); i++) { filetypes[filetype_count].extension = inbuilt_filetypes[i].extension; filetypes[filetype_count].plugin = NULL; - filetypes[filetype_count].attr = inbuilt_filetypes[i].tree_attr>>8; + filetypes[filetype_count].attr = inbuilt_filetypes[i].tree_attr>>8; if (filetypes[filetype_count].attr > heighest_attr) heighest_attr = filetypes[filetype_count].attr; - filetypes[filetype_count].icon = inbuilt_filetypes[i].icon; + filetypes[filetype_count].icon = inbuilt_filetypes[i].icon; filetype_count++; } } @@ -291,14 +302,15 @@ static void read_config(char* config_file) int fd = open(config_file, O_RDONLY); if (fd < 0) return; - /* config file is in the for + /* config file is in the form <extension>,<plugin>,<icon code> ignore line if either of the first two are missing */ while (read_line(fd, line, 64) > 0) { - if (filetype_count >= MAX_FILETYPES) + if (filetype_count >= max_types) { gui_syncsplash(HZ, ID2P(LANG_FILETYPES_FULL)); + global_status.filetype_count = 0; /* make plenty of room for next reboot */ break; } rm_whitespaces(line); @@ -347,7 +359,7 @@ int filetype_get_attr(const char* file) if (!extension) return 0; extension++; - for (i=0; i<filetype_count; i++) + for (i=0; i<max_types; i++) { if (filetypes[i].extension && !strcasecmp(extension, filetypes[i].extension)) @@ -379,7 +391,7 @@ int filetype_get_color(const char * name, int attr) return custom_colors[0]; extension = strrchr(name, '.'); if (!extension) - return custom_colors[MAX_FILETYPES]; + return custom_colors[filetype_count]; extension++; for (i=1; i<filetype_count; i++) @@ -388,7 +400,7 @@ int filetype_get_color(const char * name, int attr) !strcasecmp(extension, filetypes[i].extension)) return custom_colors[i]; } - return custom_colors[MAX_FILETYPES]; + return custom_colors[filetype_count]; } #endif @@ -439,9 +451,9 @@ char * openwith_get_name(int selected_item, void * data, char * buffer) int filetype_list_viewers(const char* current_file) { int i, count = 0, action; - int items[MAX_FILETYPES]; + int items[64]; struct gui_synclist lists; - for (i=0; i<filetype_count && count < MAX_FILETYPES; i++) + for (i=0; i<filetype_count && count < 64; i++) { if (filetypes[i].plugin) { diff --git a/apps/settings.h b/apps/settings.h index 39dabc7..276a8b3 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -145,6 +145,13 @@ extern const char * const trig_durations[TRIG_DURATION_COUNT]; #define HAVE_LCD_CONTRAST #endif +#if CONFIG_CODEC == SWCODEC +#define MAX_FILETYPES 128 +#else +#define MAX_FILETYPES 48 +#endif + + /* repeat mode options */ enum { @@ -308,6 +315,7 @@ struct system_status relative to MIN_FREQ */ #endif char last_screen; + int filetype_count; int viewer_icon_count; }; diff --git a/apps/settings_list.c b/apps/settings_list.c index 62daeb8..5311c3e 100644 --- a/apps/settings_list.c +++ b/apps/settings_list.c @@ -1248,6 +1248,7 @@ const struct settings_list settings[] = { 3, "list_accel_wait", UNIT_SEC, 1, 10, 1, scanaccel_formatter, scanaccel_getlang, NULL), #endif /* HAVE_SCROLLWHEEL */ + SYSTEM_SETTING(NVRAM(4),filetype_count, MAX_FILETYPES), }; const int nb_settings = sizeof(settings)/sizeof(*settings); |