diff --git a/src/core/host_interface.cpp b/src/core/host_interface.cpp index cd6a06ba1..4cd34ae1e 100644 --- a/src/core/host_interface.cpp +++ b/src/core/host_interface.cpp @@ -52,6 +52,7 @@ static std::string GetRelativePath(const std::string& path, const char* new_file HostInterface::HostInterface() { + SetUserDirectory(); m_game_list = std::make_unique(); m_settings.SetDefaults(); m_last_throttle_time = Common::Timer::GetValue(); @@ -439,6 +440,39 @@ void HostInterface::OnPerformanceCountersUpdated() {} void HostInterface::OnRunningGameChanged(const char* path, const char* game_code, const char* game_title) {} +void HostInterface::SetUserDirectory() +{ +#ifdef WIN32 + // On Windows, use the path to the program. + // We might want to use My Documents in the future. + const std::string program_path = FileSystem::GetProgramPath(); + Log_InfoPrintf("Program path: %s", program_path.c_str()); + + m_user_directory = FileSystem::GetPathDirectory(program_path.c_str()); +#else +#endif + + Log_InfoPrintf("User directory: %s", m_user_directory.c_str()); +} + +std::string HostInterface::GetUserDirectoryRelativePath(const char* format, ...) +{ + std::va_list ap; + va_start(ap, format); + std::string formatted_path = StringUtil::StdStringFromFormatV(format, ap); + va_end(ap); + + if (m_user_directory.empty()) + { + return formatted_path; + } + else + { + return StringUtil::StdStringFromFormat("%s%c%s", m_user_directory.c_str(), FS_OSPATH_SEPERATOR_CHARACTER, + formatted_path.c_str()); + } +} + void HostInterface::RunFrame() { m_frame_timer.Reset(); diff --git a/src/core/host_interface.h b/src/core/host_interface.h index e9356c461..3f12d1115 100644 --- a/src/core/host_interface.h +++ b/src/core/host_interface.h @@ -61,6 +61,12 @@ public: bool LoadState(const char* filename); bool SaveState(const char* filename); + /// Returns the base user directory path. + const std::string& GetUserDirectory() const { return m_user_directory; } + + /// Returns a path relative to the user directory. + std::string GetUserDirectoryRelativePath(const char* format, ...); + protected: using ThrottleClock = std::chrono::steady_clock; @@ -82,6 +88,8 @@ protected: virtual void OnPerformanceCountersUpdated(); virtual void OnRunningGameChanged(const char* path, const char* game_code, const char* game_title); + void SetUserDirectory(); + void RunFrame(); /// Throttles the system, i.e. sleeps until it's time to execute the next frame. @@ -104,6 +112,7 @@ protected: std::unique_ptr m_system; std::unique_ptr m_game_list; Settings m_settings; + std::string m_user_directory; u64 m_last_throttle_time = 0; s64 m_throttle_period = INT64_C(1000000000) / 60;