added setting to retain file browser directory on reboots WIP

I added the setting keep_directory which automatically updates
the last directory visited and restores it on next boot

--added manual entry

Change-Id: I0ffe6531d591d693806ce0bf56fe22b99e3315e9
This commit is contained in:
yegor chernyshov 2026-02-23 22:56:04 -05:00 committed by William Wilgus
parent 380b7b3e32
commit c86fd2318d
10 changed files with 53 additions and 1 deletions

View file

@ -453,6 +453,13 @@ int ft_load(struct tree_context* c, const char* tempdir)
check_file_thumbnails(c); /* map .talk to ours */ check_file_thumbnails(c); /* map .talk to ours */
tree_unlock_cache(c); tree_unlock_cache(c);
if (global_settings.keep_directory)
{
path_append(global_status.browse_last_folder, c->currdir, PA_SEP_HARD,
sizeof(global_status.browse_last_folder));
}
return 0; return 0;
} }
static void ft_load_font(char *file) static void ft_load_font(char *file)

View file

@ -17029,3 +17029,17 @@
general_purpose_led: "Use LED indicators" general_purpose_led: "Use LED indicators"
</voice> </voice>
</phrase> </phrase>
<phrase>
id: LANG_KEEP_DIRECTORY
desc: file browser setting
user: core
<source>
*: "Always remember last folder"
</source>
<dest>
*: "Always remember last folder"
</dest>
<voice>
*: "Always remember last folder"
</voice>
</phrase>

View file

@ -199,6 +199,7 @@ static int clear_start_directory(void)
splash(HZ, ID2P(LANG_RESET_DONE_CLEAR)); splash(HZ, ID2P(LANG_RESET_DONE_CLEAR));
return false; return false;
} }
MENUITEM_SETTING(keep_directory, &global_settings.keep_directory, NULL);
MENUITEM_FUNCTION(clear_start_directory_item, 0, ID2P(LANG_RESET_START_DIR), MENUITEM_FUNCTION(clear_start_directory_item, 0, ID2P(LANG_RESET_START_DIR),
clear_start_directory, NULL, Icon_file_view_menu); clear_start_directory, NULL, Icon_file_view_menu);
@ -209,6 +210,7 @@ MAKE_MENU(file_menu, ID2P(LANG_FILE), filemenu_callback, Icon_file_view_menu,
&sort_case, &sort_dir, &sort_file, &interpret_numbers, &sort_case, &sort_dir, &sort_file, &interpret_numbers,
&dirfilter, &show_filename_ext, &browse_current, &dirfilter, &show_filename_ext, &browse_current,
&show_path_in_browser, &show_path_in_browser,
&keep_directory,
&clear_start_directory_item &clear_start_directory_item
#ifdef HAVE_HOTKEY #ifdef HAVE_HOTKEY
,&hotkey_tree_item ,&hotkey_tree_item

View file

@ -2039,6 +2039,12 @@ void validate_start_directory_init(void) /* INIT_ATTR */
path_append(dirpath, PATH_ROOTSTR, path_append(dirpath, PATH_ROOTSTR,
PA_SEP_HARD, sizeof(global_settings.start_directory)); PA_SEP_HARD, sizeof(global_settings.start_directory));
} }
if (!global_settings.keep_directory) /* reset to root / if !keep_directory */
{
path_append(global_status.browse_last_folder, PATH_ROOTSTR, PA_SEP_HARD,
sizeof(global_status.browse_last_folder));
}
} }
#endif /* ndef __PCTOOL__ */ #endif /* ndef __PCTOOL__ */

View file

@ -118,7 +118,9 @@ static int browser(void* param)
int filter = SHOW_SUPPORTED; int filter = SHOW_SUPPORTED;
char folder[MAX_PATH] = "/"; char folder[MAX_PATH] = "/";
/* stuff needed to remember position in file browser */ /* stuff needed to remember position in file browser */
static char last_folder[MAX_PATH] = "/"; /*static char last_folder[MAX_PATH] = "/"*/
char *last_folder = global_status.browse_last_folder;
/* and stuff for the database browser */ /* and stuff for the database browser */
#ifdef HAVE_TAGCACHE #ifdef HAVE_TAGCACHE
static int last_db_dirlevel = 0, last_db_selection = 0, last_ft_dirlevel = 0; static int last_db_dirlevel = 0, last_db_selection = 0, last_ft_dirlevel = 0;

View file

