(Windows) Added support for setting the root of a drive as the home folder.

This is mostly usable for portable installations, for example on a USB memory stick.
This commit is contained in:
Leon Styhre 2020-07-27 14:23:40 +02:00
parent 2b898981cb
commit 41c3c66eb7
4 changed files with 27 additions and 0 deletions

View file

@ -148,7 +148,12 @@ bool parseArgs(int argc, char* argv[])
std::cerr << "Error: No home path supplied with \'--home'.\n";
return false;
}
#ifdef _WIN64
if (!Utils::FileSystem::exists(argv[i + 1]) &&
(!Utils::FileSystem::driveExists(argv[i + 1]))) {
#else
if (!Utils::FileSystem::exists(argv[i + 1])) {
#endif
std::cerr << "Error: Home path \'" << argv[i + 1] << "\' does not exist.\n";
return false;
}

View file

@ -187,6 +187,8 @@ void Settings::setDefaults()
mStringMap["SaveGamelistsMode"] = "always";
#ifdef _WIN64
mBoolMap["HideTaskbar"] = false;
// Set this to true as default as it's unreliable to suspend ES during game launches
// on some Windows versions/installations.
mBoolMap["RunInBackground"] = true;
#endif
mStringMap["MediaDirectory"] = "";

View file

@ -706,6 +706,25 @@ namespace Utils
#endif
}
bool driveExists(const std::string& _path)
{
#ifdef _WIN64
std::string path = getGenericPath(_path);
// Try to add a dot or a backslash and a dot depending on how the drive
// letter was defined by the user.
if (path.length() == 2 && path.at(1) == ':')
path += "\\.";
else if (path.length() == 3 && path.at(1) == ':')
path += ".";
struct _stat64 info;
return (_wstat64(Utils::String::stringToWideString(path).c_str(), &info) == 0);
#else
return false;
#endif
}
bool isAbsolute(const std::string& _path)
{
std::string path = getGenericPath(_path);

View file

@ -55,6 +55,7 @@ namespace Utils
bool createDirectory(const std::string& _path);
bool exists(const std::string& _path);
bool driveExists(const std::string& _path);
bool isAbsolute(const std::string& _path);
bool isRegularFile(const std::string& _path);
bool isDirectory(const std::string& _path);