diff --git a/360/file_browser.c b/360/file_browser.c
index 716a9c4c47..baae8e60ba 100644
--- a/360/file_browser.c
+++ b/360/file_browser.c
@@ -30,6 +30,16 @@ static const char * filebrowser_get_extension(const char * filename)
return "";
}
+static void filebrowser_clear_current_entries(filebrowser_t * filebrowser)
+{
+ for(uint32_t i = 0; i < MAX_FILE_LIMIT; i++)
+ {
+ filebrowser->cur[filebrowser->file_count].d_type = 0;
+ filebrowser->cur[filebrowser->file_count].d_namlen = 0;
+ strcpy(filebrowser->cur[filebrowser->file_count].d_name, "\0");
+ }
+}
+
void filebrowser_parse_directory(filebrowser_t * filebrowser, const char * path, const char *extensions)
{
int error = FALSE;
@@ -60,6 +70,7 @@ void filebrowser_parse_directory(filebrowser_t * filebrowser, const char * path,
do
{
+ strcpy(filebrowser->dir[filebrowser->directory_stack_size], path);
bool found_dir = false;
if(!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
@@ -100,4 +111,22 @@ error:
SSNES_ERR("Failed to open directory: \"%s\"\n", path);
}
FindClose(hFind);
+}
+
+void filebrowser_new(filebrowser_t * filebrowser, const char * start_dir, const char * extensions)
+{
+ filebrowser_clear_current_entries(filebrowser);
+ filebrowser->directory_stack_size = 0;
+ strcpy(filebrowser->extensions, extensions);
+
+ filebrowser_parse_directory(filebrowser, start_dir, filebrowser->extensions);
+}
+
+void filebrowser_push_directory(filebrowser_t * filebrowser, const char * path, bool with_extension)
+{
+ filebrowser->directory_stack_size++;
+ if(with_extension)
+ filebrowser_parse_directory(filebrowser, path, filebrowser->extensions);
+ else
+ filebrowser_parse_directory(filebrowser, path, "empty");
}
\ No newline at end of file
diff --git a/360/file_browser.h b/360/file_browser.h
index 70f251c5e3..6d3afcd6d2 100644
--- a/360/file_browser.h
+++ b/360/file_browser.h
@@ -16,18 +16,28 @@
* If not, see .
*/
+#include
+
#define FATX_MAX_FILE_LIMIT 4096
+#define MAX_FILE_LIMIT FATX_MAX_FILE_LIMIT
typedef struct {
unsigned d_type;
+ unsigned d_namlen;
CHAR d_name[MAX_PATH];
} DirectoryEntry;
typedef struct {
unsigned file_count; // amount of files in current directory
unsigned currently_selected; // currently selected browser entry
- DirectoryEntry cur[FATX_MAX_FILE_LIMIT]; // current file listing
+ uint32_t directory_stack_size;
+ char dir[128][2048]; /* info on the current directory */
+ DirectoryEntry cur[MAX_FILE_LIMIT]; // current file listing
char extensions[512]; // allowed file extensions
} filebrowser_t;
-void filebrowser_parse_directory(filebrowser_t * filebrowser, const char * path, const char *extensions);
\ No newline at end of file
+void filebrowser_new(filebrowser_t * filebrowser, const char * start_dir, const char * extensions);
+void filebrowser_parse_directory(filebrowser_t * filebrowser, const char * path, const char *extensions);
+void filebrowser_push_directory(filebrowser_t * filebrowser, const char * path, bool with_extension);
+
+#define FILEBROWSER_GET_CURRENT_DIRECTORY_NAME(filebrowser) (filebrowser.dir[filebrowser.directory_stack_size])
\ No newline at end of file
diff --git a/360/menu.cpp b/360/menu.cpp
index 023d588932..7fdde89560 100644
--- a/360/menu.cpp
+++ b/360/menu.cpp
@@ -69,7 +69,7 @@ HRESULT CSSNES::UnregisterXuiClasses (void)
static void filebrowser_fetch_directory_entries(const char *path, CXuiList * romlist,
CXuiTextElement * rompath_title)
{
- filebrowser_parse_directory(&browser, path, ssnes_console_get_rom_ext());
+ filebrowser_push_directory(&browser, path, true);
unsigned long dwNum_rompath = MultiByteToWideChar(CP_ACP, 0, path, -1, NULL, 0);
wchar_t * rompath_name = new wchar_t[dwNum_rompath];
@@ -232,6 +232,8 @@ HRESULT CSSNESMain::OnInit(XUIMessageInit * pInitData, BOOL& bHandled)
HRESULT CSSNESFileBrowser::OnNotifyPress( HXUIOBJ hObjPressed, BOOL& bHandled )
{
+ char path[MAX_PATH_LENGTH];
+
if(hObjPressed == m_romlist)
{
int index = m_romlist.GetCurSel();
@@ -240,7 +242,7 @@ HRESULT CSSNESFileBrowser::OnNotifyPress( HXUIOBJ hObjPressed, BOOL& bHandled )
memset(strbuffer, 0, sizeof(strbuffer));
wcstombs(strbuffer, (const wchar_t *)m_romlist.GetText(index), sizeof(strbuffer));
memset(g_console.rom_path, 0, sizeof(g_console.rom_path));
- sprintf(g_console.rom_path, "%s%s", g_console.default_rom_startup_dir, strbuffer);
+ sprintf(g_console.rom_path, "%s%s", FILEBROWSER_GET_CURRENT_DIRECTORY_NAME(browser), strbuffer);
return_to_game();
g_console.initialize_ssnes_enable = 1;
@@ -249,9 +251,8 @@ HRESULT CSSNESFileBrowser::OnNotifyPress( HXUIOBJ hObjPressed, BOOL& bHandled )
{
memset(strbuffer, 0, sizeof(strbuffer));
wcstombs(strbuffer, (const wchar_t *)m_romlist.GetText(index), sizeof(strbuffer));
- char strbuf[512];
- snprintf(strbuf, sizeof(strbuf), "%s%s", g_console.default_rom_startup_dir, strbuffer);
- filebrowser_fetch_directory_entries(strbuf, &m_romlist, &m_rompathtitle);
+ snprintf(path, sizeof(path), "%s%s\\", FILEBROWSER_GET_CURRENT_DIRECTORY_NAME(browser), strbuffer);
+ filebrowser_fetch_directory_entries(path, &m_romlist, &m_rompathtitle);
}
}
else if(hObjPressed == m_back)
@@ -358,6 +359,8 @@ int menu_init (void)
XuiSceneNavigateFirst(app.GetRootObj(), app.hMainScene, XUSER_INDEX_FOCUS);
+ filebrowser_new(&browser, g_console.default_rom_startup_dir, ssnes_console_get_rom_ext());
+
return 0;
}