Rockbox.org home
release
dev builds
extras
themes manual
wiki
device status forums
mailing lists
IRC bugs
patches
dev guide



Rockbox mail archive

Subject: .rockbox/ browsing patch
From: Brian King (brking_at_charter.net)
Date: 2002-12-13


I wanted to provide a way to make it easier to load files that reside in
.rockbox/. So I put together this patch. It adds several items to the
existing menus which essentially browse .rockbox/ and filter the files
listed accordingly. For example, I have added a While Playing menu
option to the General Settings which will open the file browser in the
rockbox directory and only display *.wps files. Selecting one will
activate it, stop will exit back to the menu. I tried to re-use all the
existing file browsing code as I didn't want to repeat it. I added menu
items to browse each type of file that can reside in .rockbox/.

Thoughts?

Brian

Index: main_menu.c
===================================================================
RCS file: /cvsroot/rockbox/apps/main_menu.c,v
retrieving revision 1.71
diff -u -r1.71 main_menu.c
--- main_menu.c 3 Dec 2002 22:41:48 -0000 1.71
+++ main_menu.c 13 Dec 2002 02:52:13 -0000
@@ -239,6 +239,11 @@
     return false;
 }
 
+bool firmware_menu(void)
+{
+ return rockbox_browse(SHOW_MOD);
+}
+
 bool main_menu(void)
 {
     int m;
@@ -262,6 +267,7 @@
 #endif /* end USE_DEMOS */
 #endif
         { str(LANG_INFO), show_info },
+ { str(LANG_FIRMWARE), firmware_menu },
         { str(LANG_VERSION), show_credits },
 #ifndef SIMULATOR
         { str(LANG_DEBUG), debug_menu },
Index: settings.h
===================================================================
RCS file: /cvsroot/rockbox/apps/settings.h,v
retrieving revision 1.63
diff -u -r1.63 settings.h
--- settings.h 12 Dec 2002 15:20:31 -0000 1.63
+++ settings.h 13 Dec 2002 02:52:13 -0000
@@ -186,7 +186,8 @@
 enum { REPEAT_OFF, REPEAT_ALL, REPEAT_ONE, NUM_REPEAT_MODES };
 
 /* dir filter options */
-enum { SHOW_ALL, SHOW_SUPPORTED, SHOW_MUSIC, SHOW_PLAYLIST, NUM_FILTER_MODES };
+enum { SHOW_ALL, SHOW_SUPPORTED, SHOW_MUSIC, SHOW_PLAYLIST, NUM_FILTER_MODES,
+SHOW_WPS, SHOW_CFG, SHOW_LNG, SHOW_MOD };
 
 #endif /* __SETTINGS_H__ */
 
Index: settings_menu.c
===================================================================
RCS file: /cvsroot/rockbox/apps/settings_menu.c,v
retrieving revision 1.87
diff -u -r1.87 settings_menu.c
--- settings_menu.c 12 Dec 2002 20:40:04 -0000 1.87
+++ settings_menu.c 13 Dec 2002 02:52:16 -0000
@@ -36,6 +36,7 @@
 #include "powermgmt.h"
 #include "rtc.h"
 #include "ata.h"
+#include "tree.h"
 #include "screens.h"
 #ifdef HAVE_LCD_BITMAP
 #include "peakmeter.h"
@@ -397,6 +398,11 @@
                       names, 15, set_poweroff_timeout);
 }
 
