nJoy: Preparation for adding new options. NOTICE: Not tested in OSX
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1665 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
ce01268885
commit
92cef41968
|
@ -213,12 +213,12 @@ SetTitle(wxT("Sound Debugging"));
|
||||||
|
|
||||||
// Basic settings
|
// Basic settings
|
||||||
SetIcon(wxNullIcon);
|
SetIcon(wxNullIcon);
|
||||||
SetSize(8, 8, 200, 100); // these will become the minimin sizes allowed by resizing
|
SetSize(8, 8, 200, 100); // These will become the minimin sizes allowed by resizing
|
||||||
Center();
|
Center();
|
||||||
|
|
||||||
|
|
||||||
// Declarations
|
// Declarations
|
||||||
wxBoxSizer * sMAIN, * sMain, *_sMail, * sBlock;
|
wxBoxSizer * m_MainSizer, * sMain, *_sMail, * sBlock;
|
||||||
|
|
||||||
wxButton* m_Upd;
|
wxButton* m_Upd;
|
||||||
wxButton* m_SelC;
|
wxButton* m_SelC;
|
||||||
|
@ -511,16 +511,16 @@ SetTitle(wxT("Sound Debugging"));
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
// Main containers
|
// Main containers
|
||||||
// -----------------------------
|
// -----------------------------
|
||||||
sMAIN = new wxBoxSizer(wxVERTICAL);
|
m_MainSizer = new wxBoxSizer(wxVERTICAL);
|
||||||
sMAIN->Add(m_Notebook, 1, wxEXPAND | wxALL, 5);
|
m_MainSizer->Add(m_Notebook, 1, wxEXPAND | wxALL, 5);
|
||||||
//sMAIN->SetSizeHints(this);
|
//m_MainSizer->SetSizeHints(this);
|
||||||
|
|
||||||
m_PageMain->SetSizer(sMain);
|
m_PageMain->SetSizer(sMain);
|
||||||
m_PageMail->SetSizer(_sMail);
|
m_PageMail->SetSizer(_sMail);
|
||||||
m_PageBlock->SetSizer(sBlock);
|
m_PageBlock->SetSizer(sBlock);
|
||||||
//sMain->Layout();
|
//sMain->Layout();
|
||||||
|
|
||||||
this->SetSizer(sMAIN);
|
this->SetSizer(m_MainSizer);
|
||||||
//this->Layout();
|
//this->Layout();
|
||||||
|
|
||||||
NotifyUpdate();
|
NotifyUpdate();
|
||||||
|
|
|
@ -501,6 +501,10 @@
|
||||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||||
>
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Src\Config.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\Src\nJoy.cpp"
|
RelativePath=".\Src\nJoy.cpp"
|
||||||
>
|
>
|
||||||
|
@ -509,6 +513,10 @@
|
||||||
RelativePath=".\Src\nJoy.h"
|
RelativePath=".\Src\nJoy.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Src\Rumble.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="GUI"
|
Name="GUI"
|
||||||
|
@ -521,6 +529,10 @@
|
||||||
RelativePath=".\Src\GUI\AboutBox.h"
|
RelativePath=".\Src\GUI\AboutBox.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Src\GUI\ConfigAdvanced.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\Src\GUI\ConfigBox.cpp"
|
RelativePath=".\Src\GUI\ConfigBox.cpp"
|
||||||
>
|
>
|
||||||
|
|
|
@ -0,0 +1,156 @@
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Project description
|
||||||
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
|
// 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
|
||||||
|
// ¯¯¯¯¯¯¯¯¯
|
||||||
|
#include "nJoy.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Enable output log
|
||||||
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
|
void DEBUG_INIT()
|
||||||
|
{
|
||||||
|
if (pFile)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
char dateStr [9];
|
||||||
|
_strdate( dateStr);
|
||||||
|
char timeStr [9];
|
||||||
|
_strtime( timeStr );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pFile = fopen ("nJoy-debug.txt","wt");
|
||||||
|
fprintf(pFile, "nJoy v"INPUT_VERSION" Debug\n");
|
||||||
|
#ifdef _WIN32
|
||||||
|
fprintf(pFile, "Date: %s\nTime: %s\n", dateStr, timeStr);
|
||||||
|
#endif
|
||||||
|
fprintf(pFile, "¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disable output log
|
||||||
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
|
void DEBUG_QUIT()
|
||||||
|
{
|
||||||
|
if (!pFile)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
char timeStr [9];
|
||||||
|
_strtime(timeStr);
|
||||||
|
|
||||||
|
fprintf(pFile, "_______________\n");
|
||||||
|
fprintf(pFile, "Time: %s", timeStr);
|
||||||
|
#endif
|
||||||
|
fclose(pFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save settings to file
|
||||||
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
|
void SaveConfig()
|
||||||
|
{
|
||||||
|
IniFile file;
|
||||||
|
file.Load("nJoy.ini");
|
||||||
|
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
char SectionName[32];
|
||||||
|
sprintf(SectionName, "PAD%i", i+1);
|
||||||
|
|
||||||
|
file.Set(SectionName, "l_shoulder", joysticks[i].buttons[CTL_L_SHOULDER]);
|
||||||
|
file.Set(SectionName, "r_shoulder", joysticks[i].buttons[CTL_R_SHOULDER]);
|
||||||
|
file.Set(SectionName, "a_button", joysticks[i].buttons[CTL_A_BUTTON]);
|
||||||
|
file.Set(SectionName, "b_button", joysticks[i].buttons[CTL_B_BUTTON]);
|
||||||
|
file.Set(SectionName, "x_button", joysticks[i].buttons[CTL_X_BUTTON]);
|
||||||
|
file.Set(SectionName, "y_button", joysticks[i].buttons[CTL_Y_BUTTON]);
|
||||||
|
file.Set(SectionName, "z_trigger", joysticks[i].buttons[CTL_Z_TRIGGER]);
|
||||||
|
file.Set(SectionName, "start_button", joysticks[i].buttons[CTL_START]);
|
||||||
|
file.Set(SectionName, "dpad", joysticks[i].dpad);
|
||||||
|
file.Set(SectionName, "dpad_up", joysticks[i].dpad2[CTL_D_PAD_UP]);
|
||||||
|
file.Set(SectionName, "dpad_down", joysticks[i].dpad2[CTL_D_PAD_DOWN]);
|
||||||
|
file.Set(SectionName, "dpad_left", joysticks[i].dpad2[CTL_D_PAD_LEFT]);
|
||||||
|
file.Set(SectionName, "dpad_right", joysticks[i].dpad2[CTL_D_PAD_RIGHT]);
|
||||||
|
file.Set(SectionName, "main_x", joysticks[i].axis[CTL_MAIN_X]);
|
||||||
|
file.Set(SectionName, "main_y", joysticks[i].axis[CTL_MAIN_Y]);
|
||||||
|
file.Set(SectionName, "sub_x", joysticks[i].axis[CTL_SUB_X]);
|
||||||
|
file.Set(SectionName, "sub_y", joysticks[i].axis[CTL_SUB_Y]);
|
||||||
|
file.Set(SectionName, "enabled", joysticks[i].enabled);
|
||||||
|
file.Set(SectionName, "deadzone", joysticks[i].deadzone);
|
||||||
|
file.Set(SectionName, "halfpress", joysticks[i].halfpress);
|
||||||
|
file.Set(SectionName, "joy_id", joysticks[i].ID);
|
||||||
|
file.Set(SectionName, "controllertype", joysticks[i].controllertype);
|
||||||
|
file.Set(SectionName, "eventnum", joysticks[i].eventnum);
|
||||||
|
}
|
||||||
|
|
||||||
|
file.Save("nJoy.ini");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load settings from file
|
||||||
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
|
void LoadConfig()
|
||||||
|
{
|
||||||
|
IniFile file;
|
||||||
|
file.Load("nJoy.ini");
|
||||||
|
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
char SectionName[32];
|
||||||
|
sprintf(SectionName, "PAD%i", i+1);
|
||||||
|
|
||||||
|
file.Get(SectionName, "l_shoulder", &joysticks[i].buttons[CTL_L_SHOULDER], 4);
|
||||||
|
file.Get(SectionName, "r_shoulder", &joysticks[i].buttons[CTL_R_SHOULDER], 5);
|
||||||
|
file.Get(SectionName, "a_button", &joysticks[i].buttons[CTL_A_BUTTON], 0);
|
||||||
|
file.Get(SectionName, "b_button", &joysticks[i].buttons[CTL_B_BUTTON], 1);
|
||||||
|
file.Get(SectionName, "x_button", &joysticks[i].buttons[CTL_X_BUTTON], 3);
|
||||||
|
file.Get(SectionName, "y_button", &joysticks[i].buttons[CTL_Y_BUTTON], 2);
|
||||||
|
file.Get(SectionName, "z_trigger", &joysticks[i].buttons[CTL_Z_TRIGGER], 7);
|
||||||
|
file.Get(SectionName, "start_button", &joysticks[i].buttons[CTL_START], 9);
|
||||||
|
file.Get(SectionName, "dpad", &joysticks[i].dpad, 0);
|
||||||
|
file.Get(SectionName, "dpad_up", &joysticks[i].dpad2[CTL_D_PAD_UP], 0);
|
||||||
|
file.Get(SectionName, "dpad_down", &joysticks[i].dpad2[CTL_D_PAD_DOWN], 0);
|
||||||
|
file.Get(SectionName, "dpad_left", &joysticks[i].dpad2[CTL_D_PAD_LEFT], 0);
|
||||||
|
file.Get(SectionName, "dpad_right", &joysticks[i].dpad2[CTL_D_PAD_RIGHT], 0);
|
||||||
|
file.Get(SectionName, "main_x", &joysticks[i].axis[CTL_MAIN_X], 0);
|
||||||
|
file.Get(SectionName, "main_y", &joysticks[i].axis[CTL_MAIN_Y], 1);
|
||||||
|
file.Get(SectionName, "sub_x", &joysticks[i].axis[CTL_SUB_X], 2);
|
||||||
|
file.Get(SectionName, "sub_y", &joysticks[i].axis[CTL_SUB_Y], 3);
|
||||||
|
file.Get(SectionName, "enabled", &joysticks[i].enabled, 1);
|
||||||
|
file.Get(SectionName, "deadzone", &joysticks[i].deadzone, 9);
|
||||||
|
file.Get(SectionName, "halfpress", &joysticks[i].halfpress, 6);
|
||||||
|
file.Get(SectionName, "joy_id", &joysticks[i].ID, 0);
|
||||||
|
file.Get(SectionName, "controllertype", &joysticks[i].controllertype, 0);
|
||||||
|
file.Get(SectionName, "eventnum", &joysticks[i].eventnum, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,133 @@
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Include
|
||||||
|
// ¯¯¯¯¯¯¯¯¯
|
||||||
|
#include "ConfigBox.h"
|
||||||
|
#include "../nJoy.h"
|
||||||
|
#include "Images/controller.xpm"
|
||||||
|
|
||||||
|
extern CONTROLLER_INFO *joyinfo;
|
||||||
|
extern bool emulator_running;
|
||||||
|
////////////////////////
|
||||||
|
|
||||||
|
int main_stick_x = 0;
|
||||||
|
|
||||||
|
// Set PAD status
|
||||||
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
|
void ConfigBox::PadGetStatus()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int _numPAD = 0;
|
||||||
|
|
||||||
|
if (!joysticks[_numPAD].enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Clear pad status
|
||||||
|
//memset(_pPADStatus, 0, sizeof(SPADStatus));
|
||||||
|
|
||||||
|
|
||||||
|
// Get pad status
|
||||||
|
GetJoyState(_numPAD);
|
||||||
|
|
||||||
|
// Reset!
|
||||||
|
/*
|
||||||
|
int base = 0x80;
|
||||||
|
_pPADStatus->stickY = base;
|
||||||
|
_pPADStatus->stickX = base;
|
||||||
|
_pPADStatus->substickX = base;
|
||||||
|
_pPADStatus->substickY = base;
|
||||||
|
_pPADStatus->button |= PAD_USE_ORIGIN;
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Set analog controllers
|
||||||
|
// Set Deadzones perhaps out of function
|
||||||
|
//int deadzone = (int)(((float)(128.00/100.00)) * (float)(joysticks[_numPAD].deadzone+1));
|
||||||
|
//int deadzone2 = (int)(((float)(-128.00/100.00)) * (float)(joysticks[_numPAD].deadzone+1));
|
||||||
|
|
||||||
|
// Adjust range
|
||||||
|
// The value returned by SDL_JoystickGetAxis is a signed integer (-32768 to 32768)
|
||||||
|
// The value used for the gamecube controller is an unsigned char (0 to 255)
|
||||||
|
int main_stick_x = (joystate[_numPAD].axis[CTL_MAIN_X] >> 8);
|
||||||
|
int main_stick_y = -(joystate[_numPAD].axis[CTL_MAIN_Y] >> 8);
|
||||||
|
//int sub_stick_x = (joystate[_numPAD].axis[CTL_SUB_X] >> 8);
|
||||||
|
//int sub_stick_y = -(joystate[_numPAD].axis[CTL_SUB_Y] >> 8);
|
||||||
|
|
||||||
|
|
||||||
|
if (joystate[_numPAD].buttons[CTL_A_BUTTON])
|
||||||
|
{
|
||||||
|
PanicAlert("");
|
||||||
|
//_pPADStatus->button |= PAD_BUTTON_A;
|
||||||
|
//_pPADStatus->analogA = 255; // Perhaps support pressure?
|
||||||
|
for(int i=0; i<4 ;i++)
|
||||||
|
{
|
||||||
|
m_bmpDot[i]->SetPosition(wxPoint(main_stick_x += 3, main_stick_y));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i=0; i<4 ;i++)
|
||||||
|
{
|
||||||
|
//m_bmpDot[i]->SetPosition(wxPoint(main_stick_x / 4, main_stick_y / 4));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Populate the advanced tab
|
||||||
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
|
void ConfigBox::Update()
|
||||||
|
{
|
||||||
|
//PadGetStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Populate the advanced tab
|
||||||
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
|
void ConfigBox::CreateAdvancedControls(int i)
|
||||||
|
{
|
||||||
|
m_pInStatus[i] = new wxPanel(m_Notebook, ID_INSTATUS1 + i, wxDefaultPosition, wxDefaultSize);
|
||||||
|
m_bmpSquare[i] = new wxStaticBitmap(m_pInStatus[i], ID_STATUSBMP1 + i, CreateBitmap(),
|
||||||
|
//wxPoint(4, 15), wxSize(70,70));
|
||||||
|
//wxPoint(4, 20), wxDefaultSize);
|
||||||
|
wxDefaultPosition, wxDefaultSize);
|
||||||
|
|
||||||
|
m_bmpDot[i] = new wxStaticBitmap(m_pInStatus[i], ID_STATUSDOTBMP1 + i, CreateBitmapDot(),
|
||||||
|
wxPoint(40, 40), wxDefaultSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxBitmap ConfigBox::CreateBitmap() // Create box
|
||||||
|
{
|
||||||
|
int w = 70, h = 70;
|
||||||
|
wxBitmap bitmap(w, h);
|
||||||
|
wxMemoryDC dc;
|
||||||
|
dc.SelectObject(bitmap);
|
||||||
|
|
||||||
|
// Set outline and fill colors
|
||||||
|
wxBrush LightBlueBrush(_T("#0383f0"));
|
||||||
|
wxPen LightBluePen(_T("#80c5fd"));
|
||||||
|
wxPen LightGrayPen(_T("#909090"));
|
||||||
|
dc.SetPen(LightGrayPen);
|
||||||
|
dc.SetBrush(*wxWHITE_BRUSH);
|
||||||
|
|
||||||
|
dc.Clear();
|
||||||
|
dc.DrawRectangle(0, 0, w, h);
|
||||||
|
dc.SelectObject(wxNullBitmap);
|
||||||
|
return bitmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxBitmap ConfigBox::CreateBitmapDot() // Create dot
|
||||||
|
{
|
||||||
|
int w = 2, h = 2;
|
||||||
|
wxBitmap bitmap(w, h);
|
||||||
|
wxMemoryDC dc;
|
||||||
|
dc.SelectObject(bitmap);
|
||||||
|
|
||||||
|
// Set outline and fill colors
|
||||||
|
wxBrush LightBlueBrush(_T("#0383f0"));
|
||||||
|
wxPen LightBluePen(_T("#80c5fd"));
|
||||||
|
wxPen LightGrayPen(_T("#909090"));
|
||||||
|
dc.SetPen(LightGrayPen);
|
||||||
|
dc.SetBrush(*wxWHITE_BRUSH);
|
||||||
|
|
||||||
|
dc.Clear();
|
||||||
|
dc.DrawRectangle(0, 0, w, h);
|
||||||
|
dc.SelectObject(wxNullBitmap);
|
||||||
|
return bitmap;
|
||||||
|
}
|
|
@ -29,12 +29,16 @@
|
||||||
//
|
//
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Include
|
||||||
|
// ¯¯¯¯¯¯¯¯¯
|
||||||
#include "ConfigBox.h"
|
#include "ConfigBox.h"
|
||||||
#include "../nJoy.h"
|
#include "../nJoy.h"
|
||||||
#include "Images/controller.xpm"
|
#include "Images/controller.xpm"
|
||||||
|
|
||||||
extern CONTROLLER_INFO *joyinfo;
|
extern CONTROLLER_INFO *joyinfo;
|
||||||
extern CONTROLLER_MAPPING joysticks[4];
|
//extern CONTROLLER_MAPPING joysticks[4];
|
||||||
extern bool emulator_running;
|
extern bool emulator_running;
|
||||||
|
|
||||||
static const char* ControllerType[] =
|
static const char* ControllerType[] =
|
||||||
|
@ -44,7 +48,12 @@ static const char* ControllerType[] =
|
||||||
// "Joytstick (xbox360)", // Shoulder buttons -> axis
|
// "Joytstick (xbox360)", // Shoulder buttons -> axis
|
||||||
// "Keyboard" // Not supported yet, sorry F|RES ;( ...
|
// "Keyboard" // Not supported yet, sorry F|RES ;( ...
|
||||||
};
|
};
|
||||||
|
////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// The wxWidgets class
|
||||||
|
// ¯¯¯¯¯¯¯
|
||||||
BEGIN_EVENT_TABLE(ConfigBox,wxDialog)
|
BEGIN_EVENT_TABLE(ConfigBox,wxDialog)
|
||||||
EVT_CLOSE(ConfigBox::OnClose)
|
EVT_CLOSE(ConfigBox::OnClose)
|
||||||
EVT_BUTTON(ID_ABOUT, ConfigBox::AboutClick)
|
EVT_BUTTON(ID_ABOUT, ConfigBox::AboutClick)
|
||||||
|
@ -72,21 +81,50 @@ BEGIN_EVENT_TABLE(ConfigBox,wxDialog)
|
||||||
EVT_BUTTON(IDB_ANALOG_MAIN_Y, ConfigBox::GetAxis)
|
EVT_BUTTON(IDB_ANALOG_MAIN_Y, ConfigBox::GetAxis)
|
||||||
EVT_BUTTON(IDB_ANALOG_SUB_X, ConfigBox::GetAxis)
|
EVT_BUTTON(IDB_ANALOG_SUB_X, ConfigBox::GetAxis)
|
||||||
EVT_BUTTON(IDB_ANALOG_SUB_Y, ConfigBox::GetAxis)
|
EVT_BUTTON(IDB_ANALOG_SUB_Y, ConfigBox::GetAxis)
|
||||||
|
|
||||||
|
#if wxUSE_TIMER
|
||||||
|
EVT_TIMER(wxID_ANY, ConfigBox::OnTimer)
|
||||||
|
#endif
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
ConfigBox::ConfigBox(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style)
|
ConfigBox::ConfigBox(wxWindow *parent, wxWindowID id, const wxString &title,
|
||||||
: wxDialog(parent, id, title, position, size, style)
|
const wxPoint &position, const wxSize& size, long style)
|
||||||
|
: wxDialog(parent, id, title, position, size, style)
|
||||||
|
#if wxUSE_TIMER
|
||||||
|
, m_timer(this)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
notebookpage = 0;
|
notebookpage = 0;
|
||||||
CreateGUIControls();
|
CreateGUIControls();
|
||||||
|
|
||||||
|
#if wxUSE_TIMER
|
||||||
|
m_timer.Start(1000);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigBox::~ConfigBox()
|
ConfigBox::~ConfigBox()
|
||||||
{
|
{
|
||||||
// empty
|
// empty
|
||||||
}
|
}
|
||||||
|
//////////////////////////////////
|
||||||
|
|
||||||
// Warning: horrible code below proceed at own risk!
|
|
||||||
|
// Populate the config window
|
||||||
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
|
void ConfigBox::OnPaint( wxPaintEvent &event )
|
||||||
|
{
|
||||||
|
event.Skip();
|
||||||
|
|
||||||
|
for(int i=0; i<4 ;i++)
|
||||||
|
{
|
||||||
|
wxPaintDC dcWin(m_pKeys[i]);
|
||||||
|
PrepareDC( dcWin );
|
||||||
|
dcWin.DrawBitmap( WxStaticBitmap1_BITMAP, 94, 0, true );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Populate the config window
|
||||||
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
void ConfigBox::CreateGUIControls()
|
void ConfigBox::CreateGUIControls()
|
||||||
{
|
{
|
||||||
#ifndef _DEBUG
|
#ifndef _DEBUG
|
||||||
|
@ -96,8 +134,12 @@ void ConfigBox::CreateGUIControls()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SetIcon(wxNullIcon);
|
SetIcon(wxNullIcon);
|
||||||
SetClientSize(637, 527);
|
|
||||||
Center();
|
//WxStaticBitmap1_BITMAP(ConfigBox_WxStaticBitmap1_XPM);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//WxStaticBitmap1_BITMAP = new WxStaticBitmap1_BITMAP(ConfigBox_WxStaticBitmap1_XPM);
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
// Force a 8pt font so that it looks more or less "correct" regardless of the default font setting
|
// Force a 8pt font so that it looks more or less "correct" regardless of the default font setting
|
||||||
|
@ -106,21 +148,21 @@ void ConfigBox::CreateGUIControls()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Buttons
|
// Buttons
|
||||||
m_About = new wxButton(this, ID_ABOUT, wxT("About"), wxPoint(5, 497), wxSize(75, 25), 0, wxDefaultValidator, wxT("About"));
|
m_About = new wxButton(this, ID_ABOUT, wxT("About"), wxDefaultPosition, wxSize(75, 25), 0, wxDefaultValidator, wxT("About"));
|
||||||
m_OK = new wxButton(this, ID_OK, wxT("OK"), wxPoint(475, 497), wxSize(75, 25), 0, wxDefaultValidator, wxT("OK"));
|
m_OK = new wxButton(this, ID_OK, wxT("OK"), wxDefaultPosition, wxSize(75, 25), 0, wxDefaultValidator, wxT("OK"));
|
||||||
m_Cancel = new wxButton(this, ID_CANCEL, wxT("Cancel"), wxPoint(556, 497), wxSize(75, 25), 0, wxDefaultValidator, wxT("Cancel"));
|
m_Cancel = new wxButton(this, ID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxSize(75, 25), 0, wxDefaultValidator, wxT("Cancel"));
|
||||||
|
|
||||||
// Notebook
|
// Notebook
|
||||||
m_Notebook = new wxNotebook(this, ID_NOTEBOOK, wxPoint(6, 7),wxSize(625, 484));
|
m_Notebook = new wxNotebook(this, ID_NOTEBOOK, wxDefaultPosition, wxDefaultSize);
|
||||||
|
|
||||||
// Controller pages
|
// Controller pages
|
||||||
m_Controller[0] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE1, wxPoint(0, 0), wxSize(600, 400));
|
m_Controller[0] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE1, wxDefaultPosition, wxDefaultSize);
|
||||||
m_Notebook->AddPage(m_Controller[0], wxT("Controller 1"));
|
m_Notebook->AddPage(m_Controller[0], wxT("Controller 1"));
|
||||||
m_Controller[1] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE2, wxPoint(0, 0), wxSize(600, 400));
|
m_Controller[1] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE2, wxDefaultPosition, wxDefaultSize);
|
||||||
m_Notebook->AddPage(m_Controller[1], wxT("Controller 2"));
|
m_Notebook->AddPage(m_Controller[1], wxT("Controller 2"));
|
||||||
m_Controller[2] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE3, wxPoint(0, 0), wxSize(600, 400));
|
m_Controller[2] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE3, wxDefaultPosition, wxDefaultSize);
|
||||||
m_Notebook->AddPage(m_Controller[2], wxT("Controller 3"));
|
m_Notebook->AddPage(m_Controller[2], wxT("Controller 3"));
|
||||||
m_Controller[3] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE4, wxPoint(0, 0), wxSize(600, 400));
|
m_Controller[3] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE4, wxDefaultPosition, wxDefaultSize);
|
||||||
m_Notebook->AddPage(m_Controller[3], wxT("Controller 4"));
|
m_Notebook->AddPage(m_Controller[3], wxT("Controller 4"));
|
||||||
|
|
||||||
// Add controls
|
// Add controls
|
||||||
|
@ -153,117 +195,203 @@ void ConfigBox::CreateGUIControls()
|
||||||
arrayStringFor_Deadzone.Add(wxString::FromAscii(buffer));
|
arrayStringFor_Deadzone.Add(wxString::FromAscii(buffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
wxBitmap WxStaticBitmap1_BITMAP(ConfigBox_WxStaticBitmap1_XPM);
|
// Define bitmap for EVT_PAINT
|
||||||
|
WxStaticBitmap1_BITMAP = wxBitmap(ConfigBox_WxStaticBitmap1_XPM);
|
||||||
|
|
||||||
|
|
||||||
|
// Populate all four pages
|
||||||
for(int i=0; i<4 ;i++)
|
for(int i=0; i<4 ;i++)
|
||||||
{
|
{
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
// Populate keys sizer
|
||||||
|
// -----------------------------
|
||||||
|
// Set relative values for the keys
|
||||||
|
int t = -75; // Top
|
||||||
|
int l = -4; // Left
|
||||||
|
m_sKeys[i] = new wxStaticBoxSizer( wxVERTICAL, m_Controller[i], wxT("Keys"));
|
||||||
|
m_pKeys[i] = new wxPanel(m_Controller[i], ID_KEYSPANEL1 + i, wxDefaultPosition, wxSize(600, 400));
|
||||||
|
//m_sKeys[i] = new wxStaticBox (m_Controller[i], IDG_JOYSTICK, wxT("Keys"), wxDefaultPosition, wxSize(608, 500));
|
||||||
|
m_sKeys[i]->Add(m_pKeys[i], 0, (wxALL), 0); // margin = 0
|
||||||
|
|
||||||
// Groups
|
// --------------------------------------------------------------------
|
||||||
m_gJoyname[i] = new wxStaticBox(m_Controller[i], IDG_JOYSTICK, wxT("Controller:"), wxPoint(5, 11), wxSize(608, 46));
|
// GameCube controller picture
|
||||||
|
// -----------------------------
|
||||||
#ifdef _WIN32
|
|
||||||
m_Joyattach[i] = new wxCheckBox(m_Controller[i], IDC_JOYATTACH, wxT("Controller attached"), wxPoint(495, 26), wxSize(109, 25), 0, wxDefaultValidator, wxT("Controller attached"));
|
|
||||||
m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, wxEmptyString, wxPoint(12, 29), wxSize(476, 21), arrayStringFor_Joyname, 0, wxDefaultValidator, wxT("m_Joyname"));
|
|
||||||
m_gExtrasettings[i] = new wxStaticBox(m_Controller[i], IDG_EXTRASETTINGS, wxT("Extra settings:"), wxPoint(104, 385), wxSize(155, 69));
|
|
||||||
m_Deadzone[i] = new wxComboBox(m_Controller[i], IDC_DEADZONE, wxEmptyString, wxPoint(167, 400), wxSize(59, 21), arrayStringFor_Deadzone, 0, wxDefaultValidator, wxT("m_Deadzone"));
|
|
||||||
m_gControllertype[i] = new wxStaticBox(m_Controller[i], IDG_CONTROLLERTYPE, wxT("Controller type:"), wxPoint(359, 383), wxSize(143, 44));
|
|
||||||
m_Controltype[i] = new wxComboBox(m_Controller[i], IDC_CONTROLTYPE, wxEmptyString, wxPoint(366, 401), wxSize(131, 21), arrayStringFor_Controltype, 0, wxDefaultValidator, wxT("m_Controltype"));
|
|
||||||
#else
|
|
||||||
m_Joyattach[i] = new wxCheckBox(m_Controller[i], IDC_JOYATTACH, wxT("Controller attached"), wxPoint(470, 26), wxSize(140, 25), 0, wxDefaultValidator, wxT("Controller attached"));
|
|
||||||
m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, wxEmptyString, wxPoint(10, 25), wxSize(450, 25), arrayStringFor_Joyname, 0, wxDefaultValidator, wxT("m_Joyname"));
|
|
||||||
m_gExtrasettings[i] = new wxStaticBox(m_Controller[i], IDG_EXTRASETTINGS, wxT("Extra settings:"), wxPoint(100, 385), wxSize(155, 65));
|
|
||||||
m_Deadzone[i] = new wxComboBox(m_Controller[i], IDC_DEADZONE, wxEmptyString, wxPoint(167, 398), wxSize(80, 25), arrayStringFor_Deadzone, 0, wxDefaultValidator, wxT("m_Deadzone"));
|
|
||||||
m_gControllertype[i] = new wxStaticBox(m_Controller[i], IDG_CONTROLLERTYPE, wxT("Controller type:"), wxPoint(359, 383), wxSize(160, 44));
|
|
||||||
m_Controltype[i] = new wxComboBox(m_Controller[i], IDC_CONTROLTYPE, wxEmptyString, wxPoint(364, 396), wxSize(150, 25), arrayStringFor_Controltype, 0, wxDefaultValidator, wxT("m_Controltype"));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// GUI left side buttons
|
|
||||||
m_JoyShoulderL[i] = new wxTextCtrl(m_Controller[i], ID_SHOULDER_L, wxT("0"), wxPoint(6, 80), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
|
||||||
m_JoyShoulderL[i]->Enable(false);
|
|
||||||
m_JoyAnalogMainX[i] = new wxTextCtrl(m_Controller[i], ID_ANALOG_MAIN_X, wxT("0"), wxPoint(6, 218), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
|
||||||
m_JoyAnalogMainX[i]->Enable(false);
|
|
||||||
m_JoyAnalogMainY[i] = new wxTextCtrl(m_Controller[i], ID_ANALOG_MAIN_Y, wxT("0"), wxPoint(6, 255), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
|
||||||
m_JoyAnalogMainY[i]->Enable(false);
|
|
||||||
m_JoyDpadUp[i] = new wxTextCtrl(m_Controller[i], ID_DPAD_UP, wxT("0"), wxPoint(6, 296), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
|
||||||
m_JoyDpadUp[i]->Enable(false);
|
|
||||||
m_JoyDpadDown[i] = new wxTextCtrl(m_Controller[i], ID_DPAD_DOWN, wxT("0"), wxPoint(6, 333), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
|
||||||
m_JoyDpadDown[i]->Enable(false);
|
|
||||||
m_JoyDpadLeft[i] = new wxTextCtrl(m_Controller[i], ID_DPAD_LEFT, wxT("0"), wxPoint(6, 369), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
|
||||||
m_JoyDpadLeft[i]->Enable(false);
|
|
||||||
m_JoyDpadRight[i] = new wxTextCtrl(m_Controller[i], ID_DPAD_RIGHT, wxT("0"), wxPoint(6, 406), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
|
||||||
m_JoyDpadRight[i]->Enable(false);
|
|
||||||
m_bJoyShoulderL[i] = new wxButton(m_Controller[i], IDB_SHOULDER_L, wxEmptyString, wxPoint(70, 82), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
|
||||||
m_bJoyAnalogMainX[i] = new wxButton(m_Controller[i], IDB_ANALOG_MAIN_X, wxEmptyString, wxPoint(70, 220), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
|
||||||
m_bJoyAnalogMainY[i] = new wxButton(m_Controller[i], IDB_ANALOG_MAIN_Y, wxEmptyString, wxPoint(70, 257), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
|
||||||
m_bJoyDpadUp[i] = new wxButton(m_Controller[i], IDB_DPAD_UP, wxEmptyString, wxPoint(70, 298), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
|
||||||
m_bJoyDpadDown[i] = new wxButton(m_Controller[i], IDB_DPAD_DOWN, wxEmptyString, wxPoint(70, 335), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
|
||||||
m_bJoyDpadLeft[i] = new wxButton(m_Controller[i], IDB_DPAD_LEFT, wxEmptyString, wxPoint(70, 371), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
|
||||||
m_bJoyDpadRight[i] = new wxButton(m_Controller[i], IDB_DPAD_RIGHT, wxEmptyString, wxPoint(70, 408), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
|
||||||
|
|
||||||
m_textMainX[i] = new wxStaticText(m_Controller[i], IDT_ANALOG_MAIN_X, wxT("X-axis"), wxPoint(6, 204), wxDefaultSize, 0, wxT("X-axis"));
|
|
||||||
m_textMainY[i] = new wxStaticText(m_Controller[i], IDT_ANALOG_MAIN_Y, wxT("Y-axis"), wxPoint(6, 241), wxDefaultSize, 0, wxT("Y-axis"));
|
|
||||||
m_textDpadUp[i] = new wxStaticText(m_Controller[i], IDT_DPAD_UP, wxT("Up"), wxPoint(6, 282), wxDefaultSize, 0, wxT("Up"));
|
|
||||||
m_textDpadDown[i] = new wxStaticText(m_Controller[i], IDT_DPAD_DOWN, wxT("Down"), wxPoint(6, 319), wxDefaultSize, 0, wxT("Down"));
|
|
||||||
m_textDpadLeft[i] = new wxStaticText(m_Controller[i], IDT_DPAD_LEFT, wxT("Left"), wxPoint(6, 354), wxDefaultSize, 0, wxT("Left"));
|
|
||||||
m_textDpadRight[i] = new wxStaticText(m_Controller[i], IDT_DPAD_RIGHT, wxT("Right"), wxPoint(6, 391), wxDefaultSize, 0, wxT("Right"));
|
|
||||||
|
|
||||||
// GUI right side buttons
|
|
||||||
m_JoyShoulderR[i] = new wxTextCtrl(m_Controller[i], ID_SHOULDER_R, wxT("0"), wxPoint(552, 106), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
|
||||||
m_JoyShoulderR[i]->Enable(false);
|
|
||||||
m_JoyButtonA[i] = new wxTextCtrl(m_Controller[i], ID_BUTTON_A, wxT("0"), wxPoint(552, 280), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
|
||||||
m_JoyButtonA[i]->Enable(false);
|
|
||||||
m_JoyButtonB[i] = new wxTextCtrl(m_Controller[i], ID_BUTTON_B, wxT("0"), wxPoint(552, 80), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
|
||||||
m_JoyButtonB[i]->Enable(false);
|
|
||||||
m_JoyButtonX[i] = new wxTextCtrl(m_Controller[i], ID_BUTTON_X, wxT("0"), wxPoint(552, 242), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
|
||||||
m_JoyButtonX[i]->Enable(false);
|
|
||||||
m_JoyButtonY[i] = new wxTextCtrl(m_Controller[i], ID_BUTTON_Y, wxT("0"), wxPoint(552, 171), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
|
||||||
m_JoyButtonY[i]->Enable(false);
|
|
||||||
m_JoyButtonZ[i] = new wxTextCtrl(m_Controller[i], ID_BUTTON_Z, wxT("0"), wxPoint(552, 145), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
|
||||||
m_JoyButtonZ[i]->Enable(false);
|
|
||||||
m_JoyAnalogSubX[i] = new wxTextCtrl(m_Controller[i], ID_ANALOG_SUB_X, wxT("0"), wxPoint(552, 351), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
|
||||||
m_JoyAnalogSubX[i]->Enable(false);
|
|
||||||
m_JoyAnalogSubY[i] = new wxTextCtrl(m_Controller[i], ID_ANALOG_SUB_Y, wxT("0"), wxPoint(552, 388), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
|
||||||
m_JoyAnalogSubY[i]->Enable(false);
|
|
||||||
m_bJoyShoulderR[i] = new wxButton(m_Controller[i], IDB_SHOULDER_R, wxEmptyString, wxPoint(526, 108), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
|
||||||
m_bJoyButtonA[i] = new wxButton(m_Controller[i], IDB_BUTTON_A, wxEmptyString, wxPoint(526, 282), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
|
||||||
m_bJoyButtonB[i] = new wxButton(m_Controller[i], IDB_BUTTON_B, wxEmptyString, wxPoint(526, 82), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
|
||||||
m_bJoyButtonX[i] = new wxButton(m_Controller[i], IDB_BUTTON_X, wxEmptyString, wxPoint(526, 244), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
|
||||||
m_bJoyButtonY[i] = new wxButton(m_Controller[i], IDB_BUTTON_Y, wxEmptyString, wxPoint(526, 173), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
|
||||||
m_bJoyButtonZ[i] = new wxButton(m_Controller[i], IDB_BUTTON_Z, wxEmptyString, wxPoint(526, 147), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
|
||||||
m_bJoyAnalogSubX[i] = new wxButton(m_Controller[i], IDB_ANALOG_SUB_X, wxEmptyString, wxPoint(526, 353), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
|
||||||
m_bJoyAnalogSubY[i] = new wxButton(m_Controller[i], IDB_ANALOG_SUB_Y, wxEmptyString, wxPoint(526, 390), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
|
||||||
|
|
||||||
m_textSubX[i] = new wxStaticText(m_Controller[i], IDT_ANALOG_SUB_X, wxT("X-axis"), wxPoint(552, 336), wxDefaultSize, 0, wxT("X-axis"));
|
|
||||||
m_textSubY[i] = new wxStaticText(m_Controller[i], IDT_ANALOG_SUB_Y, wxT("Y-axis"), wxPoint(552, 373), wxDefaultSize, 0, wxT("Y-axis"));
|
|
||||||
|
|
||||||
// GUI center button
|
|
||||||
m_JoyButtonStart[i] = new wxTextCtrl(m_Controller[i], ID_BUTTONSTART, wxT("0"), wxPoint(278, 403), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
|
||||||
m_JoyButtonStart[i]->Enable(false);
|
|
||||||
m_JoyButtonHalfpress[i] = new wxTextCtrl(m_Controller[i], ID_BUTTONHALFPRESS, wxT("0"), wxPoint(167, 424), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
|
||||||
m_JoyButtonHalfpress[i]->Enable(false);
|
|
||||||
m_bJoyButtonStart[i] = new wxButton(m_Controller[i], IDB_BUTTONSTART, wxEmptyString, wxPoint(297, 385), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
|
||||||
m_bJoyButtonHalfpress[i] = new wxButton(m_Controller[i], IDB_BUTTONHALFPRESS, wxEmptyString, wxPoint(231, 426), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
m_textDeadzone[i] = new wxStaticText(m_Controller[i], IDT_DEADZONE, wxT("Deadzone"), wxPoint(116, 404), wxDefaultSize, 0, wxT("Deadzone"));
|
|
||||||
m_textHalfpress[i] = new wxStaticText(m_Controller[i], IDT_BUTTONHALFPRESS, wxT("Half press"), wxPoint(116, 428), wxDefaultSize, 0, wxT("Half press"));
|
|
||||||
m_textWebsite[i] = new wxStaticText(m_Controller[i], IDT_WEBSITE, wxT("www.multigesture.net"), wxPoint(500, 438), wxDefaultSize, 0, wxT("www.multigesture.net"));
|
|
||||||
#else
|
|
||||||
m_textDeadzone[i] = new wxStaticText(m_Controller[i], IDT_DEADZONE, wxT("Deadzone"), wxPoint(105, 404), wxDefaultSize, 0, wxT("Deadzone"));
|
|
||||||
m_textHalfpress[i] = new wxStaticText(m_Controller[i], IDT_BUTTONHALFPRESS, wxT("Half press"), wxPoint(105, 428), wxDefaultSize, 0, wxT("Half press"));
|
|
||||||
m_textWebsite[i] = new wxStaticText(m_Controller[i], IDT_WEBSITE, wxT("www.multigesture.net"), wxPoint(480, 438), wxDefaultSize, 0, wxT("www.multigesture.net"));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// TODO: Controller image
|
// TODO: Controller image
|
||||||
// Placeholder instead of bitmap
|
// Placeholder instead of bitmap
|
||||||
// m_PlaceholderBMP[i] = new wxTextCtrl(m_Controller[i], ID_CONTROLLERPICTURE, wxT("BITMAP HERE PLZ KTHX!"), wxPoint(98, 75), wxSize(423, 306), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("BITMAP HERE PLZ KTHX!"));
|
// m_PlaceholderBMP[i] = new wxTextCtrl(m_Controller[i], ID_CONTROLLERPICTURE, wxT("BITMAP HERE PLZ KTHX!"), wxPoint(98, 75), wxSize(423, 306), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("BITMAP HERE PLZ KTHX!"));
|
||||||
// m_PlaceholderBMP[i]->Enable(false);
|
// m_PlaceholderBMP[i]->Enable(false);
|
||||||
|
|
||||||
// You can enable the bitmap here:
|
/* You can enable the bitmap here. But it loads überslow on init... (only in windows, linux
|
||||||
// But it loads überslow on init... (only in windows, linux seems to load it fast!)
|
seems to load it fast!) AAaaand the XPM file (256 colours) looks crappier than the real bitmap...
|
||||||
// AAaaand the XPM file (256 colours) looks crappier than the real bitmap... so maybe we can find a way to use a bitmap?
|
so maybe we can find a way to use a bitmap? */
|
||||||
m_controllerimage[i] = new wxStaticBitmap(m_Controller[i], ID_CONTROLLERPICTURE, WxStaticBitmap1_BITMAP, wxPoint(98, 75), wxSize(421,304));
|
//m_controllerimage[i] = new wxStaticBitmap(m_pKeys[i], ID_CONTROLLERPICTURE, WxStaticBitmap1_BITMAP, wxPoint(l + 98, t + 75), wxSize(421,304));
|
||||||
|
//m_controllerimage[i] = new wxBitmap( WxStaticBitmap1_BITMAP );
|
||||||
|
|
||||||
|
// Paint background. This allows objects to be visible on top of the picture
|
||||||
|
m_pKeys[i]->Connect(wxID_ANY, wxEVT_PAINT,
|
||||||
|
wxPaintEventHandler(ConfigBox::OnPaint),
|
||||||
|
(wxObject*)0, this);
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
// Keys objects
|
||||||
|
// -----------------------------
|
||||||
|
// Left shoulder
|
||||||
|
m_JoyShoulderL[i] = new wxTextCtrl(m_pKeys[i], ID_SHOULDER_L, wxT("0"), wxPoint(l + 6, t + 80), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
||||||
|
m_JoyShoulderL[i]->Enable(false);
|
||||||
|
m_bJoyShoulderL[i] = new wxButton(m_pKeys[i], IDB_SHOULDER_L, wxEmptyString, wxPoint(l + 70, t + 82), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
||||||
|
|
||||||
|
// Left analog
|
||||||
|
int ALt = 170; int ALw = ALt + 14; int ALb = ALw + 2; // Set offset
|
||||||
|
m_JoyAnalogMainX[i] = new wxTextCtrl(m_pKeys[i], ID_ANALOG_MAIN_X, wxT("0"), wxPoint(l + 6, t + ALw), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
||||||
|
m_JoyAnalogMainX[i]->Enable(false);
|
||||||
|
m_JoyAnalogMainY[i] = new wxTextCtrl(m_pKeys[i], ID_ANALOG_MAIN_Y, wxT("0"), wxPoint(l + 6, t + ALw + 36), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
||||||
|
m_JoyAnalogMainY[i]->Enable(false);
|
||||||
|
m_bJoyAnalogMainX[i] = new wxButton(m_pKeys[i], IDB_ANALOG_MAIN_X, wxEmptyString, wxPoint(l + 70, t + ALb), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
||||||
|
m_bJoyAnalogMainY[i] = new wxButton(m_pKeys[i], IDB_ANALOG_MAIN_Y, wxEmptyString, wxPoint(l + 70, t + ALb + 36), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
||||||
|
m_textMainX[i] = new wxStaticText(m_pKeys[i], IDT_ANALOG_MAIN_X, wxT("X-axis"), wxPoint(l + 6, t + ALt), wxDefaultSize, 0, wxT("X-axis"));
|
||||||
|
m_textMainY[i] = new wxStaticText(m_pKeys[i], IDT_ANALOG_MAIN_Y, wxT("Y-axis"), wxPoint(l + 6, t + ALt + 36), wxDefaultSize, 0, wxT("Y-axis"));
|
||||||
|
|
||||||
|
// D-Pad
|
||||||
|
int DPt = 255; int DPw = DPt + 14; int DPb = DPw + 2; // Set offset
|
||||||
|
m_JoyDpadUp[i] = new wxTextCtrl(m_pKeys[i], ID_DPAD_UP, wxT("0"), wxPoint(l + 6, t + DPw), wxSize(59, t + 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
||||||
|
m_JoyDpadUp[i]->Enable(false);
|
||||||
|
m_JoyDpadDown[i] = new wxTextCtrl(m_pKeys[i], ID_DPAD_DOWN, wxT("0"), wxPoint(l + 6, t + DPw + 36*1), wxSize(59, t + 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
||||||
|
m_JoyDpadDown[i]->Enable(false);
|
||||||
|
m_JoyDpadLeft[i] = new wxTextCtrl(m_pKeys[i], ID_DPAD_LEFT, wxT("0"), wxPoint(l + 6, t + DPw + 36*2), wxSize(59, t + 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
||||||
|
m_JoyDpadLeft[i]->Enable(false);
|
||||||
|
m_JoyDpadRight[i] = new wxTextCtrl(m_pKeys[i], ID_DPAD_RIGHT, wxT("0"), wxPoint(l + 6, t + DPw + 36*3), wxSize(59, t + 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
||||||
|
m_JoyDpadRight[i]->Enable(false);
|
||||||
|
m_bJoyDpadUp[i] = new wxButton(m_pKeys[i], IDB_DPAD_UP, wxEmptyString, wxPoint(l + 70, t + DPb + 36*0), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
||||||
|
m_bJoyDpadDown[i] = new wxButton(m_pKeys[i], IDB_DPAD_DOWN, wxEmptyString, wxPoint(l + 70, t + DPb + 36*1), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
||||||
|
m_bJoyDpadLeft[i] = new wxButton(m_pKeys[i], IDB_DPAD_LEFT, wxEmptyString, wxPoint(l + 70, t + DPb + 36*2), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
||||||
|
m_bJoyDpadRight[i] = new wxButton(m_pKeys[i], IDB_DPAD_RIGHT, wxEmptyString, wxPoint(l + 70, t + DPb + 36*3), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
||||||
|
m_textDpadUp[i] = new wxStaticText(m_pKeys[i], IDT_DPAD_UP, wxT("Up"), wxPoint(l + 6, t + DPt + 36*0), wxDefaultSize, 0, wxT("Up"));
|
||||||
|
m_textDpadDown[i] = new wxStaticText(m_pKeys[i], IDT_DPAD_DOWN, wxT("Down"), wxPoint(l + 6, t + DPt + 36*1), wxDefaultSize, 0, wxT("Down"));
|
||||||
|
m_textDpadLeft[i] = new wxStaticText(m_pKeys[i], IDT_DPAD_LEFT, wxT("Left"), wxPoint(l + 6, t + DPt + 36*2), wxDefaultSize, 0, wxT("Left"));
|
||||||
|
m_textDpadRight[i] = new wxStaticText(m_pKeys[i], IDT_DPAD_RIGHT, wxT("Right"), wxPoint(l + 6, t + DPt + 36*3), wxDefaultSize, 0, wxT("Right"));
|
||||||
|
|
||||||
|
// Right side buttons
|
||||||
|
m_JoyShoulderR[i] = new wxTextCtrl(m_pKeys[i], ID_SHOULDER_R, wxT("0"), wxPoint(l + 552, t + 106), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
||||||
|
m_JoyShoulderR[i]->Enable(false);
|
||||||
|
m_JoyButtonA[i] = new wxTextCtrl(m_pKeys[i], ID_BUTTON_A, wxT("0"), wxPoint(l + 552, t + 280), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
||||||
|
m_JoyButtonA[i]->Enable(false);
|
||||||
|
m_JoyButtonB[i] = new wxTextCtrl(m_pKeys[i], ID_BUTTON_B, wxT("0"), wxPoint(l + 552, t + 80), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
||||||
|
m_JoyButtonB[i]->Enable(false);
|
||||||
|
m_JoyButtonX[i] = new wxTextCtrl(m_pKeys[i], ID_BUTTON_X, wxT("0"), wxPoint(l + 552, t + 242), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
||||||
|
m_JoyButtonX[i]->Enable(false);
|
||||||
|
m_JoyButtonY[i] = new wxTextCtrl(m_pKeys[i], ID_BUTTON_Y, wxT("0"), wxPoint(l + 552, t + 171), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
||||||
|
m_JoyButtonY[i]->Enable(false);
|
||||||
|
m_JoyButtonZ[i] = new wxTextCtrl(m_pKeys[i], ID_BUTTON_Z, wxT("0"), wxPoint(l + 552, t + 145), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
||||||
|
m_JoyButtonZ[i]->Enable(false);
|
||||||
|
m_bJoyShoulderR[i] = new wxButton(m_pKeys[i], IDB_SHOULDER_R, wxEmptyString, wxPoint(l + 526, t + 108), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
||||||
|
m_bJoyButtonA[i] = new wxButton(m_pKeys[i], IDB_BUTTON_A, wxEmptyString, wxPoint(l + 526, t + 282), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
||||||
|
m_bJoyButtonB[i] = new wxButton(m_pKeys[i], IDB_BUTTON_B, wxEmptyString, wxPoint(l + 526, t + 82), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
||||||
|
m_bJoyButtonX[i] = new wxButton(m_pKeys[i], IDB_BUTTON_X, wxEmptyString, wxPoint(l + 526, t + 244), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
||||||
|
m_bJoyButtonY[i] = new wxButton(m_pKeys[i], IDB_BUTTON_Y, wxEmptyString, wxPoint(l + 526, t + 173), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
||||||
|
m_bJoyButtonZ[i] = new wxButton(m_pKeys[i], IDB_BUTTON_Z, wxEmptyString, wxPoint(l + 526, t + 147), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
||||||
|
|
||||||
|
// C-buttons
|
||||||
|
m_JoyAnalogSubX[i] = new wxTextCtrl(m_pKeys[i], ID_ANALOG_SUB_X, wxT("0"), wxPoint(l + 552, t + 336), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
||||||
|
m_JoyAnalogSubX[i]->Enable(false);
|
||||||
|
m_JoyAnalogSubY[i] = new wxTextCtrl(m_pKeys[i], ID_ANALOG_SUB_Y, wxT("0"), wxPoint(l + 552, t + 373), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
||||||
|
m_JoyAnalogSubY[i]->Enable(false);
|
||||||
|
m_bJoyAnalogSubX[i] = new wxButton(m_pKeys[i], IDB_ANALOG_SUB_X, wxEmptyString, wxPoint(l + 526, t + 338), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
||||||
|
m_bJoyAnalogSubY[i] = new wxButton(m_pKeys[i], IDB_ANALOG_SUB_Y, wxEmptyString, wxPoint(l + 526, t + 375), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
||||||
|
m_textSubX[i] = new wxStaticText(m_pKeys[i], IDT_ANALOG_SUB_X, wxT("X-axis"), wxPoint(l + 552, t + 321), wxDefaultSize, 0, wxT("X-axis"));
|
||||||
|
m_textSubY[i] = new wxStaticText(m_pKeys[i], IDT_ANALOG_SUB_Y, wxT("Y-axis"), wxPoint(l + 552, t + 358), wxDefaultSize, 0, wxT("Y-axis"));
|
||||||
|
|
||||||
|
// Start button
|
||||||
|
m_bJoyButtonStart[i] = new wxButton(m_pKeys[i], IDB_BUTTONSTART, wxEmptyString, wxPoint(l + 284, t + 365), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
||||||
|
m_JoyButtonStart[i] = new wxTextCtrl(m_pKeys[i], ID_BUTTONSTART, wxT("0"), wxPoint(l + 220, t + 363), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
||||||
|
m_JoyButtonStart[i]->Enable(false);
|
||||||
|
|
||||||
|
// Website text
|
||||||
|
#ifdef _WIN32
|
||||||
|
m_textWebsite[i] = new wxStaticText(m_pKeys[i], IDT_WEBSITE, wxT("www.multigesture.net"), wxPoint(l + 400, t + 380), wxDefaultSize, 0, wxT("www.multigesture.net"));
|
||||||
|
#else
|
||||||
|
m_textWebsite[i] = new wxStaticText(m_Controller[i], IDT_WEBSITE, wxT("www.multigesture.net"), wxPoint(l + 480, t + 418), wxDefaultSize, 0, wxT("www.multigesture.net"));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
// Populate Controller sizer
|
||||||
|
// -----------------------------
|
||||||
|
// Groups
|
||||||
|
#ifdef _WIN32
|
||||||
|
m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, wxEmptyString, wxDefaultPosition, wxSize(476, 21), arrayStringFor_Joyname, 0, wxDefaultValidator, wxT("m_Joyname"));
|
||||||
|
m_Joyattach[i] = new wxCheckBox(m_Controller[i], IDC_JOYATTACH, wxT("Controller attached"), wxDefaultPosition, wxSize(109, 25), 0, wxDefaultValidator, wxT("Controller attached"));
|
||||||
|
#else
|
||||||
|
m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, wxEmptyString, wxDefaultPosition, wxSize(450, 25), arrayStringFor_Joyname, 0, wxDefaultValidator, wxT("m_Joyname"));
|
||||||
|
m_Joyattach[i] = new wxCheckBox(m_Controller[i], IDC_JOYATTACH, wxT("Controller attached"), wxDefaultPosition, wxSize(140, 25), 0, wxDefaultValidator, wxT("Controller attached"));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
m_gJoyname[i] = new wxStaticBoxSizer (wxHORIZONTAL, m_Controller[i], wxT("Controller:"));
|
||||||
|
m_gJoyname[i]->Add(m_Joyname[i], 0, (wxLEFT | wxRIGHT), 5);
|
||||||
|
m_gJoyname[i]->Add(m_Joyattach[i], 0, (wxRIGHT | wxLEFT | wxBOTTOM), 1);
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
// Populate settings sizer
|
||||||
|
// -----------------------------
|
||||||
|
|
||||||
|
// Extra settings members
|
||||||
|
m_gGBExtrasettings[i] = new wxGridBagSizer(0, 0);
|
||||||
|
m_JoyButtonHalfpress[i] = new wxTextCtrl(m_Controller[i], ID_BUTTONHALFPRESS, wxT("0"), wxDefaultPosition, wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
|
||||||
|
m_JoyButtonHalfpress[i]->Enable(false);
|
||||||
|
m_bJoyButtonHalfpress[i] = new wxButton(m_Controller[i], IDB_BUTTONHALFPRESS, wxEmptyString, wxPoint(231, 426), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
|
||||||
|
#ifdef _WIN32
|
||||||
|
m_Deadzone[i] = new wxComboBox(m_Controller[i], IDC_DEADZONE, wxEmptyString, wxDefaultPosition, wxSize(59, 21), arrayStringFor_Deadzone, 0, wxDefaultValidator, wxT("m_Deadzone"));
|
||||||
|
m_textDeadzone[i] = new wxStaticText(m_Controller[i], IDT_DEADZONE, wxT("Deadzone"), wxDefaultPosition, wxDefaultSize, 0, wxT("Deadzone"));
|
||||||
|
m_textHalfpress[i] = new wxStaticText(m_Controller[i], IDT_BUTTONHALFPRESS, wxT("Half press"), wxDefaultPosition, wxDefaultSize, 0, wxT("Half press"));
|
||||||
|
#else
|
||||||
|
m_Deadzone[i] = new wxComboBox(m_Controller[i], IDC_DEADZONE, wxEmptyString, wxPoint(167, 398), wxSize(80, 25), arrayStringFor_Deadzone, 0, wxDefaultValidator, wxT("m_Deadzone"));
|
||||||
|
m_textDeadzone[i] = new wxStaticText(m_Controller[i], IDT_DEADZONE, wxT("Deadzone"), wxPoint(105, 404), wxDefaultSize, 0, wxT("Deadzone"));
|
||||||
|
m_textHalfpress[i] = new wxStaticText(m_Controller[i], IDT_BUTTONHALFPRESS, wxT("Half press"), wxPoint(105, 428), wxDefaultSize, 0, wxT("Half press"));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Populate extra settings
|
||||||
|
m_gExtrasettings[i] = new wxStaticBoxSizer( wxVERTICAL, m_Controller[i], wxT("Extra settings"));
|
||||||
|
m_gGBExtrasettings[i]->Add(m_textDeadzone[i], wxGBPosition(0, 0), wxGBSpan(1, 1), (wxRIGHT | wxTOP), 2);
|
||||||
|
m_gGBExtrasettings[i]->Add(m_Deadzone[i], wxGBPosition(0, 1), wxGBSpan(1, 1), (wxBOTTOM), 2);
|
||||||
|
m_gGBExtrasettings[i]->Add(m_textHalfpress[i], wxGBPosition(1, 0), wxGBSpan(1, 1), (wxRIGHT | wxTOP), 2);
|
||||||
|
m_gGBExtrasettings[i]->Add(m_JoyButtonHalfpress[i], wxGBPosition(1, 1), wxGBSpan(1, 1), wxALL, 0);
|
||||||
|
m_gGBExtrasettings[i]->Add(m_bJoyButtonHalfpress[i], wxGBPosition(1, 2), wxGBSpan(1, 1), (wxLEFT | wxTOP), 2);
|
||||||
|
m_gExtrasettings[i]->Add(m_gGBExtrasettings[i], 0, wxEXPAND | wxALL, 3);
|
||||||
|
|
||||||
|
// Populate controller typ
|
||||||
|
m_gControllertype[i] = new wxStaticBoxSizer( wxVERTICAL, m_Controller[i], wxT("Controller type"));
|
||||||
|
#ifdef _WIN32
|
||||||
|
m_Controltype[i] = new wxComboBox(m_Controller[i], IDC_CONTROLTYPE, wxEmptyString, wxDefaultPosition, wxSize(131, 21), arrayStringFor_Controltype, 0, wxDefaultValidator, wxT("m_Controltype"));
|
||||||
|
#else
|
||||||
|
m_Controltype[i] = new wxComboBox(m_Controller[i], IDC_CONTROLTYPE, wxEmptyString, wxDefaultPosition, wxSize(150, 25), arrayStringFor_Controltype, 0, wxDefaultValidator, wxT("m_Controltype"));
|
||||||
|
#endif
|
||||||
|
m_gControllertype[i]->Add(m_Controltype[i], 0, wxEXPAND | wxALL, 3);
|
||||||
|
|
||||||
|
// Populate input status
|
||||||
|
/*
|
||||||
|
m_gStatusIn[i] = new wxStaticBoxSizer( wxVERTICAL, m_Controller[i], wxT("In"));
|
||||||
|
CreateAdvancedControls(i);
|
||||||
|
m_gStatusIn[i]->Add(m_pInStatus[i], 0, wxALL, 0);
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Populate settings
|
||||||
|
m_sSettings[i] = new wxBoxSizer ( wxHORIZONTAL );
|
||||||
|
m_sSettings[i]->Add(m_gExtrasettings[i], 0, wxEXPAND | wxALL, 0);
|
||||||
|
m_sSettings[i]->Add(m_gControllertype[i], 0, wxEXPAND | wxLEFT, 5);
|
||||||
|
//m_sSettings[i]->Add(m_gStatusIn[i], 0, wxLEFT, 5);
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
// Populate main sizer
|
||||||
|
// -----------------------------
|
||||||
|
m_sMain[i] = new wxBoxSizer(wxVERTICAL);
|
||||||
|
m_sMain[i]->Add(m_gJoyname[i], 0, wxEXPAND | (wxALL), 5);
|
||||||
|
m_sMain[i]->Add(m_sKeys[i], 1, wxEXPAND | (wxLEFT | wxRIGHT), 5);
|
||||||
|
m_sMain[i]->Add(m_sSettings[i], 0, wxEXPAND | (wxALL), 5);
|
||||||
|
m_Controller[i]->SetSizer(m_sMain[i]); // Set the main sizer
|
||||||
|
|
||||||
|
|
||||||
|
// Disable when running
|
||||||
if(emulator_running)
|
if(emulator_running)
|
||||||
{
|
{
|
||||||
m_Joyname[i]->Enable(false);
|
m_Joyname[i]->Enable(false);
|
||||||
|
@ -271,20 +399,48 @@ void ConfigBox::CreateGUIControls()
|
||||||
m_Controltype[i]->Enable(false);
|
m_Controltype[i]->Enable(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set dialog items
|
||||||
SetControllerAll(i);
|
SetControllerAll(i);
|
||||||
}
|
} // end of loop
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
// Populate buttons sizer.
|
||||||
|
// -----------------------------
|
||||||
|
wxBoxSizer * m_sButtons = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
m_sButtons->Add(m_About, 0, (wxBOTTOM), 0);
|
||||||
|
m_sButtons->AddStretchSpacer(1);
|
||||||
|
m_sButtons->Add(m_OK, 0, wxALIGN_RIGHT | (wxBOTTOM), 0);
|
||||||
|
m_sButtons->Add(m_Cancel, 0, wxALIGN_RIGHT | (wxLEFT), 5);
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
// Populate master sizer.
|
||||||
|
// -----------------------------
|
||||||
|
wxBoxSizer * m_MainSizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
m_MainSizer->Add(m_Notebook, 0, wxEXPAND | wxALL, 5);
|
||||||
|
m_MainSizer->Add(m_sButtons, 1, wxEXPAND | ( wxLEFT | wxRIGHT | wxBOTTOM), 5);
|
||||||
|
this->SetSizer(m_MainSizer);
|
||||||
|
|
||||||
|
// Set window size
|
||||||
|
SetClientSize(m_MainSizer->GetMinSize().GetWidth(), m_MainSizer->GetMinSize().GetHeight());
|
||||||
|
Center();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Close window
|
||||||
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
void ConfigBox::OnClose(wxCloseEvent& /*event*/)
|
void ConfigBox::OnClose(wxCloseEvent& /*event*/)
|
||||||
{
|
{
|
||||||
EndModal(0);
|
EndModal(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigBox::AboutClick(wxCommandEvent& event)
|
|
||||||
{
|
|
||||||
// Call about dialog
|
// Call about dialog
|
||||||
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
#ifdef _WIN32
|
void ConfigBox::AboutClick(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
wxWindow win;
|
wxWindow win;
|
||||||
win.SetHWND((WXHWND)this->GetHWND());
|
win.SetHWND((WXHWND)this->GetHWND());
|
||||||
win.Enable(false);
|
win.Enable(false);
|
||||||
|
@ -294,12 +450,13 @@ void ConfigBox::AboutClick(wxCommandEvent& event)
|
||||||
|
|
||||||
win.Enable(true);
|
win.Enable(true);
|
||||||
win.SetHWND(0);
|
win.SetHWND(0);
|
||||||
#else
|
#else
|
||||||
AboutBox frame(NULL);
|
AboutBox frame(NULL);
|
||||||
frame.ShowModal();
|
frame.ShowModal();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ConfigBox::OKClick(wxCommandEvent& event)
|
void ConfigBox::OKClick(wxCommandEvent& event)
|
||||||
{
|
{
|
||||||
if (event.GetId() == ID_OK)
|
if (event.GetId() == ID_OK)
|
||||||
|
@ -370,7 +527,7 @@ void ConfigBox::SetControllerAll(int controller)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get dialog items
|
// Get dialog items. Collect button identification.
|
||||||
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
void ConfigBox::GetControllerAll(int controller)
|
void ConfigBox::GetControllerAll(int controller)
|
||||||
{
|
{
|
||||||
|
@ -414,6 +571,7 @@ void ConfigBox::GetControllerAll(int controller)
|
||||||
joysticks[controller].deadzone = m_Deadzone[controller]->GetSelection();
|
joysticks[controller].deadzone = m_Deadzone[controller]->GetSelection();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ConfigBox::UpdateVisibleItems(int controller)
|
void ConfigBox::UpdateVisibleItems(int controller)
|
||||||
{
|
{
|
||||||
if(joysticks[controller].controllertype)
|
if(joysticks[controller].controllertype)
|
||||||
|
@ -463,8 +621,7 @@ void ConfigBox::ChangeControllertype(wxCommandEvent& event)
|
||||||
joysticks[2].controllertype = m_Controltype[2]->GetSelection();
|
joysticks[2].controllertype = m_Controltype[2]->GetSelection();
|
||||||
joysticks[3].controllertype = m_Controltype[3]->GetSelection();
|
joysticks[3].controllertype = m_Controltype[3]->GetSelection();
|
||||||
|
|
||||||
for(int i=0; i<4 ;i++)
|
for(int i=0; i<4 ;i++) UpdateVisibleItems(i);
|
||||||
UpdateVisibleItems(i);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigBox::NotebookPageChanged(wxNotebookEvent& event)
|
void ConfigBox::NotebookPageChanged(wxNotebookEvent& event)
|
||||||
|
@ -585,6 +742,7 @@ void ConfigBox::SetButtonText(int id, char text[128])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Wait for button press
|
// Wait for button press
|
||||||
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
void ConfigBox::GetButtons(wxCommandEvent& event)
|
void ConfigBox::GetButtons(wxCommandEvent& event)
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
//
|
//
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
#ifndef __CONFIGBOX_h__
|
#ifndef __CONFIGBOX_h__
|
||||||
#define __CONFIGBOX_h__
|
#define __CONFIGBOX_h__
|
||||||
|
|
||||||
|
@ -45,6 +46,7 @@
|
||||||
#include <wx/notebook.h>
|
#include <wx/notebook.h>
|
||||||
#include <wx/panel.h>
|
#include <wx/panel.h>
|
||||||
#include <wx/statbmp.h>
|
#include <wx/statbmp.h>
|
||||||
|
#include <wx/gbsizer.h>
|
||||||
|
|
||||||
|
|
||||||
class ConfigBox : public wxDialog
|
class ConfigBox : public wxDialog
|
||||||
|
@ -53,10 +55,17 @@ class ConfigBox : public wxDialog
|
||||||
DECLARE_EVENT_TABLE();
|
DECLARE_EVENT_TABLE();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ConfigBox(wxWindow *parent, wxWindowID id = 1, const wxString &title = wxT("Configure: nJoy Input Plugin"),
|
ConfigBox(wxWindow *parent, wxWindowID id = 1,
|
||||||
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE);
|
const wxString &title = wxT("Configure: nJoy Input Plugin"),
|
||||||
|
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
|
||||||
|
long style = wxDEFAULT_DIALOG_STYLE);
|
||||||
virtual ~ConfigBox();
|
virtual ~ConfigBox();
|
||||||
|
|
||||||
|
#if wxUSE_TIMER
|
||||||
|
void OnTimer(wxTimerEvent& WXUNUSED(event)) { Update(); }
|
||||||
|
wxTimer m_timer;
|
||||||
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
wxButton *m_About;
|
wxButton *m_About;
|
||||||
wxButton *m_OK;
|
wxButton *m_OK;
|
||||||
|
@ -65,15 +74,21 @@ class ConfigBox : public wxDialog
|
||||||
wxPanel *m_Controller[4];
|
wxPanel *m_Controller[4];
|
||||||
wxNotebook *m_Notebook;
|
wxNotebook *m_Notebook;
|
||||||
|
|
||||||
|
wxPanel * m_pKeys[4], * m_pInStatus[4];
|
||||||
|
wxBitmap WxStaticBitmap1_BITMAP;
|
||||||
|
wxStaticBoxSizer * m_sKeys[4];
|
||||||
|
wxBoxSizer * m_sMain[4], * m_sSettings[4];
|
||||||
|
|
||||||
wxComboBox *m_Joyname[4];
|
wxComboBox *m_Joyname[4];
|
||||||
wxComboBox *m_Controltype[4];
|
wxComboBox *m_Controltype[4];
|
||||||
wxComboBox *m_Deadzone[4];
|
wxComboBox *m_Deadzone[4];
|
||||||
|
|
||||||
wxCheckBox *m_Joyattach[4];
|
wxCheckBox *m_Joyattach[4];
|
||||||
|
wxStaticBoxSizer *m_gJoyname[4];
|
||||||
|
|
||||||
wxStaticBox *m_gJoyname[4];
|
wxStaticBoxSizer *m_gExtrasettings[4]; wxGridBagSizer * m_gGBExtrasettings[4]; // Settings
|
||||||
wxStaticBox *m_gExtrasettings[4];
|
wxStaticBoxSizer *m_gControllertype[4];
|
||||||
wxStaticBox *m_gControllertype[4];
|
wxStaticBoxSizer *m_gStatusIn[4];
|
||||||
|
|
||||||
wxTextCtrl *m_JoyShoulderL[4];
|
wxTextCtrl *m_JoyShoulderL[4];
|
||||||
wxTextCtrl *m_JoyShoulderR[4];
|
wxTextCtrl *m_JoyShoulderR[4];
|
||||||
|
@ -130,7 +145,7 @@ class ConfigBox : public wxDialog
|
||||||
wxStaticText *m_textWebsite[4];
|
wxStaticText *m_textWebsite[4];
|
||||||
|
|
||||||
wxTextCtrl *m_PlaceholderBMP[4];
|
wxTextCtrl *m_PlaceholderBMP[4];
|
||||||
wxStaticBitmap *m_controllerimage[4];
|
wxStaticBitmap *m_controllerimage[4], *m_bmpSquare[4], *m_bmpDot[4];
|
||||||
|
|
||||||
int notebookpage;
|
int notebookpage;
|
||||||
private:
|
private:
|
||||||
|
@ -145,6 +160,10 @@ class ConfigBox : public wxDialog
|
||||||
ID_CONTROLLERPAGE3,
|
ID_CONTROLLERPAGE3,
|
||||||
ID_CONTROLLERPAGE4,
|
ID_CONTROLLERPAGE4,
|
||||||
|
|
||||||
|
ID_INSTATUS1, ID_INSTATUS2, ID_INSTATUS3, ID_INSTATUS4, // Advanced status
|
||||||
|
|
||||||
|
ID_KEYSPANEL1, ID_KEYSPANEL2, ID_KEYSPANEL3, ID_KEYSPANEL4,
|
||||||
|
|
||||||
IDC_JOYNAME,
|
IDC_JOYNAME,
|
||||||
IDC_CONTROLTYPE,
|
IDC_CONTROLTYPE,
|
||||||
IDC_DEADZONE,
|
IDC_DEADZONE,
|
||||||
|
@ -154,6 +173,8 @@ class ConfigBox : public wxDialog
|
||||||
IDG_EXTRASETTINGS,
|
IDG_EXTRASETTINGS,
|
||||||
IDG_CONTROLLERTYPE,
|
IDG_CONTROLLERTYPE,
|
||||||
ID_CONTROLLERPICTURE,
|
ID_CONTROLLERPICTURE,
|
||||||
|
ID_STATUSBMP1, ID_STATUSBMP2, ID_STATUSBMP3, ID_STATUSBMP4,
|
||||||
|
ID_STATUSDOTBMP1, ID_STATUSDOTBMP2, ID_STATUSDOTBMP3, ID_STATUSDOTBMP4,
|
||||||
|
|
||||||
ID_SHOULDER_L = 2000,
|
ID_SHOULDER_L = 2000,
|
||||||
ID_SHOULDER_R,
|
ID_SHOULDER_R,
|
||||||
|
@ -221,7 +242,9 @@ class ConfigBox : public wxDialog
|
||||||
void ChangeControllertype(wxCommandEvent& event);
|
void ChangeControllertype(wxCommandEvent& event);
|
||||||
|
|
||||||
void OnClose(wxCloseEvent& event);
|
void OnClose(wxCloseEvent& event);
|
||||||
void CreateGUIControls();
|
void CreateGUIControls(); void CreateAdvancedControls(int i);
|
||||||
|
wxBitmap CreateBitmap(); wxBitmap CreateBitmapDot();
|
||||||
|
void PadGetStatus(); void Update();
|
||||||
|
|
||||||
void SetControllerAll(int controller);
|
void SetControllerAll(int controller);
|
||||||
void UpdateVisibleItems(int controller);
|
void UpdateVisibleItems(int controller);
|
||||||
|
@ -233,6 +256,8 @@ class ConfigBox : public wxDialog
|
||||||
void GetHats(int ID);
|
void GetHats(int ID);
|
||||||
void GetAxis(wxCommandEvent& event);
|
void GetAxis(wxCommandEvent& event);
|
||||||
|
|
||||||
|
void OnPaint(wxPaintEvent &event);
|
||||||
|
|
||||||
void SetButtonText(int id, char text[128]);
|
void SetButtonText(int id, char text[128]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,394 @@
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Project description
|
||||||
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
|
// 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
|
||||||
|
// ¯¯¯¯¯¯¯¯¯
|
||||||
|
#include "nJoy.h"
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Enable or disable rumble. Set USE_RUMBLE_DINPUT_HACK in nJoy.h
|
||||||
|
// ¯¯¯¯¯¯¯¯¯
|
||||||
|
#ifdef USE_RUMBLE_DINPUT_HACK
|
||||||
|
bool g_rumbleEnable = FALSE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Rumble in windows
|
||||||
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
#ifdef USE_RUMBLE_DINPUT_HACK
|
||||||
|
LPDIRECTINPUT8 g_pDI = NULL;
|
||||||
|
LPDIRECTINPUTDEVICE8 g_pDevice = NULL;
|
||||||
|
LPDIRECTINPUTEFFECT g_pEffect = NULL;
|
||||||
|
|
||||||
|
DWORD g_dwNumForceFeedbackAxis = 0;
|
||||||
|
INT g_nXForce = 0;
|
||||||
|
INT g_nYForce = 0;
|
||||||
|
|
||||||
|
#define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p)=NULL; } }
|
||||||
|
|
||||||
|
HRESULT InitDirectInput(HWND hDlg);
|
||||||
|
//VOID FreeDirectInput();
|
||||||
|
BOOL CALLBACK EnumFFDevicesCallback(const DIDEVICEINSTANCE* pInst, VOID* pContext);
|
||||||
|
BOOL CALLBACK EnumAxesCallback(const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext);
|
||||||
|
HRESULT SetDeviceForcesXY();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined(__linux__)
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
int fd;
|
||||||
|
char device_file_name[64];
|
||||||
|
struct ff_effect effect;
|
||||||
|
bool CanRumble = false;
|
||||||
|
#endif
|
||||||
|
//////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Set PAD rumble. Explanation: Stop = 0, Rumble = 1
|
||||||
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
|
void PAD_Rumble(u8 _numPAD, unsigned int _uType, unsigned int _uStrength)
|
||||||
|
{
|
||||||
|
//if (_numPAD > 0)
|
||||||
|
// return;
|
||||||
|
|
||||||
|
// SDL can't rumble the gamepad so we need to use platform specific code
|
||||||
|
#ifdef _WIN32
|
||||||
|
#ifdef USE_RUMBLE_DINPUT_HACK
|
||||||
|
static int a = 0;
|
||||||
|
|
||||||
|
if ((_uType == 0) || (_uType == 2))
|
||||||
|
{
|
||||||
|
a = 0;
|
||||||
|
}
|
||||||
|
else if (_uType == 1)
|
||||||
|
{
|
||||||
|
a = _uStrength > 2 ? 8000 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a = int ((float)a * 0.96f);
|
||||||
|
|
||||||
|
if (!g_rumbleEnable)
|
||||||
|
{
|
||||||
|
a = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_nYForce = a;
|
||||||
|
SetDeviceForcesXY();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#elif defined(__linux__)
|
||||||
|
struct input_event event;
|
||||||
|
if (CanRumble)
|
||||||
|
{
|
||||||
|
if (_uType == 1)
|
||||||
|
{
|
||||||
|
event.type = EV_FF;
|
||||||
|
event.code = effect.id;
|
||||||
|
event.value = 1;
|
||||||
|
if (write(fd, (const void*) &event, sizeof(event)) == -1) {
|
||||||
|
perror("Play effect");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((_uType == 0) || (_uType == 2))
|
||||||
|
{
|
||||||
|
event.type = EV_FF;
|
||||||
|
event.code = effect.id;
|
||||||
|
event.value = 0;
|
||||||
|
if (write(fd, (const void*) &event, sizeof(event)) == -1) {
|
||||||
|
perror("Stop effect");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Use PAD rumble
|
||||||
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
|
void PAD_Use_Rumble(u8 _numPAD, SPADStatus* _pPADStatus)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
#ifdef USE_RUMBLE_DINPUT_HACK
|
||||||
|
|
||||||
|
// Enable or disable rumble
|
||||||
|
if (joystate[_numPAD].halfpress)
|
||||||
|
if (!g_pDI)
|
||||||
|
if (FAILED(InitDirectInput(m_hWnd)))
|
||||||
|
{
|
||||||
|
MessageBox(NULL, SDL_GetError(), "Could not initialize DirectInput!", MB_ICONERROR);
|
||||||
|
g_rumbleEnable = FALSE;
|
||||||
|
//return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_rumbleEnable = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_rumbleEnable)
|
||||||
|
{
|
||||||
|
g_pDevice->Acquire();
|
||||||
|
|
||||||
|
if (g_pEffect) g_pEffect->Start(1, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#elif defined(__linux__)
|
||||||
|
if (!fd)
|
||||||
|
{
|
||||||
|
sprintf(device_file_name, "/dev/input/event%d", joysticks[_numPAD].eventnum); //TODO: Make dynamic //
|
||||||
|
|
||||||
|
/* Open device */
|
||||||
|
fd = open(device_file_name, O_RDWR);
|
||||||
|
if (fd == -1) {
|
||||||
|
perror("Open device file");
|
||||||
|
//Something wrong, probably permissions, just return now
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int n_effects = 0;
|
||||||
|
if (ioctl(fd, EVIOCGEFFECTS, &n_effects) == -1) {
|
||||||
|
perror("Ioctl number of effects");
|
||||||
|
}
|
||||||
|
if (n_effects > 0)
|
||||||
|
CanRumble = true;
|
||||||
|
else
|
||||||
|
return; // Return since we can't do any effects
|
||||||
|
/* a strong rumbling effect */
|
||||||
|
effect.type = FF_RUMBLE;
|
||||||
|
effect.id = -1;
|
||||||
|
effect.u.rumble.strong_magnitude = 0x8000;
|
||||||
|
effect.u.rumble.weak_magnitude = 0;
|
||||||
|
effect.replay.length = 5000; // Set to 5 seconds, if a Game needs more for a single rumble event, it is dumb and must be a demo
|
||||||
|
effect.replay.delay = 0;
|
||||||
|
if (ioctl(fd, EVIOCSFF, &effect) == -1) {
|
||||||
|
perror("Upload effect");
|
||||||
|
CanRumble = false; //We have effects but it doesn't support the rumble we are using. This is basic rumble, should work for most
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Rumble stuff :D!
|
||||||
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
|
//
|
||||||
|
#ifdef USE_RUMBLE_DINPUT_HACK
|
||||||
|
HRESULT InitDirectInput( HWND hDlg )
|
||||||
|
{
|
||||||
|
DIPROPDWORD dipdw;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
// Register with the DirectInput subsystem and get a pointer to a IDirectInput interface we can use.
|
||||||
|
if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (VOID**)&g_pDI, NULL)))
|
||||||
|
{
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Look for a force feedback device we can use
|
||||||
|
if (FAILED(hr = g_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL, EnumFFDevicesCallback, NULL, DIEDFL_ATTACHEDONLY | DIEDFL_FORCEFEEDBACK)))
|
||||||
|
{
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL == g_pDevice)
|
||||||
|
{
|
||||||
|
MessageBox(NULL, "Force feedback device not found. nJoy will now disable rumble." ,"FFConst" , MB_ICONERROR | MB_OK);
|
||||||
|
g_rumbleEnable = FALSE;
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the data format to "simple joystick" - a predefined data format. A
|
||||||
|
// data format specifies which controls on a device we are interested in,
|
||||||
|
// and how they should be reported.
|
||||||
|
//
|
||||||
|
// This tells DirectInput that we will be passing a DIJOYSTATE structure to
|
||||||
|
// IDirectInputDevice8::GetDeviceState(). Even though we won't actually do
|
||||||
|
// it in this sample. But setting the data format is important so that the
|
||||||
|
// DIJOFS_* values work properly.
|
||||||
|
if (FAILED(hr = g_pDevice->SetDataFormat(&c_dfDIJoystick)))
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
// Set the cooperative level to let DInput know how this device should
|
||||||
|
// interact with the system and with other DInput applications.
|
||||||
|
// Exclusive access is required in order to perform force feedback.
|
||||||
|
//if (FAILED(hr = g_pDevice->SetCooperativeLevel(hDlg, DISCL_EXCLUSIVE | DISCL_FOREGROUND)))
|
||||||
|
|
||||||
|
if (FAILED(hr = g_pDevice->SetCooperativeLevel(hDlg, DISCL_EXCLUSIVE | DISCL_FOREGROUND)))
|
||||||
|
{
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Since we will be playing force feedback effects, we should disable the
|
||||||
|
// auto-centering spring.
|
||||||
|
dipdw.diph.dwSize = sizeof(DIPROPDWORD);
|
||||||
|
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
|
||||||
|
dipdw.diph.dwObj = 0;
|
||||||
|
dipdw.diph.dwHow = DIPH_DEVICE;
|
||||||
|
dipdw.dwData = FALSE;
|
||||||
|
|
||||||
|
if (FAILED(hr = g_pDevice->SetProperty(DIPROP_AUTOCENTER, &dipdw.diph)))
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
// Enumerate and count the axes of the joystick
|
||||||
|
if (FAILED(hr = g_pDevice->EnumObjects(EnumAxesCallback, (VOID*)&g_dwNumForceFeedbackAxis, DIDFT_AXIS)))
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
// This simple sample only supports one or two axis joysticks
|
||||||
|
if (g_dwNumForceFeedbackAxis > 2)
|
||||||
|
g_dwNumForceFeedbackAxis = 2;
|
||||||
|
|
||||||
|
// This application needs only one effect: Applying raw forces.
|
||||||
|
DWORD rgdwAxes[2] = {DIJOFS_X, DIJOFS_Y};
|
||||||
|
LONG rglDirection[2] = {0, 0};
|
||||||
|
DICONSTANTFORCE cf = {0};
|
||||||
|
|
||||||
|
DIEFFECT eff;
|
||||||
|
ZeroMemory(&eff, sizeof(eff));
|
||||||
|
eff.dwSize = sizeof(DIEFFECT);
|
||||||
|
eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
|
||||||
|
eff.dwDuration = INFINITE;
|
||||||
|
eff.dwSamplePeriod = 0;
|
||||||
|
eff.dwGain = DI_FFNOMINALMAX;
|
||||||
|
eff.dwTriggerButton = DIEB_NOTRIGGER;
|
||||||
|
eff.dwTriggerRepeatInterval = 0;
|
||||||
|
eff.cAxes = g_dwNumForceFeedbackAxis;
|
||||||
|
eff.rgdwAxes = rgdwAxes;
|
||||||
|
eff.rglDirection = rglDirection;
|
||||||
|
eff.lpEnvelope = 0;
|
||||||
|
eff.cbTypeSpecificParams = sizeof( DICONSTANTFORCE );
|
||||||
|
eff.lpvTypeSpecificParams = &cf;
|
||||||
|
eff.dwStartDelay = 0;
|
||||||
|
|
||||||
|
// Create the prepared effect
|
||||||
|
if (FAILED(hr = g_pDevice->CreateEffect(GUID_ConstantForce, &eff, &g_pEffect, NULL)))
|
||||||
|
{
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL == g_pEffect)
|
||||||
|
return E_FAIL;
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID FreeDirectInput()
|
||||||
|
{
|
||||||
|
// Unacquire the device one last time just in case
|
||||||
|
// the app tried to exit while the device is still acquired.
|
||||||
|
if (g_pDevice)
|
||||||
|
g_pDevice->Unacquire();
|
||||||
|
|
||||||
|
// Release any DirectInput objects.
|
||||||
|
SAFE_RELEASE(g_pEffect);
|
||||||
|
SAFE_RELEASE(g_pDevice);
|
||||||
|
SAFE_RELEASE(g_pDI);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL CALLBACK EnumFFDevicesCallback( const DIDEVICEINSTANCE* pInst, VOID* pContext )
|
||||||
|
{
|
||||||
|
LPDIRECTINPUTDEVICE8 pDevice;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
// Obtain an interface to the enumerated force feedback device.
|
||||||
|
hr = g_pDI->CreateDevice(pInst->guidInstance, &pDevice, NULL);
|
||||||
|
|
||||||
|
// If it failed, then we can't use this device for some bizarre reason.
|
||||||
|
// (Maybe the user unplugged it while we were in the middle of enumerating it.) So continue enumerating
|
||||||
|
if (FAILED(hr))
|
||||||
|
return DIENUM_CONTINUE;
|
||||||
|
|
||||||
|
// We successfully created an IDirectInputDevice8. So stop looking for another one.
|
||||||
|
g_pDevice = pDevice;
|
||||||
|
|
||||||
|
return DIENUM_STOP;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL CALLBACK EnumAxesCallback(const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext)
|
||||||
|
{
|
||||||
|
DWORD* pdwNumForceFeedbackAxis = (DWORD*)pContext;
|
||||||
|
if ((pdidoi->dwFlags & DIDOI_FFACTUATOR) != 0)
|
||||||
|
(*pdwNumForceFeedbackAxis)++;
|
||||||
|
|
||||||
|
return DIENUM_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT SetDeviceForcesXY()
|
||||||
|
{
|
||||||
|
// Modifying an effect is basically the same as creating a new one, except you need only specify the parameters you are modifying
|
||||||
|
LONG rglDirection[2] = { 0, 0 };
|
||||||
|
|
||||||
|
DICONSTANTFORCE cf;
|
||||||
|
|
||||||
|
if (g_dwNumForceFeedbackAxis == 1)
|
||||||
|
{
|
||||||
|
// If only one force feedback axis, then apply only one direction and keep the direction at zero
|
||||||
|
cf.lMagnitude = g_nXForce;
|
||||||
|
rglDirection[0] = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If two force feedback axis, then apply magnitude from both directions
|
||||||
|
rglDirection[0] = g_nXForce;
|
||||||
|
rglDirection[1] = g_nYForce;
|
||||||
|
cf.lMagnitude = (DWORD)sqrt((double)g_nXForce * (double)g_nXForce + (double)g_nYForce * (double)g_nYForce );
|
||||||
|
}
|
||||||
|
|
||||||
|
DIEFFECT eff;
|
||||||
|
ZeroMemory(&eff, sizeof(eff));
|
||||||
|
eff.dwSize = sizeof(DIEFFECT);
|
||||||
|
eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
|
||||||
|
eff.cAxes = g_dwNumForceFeedbackAxis;
|
||||||
|
eff.rglDirection = rglDirection;
|
||||||
|
eff.lpEnvelope = 0;
|
||||||
|
eff.cbTypeSpecificParams = sizeof(DICONSTANTFORCE);
|
||||||
|
eff.lpvTypeSpecificParams = &cf;
|
||||||
|
eff.dwStartDelay = 0;
|
||||||
|
|
||||||
|
// Now set the new parameters and start the effect immediately.
|
||||||
|
return g_pEffect->SetParameters(&eff, DIEP_DIRECTION | DIEP_TYPESPECIFICPARAMS | DIEP_START);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -11,11 +11,14 @@ if not env['HAVE_SDL']:
|
||||||
Return()
|
Return()
|
||||||
|
|
||||||
files = [
|
files = [
|
||||||
|
'Config.cpp',
|
||||||
'nJoy.cpp',
|
'nJoy.cpp',
|
||||||
|
'Rumble.cpp',
|
||||||
]
|
]
|
||||||
if padenv['HAVE_WX']:
|
if padenv['HAVE_WX']:
|
||||||
files += [
|
files += [
|
||||||
'GUI/AboutBox.cpp',
|
'GUI/AboutBox.cpp',
|
||||||
|
'GUI/ConfigAdvanced.cpp',
|
||||||
'GUI/ConfigBox.cpp',
|
'GUI/ConfigBox.cpp',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -29,73 +29,52 @@
|
||||||
//
|
//
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////
|
||||||
|
// Include
|
||||||
|
// ¯¯¯¯¯¯¯¯¯
|
||||||
#include "nJoy.h"
|
#include "nJoy.h"
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Variables
|
// Variables
|
||||||
// ¯¯¯¯¯¯¯¯¯
|
// ¯¯¯¯¯¯¯¯¯
|
||||||
|
|
||||||
|
// Rumble in windows
|
||||||
|
#define _CONTROLLER_STATE_H // avoid certain declarations in nJoy.h
|
||||||
FILE *pFile;
|
FILE *pFile;
|
||||||
HINSTANCE nJoy_hInst = NULL;
|
HINSTANCE nJoy_hInst = NULL;
|
||||||
CONTROLLER_INFO *joyinfo = 0;
|
CONTROLLER_INFO *joyinfo = 0;
|
||||||
CONTROLLER_STATE joystate[4];
|
CONTROLLER_STATE joystate[4];
|
||||||
CONTROLLER_MAPPING joysticks[4];
|
CONTROLLER_MAPPING joysticks[4];
|
||||||
bool emulator_running = FALSE;
|
bool emulator_running = FALSE;
|
||||||
|
HWND m_hWnd; // Handle to window
|
||||||
|
|
||||||
// Handle to window
|
// Rumble
|
||||||
HWND m_hWnd;
|
|
||||||
|
|
||||||
#ifdef USE_RUMBLE_DINPUT_HACK
|
|
||||||
bool g_rumbleEnable = FALSE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Rumble in windows
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
#ifdef USE_RUMBLE_DINPUT_HACK
|
|
||||||
LPDIRECTINPUT8 g_pDI = NULL;
|
|
||||||
LPDIRECTINPUTDEVICE8 g_pDevice = NULL;
|
|
||||||
LPDIRECTINPUTEFFECT g_pEffect = NULL;
|
|
||||||
|
|
||||||
DWORD g_dwNumForceFeedbackAxis = 0;
|
|
||||||
INT g_nXForce = 0;
|
|
||||||
INT g_nYForce = 0;
|
|
||||||
|
|
||||||
#define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p)=NULL; } }
|
|
||||||
|
|
||||||
HRESULT InitDirectInput(HWND hDlg);
|
|
||||||
VOID FreeDirectInput();
|
|
||||||
BOOL CALLBACK EnumFFDevicesCallback(const DIDEVICEINSTANCE* pInst, VOID* pContext);
|
|
||||||
BOOL CALLBACK EnumAxesCallback(const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext);
|
|
||||||
HRESULT SetDeviceForcesXY();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif defined(__linux__)
|
#elif defined(__linux__)
|
||||||
#include <sys/types.h>
|
extern int fd;
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
|
|
||||||
int fd;
|
|
||||||
char device_file_name[64];
|
|
||||||
struct ff_effect effect;
|
|
||||||
bool CanRumble = false;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(HAVE_WX) && HAVE_WX
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// wxWidgets
|
// wxWidgets
|
||||||
// ¯¯¯¯¯¯¯¯¯
|
// ¯¯¯¯¯¯¯¯¯
|
||||||
class wxDLLApp : public wxApp
|
#if defined(HAVE_WX) && HAVE_WX
|
||||||
{
|
class wxDLLApp : public wxApp
|
||||||
|
{
|
||||||
bool OnInit()
|
bool OnInit()
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
IMPLEMENT_APP_NO_MAIN(wxDLLApp)
|
IMPLEMENT_APP_NO_MAIN(wxDLLApp)
|
||||||
WXDLLIMPEXP_BASE void wxSetInstance(HINSTANCE hInst);
|
WXDLLIMPEXP_BASE void wxSetInstance(HINSTANCE hInst);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// DllMain
|
// DllMain
|
||||||
// ¯¯¯¯¯¯¯
|
// ¯¯¯¯¯¯¯
|
||||||
|
@ -181,10 +160,12 @@ void DllConfig(HWND _hParent)
|
||||||
}
|
}
|
||||||
|
|
||||||
LoadConfig(); // load settings
|
LoadConfig(); // load settings
|
||||||
#if defined(HAVE_WX) && HAVE_WX
|
|
||||||
|
#if defined(HAVE_WX) && HAVE_WX
|
||||||
ConfigBox frame(NULL);
|
ConfigBox frame(NULL);
|
||||||
frame.ShowModal();
|
frame.ShowModal();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -258,6 +239,7 @@ void PAD_Shutdown()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Set PAD status
|
// Set PAD status
|
||||||
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
|
void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
|
||||||
|
@ -265,10 +247,10 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
|
||||||
if (!joysticks[_numPAD].enabled)
|
if (!joysticks[_numPAD].enabled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// clear pad status
|
// Clear pad status
|
||||||
memset(_pPADStatus, 0, sizeof(SPADStatus));
|
memset(_pPADStatus, 0, sizeof(SPADStatus));
|
||||||
|
|
||||||
// get pad status
|
// Get pad status
|
||||||
GetJoyState(_numPAD);
|
GetJoyState(_numPAD);
|
||||||
|
|
||||||
// Reset!
|
// Reset!
|
||||||
|
@ -287,10 +269,10 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
|
||||||
// Adjust range
|
// Adjust range
|
||||||
// The value returned by SDL_JoystickGetAxis is a signed integer (-32768 to 32768)
|
// The value returned by SDL_JoystickGetAxis is a signed integer (-32768 to 32768)
|
||||||
// The value used for the gamecube controller is an unsigned char (0 to 255)
|
// The value used for the gamecube controller is an unsigned char (0 to 255)
|
||||||
int main_stick_x = (joystate[_numPAD].axis[CTL_MAIN_X]>>8);
|
int main_stick_x = (joystate[_numPAD].axis[CTL_MAIN_X] >> 8);
|
||||||
int main_stick_y = -(joystate[_numPAD].axis[CTL_MAIN_Y]>>8);
|
int main_stick_y = -(joystate[_numPAD].axis[CTL_MAIN_Y] >> 8);
|
||||||
int sub_stick_x = (joystate[_numPAD].axis[CTL_SUB_X]>>8);
|
int sub_stick_x = (joystate[_numPAD].axis[CTL_SUB_X] >> 8);
|
||||||
int sub_stick_y = -(joystate[_numPAD].axis[CTL_SUB_Y]>>8);
|
int sub_stick_y = -(joystate[_numPAD].axis[CTL_SUB_Y] >> 8);
|
||||||
|
|
||||||
// Quick fix
|
// Quick fix
|
||||||
if (main_stick_x > 127)
|
if (main_stick_x > 127)
|
||||||
|
@ -368,127 +350,15 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
|
||||||
_pPADStatus->button|=PAD_BUTTON_RIGHT;
|
_pPADStatus->button|=PAD_BUTTON_RIGHT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
_pPADStatus->err = PAD_ERR_NONE;
|
_pPADStatus->err = PAD_ERR_NONE;
|
||||||
|
|
||||||
|
// Use rumble
|
||||||
#ifdef _WIN32
|
PAD_Use_Rumble(_numPAD, _pPADStatus);
|
||||||
#ifdef USE_RUMBLE_DINPUT_HACK
|
|
||||||
if (joystate[_numPAD].halfpress)
|
|
||||||
if (!g_pDI)
|
|
||||||
if (FAILED(InitDirectInput(m_hWnd)))
|
|
||||||
{
|
|
||||||
MessageBox(NULL, SDL_GetError(), "Could not initialize DirectInput!", MB_ICONERROR);
|
|
||||||
g_rumbleEnable = FALSE;
|
|
||||||
//return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
g_rumbleEnable = TRUE;
|
|
||||||
|
|
||||||
if (g_rumbleEnable)
|
|
||||||
{
|
|
||||||
g_pDevice->Acquire();
|
|
||||||
|
|
||||||
if (g_pEffect)
|
|
||||||
g_pEffect->Start(1, 0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#elif defined(__linux__)
|
|
||||||
if (!fd)
|
|
||||||
{
|
|
||||||
sprintf(device_file_name, "/dev/input/event%d", joysticks[_numPAD].eventnum); //TODO: Make dynamic //
|
|
||||||
|
|
||||||
/* Open device */
|
|
||||||
fd = open(device_file_name, O_RDWR);
|
|
||||||
if (fd == -1) {
|
|
||||||
perror("Open device file");
|
|
||||||
//Something wrong, probably permissions, just return now
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int n_effects = 0;
|
|
||||||
if (ioctl(fd, EVIOCGEFFECTS, &n_effects) == -1) {
|
|
||||||
perror("Ioctl number of effects");
|
|
||||||
}
|
|
||||||
if (n_effects > 0)
|
|
||||||
CanRumble = true;
|
|
||||||
else
|
|
||||||
return; // Return since we can't do any effects
|
|
||||||
/* a strong rumbling effect */
|
|
||||||
effect.type = FF_RUMBLE;
|
|
||||||
effect.id = -1;
|
|
||||||
effect.u.rumble.strong_magnitude = 0x8000;
|
|
||||||
effect.u.rumble.weak_magnitude = 0;
|
|
||||||
effect.replay.length = 5000; // Set to 5 seconds, if a Game needs more for a single rumble event, it is dumb and must be a demo
|
|
||||||
effect.replay.delay = 0;
|
|
||||||
if (ioctl(fd, EVIOCSFF, &effect) == -1) {
|
|
||||||
perror("Upload effect");
|
|
||||||
CanRumble = false; //We have effects but it doesn't support the rumble we are using. This is basic rumble, should work for most
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set PAD rumble
|
|
||||||
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
||||||
// (Stop=0, Rumble=1)
|
|
||||||
void PAD_Rumble(u8 _numPAD, unsigned int _uType, unsigned int _uStrength)
|
|
||||||
{
|
|
||||||
//if (_numPAD > 0)
|
|
||||||
// return;
|
|
||||||
|
|
||||||
// not supported by SDL
|
|
||||||
// So we need to use platform specific stuff
|
|
||||||
#ifdef _WIN32
|
|
||||||
#ifdef USE_RUMBLE_DINPUT_HACK
|
|
||||||
static int a = 0;
|
|
||||||
|
|
||||||
if ((_uType == 0) || (_uType == 2))
|
|
||||||
{
|
|
||||||
a = 0;
|
|
||||||
}
|
|
||||||
else if (_uType == 1)
|
|
||||||
{
|
|
||||||
a = _uStrength > 2 ? 8000 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
a = int ((float)a * 0.96f);
|
|
||||||
|
|
||||||
if (!g_rumbleEnable)
|
|
||||||
{
|
|
||||||
a = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_nYForce = a;
|
|
||||||
SetDeviceForcesXY();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#elif defined(__linux__)
|
|
||||||
struct input_event event;
|
|
||||||
if (CanRumble)
|
|
||||||
{
|
|
||||||
if (_uType == 1)
|
|
||||||
{
|
|
||||||
event.type = EV_FF;
|
|
||||||
event.code = effect.id;
|
|
||||||
event.value = 1;
|
|
||||||
if (write(fd, (const void*) &event, sizeof(event)) == -1) {
|
|
||||||
perror("Play effect");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((_uType == 0) || (_uType == 2))
|
|
||||||
{
|
|
||||||
event.type = EV_FF;
|
|
||||||
event.code = effect.id;
|
|
||||||
event.value = 0;
|
|
||||||
if (write(fd, (const void*) &event, sizeof(event)) == -1) {
|
|
||||||
perror("Stop effect");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set PAD attached pads
|
// Set PAD attached pads
|
||||||
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
|
@ -510,13 +380,19 @@ unsigned int PAD_GetAttachedPads()
|
||||||
return connected;
|
return connected;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Custom Functions
|
// Custom Functions
|
||||||
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
|
|
||||||
void ReadButton(int controller, int button) {
|
// Read buttons status. Called from GetJoyState().
|
||||||
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
|
void ReadButton(int controller, int button)
|
||||||
|
{
|
||||||
int ctl_button = joysticks[controller].buttons[button];
|
int ctl_button = joysticks[controller].buttons[button];
|
||||||
if (ctl_button < joyinfo[joysticks[controller].ID].NumButtons) {
|
if (ctl_button < joyinfo[joysticks[controller].ID].NumButtons)
|
||||||
|
{
|
||||||
joystate[controller].buttons[button] = SDL_JoystickGetButton(joystate[controller].joy, ctl_button);
|
joystate[controller].buttons[button] = SDL_JoystickGetButton(joystate[controller].joy, ctl_button);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -541,9 +417,13 @@ void GetJoyState(int controller)
|
||||||
ReadButton(controller, CTL_Z_TRIGGER);
|
ReadButton(controller, CTL_Z_TRIGGER);
|
||||||
ReadButton(controller, CTL_START);
|
ReadButton(controller, CTL_START);
|
||||||
|
|
||||||
|
PanicAlert("%i", CTL_A_BUTTON);
|
||||||
|
|
||||||
|
//
|
||||||
if (joysticks[controller].halfpress < joyinfo[controller].NumButtons)
|
if (joysticks[controller].halfpress < joyinfo[controller].NumButtons)
|
||||||
joystate[controller].halfpress = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].halfpress);
|
joystate[controller].halfpress = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].halfpress);
|
||||||
|
|
||||||
|
// Check if we have an analog or digital joypad
|
||||||
if (joysticks[controller].controllertype == CTL_TYPE_JOYSTICK)
|
if (joysticks[controller].controllertype == CTL_TYPE_JOYSTICK)
|
||||||
{
|
{
|
||||||
joystate[controller].dpad = SDL_JoystickGetHat(joystate[controller].joy, joysticks[controller].dpad);
|
joystate[controller].dpad = SDL_JoystickGetHat(joystate[controller].joy, joysticks[controller].dpad);
|
||||||
|
@ -578,6 +458,7 @@ int Search_Devices()
|
||||||
joyinfo = new CONTROLLER_INFO [numjoy];
|
joyinfo = new CONTROLLER_INFO [numjoy];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Warn the user of no joysticks are detected
|
||||||
if (numjoy == 0)
|
if (numjoy == 0)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
@ -619,305 +500,3 @@ int Search_Devices()
|
||||||
|
|
||||||
return numjoy;
|
return numjoy;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable output log
|
|
||||||
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
||||||
void DEBUG_INIT()
|
|
||||||
{
|
|
||||||
if (pFile)
|
|
||||||
return;
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
char dateStr [9];
|
|
||||||
_strdate( dateStr);
|
|
||||||
char timeStr [9];
|
|
||||||
_strtime( timeStr );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pFile = fopen ("nJoy-debug.txt","wt");
|
|
||||||
fprintf(pFile, "nJoy v"INPUT_VERSION" Debug\n");
|
|
||||||
#ifdef _WIN32
|
|
||||||
fprintf(pFile, "Date: %s\nTime: %s\n", dateStr, timeStr);
|
|
||||||
#endif
|
|
||||||
fprintf(pFile, "¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disable output log
|
|
||||||
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
||||||
void DEBUG_QUIT()
|
|
||||||
{
|
|
||||||
if (!pFile)
|
|
||||||
return;
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
char timeStr [9];
|
|
||||||
_strtime(timeStr);
|
|
||||||
|
|
||||||
fprintf(pFile, "_______________\n");
|
|
||||||
fprintf(pFile, "Time: %s", timeStr);
|
|
||||||
#endif
|
|
||||||
fclose(pFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save settings to file
|
|
||||||
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
||||||
void SaveConfig()
|
|
||||||
{
|
|
||||||
IniFile file;
|
|
||||||
file.Load("nJoy.ini");
|
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
char SectionName[32];
|
|
||||||
sprintf(SectionName, "PAD%i", i+1);
|
|
||||||
|
|
||||||
file.Set(SectionName, "l_shoulder", joysticks[i].buttons[CTL_L_SHOULDER]);
|
|
||||||
file.Set(SectionName, "r_shoulder", joysticks[i].buttons[CTL_R_SHOULDER]);
|
|
||||||
file.Set(SectionName, "a_button", joysticks[i].buttons[CTL_A_BUTTON]);
|
|
||||||
file.Set(SectionName, "b_button", joysticks[i].buttons[CTL_B_BUTTON]);
|
|
||||||
file.Set(SectionName, "x_button", joysticks[i].buttons[CTL_X_BUTTON]);
|
|
||||||
file.Set(SectionName, "y_button", joysticks[i].buttons[CTL_Y_BUTTON]);
|
|
||||||
file.Set(SectionName, "z_trigger", joysticks[i].buttons[CTL_Z_TRIGGER]);
|
|
||||||
file.Set(SectionName, "start_button", joysticks[i].buttons[CTL_START]);
|
|
||||||
file.Set(SectionName, "dpad", joysticks[i].dpad);
|
|
||||||
file.Set(SectionName, "dpad_up", joysticks[i].dpad2[CTL_D_PAD_UP]);
|
|
||||||
file.Set(SectionName, "dpad_down", joysticks[i].dpad2[CTL_D_PAD_DOWN]);
|
|
||||||
file.Set(SectionName, "dpad_left", joysticks[i].dpad2[CTL_D_PAD_LEFT]);
|
|
||||||
file.Set(SectionName, "dpad_right", joysticks[i].dpad2[CTL_D_PAD_RIGHT]);
|
|
||||||
file.Set(SectionName, "main_x", joysticks[i].axis[CTL_MAIN_X]);
|
|
||||||
file.Set(SectionName, "main_y", joysticks[i].axis[CTL_MAIN_Y]);
|
|
||||||
file.Set(SectionName, "sub_x", joysticks[i].axis[CTL_SUB_X]);
|
|
||||||
file.Set(SectionName, "sub_y", joysticks[i].axis[CTL_SUB_Y]);
|
|
||||||
file.Set(SectionName, "enabled", joysticks[i].enabled);
|
|
||||||
file.Set(SectionName, "deadzone", joysticks[i].deadzone);
|
|
||||||
file.Set(SectionName, "halfpress", joysticks[i].halfpress);
|
|
||||||
file.Set(SectionName, "joy_id", joysticks[i].ID);
|
|
||||||
file.Set(SectionName, "controllertype", joysticks[i].controllertype);
|
|
||||||
file.Set(SectionName, "eventnum", joysticks[i].eventnum);
|
|
||||||
}
|
|
||||||
|
|
||||||
file.Save("nJoy.ini");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load settings from file
|
|
||||||
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
||||||
void LoadConfig()
|
|
||||||
{
|
|
||||||
IniFile file;
|
|
||||||
file.Load("nJoy.ini");
|
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
char SectionName[32];
|
|
||||||
sprintf(SectionName, "PAD%i", i+1);
|
|
||||||
|
|
||||||
file.Get(SectionName, "l_shoulder", &joysticks[i].buttons[CTL_L_SHOULDER], 4);
|
|
||||||
file.Get(SectionName, "r_shoulder", &joysticks[i].buttons[CTL_R_SHOULDER], 5);
|
|
||||||
file.Get(SectionName, "a_button", &joysticks[i].buttons[CTL_A_BUTTON], 0);
|
|
||||||
file.Get(SectionName, "b_button", &joysticks[i].buttons[CTL_B_BUTTON], 1);
|
|
||||||
file.Get(SectionName, "x_button", &joysticks[i].buttons[CTL_X_BUTTON], 3);
|
|
||||||
file.Get(SectionName, "y_button", &joysticks[i].buttons[CTL_Y_BUTTON], 2);
|
|
||||||
file.Get(SectionName, "z_trigger", &joysticks[i].buttons[CTL_Z_TRIGGER], 7);
|
|
||||||
file.Get(SectionName, "start_button", &joysticks[i].buttons[CTL_START], 9);
|
|
||||||
file.Get(SectionName, "dpad", &joysticks[i].dpad, 0);
|
|
||||||
file.Get(SectionName, "dpad_up", &joysticks[i].dpad2[CTL_D_PAD_UP], 0);
|
|
||||||
file.Get(SectionName, "dpad_down", &joysticks[i].dpad2[CTL_D_PAD_DOWN], 0);
|
|
||||||
file.Get(SectionName, "dpad_left", &joysticks[i].dpad2[CTL_D_PAD_LEFT], 0);
|
|
||||||
file.Get(SectionName, "dpad_right", &joysticks[i].dpad2[CTL_D_PAD_RIGHT], 0);
|
|
||||||
file.Get(SectionName, "main_x", &joysticks[i].axis[CTL_MAIN_X], 0);
|
|
||||||
file.Get(SectionName, "main_y", &joysticks[i].axis[CTL_MAIN_Y], 1);
|
|
||||||
file.Get(SectionName, "sub_x", &joysticks[i].axis[CTL_SUB_X], 2);
|
|
||||||
file.Get(SectionName, "sub_y", &joysticks[i].axis[CTL_SUB_Y], 3);
|
|
||||||
file.Get(SectionName, "enabled", &joysticks[i].enabled, 1);
|
|
||||||
file.Get(SectionName, "deadzone", &joysticks[i].deadzone, 9);
|
|
||||||
file.Get(SectionName, "halfpress", &joysticks[i].halfpress, 6);
|
|
||||||
file.Get(SectionName, "joy_id", &joysticks[i].ID, 0);
|
|
||||||
file.Get(SectionName, "controllertype", &joysticks[i].controllertype, 0);
|
|
||||||
file.Get(SectionName, "eventnum", &joysticks[i].eventnum, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Rumble stuff :D!
|
|
||||||
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
||||||
//
|
|
||||||
#ifdef USE_RUMBLE_DINPUT_HACK
|
|
||||||
HRESULT InitDirectInput( HWND hDlg )
|
|
||||||
{
|
|
||||||
DIPROPDWORD dipdw;
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
// Register with the DirectInput subsystem and get a pointer to a IDirectInput interface we can use.
|
|
||||||
if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (VOID**)&g_pDI, NULL)))
|
|
||||||
{
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Look for a force feedback device we can use
|
|
||||||
if (FAILED(hr = g_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL, EnumFFDevicesCallback, NULL, DIEDFL_ATTACHEDONLY | DIEDFL_FORCEFEEDBACK)))
|
|
||||||
{
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NULL == g_pDevice)
|
|
||||||
{
|
|
||||||
MessageBox(NULL, "Force feedback device not found. nJoy will now disable rumble." ,"FFConst" , MB_ICONERROR | MB_OK);
|
|
||||||
g_rumbleEnable = FALSE;
|
|
||||||
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the data format to "simple joystick" - a predefined data format. A
|
|
||||||
// data format specifies which controls on a device we are interested in,
|
|
||||||
// and how they should be reported.
|
|
||||||
//
|
|
||||||
// This tells DirectInput that we will be passing a DIJOYSTATE structure to
|
|
||||||
// IDirectInputDevice8::GetDeviceState(). Even though we won't actually do
|
|
||||||
// it in this sample. But setting the data format is important so that the
|
|
||||||
// DIJOFS_* values work properly.
|
|
||||||
if (FAILED(hr = g_pDevice->SetDataFormat(&c_dfDIJoystick)))
|
|
||||||
return hr;
|
|
||||||
|
|
||||||
// Set the cooperative level to let DInput know how this device should
|
|
||||||
// interact with the system and with other DInput applications.
|
|
||||||
// Exclusive access is required in order to perform force feedback.
|
|
||||||
//if (FAILED(hr = g_pDevice->SetCooperativeLevel(hDlg, DISCL_EXCLUSIVE | DISCL_FOREGROUND)))
|
|
||||||
|
|
||||||
if (FAILED(hr = g_pDevice->SetCooperativeLevel(hDlg, DISCL_EXCLUSIVE | DISCL_FOREGROUND)))
|
|
||||||
{
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Since we will be playing force feedback effects, we should disable the
|
|
||||||
// auto-centering spring.
|
|
||||||
dipdw.diph.dwSize = sizeof(DIPROPDWORD);
|
|
||||||
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
|
|
||||||
dipdw.diph.dwObj = 0;
|
|
||||||
dipdw.diph.dwHow = DIPH_DEVICE;
|
|
||||||
dipdw.dwData = FALSE;
|
|
||||||
|
|
||||||
if (FAILED(hr = g_pDevice->SetProperty(DIPROP_AUTOCENTER, &dipdw.diph)))
|
|
||||||
return hr;
|
|
||||||
|
|
||||||
// Enumerate and count the axes of the joystick
|
|
||||||
if (FAILED(hr = g_pDevice->EnumObjects(EnumAxesCallback, (VOID*)&g_dwNumForceFeedbackAxis, DIDFT_AXIS)))
|
|
||||||
return hr;
|
|
||||||
|
|
||||||
// This simple sample only supports one or two axis joysticks
|
|
||||||
if (g_dwNumForceFeedbackAxis > 2)
|
|
||||||
g_dwNumForceFeedbackAxis = 2;
|
|
||||||
|
|
||||||
// This application needs only one effect: Applying raw forces.
|
|
||||||
DWORD rgdwAxes[2] = {DIJOFS_X, DIJOFS_Y};
|
|
||||||
LONG rglDirection[2] = {0, 0};
|
|
||||||
DICONSTANTFORCE cf = {0};
|
|
||||||
|
|
||||||
DIEFFECT eff;
|
|
||||||
ZeroMemory(&eff, sizeof(eff));
|
|
||||||
eff.dwSize = sizeof(DIEFFECT);
|
|
||||||
eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
|
|
||||||
eff.dwDuration = INFINITE;
|
|
||||||
eff.dwSamplePeriod = 0;
|
|
||||||
eff.dwGain = DI_FFNOMINALMAX;
|
|
||||||
eff.dwTriggerButton = DIEB_NOTRIGGER;
|
|
||||||
eff.dwTriggerRepeatInterval = 0;
|
|
||||||
eff.cAxes = g_dwNumForceFeedbackAxis;
|
|
||||||
eff.rgdwAxes = rgdwAxes;
|
|
||||||
eff.rglDirection = rglDirection;
|
|
||||||
eff.lpEnvelope = 0;
|
|
||||||
eff.cbTypeSpecificParams = sizeof( DICONSTANTFORCE );
|
|
||||||
eff.lpvTypeSpecificParams = &cf;
|
|
||||||
eff.dwStartDelay = 0;
|
|
||||||
|
|
||||||
// Create the prepared effect
|
|
||||||
if (FAILED(hr = g_pDevice->CreateEffect(GUID_ConstantForce, &eff, &g_pEffect, NULL)))
|
|
||||||
{
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NULL == g_pEffect)
|
|
||||||
return E_FAIL;
|
|
||||||
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID FreeDirectInput()
|
|
||||||
{
|
|
||||||
// Unacquire the device one last time just in case
|
|
||||||
// the app tried to exit while the device is still acquired.
|
|
||||||
if (g_pDevice)
|
|
||||||
g_pDevice->Unacquire();
|
|
||||||
|
|
||||||
// Release any DirectInput objects.
|
|
||||||
SAFE_RELEASE(g_pEffect);
|
|
||||||
SAFE_RELEASE(g_pDevice);
|
|
||||||
SAFE_RELEASE(g_pDI);
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL CALLBACK EnumFFDevicesCallback( const DIDEVICEINSTANCE* pInst, VOID* pContext )
|
|
||||||
{
|
|
||||||
LPDIRECTINPUTDEVICE8 pDevice;
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
// Obtain an interface to the enumerated force feedback device.
|
|
||||||
hr = g_pDI->CreateDevice(pInst->guidInstance, &pDevice, NULL);
|
|
||||||
|
|
||||||
// If it failed, then we can't use this device for some bizarre reason.
|
|
||||||
// (Maybe the user unplugged it while we were in the middle of enumerating it.) So continue enumerating
|
|
||||||
if (FAILED(hr))
|
|
||||||
return DIENUM_CONTINUE;
|
|
||||||
|
|
||||||
// We successfully created an IDirectInputDevice8. So stop looking for another one.
|
|
||||||
g_pDevice = pDevice;
|
|
||||||
|
|
||||||
return DIENUM_STOP;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL CALLBACK EnumAxesCallback(const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext)
|
|
||||||
{
|
|
||||||
DWORD* pdwNumForceFeedbackAxis = (DWORD*)pContext;
|
|
||||||
if ((pdidoi->dwFlags & DIDOI_FFACTUATOR) != 0)
|
|
||||||
(*pdwNumForceFeedbackAxis)++;
|
|
||||||
|
|
||||||
return DIENUM_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT SetDeviceForcesXY()
|
|
||||||
{
|
|
||||||
// Modifying an effect is basically the same as creating a new one, except you need only specify the parameters you are modifying
|
|
||||||
LONG rglDirection[2] = { 0, 0 };
|
|
||||||
|
|
||||||
DICONSTANTFORCE cf;
|
|
||||||
|
|
||||||
if (g_dwNumForceFeedbackAxis == 1)
|
|
||||||
{
|
|
||||||
// If only one force feedback axis, then apply only one direction and keep the direction at zero
|
|
||||||
cf.lMagnitude = g_nXForce;
|
|
||||||
rglDirection[0] = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// If two force feedback axis, then apply magnitude from both directions
|
|
||||||
rglDirection[0] = g_nXForce;
|
|
||||||
rglDirection[1] = g_nYForce;
|
|
||||||
cf.lMagnitude = (DWORD)sqrt((double)g_nXForce * (double)g_nXForce + (double)g_nYForce * (double)g_nYForce );
|
|
||||||
}
|
|
||||||
|
|
||||||
DIEFFECT eff;
|
|
||||||
ZeroMemory(&eff, sizeof(eff));
|
|
||||||
eff.dwSize = sizeof(DIEFFECT);
|
|
||||||
eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
|
|
||||||
eff.cAxes = g_dwNumForceFeedbackAxis;
|
|
||||||
eff.rglDirection = rglDirection;
|
|
||||||
eff.lpEnvelope = 0;
|
|
||||||
eff.cbTypeSpecificParams = sizeof(DICONSTANTFORCE);
|
|
||||||
eff.lpvTypeSpecificParams = &cf;
|
|
||||||
eff.dwStartDelay = 0;
|
|
||||||
|
|
||||||
// Now set the new parameters and start the effect immediately.
|
|
||||||
return g_pEffect->SetParameters(&eff, DIEP_DIRECTION | DIEP_TYPESPECIFICPARAMS | DIEP_START);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -47,20 +47,21 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#pragma comment(lib, "SDL.lib")
|
#pragma comment(lib, "SDL.lib")
|
||||||
#pragma comment(lib, "comctl32.lib")
|
#pragma comment(lib, "comctl32.lib")
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#define _CRT_SECURE_NO_WARNINGS
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
#define DIRECTINPUT_VERSION 0x0800
|
#define DIRECTINPUT_VERSION 0x0800
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
#ifdef USE_RUMBLE_DINPUT_HACK
|
#ifdef USE_RUMBLE_DINPUT_HACK
|
||||||
#pragma comment(lib, "dxguid.lib")
|
#pragma comment(lib, "dxguid.lib")
|
||||||
#pragma comment(lib, "dinput8.lib")
|
#pragma comment(lib, "dinput8.lib")
|
||||||
#pragma comment(lib, "winmm.lib")
|
#pragma comment(lib, "winmm.lib")
|
||||||
#include <dinput.h>
|
#include <dinput.h>
|
||||||
#endif
|
VOID FreeDirectInput(); // Needed in both nJoy.cpp and Rumble.cpp
|
||||||
|
#endif
|
||||||
#endif // _WIN32
|
#endif // _WIN32
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
@ -75,6 +76,7 @@
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Define
|
// Define
|
||||||
// ¯¯¯¯¯¯
|
// ¯¯¯¯¯¯
|
||||||
|
@ -86,6 +88,7 @@
|
||||||
#define RELYEAR "2008"
|
#define RELYEAR "2008"
|
||||||
#define THANKYOU "`plot`, Absolute0, Aprentice, Bositman, Brice, ChaosCode, CKemu, CoDeX, Dave2001, dn, drk||Raziel, Florin, Gent, Gigaherz, Hacktarux, JegHegy, Linker, Linuzappz, Martin64, Muad, Knuckles, Raziel, Refraction, Rudy_x, Shadowprince, Snake785, Saqib, vEX, yaz0r, Zilmar, Zenogais and ZeZu."
|
#define THANKYOU "`plot`, Absolute0, Aprentice, Bositman, Brice, ChaosCode, CKemu, CoDeX, Dave2001, dn, drk||Raziel, Florin, Gent, Gigaherz, Hacktarux, JegHegy, Linker, Linuzappz, Martin64, Muad, Knuckles, Raziel, Refraction, Rudy_x, Shadowprince, Snake785, Saqib, vEX, yaz0r, Zilmar, Zenogais and ZeZu."
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Structures
|
// Structures
|
||||||
// ¯¯¯¯¯¯¯¯¯¯
|
// ¯¯¯¯¯¯¯¯¯¯
|
||||||
|
@ -158,6 +161,18 @@ enum
|
||||||
CTL_D_PAD_RIGHT
|
CTL_D_PAD_RIGHT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Variables
|
||||||
|
// ¯¯¯¯¯¯¯¯¯
|
||||||
|
#ifndef _CONTROLLER_STATE_H
|
||||||
|
extern FILE *pFile;
|
||||||
|
extern CONTROLLER_STATE joystate[4];
|
||||||
|
extern CONTROLLER_MAPPING joysticks[4];
|
||||||
|
extern HWND m_hWnd; // Handle to window
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Custom Functions
|
// Custom Functions
|
||||||
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
|
@ -167,5 +182,7 @@ int Search_Devices();
|
||||||
void DEBUG_INIT();
|
void DEBUG_INIT();
|
||||||
void DEBUG_QUIT();
|
void DEBUG_QUIT();
|
||||||
|
|
||||||
|
void PAD_Use_Rumble(u8 _numPAD, SPADStatus* _pPADStatus); // Rumble
|
||||||
|
|
||||||
void SaveConfig();
|
void SaveConfig();
|
||||||
void LoadConfig();
|
void LoadConfig();
|
||||||
|
|
Loading…
Reference in New Issue