| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | //////////////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  |  | // Project description
 | 
					
						
							|  |  |  |  | // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | // Name: nJoy 
 | 
					
						
							|  |  |  |  | // Description: A Dolphin Compatible Input Plugin
 | 
					
						
							|  |  |  |  | //
 | 
					
						
							|  |  |  |  | // Author: Falcon4ever (nJoy@falcon4ever.com)
 | 
					
						
							|  |  |  |  | // Site: www.multigesture.net
 | 
					
						
							|  |  |  |  | // Copyright (C) 2003-2008 Dolphin Project.
 | 
					
						
							|  |  |  |  | //
 | 
					
						
							|  |  |  |  | //////////////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  |  | //
 | 
					
						
							|  |  |  |  | // Licensetype: GNU General Public License (GPL)
 | 
					
						
							|  |  |  |  | //
 | 
					
						
							|  |  |  |  | // This program is free software: you can redistribute it and/or modify
 | 
					
						
							|  |  |  |  | // it under the terms of the GNU General Public License as published by
 | 
					
						
							|  |  |  |  | // the Free Software Foundation, version 2.0.
 | 
					
						
							|  |  |  |  | //
 | 
					
						
							|  |  |  |  | // This program is distributed in the hope that it will be useful,
 | 
					
						
							|  |  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					
						
							|  |  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					
						
							|  |  |  |  | // GNU General Public License 2.0 for more details.
 | 
					
						
							|  |  |  |  | //
 | 
					
						
							|  |  |  |  | // A copy of the GPL 2.0 should have been included with the program.
 | 
					
						
							|  |  |  |  | // If not, see http://www.gnu.org/licenses/
 | 
					
						
							|  |  |  |  | //
 | 
					
						
							|  |  |  |  | // Official SVN repository and contact information can be found at
 | 
					
						
							|  |  |  |  | // http://code.google.com/p/dolphin-emu/
 | 
					
						
							|  |  |  |  | //
 | 
					
						
							|  |  |  |  | //////////////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | //////////////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  |  | // Include
 | 
					
						
							|  |  |  |  | // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | #include "math.h" // System
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #include "ConfigBox.h" // Local
 | 
					
						
							|  |  |  |  | #include "../nJoy.h"
 | 
					
						
							|  |  |  |  | #include "Images/controller.xpm"
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | extern bool emulator_running; | 
					
						
							|  |  |  |  | ////////////////////////
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // Set dialog items from saved values
 | 
					
						
							|  |  |  |  | // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | void ConfigBox::UpdateGUIKeys(int controller) | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | {	 | 
					
						
							|  |  |  |  | 	// http://wiki.wxwidgets.org/Converting_everything_to_and_from_wxString
 | 
					
						
							|  |  |  |  | 	wxString tmp; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 	// Update selected gamepad
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 	m_Joyname[controller]->SetSelection(PadMapping[controller].ID); | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 	// Update the enabled checkbox
 | 
					
						
							| 
									
										
										
										
											2009-01-24 00:45:46 +00:00
										 |  |  |  | 	m_Joyattach[controller]->SetValue(PadMapping[controller].enabled == 1 ? true : false); | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 	tmp << PadMapping[controller].buttons[CTL_L_SHOULDER]; m_JoyShoulderL[controller]->SetValue(tmp); tmp.clear(); | 
					
						
							|  |  |  |  | 	tmp << PadMapping[controller].buttons[CTL_R_SHOULDER]; m_JoyShoulderR[controller]->SetValue(tmp); tmp.clear(); | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 	tmp << PadMapping[controller].buttons[CTL_A_BUTTON]; m_JoyButtonA[controller]->SetValue(tmp); tmp.clear(); | 
					
						
							|  |  |  |  | 	tmp << PadMapping[controller].buttons[CTL_B_BUTTON]; m_JoyButtonB[controller]->SetValue(tmp); tmp.clear(); | 
					
						
							|  |  |  |  | 	tmp << PadMapping[controller].buttons[CTL_X_BUTTON]; m_JoyButtonX[controller]->SetValue(tmp); tmp.clear(); | 
					
						
							|  |  |  |  | 	tmp << PadMapping[controller].buttons[CTL_Y_BUTTON]; m_JoyButtonY[controller]->SetValue(tmp); tmp.clear(); | 
					
						
							|  |  |  |  | 	tmp << PadMapping[controller].buttons[CTL_Z_TRIGGER]; m_JoyButtonZ[controller]->SetValue(tmp); tmp.clear(); | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 	tmp << PadMapping[controller].buttons[CTL_START]; m_JoyButtonStart[controller]->SetValue(tmp); tmp.clear(); | 
					
						
							|  |  |  |  | 	tmp << PadMapping[controller].halfpress; m_JoyButtonHalfpress[controller]->SetValue(tmp); tmp.clear(); | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 	tmp << PadMapping[controller].axis[CTL_MAIN_X]; m_JoyAnalogMainX[controller]->SetValue(tmp); tmp.clear(); | 
					
						
							|  |  |  |  | 	tmp << PadMapping[controller].axis[CTL_MAIN_Y]; m_JoyAnalogMainY[controller]->SetValue(tmp); tmp.clear(); | 
					
						
							|  |  |  |  | 	tmp << PadMapping[controller].axis[CTL_SUB_X]; m_JoyAnalogSubX[controller]->SetValue(tmp); tmp.clear(); | 
					
						
							|  |  |  |  | 	tmp << PadMapping[controller].axis[CTL_SUB_Y]; m_JoyAnalogSubY[controller]->SetValue(tmp); tmp.clear(); | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-01-19 05:49:25 +00:00
										 |  |  |  | 	// Update the deadzone and controller type controls
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 	m_ControlType[controller]->SetSelection(PadMapping[controller].controllertype); | 
					
						
							|  |  |  |  | 	m_TriggerType[controller]->SetSelection(PadMapping[controller].triggertype); | 
					
						
							|  |  |  |  | 	m_Deadzone[controller]->SetSelection(PadMapping[controller].deadzone); | 
					
						
							|  |  |  |  | 	m_CoBDiagonal[controller]->SetValue(wxString::FromAscii(PadMapping[controller].SDiagonal.c_str())); | 
					
						
							|  |  |  |  | 	m_CBS_to_C[controller]->SetValue(PadMapping[controller].bSquareToCircle); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-02 03:16:59 +00:00
										 |  |  |  | 	//LogMsg("m_TriggerType[%i] = %i\n", controller, PadMapping[controller].triggertype);
 | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 	// Update D-Pad
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 	if(PadMapping[controller].controllertype == CTL_DPAD_HAT) | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 		tmp << PadMapping[controller].dpad; m_JoyDpadUp[controller]->SetValue(tmp); tmp.clear();		 | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | 	else | 
					
						
							|  |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 		tmp << PadMapping[controller].dpad2[CTL_D_PAD_UP]; m_JoyDpadUp[controller]->SetValue(tmp); tmp.clear(); | 
					
						
							|  |  |  |  | 		tmp << PadMapping[controller].dpad2[CTL_D_PAD_DOWN]; m_JoyDpadDown[controller]->SetValue(tmp); tmp.clear(); | 
					
						
							|  |  |  |  | 		tmp << PadMapping[controller].dpad2[CTL_D_PAD_LEFT]; m_JoyDpadLeft[controller]->SetValue(tmp); tmp.clear(); | 
					
						
							|  |  |  |  | 		tmp << PadMapping[controller].dpad2[CTL_D_PAD_RIGHT]; m_JoyDpadRight[controller]->SetValue(tmp); tmp.clear(); | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-01-25 18:20:16 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 	// Replace "-1" with "" in the GUI controls
 | 
					
						
							|  |  |  |  | 	//if(ControlsCreated) ToBlank();
 | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | /* Populate the PadMapping array with the dialog items settings (for example
 | 
					
						
							|  |  |  |  |    selected joystick, enabled or disabled status and so on) */ | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | void ConfigBox::SaveButtonMapping(int controller, bool DontChangeId, int FromSlot) | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 	// Temporary storage
 | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 	wxString tmp; | 
					
						
							|  |  |  |  | 	long value; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 	// Save from or to the same or different slots
 | 
					
						
							|  |  |  |  | 	if (FromSlot == -1) FromSlot = controller; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-25 18:20:16 +00:00
										 |  |  |  | 	// Replace "" with "-1" in the GUI controls
 | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 	ToBlank(false); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	// Set enabled or disable status and other settings
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 	if(!DontChangeId) PadMapping[controller].ID = m_Joyname[FromSlot]->GetSelection(); | 
					
						
							|  |  |  |  | 	if(FromSlot == controller) PadMapping[controller].enabled = m_Joyattach[FromSlot]->GetValue(); // Only enable one
 | 
					
						
							|  |  |  |  | 	PadMapping[controller].controllertype = m_ControlType[FromSlot]->GetSelection(); | 
					
						
							|  |  |  |  | 	PadMapping[controller].triggertype = m_TriggerType[FromSlot]->GetSelection(); | 
					
						
							|  |  |  |  | 	PadMapping[controller].deadzone = m_Deadzone[FromSlot]->GetSelection(); | 
					
						
							|  |  |  |  | 	PadMapping[controller].SDiagonal = m_CoBDiagonal[FromSlot]->GetLabel().mb_str(); | 
					
						
							|  |  |  |  | 	PadMapping[controller].bSquareToCircle = m_CBS_to_C[FromSlot]->IsChecked();	 | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 	// The analog buttons
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 	m_JoyAnalogMainX[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].axis[CTL_MAIN_X] = value; tmp.clear(); | 
					
						
							|  |  |  |  | 	m_JoyAnalogMainY[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].axis[CTL_MAIN_Y] = value; tmp.clear(); | 
					
						
							|  |  |  |  | 	m_JoyAnalogSubX[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].axis[CTL_SUB_X] = value; tmp.clear(); | 
					
						
							|  |  |  |  | 	m_JoyAnalogSubY[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].axis[CTL_SUB_Y] = value; tmp.clear(); | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 	// The shoulder buttons
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 	m_JoyShoulderL[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].buttons[CTL_L_SHOULDER] = value; | 
					
						
							|  |  |  |  | 	m_JoyShoulderR[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].buttons[CTL_R_SHOULDER] = value;			 | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 	// The digital buttons
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 	m_JoyButtonA[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].buttons[CTL_A_BUTTON] = value; tmp.clear(); | 
					
						
							|  |  |  |  | 	m_JoyButtonB[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].buttons[CTL_B_BUTTON] = value; tmp.clear(); | 
					
						
							|  |  |  |  | 	m_JoyButtonX[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].buttons[CTL_X_BUTTON] = value; tmp.clear(); | 
					
						
							|  |  |  |  | 	m_JoyButtonY[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].buttons[CTL_Y_BUTTON] = value; tmp.clear(); | 
					
						
							|  |  |  |  | 	m_JoyButtonZ[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].buttons[CTL_Z_TRIGGER] = value; tmp.clear(); | 
					
						
							|  |  |  |  | 	m_JoyButtonStart[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].buttons[CTL_START] = value; tmp.clear(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-02 03:16:59 +00:00
										 |  |  |  | 	//LogMsg("PadMapping[%i].triggertype = %i, m_TriggerType[%i]->GetSelection() = %i\n",
 | 
					
						
							|  |  |  |  | 	//	controller, PadMapping[controller].triggertype, FromSlot, m_TriggerType[FromSlot]->GetSelection());
 | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 	// The halfpress button
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 	m_JoyButtonHalfpress[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].halfpress = value; tmp.clear(); | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 	// The digital pad
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 	if(PadMapping[controller].controllertype == CTL_DPAD_HAT) | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 		m_JoyDpadUp[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].dpad = value; tmp.clear(); | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | 	else | 
					
						
							|  |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 		m_JoyDpadUp[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].dpad2[CTL_D_PAD_UP] = value; tmp.clear(); | 
					
						
							|  |  |  |  | 		m_JoyDpadDown[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].dpad2[CTL_D_PAD_DOWN] = value; tmp.clear(); | 
					
						
							|  |  |  |  | 		m_JoyDpadLeft[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].dpad2[CTL_D_PAD_LEFT] = value; tmp.clear(); | 
					
						
							|  |  |  |  | 		m_JoyDpadRight[FromSlot]->GetValue().ToLong(&value); PadMapping[controller].dpad2[CTL_D_PAD_RIGHT] = value; tmp.clear();		 | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 	// Replace "-1" with "" 
 | 
					
						
							|  |  |  |  | 	ToBlank(); | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | // Update the textbox for the buttons
 | 
					
						
							|  |  |  |  | // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2009-01-25 18:20:16 +00:00
										 |  |  |  | void ConfigBox::SetButtonText(int id, char text[128], int Page) | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-01-25 18:20:16 +00:00
										 |  |  |  | 	// Set controller value
 | 
					
						
							|  |  |  |  | 	int controller;	 | 
					
						
							|  |  |  |  | 	if (Page == -1) controller = notebookpage; else controller = Page; | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 	switch(id) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 		case IDB_DPAD_RIGHT: m_JoyDpadRight[controller]->SetValue(wxString::FromAscii(text)); break; | 
					
						
							|  |  |  |  | 		case IDB_DPAD_UP: m_JoyDpadUp[controller]->SetValue(wxString::FromAscii(text)); break; | 
					
						
							|  |  |  |  | 		case IDB_DPAD_DOWN: m_JoyDpadDown[controller]->SetValue(wxString::FromAscii(text)); break; | 
					
						
							|  |  |  |  | 		case IDB_DPAD_LEFT: m_JoyDpadLeft[controller]->SetValue(wxString::FromAscii(text));	break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		case IDB_ANALOG_MAIN_X: m_JoyAnalogMainX[controller]->SetValue(wxString::FromAscii(text)); break; | 
					
						
							|  |  |  |  | 		case IDB_ANALOG_MAIN_Y: m_JoyAnalogMainY[controller]->SetValue(wxString::FromAscii(text)); break; | 
					
						
							|  |  |  |  | 		case IDB_ANALOG_SUB_X: m_JoyAnalogSubX[controller]->SetValue(wxString::FromAscii(text)); break; | 
					
						
							|  |  |  |  | 		case IDB_ANALOG_SUB_Y: m_JoyAnalogSubY[controller]->SetValue(wxString::FromAscii(text)); break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		case IDB_SHOULDER_L: m_JoyShoulderL[controller]->SetValue(wxString::FromAscii(text)); break; | 
					
						
							|  |  |  |  | 		case IDB_SHOULDER_R: m_JoyShoulderR[controller]->SetValue(wxString::FromAscii(text)); break; | 
					
						
							|  |  |  |  | 		 | 
					
						
							|  |  |  |  | 		case IDB_BUTTON_A: m_JoyButtonA[controller]->SetValue(wxString::FromAscii(text)); break;		 | 
					
						
							|  |  |  |  | 		case IDB_BUTTON_B: m_JoyButtonB[controller]->SetValue(wxString::FromAscii(text)); break; | 
					
						
							|  |  |  |  | 		case IDB_BUTTON_X: m_JoyButtonX[controller]->SetValue(wxString::FromAscii(text)); break; | 
					
						
							|  |  |  |  | 		case IDB_BUTTON_Y: m_JoyButtonY[controller]->SetValue(wxString::FromAscii(text)); break; | 
					
						
							|  |  |  |  | 		case IDB_BUTTON_Z: m_JoyButtonZ[controller]->SetValue(wxString::FromAscii(text)); break; | 
					
						
							|  |  |  |  | 		case IDB_BUTTONSTART: m_JoyButtonStart[controller]->SetValue(wxString::FromAscii(text)); break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		case IDB_BUTTONHALFPRESS: m_JoyButtonHalfpress[controller]->SetValue(wxString::FromAscii(text)); break; | 
					
						
							|  |  |  |  | 		default: break; | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // Get the text in the textbox for the buttons
 | 
					
						
							|  |  |  |  | // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2009-01-25 18:20:16 +00:00
										 |  |  |  | wxString ConfigBox::GetButtonText(int id, int Page) | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-01-25 18:20:16 +00:00
										 |  |  |  | 	// Set controller value
 | 
					
						
							|  |  |  |  | 	int controller;	 | 
					
						
							|  |  |  |  | 	if (Page == -1) controller = notebookpage; else controller = Page; | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 	switch(id) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-01-24 00:45:46 +00:00
										 |  |  |  | 		// D-Pad
 | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 		case IDB_DPAD_RIGHT: return m_JoyDpadRight[controller]->GetValue(); | 
					
						
							| 
									
										
										
										
											2009-01-24 00:45:46 +00:00
										 |  |  |  | 		case IDB_DPAD_UP: return m_JoyDpadUp[controller]->GetValue(); | 
					
						
							|  |  |  |  | 		case IDB_DPAD_DOWN: return m_JoyDpadDown[controller]->GetValue(); | 
					
						
							|  |  |  |  | 		case IDB_DPAD_LEFT: return m_JoyDpadLeft[controller]->GetValue(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// Analog Stick
 | 
					
						
							|  |  |  |  | 		case IDB_ANALOG_MAIN_X: return m_JoyAnalogMainX[controller]->GetValue(); | 
					
						
							|  |  |  |  | 		case IDB_ANALOG_MAIN_Y: return m_JoyAnalogMainY[controller]->GetValue(); | 
					
						
							|  |  |  |  | 		case IDB_ANALOG_SUB_X: return m_JoyAnalogSubX[controller]->GetValue(); | 
					
						
							|  |  |  |  | 		case IDB_ANALOG_SUB_Y: return m_JoyAnalogSubY[controller]->GetValue(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// Shoulder Buttons
 | 
					
						
							|  |  |  |  | 		case IDB_SHOULDER_L: return m_JoyShoulderL[controller]->GetValue(); | 
					
						
							|  |  |  |  | 		case IDB_SHOULDER_R: return m_JoyShoulderR[controller]->GetValue(); | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2009-01-24 00:45:46 +00:00
										 |  |  |  | 		// Buttons
 | 
					
						
							|  |  |  |  | 		case IDB_BUTTON_A: return m_JoyButtonA[controller]->GetValue();		 | 
					
						
							|  |  |  |  | 		case IDB_BUTTON_B: return m_JoyButtonB[controller]->GetValue(); | 
					
						
							|  |  |  |  | 		case IDB_BUTTON_X: return m_JoyButtonX[controller]->GetValue(); | 
					
						
							|  |  |  |  | 		case IDB_BUTTON_Y: return m_JoyButtonY[controller]->GetValue(); | 
					
						
							|  |  |  |  | 		case IDB_BUTTON_Z: return m_JoyButtonZ[controller]->GetValue(); | 
					
						
							|  |  |  |  | 		case IDB_BUTTONSTART: return m_JoyButtonStart[controller]->GetValue(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		case IDB_BUTTONHALFPRESS: return m_JoyButtonHalfpress[controller]->GetValue(); | 
					
						
							| 
									
										
										
										
											2009-01-24 22:24:44 +00:00
										 |  |  |  | 		default: return wxString(); | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-19 05:49:25 +00:00
										 |  |  |  | //////////////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | // Configure button mapping
 | 
					
						
							| 
									
										
										
										
											2009-01-19 05:49:25 +00:00
										 |  |  |  | // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // Avoid extreme axis values
 | 
					
						
							|  |  |  |  | // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | /* Function: We have to avoid very big values to becuse some triggers are -0x8000 in the
 | 
					
						
							|  |  |  |  |    unpressed state (and then go from -0x8000 to 0x8000 as they are fully pressed) */ | 
					
						
							|  |  |  |  | bool AvoidValues(int value) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	// Avoid detecting very small or very big (for triggers) values
 | 
					
						
							| 
									
										
										
										
											2009-01-20 05:28:30 +00:00
										 |  |  |  | 	if(    (value > -0x2000 && value < 0x2000) // Small values
 | 
					
						
							|  |  |  |  | 		|| (value < -0x6000 || value > 0x6000)) // Big values
 | 
					
						
							| 
									
										
										
										
											2009-01-19 05:49:25 +00:00
										 |  |  |  | 		return true; // Avoid
 | 
					
						
							|  |  |  |  | 	else | 
					
						
							|  |  |  |  | 		return false; // Keep
 | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | // Wait for button press
 | 
					
						
							|  |  |  |  | // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | /* Loop or timer: There are basically two ways to do this. With a while() or for() loop, or with a
 | 
					
						
							|  |  |  |  |    timer. The downside with the while() or for() loop is that there is no way to stop it if the user | 
					
						
							|  |  |  |  |    should select to configure another button while we are still in an old loop. What will happen then | 
					
						
							|  |  |  |  |    is that we start another parallel loop (at least in Windows) that blocks the old loop. And our only | 
					
						
							|  |  |  |  |    option to wait for the old loop to finish is with a new loop, and that will block the old loop for as | 
					
						
							|  |  |  |  |    long as it's going on. Therefore a timer is easier to control. */ | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | void ConfigBox::GetButtons(wxCommandEvent& event) | 
					
						
							|  |  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 	DoGetButtons(event.GetId()); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | void ConfigBox::DoGetButtons(int GetId) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	// =============================================
 | 
					
						
							|  |  |  |  | 	// Collect the starting values
 | 
					
						
							|  |  |  |  | 	// ----------------
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 	// Get the current controller	
 | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 	int Controller = notebookpage; | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 14:25:33 +00:00
										 |  |  |  | 	// Get the controller and trigger type
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 	int ControllerType = PadMapping[Controller].controllertype; | 
					
						
							|  |  |  |  | 	int TriggerType = PadMapping[Controller].triggertype; | 
					
						
							| 
									
										
										
										
											2009-01-20 14:25:33 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-19 05:49:25 +00:00
										 |  |  |  | 	// Collect the accepted buttons for this slot
 | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 	bool LeftRight = (GetId == IDB_SHOULDER_L || GetId == IDB_SHOULDER_R); | 
					
						
							| 
									
										
										
										
											2009-01-20 14:41:58 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 14:25:33 +00:00
										 |  |  |  | 	bool Axis = (GetId >= IDB_ANALOG_MAIN_X && GetId <= IDB_SHOULDER_R) | 
					
						
							| 
									
										
										
										
											2009-01-20 14:41:58 +00:00
										 |  |  |  | 			   && !(TriggerType == CTL_TRIGGER_XINPUT && (GetId == IDB_SHOULDER_L || GetId == IDB_SHOULDER_R) ); // Don't allow SDL here
 | 
					
						
							|  |  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-01-20 14:25:33 +00:00
										 |  |  |  | 	bool XInput = (TriggerType == CTL_TRIGGER_XINPUT); | 
					
						
							| 
									
										
										
										
											2009-01-20 14:41:58 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 	bool Button = (GetId >= IDB_BUTTON_A && GetId <= IDB_BUTTONHALFPRESS) // All digital buttons
 | 
					
						
							|  |  |  |  | 			   || (GetId == IDB_SHOULDER_L || GetId == IDB_SHOULDER_R) // both shoulder buttons
 | 
					
						
							|  |  |  |  | 			   || (GetId >= IDB_DPAD_UP && GetId <= IDB_DPAD_RIGHT && ControllerType == CTL_DPAD_CUSTOM); // Or the custom hat mode
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	bool Hat = (GetId >= IDB_DPAD_UP && GetId <= IDB_DPAD_RIGHT) // All DPads
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 			   && (PadMapping[Controller].controllertype == CTL_DPAD_HAT); // Not with the hat option defined
 | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 	/* Open a new joystick. Joysticks[controller].GetId is the system GetId of the physical joystick
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 	   that is mapped to controller, for example 0, 1, 2, 3 for the first four PadMapping */ | 
					
						
							|  |  |  |  | 	SDL_Joystick *joy = SDL_JoystickOpen(PadMapping[Controller].ID); | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-19 05:49:25 +00:00
										 |  |  |  | 	 // Get the number of axes, hats and buttons
 | 
					
						
							|  |  |  |  | 	int buttons = SDL_JoystickNumButtons(joy); | 
					
						
							|  |  |  |  | 	int axes = SDL_JoystickNumAxes(joy); | 
					
						
							|  |  |  |  | 	int hats = SDL_JoystickNumHats(joy);	 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 	// Declare values
 | 
					
						
							|  |  |  |  | 	char format[128]; | 
					
						
							| 
									
										
										
										
											2009-01-19 05:49:25 +00:00
										 |  |  |  | 	int value; // Axis value
 | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 	int type; // Button type
 | 
					
						
							|  |  |  |  | 	bool Succeed = false; | 
					
						
							|  |  |  |  | 	bool Stop = false; // Stop the timer
 | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 	int pressed = 0; | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 	int Seconds = 4; // Seconds to wait for
 | 
					
						
							|  |  |  |  | 	int TimesPerSecond = 40; // How often to run the check
 | 
					
						
							|  |  |  |  | 	// =======================
 | 
					
						
							| 
									
										
										
										
											2009-01-19 05:49:25 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 	//Console::Print("Before (%i) Id:%i %i  IsRunning:%i\n",
 | 
					
						
							|  |  |  |  | 	//	GetButtonWaitingTimer, GetButtonWaitingID, GetId, m_ButtonMappingTimer->IsRunning());
 | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 	// If the Id has changed or the timer is not running we should start one
 | 
					
						
							|  |  |  |  | 	if( GetButtonWaitingID != GetId || !m_ButtonMappingTimer->IsRunning() ) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		if(m_ButtonMappingTimer->IsRunning()) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			m_ButtonMappingTimer->Stop(); | 
					
						
							|  |  |  |  | 			GetButtonWaitingTimer = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			// Update the old textbox
 | 
					
						
							|  |  |  |  | 			SetButtonText(GetButtonWaitingID, ""); | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		 // Save the button Id
 | 
					
						
							|  |  |  |  | 		GetButtonWaitingID = GetId; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// Reset the key in case we happen to have an old one
 | 
					
						
							|  |  |  |  | 		g_Pressed = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// Update the text box
 | 
					
						
							|  |  |  |  | 		sprintf(format, "[%d]", Seconds); | 
					
						
							|  |  |  |  | 		SetButtonText(GetId, format); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// Start the timer
 | 
					
						
							|  |  |  |  | 		#if wxUSE_TIMER
 | 
					
						
							|  |  |  |  | 			m_ButtonMappingTimer->Start( floor((double)(1000 / TimesPerSecond)) ); | 
					
						
							|  |  |  |  | 		#endif
 | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 	// ===============================================
 | 
					
						
							|  |  |  |  | 	// Check for buttons
 | 
					
						
							|  |  |  |  | 	// ----------------
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 	// If there is a timer but we should not create a new one
 | 
					
						
							|  |  |  |  | 	else | 
					
						
							| 
									
										
										
										
											2009-01-19 05:49:25 +00:00
										 |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		// Update the internal status
 | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 		SDL_JoystickUpdate(); | 
					
						
							| 
									
										
										
										
											2009-01-19 05:49:25 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// For the triggers we accept both a digital or an analog button
 | 
					
						
							|  |  |  |  | 		if(Axis) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			for(int i = 0; i < axes; i++) | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2009-01-19 05:49:25 +00:00
										 |  |  |  | 				value = SDL_JoystickGetAxis(joy, i); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 				if(AvoidValues(value)) continue; // Avoid values
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 				pressed = i + (LeftRight ? 1000 : 0); // Identify the analog triggers
 | 
					
						
							|  |  |  |  | 				type = CTL_AXIS; | 
					
						
							|  |  |  |  | 				Succeed = true; | 
					
						
							| 
									
										
										
										
											2009-01-19 05:49:25 +00:00
										 |  |  |  | 			} | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// Check for a hat
 | 
					
						
							|  |  |  |  | 		if(Hat) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			for(int i = 0; i < hats; i++) | 
					
						
							|  |  |  |  | 			{	 | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 				if(SDL_JoystickGetHat(joy, i)) | 
					
						
							| 
									
										
										
										
											2009-01-19 05:49:25 +00:00
										 |  |  |  | 				{ | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 					pressed = i; | 
					
						
							|  |  |  |  | 					type = CTL_HAT; | 
					
						
							|  |  |  |  | 					Succeed = true; | 
					
						
							| 
									
										
										
										
											2009-01-19 05:49:25 +00:00
										 |  |  |  | 				}			 | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// Check for a button
 | 
					
						
							|  |  |  |  | 		if(Button) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			for(int i = 0; i < buttons; i++) | 
					
						
							| 
									
										
										
										
											2009-01-24 22:13:53 +00:00
										 |  |  |  | 			{		 | 
					
						
							|  |  |  |  | 				// Some kind of bug in SDL 1.3 would give button 9 and 10 (nonexistent) the value 48 on the 360 pad
 | 
					
						
							|  |  |  |  | 				if (SDL_JoystickGetButton(joy, i) > 1) continue; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-19 05:49:25 +00:00
										 |  |  |  | 				if(SDL_JoystickGetButton(joy, i)) | 
					
						
							|  |  |  |  | 				{ | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 					pressed = i; | 
					
						
							|  |  |  |  | 					type = CTL_BUTTON; | 
					
						
							|  |  |  |  | 					Succeed = true; | 
					
						
							| 
									
										
										
										
											2009-01-19 05:49:25 +00:00
										 |  |  |  | 				} | 
					
						
							|  |  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 14:25:33 +00:00
										 |  |  |  | 		// Check for a XInput trigger
 | 
					
						
							| 
									
										
										
										
											2009-01-24 22:13:53 +00:00
										 |  |  |  | 		#ifdef _WIN32
 | 
					
						
							|  |  |  |  | 			if(XInput) | 
					
						
							|  |  |  |  | 			{ | 
					
						
							|  |  |  |  | 				for(int i = 0; i <= XI_TRIGGER_R; i++) | 
					
						
							|  |  |  |  | 				{			 | 
					
						
							|  |  |  |  | 					if(XInput::GetXI(0, i)) | 
					
						
							|  |  |  |  | 					{ | 
					
						
							|  |  |  |  | 						pressed = i + 1000; | 
					
						
							|  |  |  |  | 						type = CTL_AXIS; | 
					
						
							|  |  |  |  | 						Succeed = true; | 
					
						
							|  |  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2009-01-20 14:25:33 +00:00
										 |  |  |  | 				} | 
					
						
							|  |  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2009-01-24 22:13:53 +00:00
										 |  |  |  | 		#endif
 | 
					
						
							| 
									
										
										
										
											2009-01-20 14:25:33 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-28 18:50:24 +00:00
										 |  |  |  | 		// Check for keyboard action
 | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 		if (g_Pressed && Button) | 
					
						
							| 
									
										
										
										
											2008-12-28 18:50:24 +00:00
										 |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			// Todo: Add a separate keyboard vector to remove this restriction
 | 
					
						
							|  |  |  |  | 			if(g_Pressed >= buttons) | 
					
						
							|  |  |  |  | 			{ | 
					
						
							|  |  |  |  | 				pressed = g_Pressed; | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 				type = CTL_BUTTON; | 
					
						
							|  |  |  |  | 				Succeed = true; | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 				g_Pressed = 0; | 
					
						
							|  |  |  |  | 				if(pressed == WXK_ESCAPE) pressed = -1; // Check for the exape key
 | 
					
						
							| 
									
										
										
										
											2008-12-28 18:50:24 +00:00
										 |  |  |  | 			} | 
					
						
							|  |  |  |  | 			else | 
					
						
							|  |  |  |  | 			{ | 
					
						
							|  |  |  |  | 				pressed = g_Pressed; | 
					
						
							| 
									
										
										
										
											2009-01-20 05:28:30 +00:00
										 |  |  |  | 				g_Pressed = -1; | 
					
						
							|  |  |  |  | 				Stop = true; | 
					
						
							| 
									
										
										
										
											2008-12-28 18:50:24 +00:00
										 |  |  |  | 			} | 
					
						
							|  |  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | 	// ========================= Check for keys
 | 
					
						
							| 
									
										
										
										
											2008-12-28 18:50:24 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-25 18:20:16 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 	// ===============================================
 | 
					
						
							|  |  |  |  | 	// Process results
 | 
					
						
							|  |  |  |  | 	// ----------------
 | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 	// Count each time
 | 
					
						
							|  |  |  |  | 	GetButtonWaitingTimer++; | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 	// This is run every second
 | 
					
						
							|  |  |  |  | 	if(GetButtonWaitingTimer % TimesPerSecond == 0) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		// Current time
 | 
					
						
							|  |  |  |  | 		int TmpTime = Seconds - (GetButtonWaitingTimer / TimesPerSecond); | 
					
						
							| 
									
										
										
										
											2008-12-28 18:50:24 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 		// Update text
 | 
					
						
							|  |  |  |  | 		sprintf(format, "[%d]", TmpTime); | 
					
						
							|  |  |  |  | 		SetButtonText(GetId, format); | 
					
						
							|  |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 	// Time's up
 | 
					
						
							|  |  |  |  | 	if( (GetButtonWaitingTimer / TimesPerSecond) >= Seconds ) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		Stop = true; | 
					
						
							|  |  |  |  | 		// Leave a blank mapping
 | 
					
						
							| 
									
										
										
										
											2009-01-25 18:20:16 +00:00
										 |  |  |  | 		if(g_Config.bSaveByID) SetButtonTextAll(GetId, "-1"); else SetButtonText(GetId, "-1"); | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 	// If we got a button
 | 
					
						
							|  |  |  |  | 	if(Succeed) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		Stop = true;		 | 
					
						
							|  |  |  |  | 		// Write the number of the pressed button to the text box
 | 
					
						
							|  |  |  |  | 		sprintf(format, "%d", pressed); | 
					
						
							| 
									
										
										
										
											2009-01-25 18:20:16 +00:00
										 |  |  |  | 		if(g_Config.bSaveByID) SetButtonTextAll(GetId, format); else SetButtonText(GetId, format); | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 	// Stop the timer
 | 
					
						
							|  |  |  |  | 	if(Stop) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		m_ButtonMappingTimer->Stop(); | 
					
						
							|  |  |  |  | 		GetButtonWaitingTimer = 0; | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 		/* Update the button mapping for all slots that use this device. (It doesn't make sense to have several slots
 | 
					
						
							|  |  |  |  | 		   controlled by the same device, but several DirectInput instances of different but identical devices may possible | 
					
						
							|  |  |  |  | 		   have the same id, I don't know. So we have to do this. The user may also have selected the same device for | 
					
						
							|  |  |  |  | 		   several disabled slots. */ | 
					
						
							| 
									
										
										
										
											2009-01-25 18:20:16 +00:00
										 |  |  |  | 		if(g_Config.bSaveByID) SaveButtonMappingAll(Controller); else SaveButtonMapping(Controller); | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-12-28 18:50:24 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 05:28:30 +00:00
										 |  |  |  | 	// If we got a bad button
 | 
					
						
							|  |  |  |  | 	if(g_Pressed == -1) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-01-25 18:20:16 +00:00
										 |  |  |  | 		// Update text
 | 
					
						
							|  |  |  |  | 		if(g_Config.bSaveByID) SetButtonTextAll(GetId, "-1"); else SetButtonText(GetId, "-1"); | 
					
						
							| 
									
										
										
										
											2009-01-20 05:28:30 +00:00
										 |  |  |  | 		 | 
					
						
							|  |  |  |  | 		// Notify the user
 | 
					
						
							|  |  |  |  | 		wxMessageBox(wxString::Format(wxT( | 
					
						
							|  |  |  |  | 			"You selected a key with a to low key code (%i), please" | 
					
						
							|  |  |  |  | 			" select another key with a higher key code."), pressed) | 
					
						
							|  |  |  |  | 			, wxT("Notice"), wxICON_INFORMATION);		 | 
					
						
							|  |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-01-20 10:37:48 +00:00
										 |  |  |  | 	// ======================== Process results
 | 
					
						
							| 
									
										
										
										
											2009-01-20 05:28:30 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-19 23:17:29 +00:00
										 |  |  |  | 	// We don't need this gamepad handle any more
 | 
					
						
							| 
									
										
										
										
											2009-01-21 18:09:31 +00:00
										 |  |  |  | 	if(SDL_JoystickOpened(PadMapping[Controller].ID)) SDL_JoystickClose(joy); | 
					
						
							| 
									
										
										
										
											2009-01-19 17:47:00 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 	// Debugging
 | 
					
						
							| 
									
										
										
										
											2009-01-25 18:20:16 +00:00
										 |  |  |  | 	/*
 | 
					
						
							|  |  |  |  | 	Console::Print("Change: %i %i %i %i  '%s' '%s' '%s' '%s'\n", | 
					
						
							|  |  |  |  | 		PadMapping[0].halfpress, PadMapping[1].halfpress, PadMapping[2].halfpress, PadMapping[3].halfpress, | 
					
						
							|  |  |  |  | 		m_JoyButtonHalfpress[0]->GetValue().c_str(), m_JoyButtonHalfpress[1]->GetValue().c_str(), m_JoyButtonHalfpress[2]->GetValue().c_str(), m_JoyButtonHalfpress[3]->GetValue().c_str() | 
					
						
							|  |  |  |  | 		);*/ | 
					
						
							| 
									
										
										
										
											2008-12-27 11:41:58 +00:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 20:21:05 +00:00
										 |  |  |  | /////////////////////////////////////////////////////////// Configure button mapping
 |