From 1bec364c3508a6d328bd7e57485aee948c566581 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Sun, 15 Feb 2026 09:41:04 -0800 Subject: [PATCH] gui: add config entry for recording/screenshot dir Fixes #339 --- gui/config.c | 6 ++++++ gui/config.h | 1 + gui/menu/menu.c | 9 +++++---- gui/platform.c | 18 +++++++++++------- gui/platform.h | 4 ++-- 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/gui/config.c b/gui/config.c index 09d9a02..a74c5c0 100644 --- a/gui/config.c +++ b/gui/config.c @@ -83,6 +83,8 @@ void vpi_config_save() sprintf(buf, "%i", vpi_config.cursor_in_fullscreen); xmlTextWriterWriteElement(writer, BAD_CAST "cursorinfullscreen", BAD_CAST buf); + xmlTextWriterWriteElement(writer, BAD_CAST "recordingdir", BAD_CAST vpi_config.recording_dir); + xmlTextWriterEndElement(writer); // vanilla xmlTextWriterEndDocument(writer); @@ -151,6 +153,10 @@ void vpi_config_init() if (child->children) { vui_strncpy(vpi_config.wireless_interface, (const char *) child->children->content, sizeof(vpi_config.wireless_interface)); } + } else if (!strcmp((const char *) child->name, "recordingdir")) { + if (child->children) { + vui_strncpy(vpi_config.recording_dir, (const char *) child->children->content, sizeof(vpi_config.recording_dir)); + } } else if (!strcmp((const char *) child->name, "connectionsetup")) { vpi_config.connection_setup = atoi((const char *) child->children->content); } else if (!strcmp((const char *) child->name, "region")) { diff --git a/gui/config.h b/gui/config.h index 39e5e68..ac767ef 100644 --- a/gui/config.h +++ b/gui/config.h @@ -17,6 +17,7 @@ typedef struct { vpi_console_entry_t *connected_console_entries; uint32_t server_address; char wireless_interface[VPI_CONSOLE_MAX_NAME]; + char recording_dir[1024]; int connection_setup; int region; int swap_abxy; diff --git a/gui/menu/menu.c b/gui/menu/menu.c index 60642c0..b1cba8b 100644 --- a/gui/menu/menu.c +++ b/gui/menu/menu.c @@ -7,6 +7,7 @@ #include #include +#include "config.h" #include "menu_common.h" #include "menu_game.h" #include "menu_main.h" @@ -26,14 +27,14 @@ void vpi_menu_init(vui_context_t *vui) vpi_menu_main(vui, 0); } -void get_valid_filename(const char *fmt, char *abs_buf, size_t size_abs_buf) +void get_valid_filename(const char *fmt, char *abs_buf, size_t size_abs_buf, const char *preferred_dir) { char buf[100]; int index = 0; do { index++; snprintf(buf, sizeof(buf), fmt, index); - vpi_get_data_filename(abs_buf, size_abs_buf, buf); + vpi_get_data_filename(abs_buf, size_abs_buf, buf, preferred_dir); } while (access(abs_buf, F_OK) == 0); } @@ -43,7 +44,7 @@ void vpi_menu_action(vui_context_t *vui, vpi_extra_action_t action) case VPI_ACTION_SCREENSHOT: { char ss_fn[4096]; - get_valid_filename("Screenshot-%04i.png", ss_fn, sizeof(ss_fn)); + get_valid_filename("Screenshot-%04i.png", ss_fn, sizeof(ss_fn), vpi_config.recording_dir); vpi_decode_screenshot(ss_fn); break; } @@ -52,7 +53,7 @@ void vpi_menu_action(vui_context_t *vui, vpi_extra_action_t action) int recording = vpi_decode_is_recording(); if (!recording) { char mov_fn[4096]; - get_valid_filename("Recording-%04i.mp4", mov_fn, sizeof(mov_fn)); + get_valid_filename("Recording-%04i.mp4", mov_fn, sizeof(mov_fn), vpi_config.recording_dir); vpi_decode_record(mov_fn); } else { vpi_decode_record_stop(); diff --git a/gui/platform.c b/gui/platform.c index 48218a8..0e33377 100644 --- a/gui/platform.c +++ b/gui/platform.c @@ -15,17 +15,21 @@ static char pref_path[4096] = {0}; void vpi_config_filename(char *out, size_t out_size) { - vpi_get_data_filename(out, out_size, "config.xml"); + vpi_get_data_filename(out, out_size, "config.xml", NULL); } -void vpi_get_data_filename(char *out, size_t out_size, const char *filename) +void vpi_get_data_filename(char *out, size_t out_size, const char *filename, const char *preferred_dir) { - if (!pref_path[0]) { - char *s = SDL_GetPrefPath("", "Vanilla"); - vui_strncpy(pref_path, s, sizeof(pref_path)); - SDL_free(s); + if (preferred_dir && preferred_dir[0]) { + snprintf(out, out_size, "%s/%s", preferred_dir, filename); + } else { + if (!pref_path[0]) { + char *s = SDL_GetPrefPath("", "Vanilla"); + vui_strncpy(pref_path, s, sizeof(pref_path)); + SDL_free(s); + } + snprintf(out, out_size, "%s%s", pref_path, filename); } - snprintf(out, out_size, "%s%s", pref_path, filename); } void vpilog_va(const char *fmt, va_list va) diff --git a/gui/platform.h b/gui/platform.h index d88ca83..25f2be4 100644 --- a/gui/platform.h +++ b/gui/platform.h @@ -5,7 +5,7 @@ #include void vpi_config_filename(char *out, size_t out_size); -void vpi_get_data_filename(char *out, size_t out_size, const char *filename); +void vpi_get_data_filename(char *out, size_t out_size, const char *filename, const char *preferred_dir); void vpilog_va(const char *fmt, va_list va); void vpilog(const char *fmt, ...); @@ -14,4 +14,4 @@ void vpi_asset_filename(char *buf, size_t size, const char *type, const char *fi void *vpi_start_process(const char **args); -#endif // VANILLA_PI_PLATFORM_H \ No newline at end of file +#endif // VANILLA_PI_PLATFORM_H