sdl_config.cpp 9.5 KB

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