+static bool language_menu(void)
+{
+ return rockbox_browse(SHOW_LNG);
+}
+
 static bool scroll_speed(void)
 {
     return set_int(str(LANG_SCROLL), "Hz", &global_settings.scroll_speed,
@@ -555,6 +561,11 @@
     return set_bool( str(LANG_FOLLOW), &global_settings.browse_current );
 }
 
+static bool custom_wps_menu(void)
+{
+ return rockbox_browse(SHOW_WPS);
+}
+
 static bool playback_settings_menu(void)
 {
     int m;
@@ -695,6 +706,7 @@
         { str(LANG_VOLUME_DISPLAY), volume_type },
         { str(LANG_BATTERY_DISPLAY), battery_type },
 #endif
+ { str(LANG_LANGUAGE), language_menu },
     };
     
     m=menu_init( items, sizeof items / sizeof(struct menu_items) );
@@ -737,6 +749,7 @@
 
     struct menu_items items[] = {
         { str(LANG_PLAYBACK), playback_settings_menu },
+ { str(LANG_WHILE_PLAYING), custom_wps_menu },
         { str(LANG_FILE), fileview_settings_menu },
         { str(LANG_DISPLAY), display_settings_menu },
         { str(LANG_SYSTEM), system_settings_menu },
Index: sound_menu.c
===================================================================
RCS file: /cvsroot/rockbox/apps/sound_menu.c,v
retrieving revision 1.31
diff -u -r1.31 sound_menu.c
--- sound_menu.c 10 Nov 2002 23:18:33 -0000 1.31
+++ sound_menu.c 13 Dec 2002 02:52:16 -0000
@@ -27,6 +27,7 @@
 #include "settings.h"
 #include "status.h"
 #include "screens.h"
+#include "tree.h"
 #ifdef HAVE_LCD_BITMAP
 #include "icons.h"
 #endif
@@ -138,6 +139,11 @@
     return false;
 }
 
+static bool custom_snd(void)
+{
+ return rockbox_browse(SHOW_CFG);
+}
+
 static bool volume(void)
 {
     return set_sound(str(LANG_VOLUME), &global_settings.volume, SOUND_VOLUME);
@@ -238,6 +244,7 @@
     int m;
     bool result;
     struct menu_items items[] = {
+ { str(LANG_CUSTOM_SND), custom_snd },
         { str(LANG_VOLUME), volume },
         { str(LANG_BASS), bass },
         { str(LANG_TREBLE), treble },
Index: tree.c
===================================================================
RCS file: /cvsroot/rockbox/apps/tree.c,v
retrieving revision 1.148
diff -u -r1.148 tree.c
--- tree.c 2 Dec 2002 04:46:19 -0000 1.148
+++ tree.c 13 Dec 2002 02:52:18 -0000
@@ -56,27 +56,57 @@
 
 #define NAME_BUFFER_SIZE (AVERAGE_FILENAME_LENGTH * MAX_FILES_IN_DIR)
 
-char name_buffer[NAME_BUFFER_SIZE];
-int name_buffer_length;
+char name_buffer_save[NAME_BUFFER_SIZE];
+int name_buffer_length_save;
+
+char name_buffer_rock[NAME_BUFFER_SIZE];
+int name_buffer_length_rock;
+
+char *name_buffer = name_buffer_save;
+int *name_buffer_length = &name_buffer_length_save;
+
 struct entry {
     short attr; /* FAT attributes + file type flags */
     char *name;
 };
 
-static struct entry dircache[MAX_FILES_IN_DIR];
-static int dircursor;
-static int dirstart;
-static int dirlevel;
-static int filesindir;
-static int dirpos[MAX_DIR_LEVELS];
-static int cursorpos[MAX_DIR_LEVELS];
-static char lastdir[MAX_PATH];
-static char lastfile[MAX_PATH];
-static char currdir[MAX_PATH];
+static struct entry dircache_save[MAX_FILES_IN_DIR];
+static int dircursor_save;
+static int dirstart_save;
+static int dirlevel_save;
+static int filesindir_save;
+static int dirpos_save[MAX_DIR_LEVELS];
+static int cursorpos_save[MAX_DIR_LEVELS];
+static char lastdir_save[MAX_PATH];
+static char lastfile_save[MAX_PATH];
+static char currdir_save[MAX_PATH];
+
+static struct entry dircache_rock[MAX_FILES_IN_DIR];
+static int dircursor_rock;
+static int dirstart_rock;
+static int dirlevel_rock;
+static int filesindir_rock;
+static int dirpos_rock[MAX_DIR_LEVELS];
+static int cursorpos_rock[MAX_DIR_LEVELS];
+static char lastdir_rock[MAX_PATH];
+static char lastfile_rock[MAX_PATH];
+static char currdir_rock[MAX_PATH];
+static int last_dirfilter_rock = SHOW_ALL;
+
+static struct entry *dircache = dircache_save;
+static int *dircursor = &dircursor_save;
+static int *dirstart = &dirstart_save;
+static int *dirlevel = &dirlevel_save;
+static int *filesindir = &filesindir_save;
+static int *dirpos = dirpos_save;
+static int *cursorpos = cursorpos_save;
+static char *lastdir = lastdir_save;
+static char *lastfile = lastfile_save;
+static char *currdir = currdir_save;
 
 void browse_root(void)
 {
- dirbrowse("/");
+ dirbrowse("/", global_settings.dirfilter);
 }
 
 
@@ -84,7 +114,7 @@
 
 /* pixel margins */
 #define MARGIN_X (global_settings.scrollbar && \
- filesindir > tree_max_on_screen ? SCROLLBAR_WIDTH : 0) + \
+ *filesindir > tree_max_on_screen ? SCROLLBAR_WIDTH : 0) + \
                   CURSOR_WIDTH + ICON_WIDTH
 #define MARGIN_Y (global_settings.statusbar ? STATUSBAR_HEIGHT : 0)
 
@@ -93,7 +123,7 @@
 #define LINE_Y (global_settings.statusbar ? 1 : 0)
 
 #define CURSOR_X (global_settings.scrollbar && \
- filesindir > tree_max_on_screen ? 1 : 0)
+ *filesindir > tree_max_on_screen ? 1 : 0)
 #define CURSOR_Y 0 /* the cursor is not positioned in regard to
                       the margins, so this is the amount of lines
                       we add to the cursor Y position to position
