Skip to content

Commit

Permalink
Merge pull request #2665 from AdmiralCurtiss/relative-memory-card-paths
Browse files Browse the repository at this point in the history
GameCube Config: Store paths relatively when selected file is within Dolphin's directory. (Windows)
  • Loading branch information
skidau committed Jul 20, 2015
2 parents 654c44b + c5b81b1 commit ad68de5
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 13 deletions.
6 changes: 5 additions & 1 deletion Source/Core/Common/FileUtil.cpp
Expand Up @@ -731,8 +731,12 @@ std::string& GetExeDirectory()
if (DolphinPath.empty())
{
TCHAR Dolphin_exe_Path[2048];
TCHAR Dolphin_exe_Clean_Path[MAX_PATH];
GetModuleFileName(nullptr, Dolphin_exe_Path, 2048);
DolphinPath = TStrToUTF8(Dolphin_exe_Path);
if (_tfullpath(Dolphin_exe_Clean_Path, Dolphin_exe_Path, MAX_PATH) != nullptr)
DolphinPath = TStrToUTF8(Dolphin_exe_Clean_Path);
else
DolphinPath = TStrToUTF8(Dolphin_exe_Path);
DolphinPath = DolphinPath.substr(0, DolphinPath.find_last_of('\\'));
}
return DolphinPath;
Expand Down
28 changes: 16 additions & 12 deletions Source/Core/DolphinWX/Config/GameCubeConfigPane.cpp
Expand Up @@ -8,6 +8,7 @@
#include <wx/checkbox.h>
#include <wx/choice.h>
#include <wx/filedlg.h>
#include <wx/filename.h>
#include <wx/gbsizer.h>
#include <wx/sizer.h>
#include <wx/stattext.h>
Expand Down Expand Up @@ -331,23 +332,26 @@ void GameCubeConfigPane::ChooseSlotPath(bool is_slot_a, TEXIDevices device_type)
}
}
}

wxFileName newFilename(filename);
newFilename.MakeAbsolute();
filename = newFilename.GetFullPath();

#ifdef _WIN32
if (!strncmp(File::GetExeDirectory().c_str(), filename.c_str(), File::GetExeDirectory().size()))
{
// If the Exe Directory Matches the prefix of the filename, we still need to verify
// that the next character is a directory separator character, otherwise we may create an invalid path
char next_char = filename.at(File::GetExeDirectory().size()) + 1;
if (next_char == '/' || next_char == '\\')
{
filename.erase(0, File::GetExeDirectory().size() + 1);
filename = "./" + filename;
}
}
// If the Memory Card file is within the Exe dir, we can assume that the user wants it to be stored relative
// to the executable, so it stays set correctly when the probably portable Exe dir is moved.
// TODO: Replace this with a cleaner, non-wx solution once std::filesystem is standard
std::string exeDir = File::GetExeDirectory() + '\\';
if (wxString(filename).Lower().StartsWith(wxString(exeDir).Lower()))
filename.erase(0, exeDir.size());

std::replace(filename.begin(), filename.end(), '\\', '/');
#endif

// also check that the path isn't used for the other memcard...
if (filename.compare(is_slot_a ? pathB : pathA) != 0)
wxFileName otherFilename(is_slot_a ? pathB : pathA);
otherFilename.MakeAbsolute();
if (newFilename.GetFullPath().compare(otherFilename.GetFullPath()) != 0)
{
if (memcard)
{
Expand Down

0 comments on commit ad68de5

Please sign in to comment.