| 
									
										
										
										
											2015-05-24 06:55:12 +02:00
										 |  |  | // Copyright 2010 Dolphin Emulator Project
 | 
					
						
							| 
									
										
										
										
											2015-05-18 01:08:10 +02:00
										 |  |  | // Licensed under GPLv2+
 | 
					
						
							| 
									
										
										
										
											2013-04-17 23:09:55 -04:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							| 
									
										
										
										
											2010-06-03 18:05:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-25 22:28:15 -04:00
										 |  |  | #include <vector>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "Common/FileUtil.h"
 | 
					
						
							|  |  |  | #include "Common/IniFile.h"
 | 
					
						
							| 
									
										
										
										
											2016-10-07 22:55:13 +02:00
										 |  |  | #include "Common/MsgHandler.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "Core/ConfigManager.h"
 | 
					
						
							|  |  |  | #include "Core/HW/Wiimote.h"
 | 
					
						
							| 
									
										
										
										
											2017-01-29 22:32:04 -05:00
										 |  |  | #include "InputCommon/ControllerEmu/ControllerEmu.h"
 | 
					
						
							| 
									
										
										
										
											2015-10-25 22:28:15 -04:00
										 |  |  | #include "InputCommon/ControllerInterface/ControllerInterface.h"
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | #include "InputCommon/InputConfig.h"
 | 
					
						
							| 
									
										
										
										
											2010-06-04 20:03:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-31 00:04:15 -04:00
										 |  |  | bool InputConfig::LoadConfig(bool isGC) | 
					
						
							| 
									
										
										
										
											2010-06-03 18:05:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   IniFile inifile; | 
					
						
							|  |  |  |   bool useProfile[MAX_BBMOTES] = {false, false, false, false, false}; | 
					
						
							|  |  |  |   std::string num[MAX_BBMOTES] = {"1", "2", "3", "4", "BB"}; | 
					
						
							|  |  |  |   std::string profile[MAX_BBMOTES]; | 
					
						
							|  |  |  |   std::string path; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-29 14:42:43 +02:00
										 |  |  |   if (SConfig::GetInstance().GetGameID() != "00000000") | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   { | 
					
						
							|  |  |  |     std::string type; | 
					
						
							|  |  |  |     if (isGC) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       type = "Pad"; | 
					
						
							|  |  |  |       path = "Profiles/GCPad/"; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       type = "Wiimote"; | 
					
						
							|  |  |  |       path = "Profiles/Wiimote/"; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     IniFile game_ini = SConfig::GetInstance().LoadGameIni(); | 
					
						
							|  |  |  |     IniFile::Section* control_section = game_ini.GetOrCreateSection("Controls"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (int i = 0; i < 4; i++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       if (control_section->Exists(type + "Profile" + num[i])) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         if (control_section->Get(type + "Profile" + num[i], &profile[i])) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           if (File::Exists(File::GetUserPath(D_CONFIG_IDX) + path + profile[i] + ".ini")) | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             useProfile[i] = true; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           else | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             // TODO: PanicAlert shouldn't be used for this.
 | 
					
						
							|  |  |  |             PanicAlertT("Selected controller profile does not exist"); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (inifile.Load(File::GetUserPath(D_CONFIG_IDX) + m_ini_name + ".ini")) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     int n = 0; | 
					
						
							|  |  |  |     for (auto& controller : m_controllers) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       // Load settings from ini
 | 
					
						
							|  |  |  |       if (useProfile[n]) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         IniFile profile_ini; | 
					
						
							|  |  |  |         profile_ini.Load(File::GetUserPath(D_CONFIG_IDX) + path + profile[n] + ".ini"); | 
					
						
							|  |  |  |         controller->LoadConfig(profile_ini.GetOrCreateSection("Profile")); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         controller->LoadConfig(inifile.GetOrCreateSection(controller->GetName())); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Update refs
 | 
					
						
							|  |  |  |       controller->UpdateReferences(g_controller_interface); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Next profile
 | 
					
						
							|  |  |  |       n++; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     m_controllers[0]->LoadDefaults(g_controller_interface); | 
					
						
							|  |  |  |     m_controllers[0]->UpdateReferences(g_controller_interface); | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-06-03 18:05:08 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-31 00:04:15 -04:00
										 |  |  | void InputConfig::SaveConfig() | 
					
						
							| 
									
										
										
										
											2010-06-03 18:05:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   std::string ini_filename = File::GetUserPath(D_CONFIG_IDX) + m_ini_name + ".ini"; | 
					
						
							| 
									
										
										
										
											2010-06-04 20:03:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   IniFile inifile; | 
					
						
							|  |  |  |   inifile.Load(ini_filename); | 
					
						
							| 
									
										
										
										
											2010-06-03 18:05:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   for (auto& controller : m_controllers) | 
					
						
							|  |  |  |     controller->SaveConfig(inifile.GetOrCreateSection(controller->GetName())); | 
					
						
							| 
									
										
										
										
											2013-09-07 23:02:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   inifile.Save(ini_filename); | 
					
						
							| 
									
										
										
										
											2010-06-03 18:05:08 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-10-25 22:28:15 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | ControllerEmu* InputConfig::GetController(int index) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   return m_controllers.at(index).get(); | 
					
						
							| 
									
										
										
										
											2015-10-25 22:28:15 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void InputConfig::ClearControllers() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   m_controllers.clear(); | 
					
						
							| 
									
										
										
										
											2015-10-25 22:28:15 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool InputConfig::ControllersNeedToBeCreated() const | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   return m_controllers.empty(); | 
					
						
							| 
									
										
										
										
											2015-10-25 22:28:15 -04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-06-22 01:33:53 +12:00
										 |  |  | 
 | 
					
						
							|  |  |  | bool InputConfig::IsControllerControlledByGamepadDevice(int index) const | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   if (static_cast<size_t>(index) >= m_controllers.size()) | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const auto& controller = m_controllers.at(index).get()->default_device; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Filter out anything which obviously not a gamepad
 | 
					
						
							| 
									
										
										
										
											2016-08-08 09:38:22 -07:00
										 |  |  |   return !((controller.source == "Keyboard")    // OSX IOKit Keyboard/Mouse
 | 
					
						
							|  |  |  |            || (controller.source == "Quartz")   // OSX Quartz Keyboard/Mouse
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |            || (controller.source == "XInput2")  // Linux and BSD Keyboard/Mouse
 | 
					
						
							|  |  |  |            || (controller.source == "Android" && | 
					
						
							|  |  |  |                controller.name == "Touchscreen")  // Android Touchscreen
 | 
					
						
							|  |  |  |            || (controller.source == "DInput" && | 
					
						
							|  |  |  |                controller.name == "Keyboard Mouse"));  // Windows Keyboard/Mouse
 | 
					
						
							| 
									
										
										
										
											2016-06-22 01:33:53 +12:00
										 |  |  | } |