forked from eden-emu/eden
		
	yuzu qt: Handle per-game configs for title id 0
Currently with programs that have a 0 title id, yuzu loads the custom configuration 0000000000000000.ini for per-game configs. This is not ideal since many homebrews share this id. Instead for these programs, we load a config that is simply the file name and `.ini` appended to it.
This commit is contained in:
		
							parent
							
								
									e8f1d7145e
								
							
						
					
					
						commit
						d8a19d286b
					
				
					 8 changed files with 46 additions and 22 deletions
				
			
		|  | @ -16,7 +16,7 @@ | ||||||
| 
 | 
 | ||||||
| namespace FS = Common::FS; | namespace FS = Common::FS; | ||||||
| 
 | 
 | ||||||
| Config::Config(const std::string& config_name, ConfigType config_type) : type(config_type) { | Config::Config(std::string_view config_name, ConfigType config_type) : type(config_type) { | ||||||
|     global = config_type == ConfigType::GlobalConfig; |     global = config_type == ConfigType::GlobalConfig; | ||||||
| 
 | 
 | ||||||
|     Initialize(config_name); |     Initialize(config_name); | ||||||
|  | @ -242,7 +242,7 @@ const std::array<UISettings::Shortcut, 17> Config::default_hotkeys{{ | ||||||
| }}; | }}; | ||||||
| // clang-format on
 | // clang-format on
 | ||||||
| 
 | 
 | ||||||