@@ -152,7 +182,7 @@
 
     playlist_clear();
 
- for(i = 0;i < filesindir;i++)
+ for(i = 0;i < *filesindir;i++)
     {
         if(dircache[i].attr & TREE_ATTR_MPA)
         {
@@ -184,7 +214,7 @@
         return ( e2->attr & ATTR_DIRECTORY ) - ( e1->attr & ATTR_DIRECTORY );
 }
 
-static int showdir(char *path, int start)
+static int showdir(char *path, int start, int dirfilter)
 {
     int icon_type = 0;
     int i;
@@ -203,12 +233,12 @@
 #endif
 
     /* new dir? cache it */
- if (strncmp(path,lastdir,sizeof(lastdir))) {
+ if (strncmp(path,lastdir,sizeof(lastdir_save))) {
         DIR *dir = opendir(path);
         if(!dir)
             return -1; /* not a directory */
 
- name_buffer_length = 0;
+ *name_buffer_length = 0;
         dir_buffer_full = false;
         
         for ( i=0; i<MAX_FILES_IN_DIR; i++ ) {
@@ -237,7 +267,7 @@
             }
 
             /* filter out dotfiles and hidden files */
- if (global_settings.dirfilter != SHOW_ALL &&
+ if (dirfilter != SHOW_ALL &&
                 ((entry->d_name[0]=='.') ||
                  (entry->attribute & ATTR_HIDDEN))) {
                 i--;
@@ -273,7 +303,7 @@
             }
 
             /* filter out all non-playlist files */
- if ( global_settings.dirfilter == SHOW_PLAYLIST &&
+ if ( dirfilter == SHOW_PLAYLIST &&
                  (!(dptr->attr &
                     (ATTR_DIRECTORY|TREE_ATTR_M3U))) ) {
                 i--;
@@ -281,7 +311,7 @@
             }
             
             /* filter out non-music files */
- if ( global_settings.dirfilter == SHOW_MUSIC &&
+ if ( dirfilter == SHOW_MUSIC &&
                  (!(dptr->attr &
                     (ATTR_DIRECTORY|TREE_ATTR_MPA|TREE_ATTR_M3U))) ) {
                 i--;
@@ -289,28 +319,56 @@
             }
 
             /* filter out non-supported files */
- if ( global_settings.dirfilter == SHOW_SUPPORTED &&
+ if ( dirfilter == SHOW_SUPPORTED &&
                  (!(dptr->attr & TREE_ATTR_MASK)) ) {
                 i--;
                 continue;
             }
 
- if (len > NAME_BUFFER_SIZE - name_buffer_length - 1) {
+ /* filter out non-wps files */
+ if ( dirfilter == SHOW_WPS &&
+ ((dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_WPS) ) {
+ i--;
+ continue;
+ }
+
+ /* filter out non-cfg files */
+ if ( dirfilter == SHOW_CFG &&
+ ((dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_CFG) ) {
+ i--;
+ continue;
+ }
+
+ /* filter out non-lng files */
+ if ( dirfilter == SHOW_LNG &&
+ ((dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_LNG) ) {
+ i--;
+ continue;
+ }
+
+ /* filter out non-mod files */
+ if ( dirfilter == SHOW_MOD &&
+ ((dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_MOD) ) {
+ i--;
+ continue;
+ }
+
+ if (len > NAME_BUFFER_SIZE - (*name_buffer_length) - 1) {
                 /* Tell the world that we ran out of buffer space */
                 dir_buffer_full = true;
                 break;
             }
- dptr->name = &name_buffer[name_buffer_length];
+ dptr->name = &name_buffer[*name_buffer_length];
             strcpy(dptr->name,entry->d_name);
- name_buffer_length += len + 1;
+ (*name_buffer_length) += len + 1;
         }
- filesindir = i;
+ *filesindir = i;
         closedir(dir);
- strncpy(lastdir,path,sizeof(lastdir));
- lastdir[sizeof(lastdir)-1] = 0;
- qsort(dircache,filesindir,sizeof(struct entry),compare);
+ strncpy(lastdir,path,sizeof(lastdir_save));
+ lastdir[sizeof(lastdir_save)-1] = 0;
+ qsort(dircache,*filesindir,sizeof(struct entry),compare);
 
- if ( dir_buffer_full || filesindir == MAX_FILES_IN_DIR ) {
+ if ( dir_buffer_full || *filesindir == MAX_FILES_IN_DIR ) {
 #ifdef HAVE_LCD_CHARCELLS
             lcd_double_height(false);
 #endif
@@ -330,7 +388,7 @@
         /* use lastfile to determine start (default=0) */
         start = 0;
 
- for (i=0; i<filesindir; i++)
+ for (i=0; i<*filesindir; i++)
         {
             if (!strcasecmp(dircache[i].name, lastfile))
             {
@@ -339,7 +397,7 @@
             }
         }
 
- diff_files = filesindir - start;
+ diff_files = *filesindir - start;
         if (diff_files < tree_max_on_screen)
         {
             int oldstart = start;
@@ -348,10 +406,10 @@
             if (start < 0)
                 start = 0;
 
- dircursor = oldstart - start;
+ *dircursor = oldstart - start;
         }
 
- dirstart = start;
+ *dirstart = start;
     }
 
     lcd_stop_scroll();
@@ -367,7 +425,7 @@
     for ( i=start; i < start+tree_max_on_screen; i++ ) {
         int len;
 
- if ( i >= filesindir )
+ if ( i >= *filesindir )
             break;
 
         len = strlen(dircache[i].name);
@@ -430,7 +488,7 @@
         }
 
         /* if music filter is on, cut off the extension */
- if (global_settings.dirfilter == SHOW_MUSIC &&
+ if (dirfilter == SHOW_MUSIC &&
             (dircache[i].attr & (TREE_ATTR_M3U|TREE_ATTR_MPA)))
         {
             char temp = dircache[i].name[len-4];
@@ -443,13 +501,13 @@
     }
 
 #ifdef HAVE_LCD_BITMAP
- if (global_settings.scrollbar && filesindir > tree_max_on_screen)
+ if (global_settings.scrollbar && *filesindir > tree_max_on_screen)
         scrollbar(SCROLLBAR_X, SCROLLBAR_Y, SCROLLBAR_WIDTH - 1,
- LCD_HEIGHT - SCROLLBAR_Y, filesindir, start,
+ LCD_HEIGHT - SCROLLBAR_Y, *filesindir, start,
                   start + tree_max_on_screen, VERTICAL);
 #endif
     status_draw();
- return filesindir;
+ return *filesindir;
 }
 
 bool ask_resume(void)
@@ -544,7 +602,7 @@
             if (!ask_resume())
                 return;
 
- if (showdir(global_settings.resume_file, 0) < 0 )
+ if (showdir(global_settings.resume_file, 0, global_settings.dirfilter) < 0 )
                 return;
 
             lastdir[0] = '\0';
@@ -587,30 +645,30 @@
 
     strcpy(lastfile, name);
 
- dircursor = 0;
- dirstart = -1;
+ *dircursor = 0;
+ *dirstart = -1;
 
- if (strncmp(currdir,lastdir,sizeof(lastdir)))
+ if (strncmp(currdir,lastdir,sizeof(lastdir_save)))
     {
- dirlevel = 0;
- dirpos[dirlevel] = -1;
- cursorpos[dirlevel] = 0;
+ *dirlevel = 0;
+ dirpos[*dirlevel] = -1;
+ cursorpos[*dirlevel] = 0;
         
         /* use '/' to calculate dirlevel */
         for (i=1; i<strlen(path)+1; i++)
         {
             if (path[i] == '/')
             {
- dirlevel++;
- dirpos[dirlevel] = -1;
- cursorpos[dirlevel] = 0;
+ (*dirlevel)++;
+ dirpos[*dirlevel] = -1;
+ cursorpos[*dirlevel] = 0;
             }
         }
     }
 }
 
 #ifdef HAVE_RECORDER_KEYPAD
-bool pageupdown(int* ds, int* dc, int numentries, int tree_max_on_screen )
+bool pageupdown(int* ds, int* dc, int numentries, int tree_max_on_screen, int dirfilter )
 {
     bool exit = false;
     bool used = false;
@@ -658,7 +716,7 @@
                 break;
         }
         if ( used ) {
- showdir(currdir, dirstart);
+ showdir(currdir, dirstart, dirfilter);
             put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
             lcd_update();
         }
@@ -690,7 +748,7 @@
     settings_save();
 }
 
-bool dirbrowse(char *root)
+bool dirbrowse(char *root, int dirfilter)
 {
     int numentries=0;
     char buf[MAX_PATH];
@@ -709,22 +767,23 @@
     tree_max_on_screen = TREE_MAX_ON_SCREEN;
 #endif
 
- dircursor=0;
- dirstart=0;
- dirlevel=0;
+ *dircursor=0;
+ *dirstart=0;
+ *dirlevel=0;
 
- memcpy(currdir,root,sizeof(currdir));
+ memcpy(currdir,root,sizeof(currdir_save));
 
- start_resume();
+ if (dirfilter < NUM_FILTER_MODES)
+ start_resume();
 
- numentries = showdir(currdir, dirstart);
+ numentries = showdir(currdir, *dirstart, dirfilter);
     if (numentries == -1)
         return -1; /* currdir is not a directory */
 
- put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
+ put_cursorxy(CURSOR_X, CURSOR_Y + *dircursor, true);
 
     while(1) {
- struct entry* file = &dircache[dircursor+dirstart];
+ struct entry* file = &dircache[*dircursor+*dirstart];
 
         bool restore = false;
         bool need_update = false;
@@ -743,15 +802,15 @@
                     else
                         currdir[i-1]=0;
 
- dirlevel--;
- if ( dirlevel < MAX_DIR_LEVELS ) {
- dirstart = dirpos[dirlevel];
- dircursor = cursorpos[dirlevel];
+ (*dirlevel)--;
+ if ( *dirlevel < MAX_DIR_LEVELS ) {
+ *dirstart = dirpos[*dirlevel];
+ *dircursor = cursorpos[*dirlevel];
                     }
                     else
- dirstart = dircursor = 0;
+ *dirstart = *dircursor = 0;
 
- if (dirstart == -1)
+ if (*dirstart == -1)
                         strcpy(lastfile, buf);
 
                     restore = true;
@@ -790,14 +849,14 @@
                 }
 
                 if (file->attr & ATTR_DIRECTORY) {
- memcpy(currdir,buf,sizeof(currdir));
- if ( dirlevel < MAX_DIR_LEVELS ) {
- dirpos[dirlevel] = dirstart;
- cursorpos[dirlevel] = dircursor;
+ memcpy(currdir,buf,sizeof(currdir_save));
+ if ( *dirlevel < MAX_DIR_LEVELS ) {
+ dirpos[*dirlevel] = *dirstart;
+ cursorpos[*dirlevel] = *dircursor;
                     }
- dirlevel++;
- dircursor=0;
- dirstart=0;
+ (*dirlevel)++;
+ *dircursor=0;
+ *dirstart=0;
                 } else {
                     int seed = current_tick;
                     bool play = false;
@@ -820,7 +879,7 @@
                             if ( global_settings.resume )
                                 strncpy(global_settings.resume_file,
                                         currdir, MAX_PATH);
- start_index = build_playlist(dircursor+dirstart);
+ start_index = build_playlist(*dircursor+*dirstart);
 
                             /* it is important that we get back the index in
                                the (shuffled) list and stor that */
@@ -893,9 +952,9 @@
                             lcd_getstringsize("A", &fw, &fh);
                             tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
                             /* make sure cursor is on screen */
- while ( dircursor > tree_max_on_screen ) {
- dircursor--;
- dirstart++;
+ while ( *dircursor > tree_max_on_screen ) {
+ (*dircursor)--;
+ (*dirstart)++;
                             }
                             restore = true;
                             break;
@@ -941,30 +1000,30 @@
             case TREE_PREV:
             case TREE_PREV | BUTTON_REPEAT:
             case BUTTON_VOL_UP:
- if(filesindir) {
- if(dircursor) {
- put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, false);
- dircursor--;
- put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
+ if(*filesindir) {
+ if(*dircursor) {
+ put_cursorxy(CURSOR_X, CURSOR_Y + *dircursor, false);
+ (*dircursor)--;
+ put_cursorxy(CURSOR_X, CURSOR_Y + *dircursor, true);
                     }
                     else {
- if (dirstart) {
- dirstart--;
- numentries = showdir(currdir, dirstart);
- put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
+ if (*dirstart) {
+ (*dirstart)--;
+ numentries = showdir(currdir, *dirstart, dirfilter);
+ put_cursorxy(CURSOR_X, CURSOR_Y + *dircursor, true);
                         }
                         else {
                             if (numentries < tree_max_on_screen) {
- put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
+ put_cursorxy(CURSOR_X, CURSOR_Y + *dircursor,
                                              false);
- dircursor = numentries - 1;
- put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
+ *dircursor = numentries - 1;
+ put_cursorxy(CURSOR_X, CURSOR_Y + *dircursor,
                                              true);
                             }
                             else {
- dirstart = numentries - tree_max_on_screen;
- dircursor = tree_max_on_screen - 1;
- numentries = showdir(currdir, dirstart);
+ *dirstart = numentries - tree_max_on_screen;
+ *dircursor = tree_max_on_screen - 1;
+ numentries = showdir(currdir, *dirstart, dirfilter);
                                 put_cursorxy(CURSOR_X, CURSOR_Y +
                                              tree_max_on_screen - 1, true);
                             }
@@ -977,32 +1036,32 @@
             case TREE_NEXT:
             case TREE_NEXT | BUTTON_REPEAT:
             case BUTTON_VOL_DOWN:
- if(filesindir)
+ if(*filesindir)
                 {
- if (dircursor + dirstart + 1 < numentries ) {
- if(dircursor+1 < tree_max_on_screen) {
- put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
+ if (*dircursor + *dirstart + 1 < numentries ) {
+ if(*dircursor+1 < tree_max_on_screen) {
+ put_cursorxy(CURSOR_X, CURSOR_Y + *dircursor,
                                          false);
- dircursor++;
- put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
+ (*dircursor)++;
+ put_cursorxy(CURSOR_X, CURSOR_Y + *dircursor, true);
                         }
                         else {
- dirstart++;
- numentries = showdir(currdir, dirstart);
- put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
+ (*dirstart)++;
+ numentries = showdir(currdir, *dirstart, dirfilter);
+ put_cursorxy(CURSOR_X, CURSOR_Y + *dircursor, true);
                         }
                     }
                     else {
                         if(numentries < tree_max_on_screen) {
- put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
+ put_cursorxy(CURSOR_X, CURSOR_Y + *dircursor,
                                          false);
- dirstart = dircursor = 0;
- put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
+ *dirstart = *dircursor = 0;
+ put_cursorxy(CURSOR_X, CURSOR_Y + *dircursor, true);
                         }
                         else {
- dirstart = dircursor = 0;
- numentries = showdir(currdir, dirstart);
- put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
+ *dirstart = *dircursor = 0;
+ numentries = showdir(currdir, *dirstart, dirfilter);
+ put_cursorxy(CURSOR_X, CURSOR_Y + *dircursor, true);
                         }
                     }
                     need_update = true;
@@ -1018,7 +1077,7 @@
 
             case BUTTON_ON:
 #ifdef HAVE_RECORDER_KEYPAD
- if (pageupdown(&dirstart, &dircursor, numentries,
+ if (pageupdown(dirstart, dircursor, numentries,
                                tree_max_on_screen))
                 {
                     /* start scroll */
@@ -1079,54 +1138,58 @@
         {
             if ( reload_root ) {
                 strcpy(currdir, "/");
- dirlevel = 0;
+ *dirlevel = 0;
                 reload_root = false;
             }
- dircursor = 0;
- dirstart = 0;
+ *dircursor = 0;
+ *dirstart = 0;
             lastdir[0] = 0;
             lastfilter = global_settings.dirfilter;
             lastsortcase = global_settings.sort_case;
             restore = true;
+ dirfilter = global_settings.dirfilter;
         }
 
         if ( restore ) {
+ if (dirfilter > NUM_FILTER_MODES){
+ break;
+ }
             /* restore display */
             /* We need to adjust if the number of lines on screen have
                changed because of a status bar change */
- if(CURSOR_Y+LINE_Y+dircursor>tree_max_on_screen) {
- dirstart++;
- dircursor--;
+ if(CURSOR_Y+LINE_Y+*dircursor>tree_max_on_screen) {
+ (*dirstart)++;
+ (*dircursor)--;
             }
 #ifdef HAVE_LCD_BITMAP
             /* the sub-screen might've ruined the margins */
             lcd_setmargins(MARGIN_X,MARGIN_Y); /* leave room for cursor and
                                                   icon */
 #endif
- numentries = showdir(currdir, dirstart);
- put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
+ numentries = showdir(currdir, *dirstart, dirfilter);
+ put_cursorxy(CURSOR_X, CURSOR_Y + *dircursor, true);
             
             need_update = true;
         }
 
         if ( numentries ) {
- i = dirstart+dircursor;
+ i = *dirstart+*dircursor;
 
             /* if MP3 filter is on, cut off the extension */
             if(lasti!=i || restore) {
                 lasti=i;
                 lcd_stop_scroll();
- if (global_settings.dirfilter == SHOW_MUSIC &&
+ if (dirfilter == SHOW_MUSIC &&
                     (dircache[i].attr & (TREE_ATTR_M3U|TREE_ATTR_MPA)))
                 {
                     int len = strlen(dircache[i].name);
                     char temp = dircache[i].name[len-4];
                     dircache[i].name[len-4] = 0;
- lcd_puts_scroll(LINE_X, dircursor, dircache[i].name);
+ lcd_puts_scroll(LINE_X, *dircursor, dircache[i].name);
                     dircache[i].name[len-4] = temp;
                 }
                 else
- lcd_puts_scroll(LINE_X, dircursor, dircache[i].name);
+ lcd_puts_scroll(LINE_X, *dircursor, dircache[i].name);
 
                 need_update = true;
             }
@@ -1140,6 +1203,52 @@
     }
 
     return false;
+}
+
+bool rockbox_browse(int dirfilter)
+{
+ bool rc;
+
+ dircache = dircache_rock;
+ dircursor = &dircursor_rock;
+ dirstart = &dirstart_rock;
+ dirlevel = &dirlevel_rock;
+ filesindir = &filesindir_rock;
+ dirpos = dirpos_rock;
+ cursorpos = cursorpos_rock;
+ lastdir = lastdir_rock;
+ lastfile = lastfile_rock;
+ currdir = currdir_rock;
+ name_buffer = name_buffer_rock;
+ name_buffer_length = &name_buffer_length_rock;
+
+ if (last_dirfilter_rock != dirfilter)
+ {
+ strcpy(currdir, "/");
+ *dirlevel = 0;
+ *dircursor = 0;
+ *dirstart = 0;
+ lastdir[0] = 0;
+ }
+
+ last_dirfilter_rock = dirfilter;
+
+ rc = dirbrowse(ROCKBOX_DIR, dirfilter);
+
+ dircache = dircache_save;
+ dircursor = &dircursor_save;
+ dirstart = &dirstart_save;
+ dirlevel = &dirlevel_save;
+ filesindir = &filesindir_save;
+ dirpos = dirpos_save;
+ cursorpos = cursorpos_save;
+ lastdir = lastdir_save;
+ lastfile = lastfile_save;
+ currdir = currdir_save;
+ name_buffer = name_buffer_save;
+ name_buffer_length = &name_buffer_length_save;
+
+ return rc;
 }
 
 /* -----------------------------------------------------------------
Index: tree.h
===================================================================
RCS file: /cvsroot/rockbox/apps/tree.h,v
retrieving revision 1.2
diff -u -r1.2 tree.h
--- tree.h 9 Sep 2002 14:25:39 -0000 1.2
+++ tree.h 13 Dec 2002 02:52:18 -0000
@@ -23,6 +23,7 @@
 
 void browse_root(void);
 void set_current_file(char *path);
-bool dirbrowse(char *root);
+bool dirbrowse(char *root, int dirfilter);
+bool rockbox_browse(int dirfilter);
 
 #endif
Index: lang/english.lang
===================================================================
RCS file: /cvsroot/rockbox/apps/lang/english.lang,v
retrieving revision 1.40
diff -u -r1.40 english.lang
--- lang/english.lang 12 Dec 2002 16:56:19 -0000 1.40
+++ lang/english.lang 13 Dec 2002 02:52:19 -0000
@@ -36,6 +36,11 @@
 eng: "Info"
 new:
 
+id: LANG_FIRMWARE
+desc: in the main menu
+eng: "Firmware"
+new:
+
 id: LANG_VERSION
 desc: in the main menu
 eng: "Version"
@@ -186,6 +191,11 @@
 eng: ""
 new:
 
+id: LANG_LANGUAGE
+desc: in settings_menu
+eng: "Language"
+new:
+
 id: LANG_CONTRAST
 desc: in settings_menu
 eng: "Contrast"
@@ -330,6 +340,11 @@
 eng: "Reset settings"
 new:
 
+id: LANG_WHILE_PLAYING
+desc: in settings_menu()
+eng: "While Playing"
+new:
+
 id: LANG_PLAYBACK
 desc: in settings_menu()
 eng: "Playback"
@@ -348,6 +363,11 @@
 id: LANG_SYSTEM
 desc: in settings_menu()
 eng: "System"
+new:
+
+id: LANG_CUSTOM_SND
+desc: in sound_settings
+eng: "Custom"
 new:
 
 id: LANG_VOLUME



Page was last modified "Jan 10 2012" The Rockbox Crew
aaa