@ -628,6 +628,11 @@ static bool settings_write_config(const char* filename, int options)
case SETTINGS_SAVE_RESUMEINFO: case SETTINGS_SAVE_RESUMEINFO:
if (!(setting->flags & F_RESUMESETTING)) if (!(setting->flags & F_RESUMESETTING))
continue; continue;
if (setting->setting == &global_status.browse_last_folder
&& (!global_settings.keep_directory))
{
continue;
}
break; break;
case SETTINGS_SAVE_ALL: case SETTINGS_SAVE_ALL:
{ {

View file

@ -365,6 +365,7 @@ struct system_status
int font_id[NB_SCREENS]; /* font id of the settings font for each screen */ int font_id[NB_SCREENS]; /* font id of the settings font for each screen */
bool resume_modified; /* playlist is modified (=> warn before erase) */ bool resume_modified; /* playlist is modified (=> warn before erase) */
char browse_last_folder[MAX_PATH];/* only saved if keep_directory = true */
}; };
struct user_settings struct user_settings
@ -893,6 +894,7 @@ struct user_settings
char start_directory[MAX_PATHNAME+1]; char start_directory[MAX_PATHNAME+1];
/* Has the root been customized from the .cfg file? false = no, true = loaded from cfg */ /* Has the root been customized from the .cfg file? false = no, true = loaded from cfg */
bool keep_directory; /* this saves the last path visited in the file browser */
bool root_menu_customized; bool root_menu_customized;
#ifdef HAVE_QUICKSCREEN #ifdef HAVE_QUICKSCREEN
bool shortcuts_replaces_qs; bool shortcuts_replaces_qs;

View file

@ -148,6 +148,13 @@
#define SYSTEM_STATUS(flags,var,default,name) \ #define SYSTEM_STATUS(flags,var,default,name) \
{flags|F_RESUMESETTING|F_T_INT, &global_status.var,-1, \ {flags|F_RESUMESETTING|F_T_INT, &global_status.var,-1, \
INT(default), name, UNUSED} INT(default), name, UNUSED}
#define SYSTEM_STATUS_TEXT_SETTING(flags,var,name,default,prefix,suffix) \
{flags|F_RESUMESETTING|F_T_UCHARPTR, &global_status.var,-1, \
CHARPTR(default),name, \
{.filename_setting= \
(struct filename_setting[]){ \
{prefix,suffix,sizeof(global_status.var)}}} }
/* system_status settings items will be saved to resume.cfg /* system_status settings items will be saved to resume.cfg
Use for int which use the set_sound() function to set them Use for int which use the set_sound() function to set them
These items WILL be included in the users exported settings files These items WILL be included in the users exported settings files
@ -1498,6 +1505,9 @@ const struct settings_list settings[] = {
#endif /* HAVE_DISK_STORAGE */ #endif /* HAVE_DISK_STORAGE */
/* browser */ /* browser */
TEXT_SETTING(0, start_directory, "start directory", "/", NULL, NULL), TEXT_SETTING(0, start_directory, "start directory", "/", NULL, NULL),
SYSTEM_STATUS_TEXT_SETTING(0, browse_last_folder, "last folder", "/", NULL, NULL),
OFFON_SETTING(0, keep_directory, LANG_KEEP_DIRECTORY, false, "keep directory", NULL),
CHOICE_SETTING(0, dirfilter, LANG_FILTER, SHOW_SUPPORTED, "show files", CHOICE_SETTING(0, dirfilter, LANG_FILTER, SHOW_SUPPORTED, "show files",
"all,supported,music,playlists", NULL, 4, ID2P(LANG_ALL), "all,supported,music,playlists", NULL, 4, ID2P(LANG_ALL),
ID2P(LANG_FILTER_SUPPORTED), ID2P(LANG_FILTER_MUSIC), ID2P(LANG_FILTER_SUPPORTED), ID2P(LANG_FILTER_MUSIC),

View file

@ -756,6 +756,7 @@ Nyx Guan
Arin Kim Arin Kim
Ingmar Steen Ingmar Steen
Lourenço Soares Lourenço Soares
Yegor Chernyshov
The libmad team The libmad team
The wavpack team The wavpack team

View file

@ -194,6 +194,9 @@ each option pertains both to files and directories):
\item [Recording Directory.] \item [Recording Directory.]
Save recordings in the selected directory. Save recordings in the selected directory.
} }
\item [Always remember last folder.]
Saves the last position in the file browser on shutdown.
This directory (and if applicable last file) will be restored next boot.
\item [Start Directory.] \item [Start Directory.]
Set as default start directory for the File Browser. Set as default start directory for the File Browser.
\note{If you have \setting{Auto-Change Directory} and \note{If you have \setting{Auto-Change Directory} and