| void Config::Initialize(const std::string& config_name) { | void Config::Initialize(std::string_view config_name) { | ||||||
|     const auto fs_config_loc = FS::GetYuzuPath(FS::YuzuPath::ConfigDir); |     const auto fs_config_loc = FS::GetYuzuPath(FS::YuzuPath::ConfigDir); | ||||||
|     const auto config_file = fmt::format("{}.ini", config_name); |     const auto config_file = fmt::format("{}.ini", config_name); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -22,7 +22,7 @@ public: | ||||||
|         InputProfile, |         InputProfile, | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     explicit Config(const std::string& config_name = "qt-config", |     explicit Config(std::string_view config_name = "qt-config", | ||||||
|                     ConfigType config_type = ConfigType::GlobalConfig); |                     ConfigType config_type = ConfigType::GlobalConfig); | ||||||
|     ~Config(); |     ~Config(); | ||||||
| 
 | 
 | ||||||
|  | @ -45,7 +45,7 @@ public: | ||||||
|     static const std::array<UISettings::Shortcut, 17> default_hotkeys; |     static const std::array<UISettings::Shortcut, 17> default_hotkeys; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     void Initialize(const std::string& config_name); |     void Initialize(std::string_view config_name); | ||||||
| 
 | 
 | ||||||
|     void ReadValues(); |     void ReadValues(); | ||||||
|     void ReadPlayerValue(std::size_t player_index); |     void ReadPlayerValue(std::size_t player_index); | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ | ||||||
| 
 | 
 | ||||||
| #include <algorithm> | #include <algorithm> | ||||||
| #include <memory> | #include <memory> | ||||||
|  | #include <string> | ||||||
| #include <utility> | #include <utility> | ||||||
| 
 | 
 | ||||||
| #include <QCheckBox> | #include <QCheckBox> | ||||||
|  | @ -14,6 +15,7 @@ | ||||||
| #include <QTimer> | #include <QTimer> | ||||||
| #include <QTreeView> | #include <QTreeView> | ||||||
| 
 | 
 | ||||||
|  | #include "common/fs/path_util.h" | ||||||
| #include "core/core.h" | #include "core/core.h" | ||||||
| #include "core/file_sys/control_metadata.h" | #include "core/file_sys/control_metadata.h" | ||||||
| #include "core/file_sys/patch_manager.h" | #include "core/file_sys/patch_manager.h" | ||||||
|  | @ -26,10 +28,15 @@ | ||||||
| #include "yuzu/uisettings.h" | #include "yuzu/uisettings.h" | ||||||
| #include "yuzu/util/util.h" | #include "yuzu/util/util.h" | ||||||
| 
 | 
 | ||||||
| ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id) | ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id, std::string_view file_name) | ||||||
|     : QDialog(parent), ui(std::make_unique<Ui::ConfigurePerGame>()), title_id(title_id) { |     : QDialog(parent), ui(std::make_unique<Ui::ConfigurePerGame>()), title_id(title_id) { | ||||||
|  |     if (title_id == 0) { | ||||||
|  |         game_config = std::make_unique<Config>(Common::FS::GetFilename(file_name), | ||||||
|  |                                                Config::ConfigType::PerGameConfig); | ||||||
|  |     } else { | ||||||
|         game_config = std::make_unique<Config>(fmt::format("{:016X}", title_id), |         game_config = std::make_unique<Config>(fmt::format("{:016X}", title_id), | ||||||
|                                                Config::ConfigType::PerGameConfig); |                                                Config::ConfigType::PerGameConfig); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     Settings::SetConfiguringGlobal(false); |     Settings::SetConfiguringGlobal(false); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include <memory> | #include <memory> | ||||||
|  | #include <string> | ||||||
| #include <vector> | #include <vector> | ||||||
| 
 | 
 | ||||||
| #include <QDialog> | #include <QDialog> | ||||||
|  | @ -27,7 +28,7 @@ class ConfigurePerGame : public QDialog { | ||||||
|     Q_OBJECT |     Q_OBJECT | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
|     explicit ConfigurePerGame(QWidget* parent, u64 title_id); |     explicit ConfigurePerGame(QWidget* parent, u64 title_id, std::string_view file_name); | ||||||
|     ~ConfigurePerGame() override; |     ~ConfigurePerGame() override; | ||||||
| 
 | 
 | ||||||
|     /// Save all button configurations to settings file
 |     /// Save all button configurations to settings file
 | ||||||
|  |  | ||||||
|  | @ -561,11 +561,11 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri | ||||||
|     connect(remove_dlc, &QAction::triggered, [this, program_id]() { |     connect(remove_dlc, &QAction::triggered, [this, program_id]() { | ||||||
|         emit RemoveInstalledEntryRequested(program_id, InstalledEntryType::AddOnContent); |         emit RemoveInstalledEntryRequested(program_id, InstalledEntryType::AddOnContent); | ||||||
|     }); |     }); | ||||||
|     connect(remove_shader_cache, &QAction::triggered, [this, program_id]() { |     connect(remove_shader_cache, &QAction::triggered, [this, program_id, path]() { | ||||||
|         emit RemoveFileRequested(program_id, GameListRemoveTarget::ShaderCache); |         emit RemoveFileRequested(program_id, GameListRemoveTarget::ShaderCache, path); | ||||||
|     }); |     }); | ||||||
|     connect(remove_custom_config, &QAction::triggered, [this, program_id]() { |     connect(remove_custom_config, &QAction::triggered, [this, program_id, path]() { | ||||||
|         emit RemoveFileRequested(program_id, GameListRemoveTarget::CustomConfiguration); |         emit RemoveFileRequested(program_id, GameListRemoveTarget::CustomConfiguration, path); | ||||||
|     }); |     }); | ||||||
|     connect(dump_romfs, &QAction::triggered, |     connect(dump_romfs, &QAction::triggered, | ||||||
|             [this, program_id, path]() { emit DumpRomFSRequested(program_id, path); }); |             [this, program_id, path]() { emit DumpRomFSRequested(program_id, path); }); | ||||||
|  |  | ||||||
|  | @ -88,7 +88,8 @@ signals: | ||||||
|                              const std::string& game_path); |                              const std::string& game_path); | ||||||
|     void OpenTransferableShaderCacheRequested(u64 program_id); |     void OpenTransferableShaderCacheRequested(u64 program_id); | ||||||
|     void RemoveInstalledEntryRequested(u64 program_id, InstalledEntryType type); |     void RemoveInstalledEntryRequested(u64 program_id, InstalledEntryType type); | ||||||
|     void RemoveFileRequested(u64 program_id, GameListRemoveTarget target); |     void RemoveFileRequested(u64 program_id, GameListRemoveTarget target, | ||||||
|  |                              std::string_view game_path); | ||||||
|     void DumpRomFSRequested(u64 program_id, const std::string& game_path); |     void DumpRomFSRequested(u64 program_id, const std::string& game_path); | ||||||
|     void CopyTIDRequested(u64 program_id); |     void CopyTIDRequested(u64 program_id); | ||||||
|     void NavigateToGamedbEntryRequested(u64 program_id, |     void NavigateToGamedbEntryRequested(u64 program_id, | ||||||
|  |  | ||||||
|  | @ -1334,7 +1334,13 @@ void GMainWindow::BootGame(const QString& filename, std::size_t program_index) { | ||||||
| 
 | 
 | ||||||
|     if (!(loader == nullptr || loader->ReadProgramId(title_id) != Loader::ResultStatus::Success)) { |     if (!(loader == nullptr || loader->ReadProgramId(title_id) != Loader::ResultStatus::Success)) { | ||||||
|         // Load per game settings
 |         // Load per game settings
 | ||||||
|         Config per_game_config(fmt::format("{:016X}", title_id), Config::ConfigType::PerGameConfig); |         if (title_id == 0) { | ||||||
|  |             Config per_game_config(Common::FS::GetFilename(filename.toStdString()), | ||||||
|  |                                    Config::ConfigType::PerGameConfig); | ||||||
|  |         } else { | ||||||
|  |             Config per_game_config(fmt::format("{:016X}", title_id), | ||||||
|  |                                    Config::ConfigType::PerGameConfig); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     ConfigureVibration::SetAllVibrationDevices(); |     ConfigureVibration::SetAllVibrationDevices(); | ||||||
|  | @ -1795,7 +1801,8 @@ void GMainWindow::RemoveAddOnContent(u64 program_id, const QString& entry_type) | ||||||
|                              tr("Successfully removed %1 installed DLC.").arg(count)); |                              tr("Successfully removed %1 installed DLC.").arg(count)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GMainWindow::OnGameListRemoveFile(u64 program_id, GameListRemoveTarget target) { | void GMainWindow::OnGameListRemoveFile(u64 program_id, GameListRemoveTarget target, | ||||||
|  |                                        std::string_view game_path) { | ||||||
|     const QString question = [this, target] { |     const QString question = [this, target] { | ||||||
|         switch (target) { |         switch (target) { | ||||||
|         case GameListRemoveTarget::ShaderCache: |         case GameListRemoveTarget::ShaderCache: | ||||||
|  | @ -1817,7 +1824,7 @@ void GMainWindow::OnGameListRemoveFile(u64 program_id, GameListRemoveTarget targ | ||||||
|         RemoveTransferableShaderCache(program_id); |         RemoveTransferableShaderCache(program_id); | ||||||
|         break; |         break; | ||||||
|     case GameListRemoveTarget::CustomConfiguration: |     case GameListRemoveTarget::CustomConfiguration: | ||||||
|         RemoveCustomConfiguration(program_id); |         RemoveCustomConfiguration(program_id, game_path); | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | @ -1842,9 +1849,16 @@ void GMainWindow::RemoveTransferableShaderCache(u64 program_id) { | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GMainWindow::RemoveCustomConfiguration(u64 program_id) { | void GMainWindow::RemoveCustomConfiguration(u64 program_id, std::string_view game_path) { | ||||||
|     const auto custom_config_file_path = Common::FS::GetYuzuPath(Common::FS::YuzuPath::ConfigDir) / |     std::string custom_config_file_path; | ||||||
|  |     if (program_id == 0) { | ||||||
|  |         custom_config_file_path = Common::FS::GetYuzuPath(Common::FS::YuzuPath::ConfigDir) / | ||||||
|  |                                   "custom" / | ||||||
|  |                                   fmt::format("{:s}.ini", Common::FS::GetFilename(game_path)); | ||||||
|  |     } else { | ||||||
|  |         custom_config_file_path = Common::FS::GetYuzuPath(Common::FS::YuzuPath::ConfigDir) / | ||||||
|                                   "custom" / fmt::format("{:016X}.ini", program_id); |                                   "custom" / fmt::format("{:016X}.ini", program_id); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     if (!Common::FS::Exists(custom_config_file_path)) { |     if (!Common::FS::Exists(custom_config_file_path)) { | ||||||
|         QMessageBox::warning(this, tr("Error Removing Custom Configuration"), |         QMessageBox::warning(this, tr("Error Removing Custom Configuration"), | ||||||
|  | @ -2633,7 +2647,7 @@ void GMainWindow::OpenPerGameConfiguration(u64 title_id, const std::string& file | ||||||
|     const auto v_file = Core::GetGameFileFromPath(vfs, file_name); |     const auto v_file = Core::GetGameFileFromPath(vfs, file_name); | ||||||
|     const auto& system = Core::System::GetInstance(); |     const auto& system = Core::System::GetInstance(); | ||||||
| 
 | 
 | ||||||
|     ConfigurePerGame dialog(this, title_id); |     ConfigurePerGame dialog(this, title_id, file_name); | ||||||
|     dialog.LoadFromFile(v_file); |     dialog.LoadFromFile(v_file); | ||||||
|     const auto result = dialog.exec(); |     const auto result = dialog.exec(); | ||||||
|     if (result == QDialog::Accepted) { |     if (result == QDialog::Accepted) { | ||||||
|  |  | ||||||
|  | @ -236,7 +236,8 @@ private slots: | ||||||
|                               const std::string& game_path); |                               const std::string& game_path); | ||||||
|     void OnTransferableShaderCacheOpenFile(u64 program_id); |     void OnTransferableShaderCacheOpenFile(u64 program_id); | ||||||
|     void OnGameListRemoveInstalledEntry(u64 program_id, InstalledEntryType type); |     void OnGameListRemoveInstalledEntry(u64 program_id, InstalledEntryType type); | ||||||
|     void OnGameListRemoveFile(u64 program_id, GameListRemoveTarget target); |     void OnGameListRemoveFile(u64 program_id, GameListRemoveTarget target, | ||||||
|  |                               std::string_view game_path); | ||||||
|     void OnGameListDumpRomFS(u64 program_id, const std::string& game_path); |     void OnGameListDumpRomFS(u64 program_id, const std::string& game_path); | ||||||
|     void OnGameListCopyTID(u64 program_id); |     void OnGameListCopyTID(u64 program_id); | ||||||
|     void OnGameListNavigateToGamedbEntry(u64 program_id, |     void OnGameListNavigateToGamedbEntry(u64 program_id, | ||||||
|  | @ -275,7 +276,7 @@ private: | ||||||
|     void RemoveUpdateContent(u64 program_id, const QString& entry_type); |     void RemoveUpdateContent(u64 program_id, const QString& entry_type); | ||||||
|     void RemoveAddOnContent(u64 program_id, const QString& entry_type); |     void RemoveAddOnContent(u64 program_id, const QString& entry_type); | ||||||
|     void RemoveTransferableShaderCache(u64 program_id); |     void RemoveTransferableShaderCache(u64 program_id); | ||||||
|     void RemoveCustomConfiguration(u64 program_id); |     void RemoveCustomConfiguration(u64 program_id, std::string_view game_path); | ||||||
|     std::optional<u64> SelectRomFSDumpTarget(const FileSys::ContentProvider&, u64 program_id); |     std::optional<u64> SelectRomFSDumpTarget(const FileSys::ContentProvider&, u64 program_id); | ||||||
|     InstallResult InstallNSPXCI(const QString& filename); |     InstallResult InstallNSPXCI(const QString& filename); | ||||||
|     InstallResult InstallNCA(const QString& filename); |     InstallResult InstallNCA(const QString& filename); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 lat9nq
						lat9nq