mirror of
https://github.com/Dark98/threeSD.git
synced 2026-07-02 16:49:04 +00:00
Fix Flatpak user path
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
#define EMU_DATA_DIR "citra-emu"
|
||||
#endif
|
||||
#endif
|
||||
#define CITRA_EXECUTABLE "citra-qt"
|
||||
|
||||
// Subdirs in the User dir returned by GetUserPath(UserPath::UserDir)
|
||||
#define CONFIG_DIR "config"
|
||||
|
||||
+48
-16
@@ -694,9 +694,36 @@ std::string GetSysDirectory() {
|
||||
|
||||
namespace {
|
||||
std::unordered_map<UserPath, std::string> g_paths;
|
||||
bool g_portable_user_directory = false;
|
||||
} // namespace
|
||||
|
||||
UserPathType GetUserPathType() {
|
||||
#ifdef _WIN32
|
||||
const auto user_path = GetExeDirectory() + DIR_SEP USERDATA_DIR DIR_SEP;
|
||||
if (FileUtil::Exists(user_path)) {
|
||||
return UserPathType::Portable;
|
||||
} else {
|
||||
return UserPathType::Normal;
|
||||
}
|
||||
#elif ANDROID
|
||||
UNREACHABLE_MSG("Android is not supported (yet)");
|
||||
#else
|
||||
if (FileUtil::Exists(ROOT_DIR DIR_SEP USERDATA_DIR DIR_SEP)) {
|
||||
return UserPathType::Portable;
|
||||
} else if (FileUtil::Exists(ROOT_DIR DIR_SEP CITRA_EXECUTABLE)) {
|
||||
return UserPathType::Normal;
|
||||
}
|
||||
|
||||
const bool normal_exists =
|
||||
FileUtil::Exists(GetUserDirectory("XDG_DATA_HOME") + DIR_SEP EMU_DATA_DIR DIR_SEP);
|
||||
const bool flatpak_exists = FileUtil::Exists(
|
||||
GetHomeDirectory() + "/.var/app/org.citra_emu.citra/data" + DIR_SEP EMU_DATA_DIR DIR_SEP);
|
||||
if (!normal_exists || flatpak_exists) { // Flatpak takes precedence
|
||||
return UserPathType::Flatpak;
|
||||
}
|
||||
return UserPathType::Normal;
|
||||
#endif
|
||||
}
|
||||
|
||||
void SetUserPath(const std::string& path) {
|
||||
if (!g_paths.empty()) {
|
||||
g_paths.clear();
|
||||
@@ -711,27 +738,26 @@ void SetUserPath(const std::string& path) {
|
||||
g_paths.emplace(UserPath::CacheDir, user_path + CACHE_DIR DIR_SEP);
|
||||
} else {
|
||||
#ifdef _WIN32
|
||||
user_path = GetExeDirectory() + DIR_SEP USERDATA_DIR DIR_SEP;
|
||||
if (!FileUtil::IsDirectory(user_path)) {
|
||||
user_path = AppDataRoamingDirectory() + DIR_SEP EMU_DATA_DIR DIR_SEP;
|
||||
} else {
|
||||
if (GetUserPathType() == UserPathType::Portable) {
|
||||
LOG_INFO(Common_Filesystem, "Using the local user directory");
|
||||
g_portable_user_directory = true;
|
||||
user_path = GetExeDirectory() + DIR_SEP USERDATA_DIR DIR_SEP;
|
||||
} else {
|
||||
user_path = AppDataRoamingDirectory() + DIR_SEP EMU_DATA_DIR DIR_SEP;
|
||||
}
|
||||
|
||||
g_paths.emplace(UserPath::ConfigDir, user_path + CONFIG_DIR DIR_SEP);
|
||||
g_paths.emplace(UserPath::CacheDir, user_path + CACHE_DIR DIR_SEP);
|
||||
#elif ANDROID
|
||||
ASSERT_MSG(false, "Specified path {} is not valid", path);
|
||||
UNREACHABLE_MSG("Android is not supported (yet)");
|
||||
#else
|
||||
if (FileUtil::Exists(ROOT_DIR DIR_SEP USERDATA_DIR)) {
|
||||
switch (GetUserPathType()) {
|
||||
case UserPathType::Portable: {
|
||||
user_path = ROOT_DIR DIR_SEP USERDATA_DIR DIR_SEP;
|
||||
g_paths.emplace(UserPath::ConfigDir, user_path + CONFIG_DIR DIR_SEP);
|
||||
g_paths.emplace(UserPath::CacheDir, user_path + CACHE_DIR DIR_SEP);
|
||||
|
||||
LOG_INFO(Common_Filesystem, "Using the local user directory");
|
||||
g_portable_user_directory = true;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
case UserPathType::Normal: {
|
||||
std::string data_dir = GetUserDirectory("XDG_DATA_HOME");
|
||||
std::string config_dir = GetUserDirectory("XDG_CONFIG_HOME");
|
||||
std::string cache_dir = GetUserDirectory("XDG_CACHE_HOME");
|
||||
@@ -739,6 +765,16 @@ void SetUserPath(const std::string& path) {
|
||||
user_path = data_dir + DIR_SEP EMU_DATA_DIR DIR_SEP;
|
||||
g_paths.emplace(UserPath::ConfigDir, config_dir + DIR_SEP EMU_DATA_DIR DIR_SEP);
|
||||
g_paths.emplace(UserPath::CacheDir, cache_dir + DIR_SEP EMU_DATA_DIR DIR_SEP);
|
||||
break;
|
||||
}
|
||||
case UserPathType::Flatpak: {
|
||||
const auto base_path = GetHomeDirectory() + "/.var/app/org.citra_emu.citra/";
|
||||
user_path = base_path + "data/citra-emu/";
|
||||
|
||||
g_paths.emplace(UserPath::ConfigDir, base_path + "config/citra-emu/");
|
||||
g_paths.emplace(UserPath::CacheDir, base_path + "cache/citra-emu/");
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -758,10 +794,6 @@ const std::string& GetUserPath(UserPath path) {
|
||||
return g_paths[path];
|
||||
}
|
||||
|
||||
bool IsPortableUserDirectory() {
|
||||
return g_portable_user_directory;
|
||||
}
|
||||
|
||||
std::size_t WriteStringToFile(bool text_file, const std::string& filename, std::string_view str) {
|
||||
return IOFile(filename, text_file ? "w" : "wb").WriteString(str);
|
||||
}
|
||||
|
||||
@@ -129,6 +129,15 @@ void CopyDir(const std::string& source_path, const std::string& dest_path);
|
||||
// Set the current directory to given directory
|
||||
bool SetCurrentDir(const std::string& directory);
|
||||
|
||||
enum class UserPathType {
|
||||
Normal, /// user-wide normal install
|
||||
Portable, /// portable install
|
||||
Flatpak, /// Flatpak install (Linux only)
|
||||
};
|
||||
|
||||
// Determine type of the user path that should be used.
|
||||
UserPathType GetUserPathType();
|
||||
|
||||
// User paths are not directly used by us, and are only preserved here to match Citra's
|
||||
// user folder and tell where to copy the files to.
|
||||
|
||||
@@ -138,9 +147,6 @@ void SetUserPath(const std::string& path = "");
|
||||
// directory. To be used in "multi-user" mode (that is, installed).
|
||||
const std::string& GetUserPath(UserPath path);
|
||||
|
||||
// Whetehr we are using the portable user directory.
|
||||
bool IsPortableUserDirectory();
|
||||
|
||||
// Returns the path to where the sys file are
|
||||
std::string GetSysDirectory();
|
||||
|
||||
|
||||
@@ -256,9 +256,8 @@ void ImportDialog::InsertSecondLevelItem(std::size_t row, const Core::ContentSpe
|
||||
encryption.clear();
|
||||
}
|
||||
|
||||
auto* item = new QTreeWidgetItem{
|
||||
{QString{}, name, ReadableByteSize(content.maximum_size), encryption,
|
||||
content.already_exists ? QStringLiteral("Yes") : QStringLiteral("No")}};
|
||||
auto* item = new QTreeWidgetItem{{QString{}, name, ReadableByteSize(content.maximum_size),
|
||||
encryption, content.already_exists ? tr("Yes") : tr("No")}};
|
||||
|
||||
QPixmap icon;
|
||||
if (replace_icon.isNull()) {
|
||||
|
||||
+17
-4
@@ -11,6 +11,7 @@
|
||||
#include <QStorageInfo>
|
||||
#include <QTreeWidgetItem>
|
||||
#include <qdevicewatcher.h>
|
||||
#include "common/assert.h"
|
||||
#include "common/file_util.h"
|
||||
#include "frontend/import_dialog.h"
|
||||
#include "frontend/main.h"
|
||||
@@ -60,10 +61,22 @@ MainDialog::MainDialog(QWidget* parent) : QDialog(parent), ui(std::make_unique<U
|
||||
}
|
||||
});
|
||||
|
||||
ui->importDestination->setText(tr("Import Destination: %1")
|
||||
.arg(FileUtil::IsPortableUserDirectory()
|
||||
? tr("Portable Citra Install")
|
||||
: tr("User-wide Citra Install")));
|
||||
QString destination_text{};
|
||||
const auto destination = FileUtil::GetUserPathType();
|
||||
if (destination == FileUtil::UserPathType::Normal) {
|
||||
#ifdef __linux__
|
||||
destination_text = tr("Non-Flatpak Citra Install");
|
||||
#else
|
||||
destination_text = tr("User-wide Citra Install");
|
||||
#endif
|
||||
} else if (destination == FileUtil::UserPathType::Portable) {
|
||||
destination_text = tr("Portable Citra Install");
|
||||
} else if (destination == FileUtil::UserPathType::Flatpak) {
|
||||
destination_text = tr("Flatpak Citra Install");
|
||||
} else {
|
||||
UNREACHABLE();
|
||||
}
|
||||
ui->importDestination->setText(tr("Import Destination: %1").arg(destination_text));
|
||||
|
||||
connect(ui->main, &QTreeWidget::itemSelectionChanged, [this] {
|
||||
ui->buttonBox->button(QDialogButtonBox::StandardButton::Ok)
|
||||
|
||||
Reference in New Issue
Block a user