From 50790cc3c553923211edd846497a0c220bd731e5 Mon Sep 17 00:00:00 2001 From: wins1ey Date: Thu, 6 Nov 2025 17:30:00 +0000 Subject: [PATCH 1/4] Add config setting for default_folder Set the default folder in config.ini with the key `default_folder`. For e.g. `default_folder = games`. Cubiboot will start with that folder open instead of in the root of the SD card. --- cubeboot/source/main.c | 5 +++++ cubeboot/source/settings.c | 7 +++++++ cubeboot/source/settings.h | 1 + patches/source/main.c | 9 ++++++++- 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/cubeboot/source/main.c b/cubeboot/source/main.c index 561db94..6f2859a 100644 --- a/cubeboot/source/main.c +++ b/cubeboot/source/main.c @@ -315,6 +315,11 @@ int main(int argc, char **argv) { // iprintf("Copying cube_logo_path: %p\n", cube_logo_ptr); // strcpy(cube_logo_ptr, settings.cube_logo); // } + void *default_folder_ptr = (void*)get_symbol_value(symshdr, syment, symstringdata, "default_folder"); + if (default_folder_ptr != NULL && settings.default_folder != NULL) { + iprintf("Copying cube_logo_path: %p\n", default_folder_ptr); + strcpy(default_folder_ptr, settings.default_folder); + } // Copy other variables set_patch_value(symshdr, syment, symstringdata, "is_running_dolphin", is_running_dolphin); diff --git a/cubeboot/source/settings.c b/cubeboot/source/settings.c index b315092..600b3a1 100644 --- a/cubeboot/source/settings.c +++ b/cubeboot/source/settings.c @@ -77,6 +77,13 @@ void load_settings() { settings.default_program = (char*)default_program; } + // default folder + const char *default_folder = ini_get(conf, "cubeboot", "default_folder"); + if (default_folder != NULL) { + iprintf("Found default_folder = %s\n", default_folder); + settings.default_folder = (char*)default_folder; + } + // swiss enable int force_swiss_default = 0; if (!ini_sget(conf, "cubeboot", "force_swiss_default", "%d", &force_swiss_default)) { diff --git a/cubeboot/source/settings.h b/cubeboot/source/settings.h index 6f6bc6c..6ea60bb 100644 --- a/cubeboot/source/settings.h +++ b/cubeboot/source/settings.h @@ -12,6 +12,7 @@ typedef struct settings { u32 preboot_delay_ms; u32 postboot_delay_ms; char *default_program; + char *default_folder; char *boot_buttons[MAX_BUTTONS]; } settings_t; diff --git a/patches/source/main.c b/patches/source/main.c index 9f8c19b..7162716 100644 --- a/patches/source/main.c +++ b/patches/source/main.c @@ -47,6 +47,7 @@ __attribute_data__ static u8 *cube_text_tex = NULL; __attribute_data__ char cube_logo_path[MAX_FILE_NAME] = {0}; __attribute_data__ u32 force_progressive = 0; __attribute_data__ u32 force_swiss_boot = 0; +__attribute_data__ char default_folder[MAX_FILE_NAME] = {0}; // used if we are switching to 60Hz on a PAL IPL __attribute_data__ static int fix_pal_ntsc = 0; @@ -353,8 +354,14 @@ __attribute_used__ void pre_thread_init() { gm_init_heap(); gm_init_thread(); + if (!start_passthrough_game) { - gm_start_thread("/"); + if (dvd_custom_open(default_folder, FILE_ENTRY_TYPE_DIR, 0) == 0) { + dvd_custom_close(dvd_custom_status()->fd); + gm_start_thread(default_folder); + } else { + gm_start_thread("/"); + } } } From f5a49a245d32e893f7ff3dfd76551515e4ba1328 Mon Sep 17 00:00:00 2001 From: wins1ey Date: Fri, 7 Nov 2025 07:54:46 +0000 Subject: [PATCH 2/4] Fix default folder handling - Added get_valid_path() helper to safely check default_folder. - Handles NULL, empty, and missing leading '/' cases. - Falls back to root '/' if folder does not exist. --- patches/source/main.c | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/patches/source/main.c b/patches/source/main.c index 7162716..40236ba 100644 --- a/patches/source/main.c +++ b/patches/source/main.c @@ -348,6 +348,30 @@ __attribute_used__ void mod_cube_anim() { } } +__attribute_used__ char* get_valid_path() { + if (default_folder[0] == '\0') { + OSReport("No default folder set, opening root\n"); + return "/"; + } + + static char path[MAX_FILE_NAME]; + if (default_folder[0] != '/') { + snprintf(path, sizeof(path), "/%s", default_folder); + } else { + strncpy(path, default_folder, sizeof(path)); + path[sizeof(path) - 1] = '\0'; + } + + if (dvd_custom_open(path, FILE_ENTRY_TYPE_DIR, 0) != 0) { + OSReport("Could not open default folder: %s, opening root\n", path); + return "/"; + } + dvd_custom_close(dvd_custom_status()->fd); + + OSReport("Using default folder: %s\n", path); + return path; +} + __attribute_used__ void pre_thread_init() { dolphin_ARAMInit(); orig_thread_init(); @@ -356,12 +380,7 @@ __attribute_used__ void pre_thread_init() { gm_init_thread(); if (!start_passthrough_game) { - if (dvd_custom_open(default_folder, FILE_ENTRY_TYPE_DIR, 0) == 0) { - dvd_custom_close(dvd_custom_status()->fd); - gm_start_thread(default_folder); - } else { - gm_start_thread("/"); - } + gm_start_thread(get_valid_path()); } } From cc276eaa2b0ea1a98c28320c2c8fa69685a8493e Mon Sep 17 00:00:00 2001 From: wins1ey Date: Fri, 7 Nov 2025 08:25:09 +0000 Subject: [PATCH 3/4] Fix print string when copying default_folder setting --- cubeboot/source/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cubeboot/source/main.c b/cubeboot/source/main.c index 6f2859a..e327e6f 100644 --- a/cubeboot/source/main.c +++ b/cubeboot/source/main.c @@ -317,7 +317,7 @@ int main(int argc, char **argv) { // } void *default_folder_ptr = (void*)get_symbol_value(symshdr, syment, symstringdata, "default_folder"); if (default_folder_ptr != NULL && settings.default_folder != NULL) { - iprintf("Copying cube_logo_path: %p\n", default_folder_ptr); + iprintf("Copying default_folder: %p\n", default_folder_ptr); strcpy(default_folder_ptr, settings.default_folder); } From 0ff8d41b34506b509a97abbf550b453b63f16481 Mon Sep 17 00:00:00 2001 From: wins1ey Date: Sun, 9 Nov 2025 14:52:50 +0000 Subject: [PATCH 4/4] Refactor default folder handling and reorder default_folder init - Renamed get_valid_path() to resolve_default_folder() for clarity - Switched to using a local path_buf to safely build folder paths - Moved default_folder initialisation to below cube_logo --- cubeboot/source/settings.c | 14 +++++++------- cubeboot/source/settings.h | 2 +- patches/source/main.c | 16 +++++++--------- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/cubeboot/source/settings.c b/cubeboot/source/settings.c index 600b3a1..49cb7ac 100644 --- a/cubeboot/source/settings.c +++ b/cubeboot/source/settings.c @@ -70,13 +70,6 @@ void load_settings() { settings.cube_logo = (char*)cube_logo; } - // default program - const char *default_program = ini_get(conf, "cubeboot", "default_program"); - if (default_program != NULL) { - iprintf("Found default_program = %s\n", default_program); - settings.default_program = (char*)default_program; - } - // default folder const char *default_folder = ini_get(conf, "cubeboot", "default_folder"); if (default_folder != NULL) { @@ -84,6 +77,13 @@ void load_settings() { settings.default_folder = (char*)default_folder; } + // default program + const char *default_program = ini_get(conf, "cubeboot", "default_program"); + if (default_program != NULL) { + iprintf("Found default_program = %s\n", default_program); + settings.default_program = (char*)default_program; + } + // swiss enable int force_swiss_default = 0; if (!ini_sget(conf, "cubeboot", "force_swiss_default", "%d", &force_swiss_default)) { diff --git a/cubeboot/source/settings.h b/cubeboot/source/settings.h index 6ea60bb..6acd395 100644 --- a/cubeboot/source/settings.h +++ b/cubeboot/source/settings.h @@ -5,6 +5,7 @@ typedef struct settings { u32 cube_color; char *cube_logo; + char *default_folder; u32 force_swiss_default; u32 show_watermark; u32 disable_mcp_select; @@ -12,7 +13,6 @@ typedef struct settings { u32 preboot_delay_ms; u32 postboot_delay_ms; char *default_program; - char *default_folder; char *boot_buttons[MAX_BUTTONS]; } settings_t; diff --git a/patches/source/main.c b/patches/source/main.c index 40236ba..d715f4b 100644 --- a/patches/source/main.c +++ b/patches/source/main.c @@ -45,9 +45,9 @@ __attribute_data__ u32 start_passthrough_game = 0; __attribute_data__ static u8 *cube_text_tex = NULL; __attribute_data__ char cube_logo_path[MAX_FILE_NAME] = {0}; +__attribute_data__ char default_folder[MAX_FILE_NAME] = {0}; __attribute_data__ u32 force_progressive = 0; __attribute_data__ u32 force_swiss_boot = 0; -__attribute_data__ char default_folder[MAX_FILE_NAME] = {0}; // used if we are switching to 60Hz on a PAL IPL __attribute_data__ static int fix_pal_ntsc = 0; @@ -348,18 +348,17 @@ __attribute_used__ void mod_cube_anim() { } } -__attribute_used__ char* get_valid_path() { +__attribute_used__ char* resolve_default_folder() { if (default_folder[0] == '\0') { OSReport("No default folder set, opening root\n"); return "/"; } - static char path[MAX_FILE_NAME]; + const char *path = default_folder; + static char path_buf[MAX_FILE_NAME]; if (default_folder[0] != '/') { - snprintf(path, sizeof(path), "/%s", default_folder); - } else { - strncpy(path, default_folder, sizeof(path)); - path[sizeof(path) - 1] = '\0'; + snprintf(path_buf, sizeof(path_buf), "/%s", default_folder); + path = path_buf; } if (dvd_custom_open(path, FILE_ENTRY_TYPE_DIR, 0) != 0) { @@ -378,9 +377,8 @@ __attribute_used__ void pre_thread_init() { gm_init_heap(); gm_init_thread(); - if (!start_passthrough_game) { - gm_start_thread(get_valid_path()); + gm_start_thread(resolve_default_folder()); } }