sdl_config.cpp 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. // SPDX-FileCopyrightText: 2023 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. // SDL will break our main function in yuzu-cmd if we don't define this before adding SDL.h
  4. #define SDL_MAIN_HANDLED
  5. #include <SDL.h>
  6. #include "input_common/main.h"
  7. #include "sdl_config.h"
  8. const std::array<int, Settings::NativeButton::NumButtons> SdlConfig::default_buttons = {
  9. SDL_SCANCODE_A, SDL_SCANCODE_S, SDL_SCANCODE_Z, SDL_SCANCODE_X, SDL_SCANCODE_T,
  10. SDL_SCANCODE_G, SDL_SCANCODE_F, SDL_SCANCODE_H, SDL_SCANCODE_Q, SDL_SCANCODE_W,
  11. SDL_SCANCODE_M, SDL_SCANCODE_N, SDL_SCANCODE_1, SDL_SCANCODE_2, SDL_SCANCODE_B,
  12. };
  13. const std::array<int, Settings::NativeMotion::NumMotions> SdlConfig::default_motions = {
  14. SDL_SCANCODE_7,
  15. SDL_SCANCODE_8,
  16. };
  17. const std::array<std::array<int, 4>, Settings::NativeAnalog::NumAnalogs> SdlConfig::default_analogs{
  18. {
  19. {
  20. SDL_SCANCODE_UP,
  21. SDL_SCANCODE_DOWN,
  22. SDL_SCANCODE_LEFT,
  23. SDL_SCANCODE_RIGHT,
  24. },
  25. {
  26. SDL_SCANCODE_I,
  27. SDL_SCANCODE_K,
  28. SDL_SCANCODE_J,
  29. SDL_SCANCODE_L,
  30. },
  31. }};
  32. const std::array<int, 2> SdlConfig::default_stick_mod = {
  33. SDL_SCANCODE_D,
  34. 0,
  35. };
  36. const std::array<int, 2> SdlConfig::default_ringcon_analogs{{
  37. 0,
  38. 0,
  39. }};
  40. SdlConfig::SdlConfig(const std::optional<std::string> config_path) {
  41. Initialize(config_path);
  42. ReadSdlValues();
  43. SaveSdlValues();
  44. }
  45. SdlConfig::~SdlConfig() {
  46. if (global) {
  47. SdlConfig::SaveAllValues();
  48. }
  49. }
  50. void SdlConfig::ReloadAllValues() {
  51. Reload();
  52. ReadSdlValues();
  53. SaveSdlValues();
  54. }
  55. void SdlConfig::SaveAllValues() {
  56. Save();
  57. SaveSdlValues();
  58. }
  59. void SdlConfig::ReadSdlValues() {
  60. ReadSdlControlValues();
  61. }
  62. void SdlConfig::ReadSdlControlValues() {
  63. BeginGroup(Settings::TranslateCategory(Settings::Category::Controls));
  64. Settings::values.players.SetGlobal(!IsCustomConfig());
  65. for (std::size_t p = 0; p < Settings::values.players.GetValue().size(); ++p) {
  66. ReadSdlPlayerValues(p);
  67. }
  68. if (IsCustomConfig()) {
  69. EndGroup();
  70. return;
  71. }
  72. ReadDebugControlValues();
  73. ReadHidbusValues();
  74. EndGroup();
  75. }
  76. void SdlConfig::ReadSdlPlayerValues(const std::size_t player_index) {
  77. std::string player_prefix;
  78. if (type != ConfigType::InputProfile) {
  79. player_prefix.append("player_").append(ToString(player_index)).append("_");
  80. }
  81. auto& player = Settings::values.players.GetValue()[player_index];
  82. if (IsCustomConfig()) {
  83. const auto profile_name =
  84. ReadStringSetting(std::string(player_prefix).append("profile_name"));
  85. if (profile_name.empty()) {
  86. // Use the global input config
  87. player = Settings::values.players.GetValue(true)[player_index];
  88. return;
  89. }
  90. }
  91. for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
  92. const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]);
  93. auto& player_buttons = player.buttons[i];
  94. player_buttons = ReadStringSetting(
  95. std::string(player_prefix).append(Settings::NativeButton::mapping[i]), default_param);
  96. if (player_buttons.empty()) {
  97. player_buttons = default_param;
  98. }
  99. }
  100. for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {
  101. const std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
  102. default_analogs[i][0], default_analogs[i][1], default_analogs[i][2],
  103. default_analogs[i][3], default_stick_mod[i], 0.5f);
  104. auto& player_analogs = player.analogs[i];
  105. player_analogs = ReadStringSetting(
  106. std::string(player_prefix).append(Settings::NativeAnalog::mapping[i]), default_param);
  107. if (player_analogs.empty()) {
  108. player_analogs = default_param;
  109. }
  110. }
  111. for (int i = 0; i < Settings::NativeMotion::NumMotions; ++i) {
  112. const std::string default_param = InputCommon::GenerateKeyboardParam(default_motions[i]);
  113. auto& player_motions = player.motions[i];
  114. player_motions = ReadStringSetting(
  115. std::string(player_prefix).append(Settings::NativeMotion::mapping[i]), default_param);
  116. if (player_motions.empty()) {
  117. player_motions = default_param;
  118. }
  119. }
  120. }
  121. void SdlConfig::ReadDebugControlValues() {
  122. for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
  123. const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]);
  124. auto& debug_pad_buttons = Settings::values.debug_pad_buttons[i];
  125. debug_pad_buttons = ReadStringSetting(
  126. std::string("debug_pad_").append(Settings::NativeButton::mapping[i]), default_param);
  127. if (debug_pad_buttons.empty()) {
  128. debug_pad_buttons = default_param;
  129. }
  130. }
  131. for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {
  132. const std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
  133. default_analogs[i][0], default_analogs[i][1], default_analogs[i][2],
  134. default_analogs[i][3], default_stick_mod[i], 0.5f);
  135. auto& debug_pad_analogs = Settings::values.debug_pad_analogs[i];
  136. debug_pad_analogs = ReadStringSetting(
  137. std::string("debug_pad_").append(Settings::NativeAnalog::mapping[i]), default_param);
  138. if (debug_pad_analogs.empty()) {
  139. debug_pad_analogs = default_param;
  140. }
  141. }
  142. }
  143. void SdlConfig::ReadHidbusValues() {
  144. const std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
  145. 0, 0, default_ringcon_analogs[0], default_ringcon_analogs[1], 0, 0.05f);
  146. auto& ringcon_analogs = Settings::values.ringcon_analogs;
  147. ringcon_analogs = ReadStringSetting(std::string("ring_controller"), default_param);
  148. if (ringcon_analogs.empty()) {
  149. ringcon_analogs = default_param;
  150. }
  151. }
  152. void SdlConfig::SaveSdlValues() {
  153. SaveSdlControlValues();
  154. WriteToIni();
  155. }
  156. void SdlConfig::SaveSdlControlValues() {
  157. BeginGroup(Settings::TranslateCategory(Settings::Category::Controls));
  158. Settings::values.players.SetGlobal(!IsCustomConfig());
  159. for (std::size_t p = 0; p < Settings::values.players.GetValue().size(); ++p) {
  160. SaveSdlPlayerValues(p);
  161. }
  162. if (IsCustomConfig()) {
  163. EndGroup();
  164. return;
  165. }
  166. SaveDebugControlValues();
  167. SaveHidbusValues();
  168. EndGroup();
  169. }
  170. void SdlConfig::SaveSdlPlayerValues(const std::size_t player_index) {
  171. std::string player_prefix;
  172. if (type != ConfigType::InputProfile) {
  173. player_prefix = std::string("player_").append(ToString(player_index)).append("_");
  174. }
  175. const auto& player = Settings::values.players.GetValue()[player_index];
  176. if (IsCustomConfig() && player.profile_name.empty()) {
  177. // No custom profile selected
  178. return;
  179. }
  180. for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
  181. const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]);
  182. WriteStringSetting(std::string(player_prefix).append(Settings::NativeButton::mapping[i]),
  183. player.buttons[i], std::make_optional(default_param));
  184. }
  185. for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {
  186. const std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
  187. default_analogs[i][0], default_analogs[i][1], default_analogs[i][2],
  188. default_analogs[i][3], default_stick_mod[i], 0.5f);
  189. WriteStringSetting(std::string(player_prefix).append(Settings::NativeAnalog::mapping[i]),
  190. player.analogs[i], std::make_optional(default_param));
  191. }
  192. for (int i = 0; i < Settings::NativeMotion::NumMotions; ++i) {
  193. const std::string default_param = InputCommon::GenerateKeyboardParam(default_motions[i]);
  194. WriteStringSetting(std::string(player_prefix).append(Settings::NativeMotion::mapping[i]),
  195. player.motions[i], std::make_optional(default_param));
  196. }
  197. }
  198. void SdlConfig::SaveDebugControlValues() {
  199. for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
  200. const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]);
  201. WriteStringSetting(std::string("debug_pad_").append(Settings::NativeButton::mapping[i]),
  202. Settings::values.debug_pad_buttons[i],
  203. std::make_optional(default_param));
  204. }
  205. for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {
  206. const std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
  207. default_analogs[i][0], default_analogs[i][1], default_analogs[i][2],
  208. default_analogs[i][3], default_stick_mod[i], 0.5f);
  209. WriteStringSetting(std::string("debug_pad_").append(Settings::NativeAnalog::mapping[i]),
  210. Settings::values.debug_pad_analogs[i],
  211. std::make_optional(default_param));
  212. }
  213. }
  214. void SdlConfig::SaveHidbusValues() {
  215. const std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
  216. 0, 0, default_ringcon_analogs[0], default_ringcon_analogs[1], 0, 0.05f);
  217. WriteStringSetting(std::string("ring_controller"), Settings::values.ringcon_analogs,
  218. std::make_optional(default_param));
  219. }
  220. std::vector<Settings::BasicSetting*>& SdlConfig::FindRelevantList(Settings::Category category) {
  221. return Settings::values.linkage.by_category[category];
  222. }