add wxw modalness to both njoys and fix a bug where calling DllConfig from different parent HWNDs would stop the config dialog from appearing.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3656 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
Shawn Hoffman 2009-07-03 03:01:58 +00:00
parent 1cb3fe7521
commit 518d3854ba
14 changed files with 270 additions and 244 deletions

View File

@ -172,6 +172,8 @@ void DllConfig(HWND _hParent)
#if defined(HAVE_WX) && HAVE_WX #if defined(HAVE_WX) && HAVE_WX
if (!m_ConfigFrame) if (!m_ConfigFrame)
m_ConfigFrame = new DSPConfigDialogHLE(GetParentedWxWindow(_hParent)); m_ConfigFrame = new DSPConfigDialogHLE(GetParentedWxWindow(_hParent));
else if (!m_ConfigFrame->GetParent()->IsShown())
m_ConfigFrame->Close(true);
// add backends // add backends
std::vector<std::string> backends = AudioCommon::GetSoundBackends(); std::vector<std::string> backends = AudioCommon::GetSoundBackends();

View File

@ -142,6 +142,8 @@ void DllConfig(HWND _hParent)
#if defined(HAVE_WX) && HAVE_WX #if defined(HAVE_WX) && HAVE_WX
if (!m_ConfigFrame) if (!m_ConfigFrame)
m_ConfigFrame = new DSPConfigDialogLLE(GetParentedWxWindow(_hParent)); m_ConfigFrame = new DSPConfigDialogLLE(GetParentedWxWindow(_hParent));
else if (!m_ConfigFrame->GetParent()->IsShown())
m_ConfigFrame->Close(true);
// add backends // add backends
std::vector<std::string> backends = AudioCommon::GetSoundBackends(); std::vector<std::string> backends = AudioCommon::GetSoundBackends();

View File

@ -634,6 +634,8 @@ void DllConfig(HWND _hParent)
#if defined(HAVE_WX) && HAVE_WX #if defined(HAVE_WX) && HAVE_WX
if (!m_ConfigFrame) if (!m_ConfigFrame)
m_ConfigFrame = new PADConfigDialogSimple(GetParentedWxWindow(_hParent)); m_ConfigFrame = new PADConfigDialogSimple(GetParentedWxWindow(_hParent));
else if (!m_ConfigFrame->GetParent()->IsShown())
m_ConfigFrame->Close(true);
// Only allow one open at a time // Only allow one open at a time
if (!m_ConfigFrame->IsShown()) if (!m_ConfigFrame->IsShown())

View File

@ -167,6 +167,8 @@ void DllConfig(HWND _hParent)
#if defined(HAVE_WX) && HAVE_WX #if defined(HAVE_WX) && HAVE_WX
if (!m_ConfigFrame) if (!m_ConfigFrame)
m_ConfigFrame = new GFXConfigDialogOGL(GetParentedWxWindow(_hParent)); m_ConfigFrame = new GFXConfigDialogOGL(GetParentedWxWindow(_hParent));
else if (!m_ConfigFrame->GetParent()->IsShown())
m_ConfigFrame->Close(true);
#if defined(_WIN32) #if defined(_WIN32)

View File

@ -192,6 +192,8 @@ void DllConfig(HWND _hParent)
if (!m_ConfigFrame) if (!m_ConfigFrame)
m_ConfigFrame = new WiimoteConfigDialog(GetParentedWxWindow(_hParent)); m_ConfigFrame = new WiimoteConfigDialog(GetParentedWxWindow(_hParent));
else if (!m_ConfigFrame->GetParent()->IsShown())
m_ConfigFrame->Close(true);
// Only allow one open at a time // Only allow one open at a time
if (!m_ConfigFrame->IsShown()) if (!m_ConfigFrame->IsShown())

View File

@ -38,7 +38,7 @@
Config g_Config; Config g_Config;
#if defined(HAVE_WX) && HAVE_WX #if defined(HAVE_WX) && HAVE_WX
extern ConfigBox* m_frame; extern PADConfigDialognJoy* m_ConfigFrame;
#endif #endif
////////////////////////////////// //////////////////////////////////
@ -179,7 +179,7 @@ void Config::Save(int Slot)
// ====================================== // ======================================
// Debugging // Debugging
//if(m_frame) m_frame->LogMsg("Saved: %s %i\n", SectionName.c_str(), PadMapping[i].triggertype); //if(m_ConfigFrame) m_ConfigFrame->LogMsg("Saved: %s %i\n", SectionName.c_str(), PadMapping[i].triggertype);
} }
INFO_LOG(CONSOLE, "%i: Save: %i\n", 0, PadMapping[0].halfpress); INFO_LOG(CONSOLE, "%i: Save: %i\n", 0, PadMapping[0].halfpress);
@ -221,7 +221,7 @@ void Config::Load(bool ChangePad, bool ChangeSaveByID)
{ {
std::string SectionName = StringFromFormat("PAD%i", i+1); std::string SectionName = StringFromFormat("PAD%i", i+1);
// Don't update this when we are loading settings from the ConfigBox // Don't update this when we are loading settings from the PADConfigDialognJoy
if(!ChangePad) if(!ChangePad)
{ {
file.Get(SectionName.c_str(), "joy_id", &PadMapping[i].ID, 0); file.Get(SectionName.c_str(), "joy_id", &PadMapping[i].ID, 0);
@ -273,7 +273,7 @@ void Config::Load(bool ChangePad, bool ChangeSaveByID)
// ============================= // =============================
// Debugging // Debugging
//if(m_frame) m_frame->LogMsg("%i: Enabled: %i\n", i, PadMapping[i].buttons[CTL_X_BUTTON]); //if(m_ConfigFrame) m_ConfigFrame->LogMsg("%i: Enabled: %i\n", i, PadMapping[i].buttons[CTL_X_BUTTON]);
} }
INFO_LOG(CONSOLE, "%i: Load: %i\n", 0, PadMapping[0].halfpress); INFO_LOG(CONSOLE, "%i: Load: %i\n", 0, PadMapping[0].halfpress);

View File

@ -46,7 +46,7 @@ bool StrangeHack = true;
// Set PAD status // Set PAD status
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::PadGetStatus() void PADConfigDialognJoy::PadGetStatus()
{ {
/* Return if it's not detected. The ID should never be less than zero here, it can only be that /* Return if it's not detected. The ID should never be less than zero here, it can only be that
because of a manual ini file change, but we make that check anway. */ because of a manual ini file change, but we make that check anway. */
@ -248,7 +248,7 @@ std::string ShowStatus(int VirtualController)
// Populate the advanced tab // Populate the advanced tab
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::Update() void PADConfigDialognJoy::Update()
{ {
// Check that Dolphin is in focus, otherwise don't update the pad status // Check that Dolphin is in focus, otherwise don't update the pad status
/* If the emulator is running and unpaused GetJoyState() is run a little more often than needed, /* If the emulator is running and unpaused GetJoyState() is run a little more often than needed,
@ -276,7 +276,7 @@ void ConfigBox::Update()
// Populate the advanced tab // Populate the advanced tab
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::CreateAdvancedControls(int i) void PADConfigDialognJoy::CreateAdvancedControls(int i)
{ {
m_TStatusIn[i] = new wxStaticText(m_Controller[i], IDT_STATUS_IN, wxT("In")); m_TStatusIn[i] = new wxStaticText(m_Controller[i], IDT_STATUS_IN, wxT("In"));
m_TStatusOut[i] = new wxStaticText(m_Controller[i], IDT_STATUS_OUT, wxT("Out")); m_TStatusOut[i] = new wxStaticText(m_Controller[i], IDT_STATUS_OUT, wxT("Out"));
@ -342,7 +342,7 @@ void ConfigBox::CreateAdvancedControls(int i)
} }
wxBitmap ConfigBox::CreateBitmap() // Create box wxBitmap PADConfigDialognJoy::CreateBitmap() // Create box
{ {
BoxW = 70, BoxH = 70; BoxW = 70, BoxH = 70;
wxBitmap bitmap(BoxW, BoxH); wxBitmap bitmap(BoxW, BoxH);
@ -363,7 +363,7 @@ wxBitmap ConfigBox::CreateBitmap() // Create box
return bitmap; return bitmap;
} }
wxBitmap ConfigBox::CreateBitmapDot() // Create dot wxBitmap PADConfigDialognJoy::CreateBitmapDot() // Create dot
{ {
int w = 2, h = 2; int w = 2, h = 2;
wxBitmap bitmap(w, h); wxBitmap bitmap(w, h);

View File

@ -60,65 +60,65 @@ static const char* TriggerType[] =
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
// The wxWidgets class // The wxWidgets class
// ¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯
BEGIN_EVENT_TABLE(ConfigBox,wxDialog) BEGIN_EVENT_TABLE(PADConfigDialognJoy,wxDialog)
EVT_CLOSE(ConfigBox::OnClose) EVT_CLOSE(PADConfigDialognJoy::OnClose)
EVT_BUTTON(ID_ABOUT, ConfigBox::AboutClick) EVT_BUTTON(ID_ABOUT, PADConfigDialognJoy::AboutClick)
EVT_BUTTON(ID_OK, ConfigBox::OKClick) EVT_BUTTON(ID_OK, PADConfigDialognJoy::OKClick)
EVT_BUTTON(ID_CANCEL, ConfigBox::CancelClick) EVT_BUTTON(ID_CANCEL, PADConfigDialognJoy::CancelClick)
EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK, ConfigBox::NotebookPageChanged) EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK, PADConfigDialognJoy::NotebookPageChanged)
// Change and enable or disable gamepad // Change and enable or disable gamepad
EVT_COMBOBOX(IDC_JOYNAME, ConfigBox::ChangeSettings) EVT_COMBOBOX(IDC_JOYNAME, PADConfigDialognJoy::ChangeSettings)
EVT_CHECKBOX(IDC_JOYATTACH, ConfigBox::ChangeSettings) EVT_CHECKBOX(IDC_JOYATTACH, PADConfigDialognJoy::ChangeSettings)
// Other settings // Other settings
EVT_CHECKBOX(IDC_SAVEBYID, ConfigBox::ChangeSettings) EVT_CHECKBOX(IDC_SAVEBYID, PADConfigDialognJoy::ChangeSettings)
EVT_CHECKBOX(IDC_SHOWADVANCED, ConfigBox::ChangeSettings) EVT_CHECKBOX(IDC_SHOWADVANCED, PADConfigDialognJoy::ChangeSettings)
EVT_CHECKBOX(IDCB_CHECKFOCUS, ConfigBox::ChangeSettings) EVT_CHECKBOX(IDCB_CHECKFOCUS, PADConfigDialognJoy::ChangeSettings)
EVT_COMBOBOX(IDCB_MAINSTICK_DIAGONAL, ConfigBox::ChangeSettings) EVT_COMBOBOX(IDCB_MAINSTICK_DIAGONAL, PADConfigDialognJoy::ChangeSettings)
EVT_COMBOBOX(IDC_CONTROLTYPE, ConfigBox::ChangeSettings) EVT_COMBOBOX(IDC_CONTROLTYPE, PADConfigDialognJoy::ChangeSettings)
EVT_COMBOBOX(IDC_TRIGGERTYPE, ConfigBox::ChangeSettings) EVT_COMBOBOX(IDC_TRIGGERTYPE, PADConfigDialognJoy::ChangeSettings)
EVT_COMBOBOX(IDC_DEADZONE, ConfigBox::ChangeSettings) EVT_COMBOBOX(IDC_DEADZONE, PADConfigDialognJoy::ChangeSettings)
// Rumble settings // Rumble settings
EVT_CHECKBOX(IDC_ENABLERUMBLE, ConfigBox::ChangeSettings) EVT_CHECKBOX(IDC_ENABLERUMBLE, PADConfigDialognJoy::ChangeSettings)
EVT_COMBOBOX(IDC_RUMBLESTRENGTH, ConfigBox::ChangeSettings) EVT_COMBOBOX(IDC_RUMBLESTRENGTH, PADConfigDialognJoy::ChangeSettings)
// Advanced settings // Advanced settings
EVT_COMBOBOX(IDCB_MAINSTICK_DIAGONAL, ConfigBox::ChangeSettings) EVT_COMBOBOX(IDCB_MAINSTICK_DIAGONAL, PADConfigDialognJoy::ChangeSettings)
EVT_CHECKBOX(IDCB_MAINSTICK_S_TO_C, ConfigBox::ChangeSettings) EVT_CHECKBOX(IDCB_MAINSTICK_S_TO_C, PADConfigDialognJoy::ChangeSettings)
EVT_CHECKBOX(IDCB_FILTER_SETTINGS, ConfigBox::ChangeSettings) EVT_CHECKBOX(IDCB_FILTER_SETTINGS, PADConfigDialognJoy::ChangeSettings)
#ifdef RERECORDING #ifdef RERECORDING
EVT_CHECKBOX(ID_RECORDING, ConfigBox::ChangeSettings) EVT_CHECKBOX(ID_RECORDING, PADConfigDialognJoy::ChangeSettings)
EVT_CHECKBOX(ID_PLAYBACK, ConfigBox::ChangeSettings) EVT_CHECKBOX(ID_PLAYBACK, PADConfigDialognJoy::ChangeSettings)
EVT_BUTTON(ID_SAVE_RECORDING, ConfigBox::GetButtons) EVT_BUTTON(ID_SAVE_RECORDING, PADConfigDialognJoy::GetButtons)
#endif #endif
EVT_BUTTON(IDB_SHOULDER_L, ConfigBox::GetButtons) EVT_BUTTON(IDB_SHOULDER_L, PADConfigDialognJoy::GetButtons)
EVT_BUTTON(IDB_SHOULDER_R, ConfigBox::GetButtons) EVT_BUTTON(IDB_SHOULDER_R, PADConfigDialognJoy::GetButtons)
EVT_BUTTON(IDB_BUTTON_A, ConfigBox::GetButtons) EVT_BUTTON(IDB_BUTTON_A, PADConfigDialognJoy::GetButtons)
EVT_BUTTON(IDB_BUTTON_B, ConfigBox::GetButtons) EVT_BUTTON(IDB_BUTTON_B, PADConfigDialognJoy::GetButtons)
EVT_BUTTON(IDB_BUTTON_X, ConfigBox::GetButtons) EVT_BUTTON(IDB_BUTTON_X, PADConfigDialognJoy::GetButtons)
EVT_BUTTON(IDB_BUTTON_Y, ConfigBox::GetButtons) EVT_BUTTON(IDB_BUTTON_Y, PADConfigDialognJoy::GetButtons)
EVT_BUTTON(IDB_BUTTON_Z, ConfigBox::GetButtons) EVT_BUTTON(IDB_BUTTON_Z, PADConfigDialognJoy::GetButtons)
EVT_BUTTON(IDB_BUTTONSTART, ConfigBox::GetButtons) EVT_BUTTON(IDB_BUTTONSTART, PADConfigDialognJoy::GetButtons)
EVT_BUTTON(IDB_BUTTONHALFPRESS, ConfigBox::GetButtons) EVT_BUTTON(IDB_BUTTONHALFPRESS, PADConfigDialognJoy::GetButtons)
EVT_BUTTON(IDB_DPAD_UP, ConfigBox::GetButtons) EVT_BUTTON(IDB_DPAD_UP, PADConfigDialognJoy::GetButtons)
EVT_BUTTON(IDB_DPAD_DOWN, ConfigBox::GetButtons) EVT_BUTTON(IDB_DPAD_DOWN, PADConfigDialognJoy::GetButtons)
EVT_BUTTON(IDB_DPAD_LEFT, ConfigBox::GetButtons) EVT_BUTTON(IDB_DPAD_LEFT, PADConfigDialognJoy::GetButtons)
EVT_BUTTON(IDB_DPAD_RIGHT, ConfigBox::GetButtons) EVT_BUTTON(IDB_DPAD_RIGHT, PADConfigDialognJoy::GetButtons)
EVT_BUTTON(IDB_ANALOG_MAIN_X, ConfigBox::GetButtons) EVT_BUTTON(IDB_ANALOG_MAIN_X, PADConfigDialognJoy::GetButtons)
EVT_BUTTON(IDB_ANALOG_MAIN_Y, ConfigBox::GetButtons) EVT_BUTTON(IDB_ANALOG_MAIN_Y, PADConfigDialognJoy::GetButtons)
EVT_BUTTON(IDB_ANALOG_SUB_X, ConfigBox::GetButtons) EVT_BUTTON(IDB_ANALOG_SUB_X, PADConfigDialognJoy::GetButtons)
EVT_BUTTON(IDB_ANALOG_SUB_Y, ConfigBox::GetButtons) EVT_BUTTON(IDB_ANALOG_SUB_Y, PADConfigDialognJoy::GetButtons)
#if wxUSE_TIMER #if wxUSE_TIMER
EVT_TIMER(IDTM_CONSTANT, ConfigBox::OnTimer) EVT_TIMER(IDTM_CONSTANT, PADConfigDialognJoy::OnTimer)
EVT_TIMER(IDTM_BUTTON, ConfigBox::OnButtonTimer) EVT_TIMER(IDTM_BUTTON, PADConfigDialognJoy::OnButtonTimer)
#endif #endif
END_EVENT_TABLE() END_EVENT_TABLE()
ConfigBox::ConfigBox(wxWindow *parent, wxWindowID id, const wxString &title, PADConfigDialognJoy::PADConfigDialognJoy(wxWindow *parent, wxWindowID id, const wxString &title,
const wxPoint &position, const wxSize& size, long style) const wxPoint &position, const wxSize& size, long style)
: wxDialog(parent, id, title, position, size, style) : wxDialog(parent, id, title, position, size, style)
{ {
@ -146,11 +146,11 @@ ConfigBox::ConfigBox(wxWindow *parent, wxWindowID id, const wxString &title,
// wxEVT_KEY_DOWN is blocked for enter, tab and the directional keys // wxEVT_KEY_DOWN is blocked for enter, tab and the directional keys
wxTheApp->Connect(wxID_ANY, wxEVT_KEY_UP, wxTheApp->Connect(wxID_ANY, wxEVT_KEY_UP,
wxKeyEventHandler(ConfigBox::OnKeyDown), wxKeyEventHandler(PADConfigDialognJoy::OnKeyDown),
(wxObject*)0, this); (wxObject*)0, this);
} }
ConfigBox::~ConfigBox() PADConfigDialognJoy::~PADConfigDialognJoy()
{ {
// The statbar sample has this so I add this to // The statbar sample has this so I add this to
#if wxUSE_TIMER #if wxUSE_TIMER
@ -158,7 +158,7 @@ ConfigBox::~ConfigBox()
#endif #endif
} }
void ConfigBox::OnKeyDown(wxKeyEvent& event) void PADConfigDialognJoy::OnKeyDown(wxKeyEvent& event)
{ {
/*m_pStatusBar->SetLabel(wxString::Format( /*m_pStatusBar->SetLabel(wxString::Format(
"Key: %i", event.GetKeyCode() "Key: %i", event.GetKeyCode()
@ -168,7 +168,7 @@ void ConfigBox::OnKeyDown(wxKeyEvent& event)
// Close window // Close window
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::OnClose(wxCloseEvent& event) void PADConfigDialognJoy::OnClose(wxCloseEvent& event)
{ {
// Allow wxWidgets to close the window // Allow wxWidgets to close the window
event.Skip(); event.Skip();
@ -182,7 +182,7 @@ void ConfigBox::OnClose(wxCloseEvent& event)
// Call about dialog // Call about dialog
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::AboutClick(wxCommandEvent& event) void PADConfigDialognJoy::AboutClick(wxCommandEvent& event)
{ {
#ifdef _WIN32 #ifdef _WIN32
wxWindow win; wxWindow win;
@ -202,7 +202,7 @@ void ConfigBox::AboutClick(wxCommandEvent& event)
// Click OK // Click OK
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::OKClick(wxCommandEvent& event) void PADConfigDialognJoy::OKClick(wxCommandEvent& event)
{ {
if (event.GetId() == ID_OK) if (event.GetId() == ID_OK)
{ {
@ -214,7 +214,7 @@ void ConfigBox::OKClick(wxCommandEvent& event)
// Click Cancel // Click Cancel
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::CancelClick(wxCommandEvent& event) void PADConfigDialognJoy::CancelClick(wxCommandEvent& event)
{ {
if (event.GetId() == ID_CANCEL) if (event.GetId() == ID_CANCEL)
{ {
@ -226,7 +226,7 @@ void ConfigBox::CancelClick(wxCommandEvent& event)
// Debugging // Debugging
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::LogMsg(const char* format, ...) void PADConfigDialognJoy::LogMsg(const char* format, ...)
{ {
#ifdef _WIN32 #ifdef _WIN32
if(Debugging) if(Debugging)
@ -262,7 +262,7 @@ void ConfigBox::LogMsg(const char* format, ...)
Input: ChangePad needs to be used when we change the pad for a slot. Slot needs to be used when Input: ChangePad needs to be used when we change the pad for a slot. Slot needs to be used when
we only want to save changes to one slot. we only want to save changes to one slot.
*/ */
void ConfigBox::DoSave(bool ChangePad, int Slot) void PADConfigDialognJoy::DoSave(bool ChangePad, int Slot)
{ {
// Replace "" with "-1" before we are saving // Replace "" with "-1" before we are saving
ToBlank(false); ToBlank(false);
@ -289,7 +289,7 @@ void ConfigBox::DoSave(bool ChangePad, int Slot)
// On changing the SaveById option we update all pages // On changing the SaveById option we update all pages
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::OnSaveById() void PADConfigDialognJoy::OnSaveById()
{ {
// Save current settings // Save current settings
DoSave(false, notebookpage); DoSave(false, notebookpage);
@ -307,7 +307,7 @@ void ConfigBox::OnSaveById()
/* Function: When changing the joystick we save and load the settings and update the PadMapping /* Function: When changing the joystick we save and load the settings and update the PadMapping
and PadState array. PadState[].joy is the gamepad handle that is used to access the pad throughout and PadState array. PadState[].joy is the gamepad handle that is used to access the pad throughout
the plugin. Joyinfo[].joy is only used the first time the pads are checked. */ the plugin. Joyinfo[].joy is only used the first time the pads are checked. */
void ConfigBox::DoChangeJoystick() void PADConfigDialognJoy::DoChangeJoystick()
{ {
// Close the current pad, unless it's used by another slot // Close the current pad, unless it's used by another slot
//if (PadMapping[notebookpage].enabled) PadClose(notebookpage); //if (PadMapping[notebookpage].enabled) PadClose(notebookpage);
@ -322,7 +322,7 @@ void ConfigBox::DoChangeJoystick()
// Open the new pad // Open the new pad
if (PadMapping[notebookpage].enabled) PadOpen(notebookpage); if (PadMapping[notebookpage].enabled) PadOpen(notebookpage);
} }
void ConfigBox::PadOpen(int Open) // Open for slot 1, 2, 3 or 4 void PADConfigDialognJoy::PadOpen(int Open) // Open for slot 1, 2, 3 or 4
{ {
// Check that we got a good pad // Check that we got a good pad
if (!joyinfo.at(PadMapping[Open].ID).Good) if (!joyinfo.at(PadMapping[Open].ID).Good)
@ -333,7 +333,7 @@ void ConfigBox::PadOpen(int Open) // Open for slot 1, 2, 3 or 4
PadState[Open].joy = SDL_JoystickOpen(PadMapping[Open].ID); PadState[Open].joy = SDL_JoystickOpen(PadMapping[Open].ID);
} }
void ConfigBox::PadClose(int Close) // Close for slot 1, 2, 3 or 4 void PADConfigDialognJoy::PadClose(int Close) // Close for slot 1, 2, 3 or 4
{ {
if (SDL_JoystickOpened(PadMapping[Close].ID)) SDL_JoystickClose(PadState[Close].joy); if (SDL_JoystickOpened(PadMapping[Close].ID)) SDL_JoystickClose(PadState[Close].joy);
PadState[Close].joy = NULL; PadState[Close].joy = NULL;
@ -341,7 +341,7 @@ void ConfigBox::PadClose(int Close) // Close for slot 1, 2, 3 or 4
// Notebook page changed // Notebook page changed
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::NotebookPageChanged(wxNotebookEvent& event) void PADConfigDialognJoy::NotebookPageChanged(wxNotebookEvent& event)
{ {
// Save current settings now, don't wait for OK // Save current settings now, don't wait for OK
if(ControlsCreated && !g_Config.bSaveByID) DoSave(false, notebookpage); if(ControlsCreated && !g_Config.bSaveByID) DoSave(false, notebookpage);
@ -355,7 +355,7 @@ void ConfigBox::NotebookPageChanged(wxNotebookEvent& event)
// Replace the harder to understand -1 with "" for the sake of user friendliness // Replace the harder to understand -1 with "" for the sake of user friendliness
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::ToBlank(bool ToBlank) void PADConfigDialognJoy::ToBlank(bool ToBlank)
{ {
if (!ControlsCreated) return; if (!ControlsCreated) return;
@ -383,7 +383,7 @@ void ConfigBox::ToBlank(bool ToBlank)
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
// Change settings // Change settings
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::SetButtonTextAll(int id, const char *text) void PADConfigDialognJoy::SetButtonTextAll(int id, const char *text)
{ {
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
@ -394,7 +394,7 @@ void ConfigBox::SetButtonTextAll(int id, const char *text)
}; };
} }
void ConfigBox::SaveButtonMappingAll(int Slot) void PADConfigDialognJoy::SaveButtonMappingAll(int Slot)
{ {
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
@ -405,7 +405,7 @@ void ConfigBox::SaveButtonMappingAll(int Slot)
} }
} }
void ConfigBox::UpdateGUIAll(int Slot) void PADConfigDialognJoy::UpdateGUIAll(int Slot)
{ {
if(Slot == -1) if(Slot == -1)
{ {
@ -423,7 +423,7 @@ void ConfigBox::UpdateGUIAll(int Slot)
} }
} }
void ConfigBox::ChangeSettings( wxCommandEvent& event ) void PADConfigDialognJoy::ChangeSettings( wxCommandEvent& event )
{ {
switch(event.GetId()) switch(event.GetId())
{ {
@ -519,7 +519,7 @@ void ConfigBox::ChangeSettings( wxCommandEvent& event )
// Update GUI // Update GUI
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
// Called from: CreateGUIControls(), ChangeControllertype() // Called from: CreateGUIControls(), ChangeControllertype()
void ConfigBox::UpdateGUI(int _notebookpage) void PADConfigDialognJoy::UpdateGUI(int _notebookpage)
{ {
// If there are no good pads disable the entire notebook // If there are no good pads disable the entire notebook
if (NumGoodPads == 0) if (NumGoodPads == 0)
@ -597,7 +597,7 @@ void ConfigBox::UpdateGUI(int _notebookpage)
// Paint the background // Paint the background
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::OnPaint(wxPaintEvent &event) void PADConfigDialognJoy::OnPaint(wxPaintEvent &event)
{ {
event.Skip(); event.Skip();
@ -611,7 +611,7 @@ void ConfigBox::OnPaint(wxPaintEvent &event)
// Populate the config window // Populate the config window
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::CreateGUIControls() void PADConfigDialognJoy::CreateGUIControls()
{ {
INFO_LOG(CONSOLE, "CreateGUIControls()\n"); INFO_LOG(CONSOLE, "CreateGUIControls()\n");
@ -739,7 +739,7 @@ void ConfigBox::CreateGUIControls()
// Paint background. This allows objects to be visible on top of the picture // Paint background. This allows objects to be visible on top of the picture
m_pKeys[i]->Connect(wxID_ANY, wxEVT_PAINT, m_pKeys[i]->Connect(wxID_ANY, wxEVT_PAINT,
wxPaintEventHandler(ConfigBox::OnPaint), wxPaintEventHandler(PADConfigDialognJoy::OnPaint),
(wxObject*)0, this); (wxObject*)0, this);
@ -1098,7 +1098,7 @@ void ConfigBox::CreateGUIControls()
ToBlank(); ToBlank();
} }
void ConfigBox::SizeWindow() void PADConfigDialognJoy::SizeWindow()
{ {
SetClientSize(m_MainSizer->GetMinSize().GetWidth(), m_MainSizer->GetMinSize().GetHeight()); SetClientSize(m_MainSizer->GetMinSize().GetWidth(), m_MainSizer->GetMinSize().GetHeight());
} }

View File

@ -50,17 +50,17 @@
#include "../nJoy.h" #include "../nJoy.h"
class ConfigBox : public wxDialog class PADConfigDialognJoy : public wxDialog
{ {
private: private:
DECLARE_EVENT_TABLE(); DECLARE_EVENT_TABLE();
public: public:
ConfigBox(wxWindow *parent, wxWindowID id = 1, PADConfigDialognJoy(wxWindow *parent, wxWindowID id = 1,
const wxString &title = wxT("Configure: nJoy Input Plugin"), const wxString &title = wxT("Configure: nJoy Input Plugin"),
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
long style = wxDEFAULT_DIALOG_STYLE); long style = wxDEFAULT_DIALOG_STYLE);
virtual ~ConfigBox(); virtual ~PADConfigDialognJoy();
#if wxUSE_TIMER #if wxUSE_TIMER
void OnTimer(wxTimerEvent& WXUNUSED(event)) { Update(); } void OnTimer(wxTimerEvent& WXUNUSED(event)) { Update(); }

View File

@ -45,7 +45,7 @@ extern bool g_EmulatorRunning;
// Set dialog items from saved values // Set dialog items from saved values
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::UpdateGUIButtonMapping(int controller) void PADConfigDialognJoy::UpdateGUIButtonMapping(int controller)
{ {
// http://wiki.wxwidgets.org/Converting_everything_to_and_from_wxString // http://wiki.wxwidgets.org/Converting_everything_to_and_from_wxString
wxString tmp; wxString tmp;
@ -105,7 +105,7 @@ void ConfigBox::UpdateGUIButtonMapping(int controller)
/* Populate the PadMapping array with the dialog items settings (for example /* Populate the PadMapping array with the dialog items settings (for example
selected joystick, enabled or disabled status and so on) */ selected joystick, enabled or disabled status and so on) */
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::SaveButtonMapping(int controller, bool DontChangeId, int FromSlot) void PADConfigDialognJoy::SaveButtonMapping(int controller, bool DontChangeId, int FromSlot)
{ {
// Temporary storage // Temporary storage
wxString tmp; wxString tmp;
@ -169,7 +169,7 @@ void ConfigBox::SaveButtonMapping(int controller, bool DontChangeId, int FromSlo
// Update the textbox for the buttons // Update the textbox for the buttons
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::SetButtonText(int id, const char *text, int Page) void PADConfigDialognJoy::SetButtonText(int id, const char *text, int Page)
{ {
// Set controller value // Set controller value
int controller; int controller;
@ -204,7 +204,7 @@ void ConfigBox::SetButtonText(int id, const char *text, int Page)
// Get the text in the textbox for the buttons // Get the text in the textbox for the buttons
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
wxString ConfigBox::GetButtonText(int id, int Page) wxString PADConfigDialognJoy::GetButtonText(int id, int Page)
{ {
// Set controller value // Set controller value
int controller; int controller;
@ -255,12 +255,12 @@ wxString ConfigBox::GetButtonText(int id, int Page)
is that we start another parallel loop (at least in Windows) that blocks the old loop. And our only is that we start another parallel loop (at least in Windows) that blocks the old loop. And our only
option to wait for the old loop to finish is with a new loop, and that will block the old loop for as option to wait for the old loop to finish is with a new loop, and that will block the old loop for as
long as it's going on. Therefore a timer is easier to control. */ long as it's going on. Therefore a timer is easier to control. */
void ConfigBox::GetButtons(wxCommandEvent& event) void PADConfigDialognJoy::GetButtons(wxCommandEvent& event)
{ {
DoGetButtons(event.GetId()); DoGetButtons(event.GetId());
} }
void ConfigBox::DoGetButtons(int GetId) void PADConfigDialognJoy::DoGetButtons(int GetId)
{ {
// ============================================= // =============================================
// Collect the starting values // Collect the starting values

View File

@ -56,7 +56,7 @@
controllers. Joysticks[].ID will have the number of the physical input device mapped to that controllers. Joysticks[].ID will have the number of the physical input device mapped to that
controller (this value range between 0 and the total number of connected physical devices). The controller (this value range between 0 and the total number of connected physical devices). The
mapping of a certain physical device to PadState[].joy is initially done by Initialize(), but mapping of a certain physical device to PadState[].joy is initially done by Initialize(), but
for the configuration we can remap that, like in ConfigBox::ChangeJoystick(). for the configuration we can remap that, like in PADConfigDialognJoy::ChangeJoystick().
The joyinfo[] array holds the physical gamepad info for a certain physical device. It's therefore The joyinfo[] array holds the physical gamepad info for a certain physical device. It's therefore
used as joyinfo[PadMapping[controller].ID] if we want to get the joyinfo for a certain joystick. used as joyinfo[PadMapping[controller].ID] if we want to get the joyinfo for a certain joystick.
@ -72,7 +72,7 @@
// Declare config window so that we can write debugging info to it from functions in this file // Declare config window so that we can write debugging info to it from functions in this file
#if defined(HAVE_WX) && HAVE_WX #if defined(HAVE_WX) && HAVE_WX
ConfigBox* m_frame; PADConfigDialognJoy* m_ConfigFrame = NULL;
#endif #endif
///////////////////////// /////////////////////////
@ -83,7 +83,6 @@
#define _EXCLUDE_MAIN_ // Avoid certain declarations in nJoy.h #define _EXCLUDE_MAIN_ // Avoid certain declarations in nJoy.h
FILE *pFile; FILE *pFile;
HINSTANCE nJoy_hInst = NULL;
std::vector<InputCommon::CONTROLLER_INFO> joyinfo; std::vector<InputCommon::CONTROLLER_INFO> joyinfo;
InputCommon::CONTROLLER_STATE PadState[4]; InputCommon::CONTROLLER_STATE PadState[4];
InputCommon::CONTROLLER_MAPPING PadMapping[4]; InputCommon::CONTROLLER_MAPPING PadMapping[4];
@ -100,59 +99,70 @@ PLUGIN_GLOBALS* globals = NULL;
extern int fd; extern int fd;
#endif #endif
////////////////////////////////////////////////////////////////////////////////////////// // Standard crap to make wxWidgets happy
// wxWidgets #ifdef _WIN32
// ¯¯¯¯¯¯¯¯¯ HINSTANCE g_hInstance;
#if defined(HAVE_WX) && HAVE_WX
class wxDLLApp : public wxApp
{
bool OnInit()
{
return true;
}
};
IMPLEMENT_APP_NO_MAIN(wxDLLApp) #if defined(HAVE_WX) && HAVE_WX
class wxDLLApp : public wxApp
{
bool OnInit()
{
return true;
}
};
IMPLEMENT_APP_NO_MAIN(wxDLLApp)
WXDLLIMPEXP_BASE void wxSetInstance(HINSTANCE hInst); WXDLLIMPEXP_BASE void wxSetInstance(HINSTANCE hInst);
#endif #endif
BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle
////////////////////////////////////////////////////////////////////////////////////////// DWORD dwReason, // reason called
// DllMain LPVOID lpvReserved) // reserved
// ¯¯¯¯¯¯¯
#ifdef _WIN32
BOOL APIENTRY DllMain( HINSTANCE hinstDLL, // DLL module handle
DWORD dwReason, // reason called
LPVOID lpvReserved) // reserved
{ {
switch (dwReason) switch (dwReason)
{ {
case DLL_PROCESS_ATTACH: case DLL_PROCESS_ATTACH:
{ {
//use wxInitialize() if you don't want GUI instead of the following 12 lines #if defined(HAVE_WX) && HAVE_WX
wxSetInstance((HINSTANCE)hinstDLL); wxSetInstance((HINSTANCE)hinstDLL);
int argc = 0; int argc = 0;
char **argv = NULL; char **argv = NULL;
wxEntryStart(argc, argv); wxEntryStart(argc, argv);
if (!wxTheApp || !wxTheApp->CallOnInit())
if (!wxTheApp || !wxTheApp->CallOnInit() )
return FALSE; return FALSE;
#endif
} }
break; break;
case DLL_PROCESS_DETACH: case DLL_PROCESS_DETACH:
wxEntryCleanup(); //use wxUninitialize() if you don't want GUI #if defined(HAVE_WX) && HAVE_WX
wxEntryCleanup();
#endif
break;
default:
break; break;
default:
break;
} }
nJoy_hInst = hinstDLL; g_hInstance = hinstDLL;
return TRUE; return TRUE;
} }
#endif #endif
#if defined(HAVE_WX) && HAVE_WX
wxWindow* GetParentedWxWindow(HWND Parent)
{
#ifdef _WIN32
wxSetInstance((HINSTANCE)g_hInstance);
#endif
wxWindow *win = new wxWindow();
#ifdef _WIN32
win->SetHWND((WXHWND)Parent);
win->AdoptAttributesFromHWND();
#endif
return win;
}
#endif
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
// Input Plugin Functions (from spec's) // Input Plugin Functions (from spec's)
@ -187,43 +197,41 @@ void SetDllGlobals(PLUGIN_GLOBALS* _pPluginGlobals)
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void DllConfig(HWND _hParent) void DllConfig(HWND _hParent)
{ {
// Debugging #ifdef _WIN32
// #ifdef SHOW_PAD_STATUS // Start the pads so we can use them in the configuration and advanced controls
// Console::Open(100); if (!g_EmulatorRunning)
// m_hConsole = Console::GetHwnd(); {
// #endif Search_Devices(joyinfo, NumPads, NumGoodPads); // Populate joyinfo for all attached devices
#ifdef _WIN32 // Check if a DirectInput error occured
// Start the pads so we can use them in the configuration and advanced controls if (ReloadDLL())
if(!g_EmulatorRunning)
{ {
Search_Devices(joyinfo, NumPads, NumGoodPads); // Populate joyinfo for all attached devices PostMessage(_hParent, WM_USER, NJOY_RELOAD, 0);
// Check if a DirectInput error occured
if(ReloadDLL())
{
PostMessage(_hParent, WM_USER, NJOY_RELOAD, 0);
return;
}
}
m_frame = new ConfigBox(NULL);
m_frame->Show();
#else
if (SDL_Init(SDL_INIT_JOYSTICK ) < 0)
{
printf("Could not initialize SDL! (%s)\n", SDL_GetError());
return; return;
} }
}
#else
if (SDL_Init(SDL_INIT_JOYSTICK ) < 0)
{
printf("Could not initialize SDL! (%s)\n", SDL_GetError());
return;
}
#endif
g_Config.Load(); // load settings g_Config.Load(); // load settings
#if defined(HAVE_WX) && HAVE_WX #if defined(HAVE_WX) && HAVE_WX
ConfigBox frame(NULL); if (!m_ConfigFrame)
frame.ShowModal(); m_ConfigFrame = new PADConfigDialognJoy(GetParentedWxWindow(_hParent));
#endif else if (!m_ConfigFrame->GetParent()->IsShown())
#endif m_ConfigFrame->Close(true);
// Only allow one open at a time
if (!m_ConfigFrame->IsShown())
m_ConfigFrame->ShowModal();
else
m_ConfigFrame->Hide();
#endif
} }
void DllDebugger(HWND _hParent, bool Show) {} void DllDebugger(HWND _hParent, bool Show) {}
@ -257,7 +265,7 @@ void Initialize(void *init)
// Populate joyinfo for all attached devices if the configuration window is not already open // Populate joyinfo for all attached devices if the configuration window is not already open
#if defined(HAVE_WX) && HAVE_WX #if defined(HAVE_WX) && HAVE_WX
if(!m_frame) if(!m_ConfigFrame)
{ {
Search_Devices(joyinfo, NumPads, NumGoodPads); Search_Devices(joyinfo, NumPads, NumGoodPads);
// Check if a DirectInput error occured // Check if a DirectInput error occured
@ -273,7 +281,7 @@ void Initialize(void *init)
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
/* Information: This function can not be run twice without an Initialize in between. If /* Information: This function can not be run twice without an Initialize in between. If
it's run twice the SDL_...() functions below will cause a crash. it's run twice the SDL_...() functions below will cause a crash.
Called from: The Dolphin Core, ConfigBox::OnClose() */ Called from: The Dolphin Core, PADConfigDialognJoy::OnClose() */
void Shutdown() void Shutdown()
{ {
INFO_LOG(CONSOLE, "Shutdown: %i\n", SDL_WasInit(0)); INFO_LOG(CONSOLE, "Shutdown: %i\n", SDL_WasInit(0));
@ -297,7 +305,7 @@ void Shutdown()
// Don't shutdown the gamepad if the configuration window is still showing // Don't shutdown the gamepad if the configuration window is still showing
// Todo: Coordinate with the Wiimote plugin, SDL_Quit() will remove the pad for it to // Todo: Coordinate with the Wiimote plugin, SDL_Quit() will remove the pad for it to
#if defined(HAVE_WX) && HAVE_WX #if defined(HAVE_WX) && HAVE_WX
if (m_frame) return; if (m_ConfigFrame) return;
#endif #endif
/* Close all devices carefully. We must check that we are not accessing any undefined /* Close all devices carefully. We must check that we are not accessing any undefined
vector elements or any bad devices */ vector elements or any bad devices */
@ -663,7 +671,7 @@ return true;
HWND RenderingWindow = NULL; if (g_PADInitialize) RenderingWindow = g_PADInitialize->hWnd; HWND RenderingWindow = NULL; if (g_PADInitialize) RenderingWindow = g_PADInitialize->hWnd;
HWND Parent = GetParent(RenderingWindow); HWND Parent = GetParent(RenderingWindow);
HWND TopLevel = GetParent(Parent); HWND TopLevel = GetParent(Parent);
HWND Config = NULL; if (m_frame) Config = (HWND)m_frame->GetHWND(); HWND Config = NULL; if (m_ConfigFrame) Config = (HWND)m_ConfigFrame->GetHWND();
// Support both rendering to main window and not, and the config and eventual console window // Support both rendering to main window and not, and the config and eventual console window
if (GetForegroundWindow() == TopLevel || GetForegroundWindow() == RenderingWindow || GetForegroundWindow() == Config || GetForegroundWindow() == m_hConsole) if (GetForegroundWindow() == TopLevel || GetForegroundWindow() == RenderingWindow || GetForegroundWindow() == Config || GetForegroundWindow() == m_hConsole)
return true; return true;

View File

@ -45,51 +45,51 @@ static const char* ControllerType[] =
// "Keyboard" // Not supported yet, sorry F|RES ;( ... // "Keyboard" // Not supported yet, sorry F|RES ;( ...
}; };
BEGIN_EVENT_TABLE(ConfigBox,wxDialog) BEGIN_EVENT_TABLE(PADConfigDialognJoy4,wxDialog)
EVT_CLOSE(ConfigBox::OnClose) EVT_CLOSE(PADConfigDialognJoy4::OnClose)
EVT_BUTTON(ID_ABOUT, ConfigBox::AboutClick) EVT_BUTTON(ID_ABOUT, PADConfigDialognJoy4::AboutClick)
EVT_BUTTON(ID_OK, ConfigBox::OKClick) EVT_BUTTON(ID_OK, PADConfigDialognJoy4::OKClick)
EVT_BUTTON(ID_CANCEL, ConfigBox::CancelClick) EVT_BUTTON(ID_CANCEL, PADConfigDialognJoy4::CancelClick)
EVT_COMBOBOX(IDC_JOYNAME, ConfigBox::ChangeJoystick) EVT_COMBOBOX(IDC_JOYNAME, PADConfigDialognJoy4::ChangeJoystick)
EVT_COMBOBOX(IDC_CONTROLTYPE, ConfigBox::ChangeControllertype) EVT_COMBOBOX(IDC_CONTROLTYPE, PADConfigDialognJoy4::ChangeControllertype)
EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK, ConfigBox::NotebookPageChanged) EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK, PADConfigDialognJoy4::NotebookPageChanged)
EVT_BUTTON(IDB_SHOULDER_L, ConfigBox::GetInputs) EVT_BUTTON(IDB_SHOULDER_L, PADConfigDialognJoy4::GetInputs)
EVT_BUTTON(IDB_SHOULDER_R, ConfigBox::GetInputs) EVT_BUTTON(IDB_SHOULDER_R, PADConfigDialognJoy4::GetInputs)
EVT_BUTTON(IDB_BUTTON_A, ConfigBox::GetInputs) EVT_BUTTON(IDB_BUTTON_A, PADConfigDialognJoy4::GetInputs)
EVT_BUTTON(IDB_BUTTON_B, ConfigBox::GetInputs) EVT_BUTTON(IDB_BUTTON_B, PADConfigDialognJoy4::GetInputs)
EVT_BUTTON(IDB_BUTTON_X, ConfigBox::GetInputs) EVT_BUTTON(IDB_BUTTON_X, PADConfigDialognJoy4::GetInputs)
EVT_BUTTON(IDB_BUTTON_Y, ConfigBox::GetInputs) EVT_BUTTON(IDB_BUTTON_Y, PADConfigDialognJoy4::GetInputs)
EVT_BUTTON(IDB_BUTTON_Z, ConfigBox::GetInputs) EVT_BUTTON(IDB_BUTTON_Z, PADConfigDialognJoy4::GetInputs)
EVT_BUTTON(IDB_BUTTONSTART, ConfigBox::GetInputs) EVT_BUTTON(IDB_BUTTONSTART, PADConfigDialognJoy4::GetInputs)
EVT_BUTTON(ID_BUTTONCALIBRATE, ConfigBox::Calibrate) EVT_BUTTON(ID_BUTTONCALIBRATE, PADConfigDialognJoy4::Calibrate)
EVT_BUTTON(IDB_BUTTONHALFPRESS, ConfigBox::GetInputs) EVT_BUTTON(IDB_BUTTONHALFPRESS, PADConfigDialognJoy4::GetInputs)
EVT_BUTTON(IDB_DPAD_UP, ConfigBox::GetInputs) EVT_BUTTON(IDB_DPAD_UP, PADConfigDialognJoy4::GetInputs)
EVT_BUTTON(IDB_DPAD_DOWN, ConfigBox::GetInputs) EVT_BUTTON(IDB_DPAD_DOWN, PADConfigDialognJoy4::GetInputs)
EVT_BUTTON(IDB_DPAD_LEFT, ConfigBox::GetInputs) EVT_BUTTON(IDB_DPAD_LEFT, PADConfigDialognJoy4::GetInputs)
EVT_BUTTON(IDB_DPAD_RIGHT, ConfigBox::GetInputs) EVT_BUTTON(IDB_DPAD_RIGHT, PADConfigDialognJoy4::GetInputs)
EVT_BUTTON(IDB_ANALOG_MAIN_X, ConfigBox::GetInputs) EVT_BUTTON(IDB_ANALOG_MAIN_X, PADConfigDialognJoy4::GetInputs)
EVT_BUTTON(IDB_ANALOG_MAIN_Y, ConfigBox::GetInputs) EVT_BUTTON(IDB_ANALOG_MAIN_Y, PADConfigDialognJoy4::GetInputs)
EVT_BUTTON(IDB_ANALOG_SUB_X, ConfigBox::GetInputs) EVT_BUTTON(IDB_ANALOG_SUB_X, PADConfigDialognJoy4::GetInputs)
EVT_BUTTON(IDB_ANALOG_SUB_Y, ConfigBox::GetInputs) EVT_BUTTON(IDB_ANALOG_SUB_Y, PADConfigDialognJoy4::GetInputs)
EVT_BUTTON(IDB_BUTTONDEBUGSTART,ConfigBox::StartDebug) EVT_BUTTON(IDB_BUTTONDEBUGSTART,PADConfigDialognJoy4::StartDebug)
END_EVENT_TABLE() END_EVENT_TABLE()
ConfigBox::ConfigBox(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style) PADConfigDialognJoy4::PADConfigDialognJoy4(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style)
: wxDialog(parent, id, title, position, size, style) : wxDialog(parent, id, title, position, size, style)
{ {
notebookpage = 0; notebookpage = 0;
CreateGUIControls(); CreateGUIControls();
} }
ConfigBox::~ConfigBox() PADConfigDialognJoy4::~PADConfigDialognJoy4()
{ {
// empty // empty
} }
// Warning: horrible code below proceed at own risk! // Warning: horrible code below proceed at own risk!
void ConfigBox::CreateGUIControls() void PADConfigDialognJoy4::CreateGUIControls()
{ {
#ifndef _DEBUG #ifndef _DEBUG
SetTitle(wxT("Configure: nJoy v"INPUT_VERSION" Input Plugin")); SetTitle(wxT("Configure: nJoy v"INPUT_VERSION" Input Plugin"));
@ -288,12 +288,12 @@ void ConfigBox::CreateGUIControls()
m_bJoyDebug = new wxButton(m_Controller[4], IDB_BUTTONDEBUGSTART, wxT("Start"), wxPoint(297, 385), wxDefaultSize, 0, wxDefaultValidator, wxT("Start")); m_bJoyDebug = new wxButton(m_Controller[4], IDB_BUTTONDEBUGSTART, wxT("Start"), wxPoint(297, 385), wxDefaultSize, 0, wxDefaultValidator, wxT("Start"));
} }
void ConfigBox::OnClose(wxCloseEvent& /*event*/) void PADConfigDialognJoy4::OnClose(wxCloseEvent& /*event*/)
{ {
EndModal(0); EndModal(0);
} }
void ConfigBox::AboutClick(wxCommandEvent& event) void PADConfigDialognJoy4::AboutClick(wxCommandEvent& event)
{ {
// Call about dialog // Call about dialog
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
@ -313,7 +313,7 @@ void ConfigBox::AboutClick(wxCommandEvent& event)
#endif #endif
} }
void ConfigBox::OKClick(wxCommandEvent& event) void PADConfigDialognJoy4::OKClick(wxCommandEvent& event)
{ {
if (event.GetId() == ID_OK) if (event.GetId() == ID_OK)
{ {
@ -325,7 +325,7 @@ void ConfigBox::OKClick(wxCommandEvent& event)
} }
} }
void ConfigBox::CancelClick(wxCommandEvent& event) void PADConfigDialognJoy4::CancelClick(wxCommandEvent& event)
{ {
if (event.GetId() == ID_CANCEL) if (event.GetId() == ID_CANCEL)
{ {
@ -333,7 +333,7 @@ void ConfigBox::CancelClick(wxCommandEvent& event)
Close(); Close();
} }
} }
void ConfigBox::StartDebug(wxCommandEvent& event) void PADConfigDialognJoy4::StartDebug(wxCommandEvent& event)
{ {
SDL_Joystick *joy = SDL_JoystickOpen(joysticks[0].ID); SDL_Joystick *joy = SDL_JoystickOpen(joysticks[0].ID);
int axes = SDL_JoystickNumAxes(joy); int axes = SDL_JoystickNumAxes(joy);
@ -356,7 +356,7 @@ void ConfigBox::StartDebug(wxCommandEvent& event)
} }
} }
} }
void ConfigBox::Calibrate(wxCommandEvent& event) void PADConfigDialognJoy4::Calibrate(wxCommandEvent& event)
{ {
int controller = notebookpage; int controller = notebookpage;
@ -391,7 +391,7 @@ void ConfigBox::Calibrate(wxCommandEvent& event)
} }
// Set dialog items // Set dialog items
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::SetControllerAll(int controller) void PADConfigDialognJoy4::SetControllerAll(int controller)
{ {
// http://wiki.wxwidgets.org/Converting_everything_to_and_from_wxString // http://wiki.wxwidgets.org/Converting_everything_to_and_from_wxString
wxString tmp; wxString tmp;
@ -439,7 +439,7 @@ void ConfigBox::SetControllerAll(int controller)
// Get dialog items // Get dialog items
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::GetControllerAll(int controller) void PADConfigDialognJoy4::GetControllerAll(int controller)
{ {
wxString tmp; wxString tmp;
long lvalue; long lvalue;
@ -481,7 +481,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 PADConfigDialognJoy4::UpdateVisibleItems(int controller)
{ {
if(joysticks[controller].controllertype) if(joysticks[controller].controllertype)
{ {
@ -515,7 +515,7 @@ void ConfigBox::UpdateVisibleItems(int controller)
} }
} }
void ConfigBox::ChangeJoystick(wxCommandEvent& event) void PADConfigDialognJoy4::ChangeJoystick(wxCommandEvent& event)
{ {
joysticks[0].ID = m_Joyname[0]->GetSelection(); joysticks[0].ID = m_Joyname[0]->GetSelection();
joysticks[1].ID = m_Joyname[1]->GetSelection(); joysticks[1].ID = m_Joyname[1]->GetSelection();
@ -523,7 +523,7 @@ void ConfigBox::ChangeJoystick(wxCommandEvent& event)
joysticks[3].ID = m_Joyname[3]->GetSelection(); joysticks[3].ID = m_Joyname[3]->GetSelection();
} }
void ConfigBox::ChangeControllertype(wxCommandEvent& event) void PADConfigDialognJoy4::ChangeControllertype(wxCommandEvent& event)
{ {
joysticks[0].controllertype = m_Controltype[0]->GetSelection(); joysticks[0].controllertype = m_Controltype[0]->GetSelection();
joysticks[1].controllertype = m_Controltype[1]->GetSelection(); joysticks[1].controllertype = m_Controltype[1]->GetSelection();
@ -534,12 +534,12 @@ void ConfigBox::ChangeControllertype(wxCommandEvent& event)
UpdateVisibleItems(i); UpdateVisibleItems(i);
} }
void ConfigBox::NotebookPageChanged(wxNotebookEvent& event) void PADConfigDialognJoy4::NotebookPageChanged(wxNotebookEvent& event)
{ {
notebookpage = event.GetSelection(); notebookpage = event.GetSelection();
} }
void ConfigBox::SetButtonText(int id, char text[128]) void PADConfigDialognJoy4::SetButtonText(int id, char text[128])
{ {
int controller = notebookpage; int controller = notebookpage;
@ -651,7 +651,7 @@ void ConfigBox::SetButtonText(int id, char text[128])
break; break;
} }
} }
void ConfigBox::GetInputs(wxCommandEvent& event) void PADConfigDialognJoy4::GetInputs(wxCommandEvent& event)
{ {
int ID = event.GetId(); int ID = event.GetId();
int controller = notebookpage; int controller = notebookpage;
@ -744,7 +744,7 @@ InputEnd:
// Wait for D-Pad // Wait for D-Pad
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void ConfigBox::GetHats(int ID) void PADConfigDialognJoy4::GetHats(int ID)
{ {
int controller = notebookpage; int controller = notebookpage;

View File

@ -47,15 +47,15 @@
#include <wx/statbmp.h> #include <wx/statbmp.h>
class ConfigBox : public wxDialog class PADConfigDialognJoy4 : public wxDialog
{ {
private: private:
DECLARE_EVENT_TABLE(); DECLARE_EVENT_TABLE();
public: public:
ConfigBox(wxWindow *parent, wxWindowID id = 1, const wxString &title = wxT("Configure: nJoy Input Plugin"), PADConfigDialognJoy4(wxWindow *parent, wxWindowID id = 1, const wxString &title = wxT("Configure: nJoy Input Plugin"),
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE); const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE);
virtual ~ConfigBox(); virtual ~PADConfigDialognJoy4();
private: private:
wxButton *m_About; wxButton *m_About;

View File

@ -52,7 +52,6 @@ bool g_rumbleEnable = FALSE;
// Rumble in windows // Rumble in windows
#ifdef _WIN32 #ifdef _WIN32
HINSTANCE nJoy_hInst = NULL;
#ifdef USE_RUMBLE_DINPUT_HACK #ifdef USE_RUMBLE_DINPUT_HACK
LPDIRECTINPUT8 g_pDI = NULL; LPDIRECTINPUT8 g_pDI = NULL;
LPDIRECTINPUTDEVICE8 g_pDevice = NULL; LPDIRECTINPUTDEVICE8 g_pDevice = NULL;
@ -77,11 +76,12 @@ HRESULT SetDeviceForcesXY();
struct ff_effect effect; struct ff_effect effect;
bool CanRumble = false; bool CanRumble = false;
#endif #endif
// Standard crap to make wxWidgets happy
#ifdef _WIN32 #ifdef _WIN32
HINSTANCE g_hInstance;
#if defined(HAVE_WX) && HAVE_WX #if defined(HAVE_WX) && HAVE_WX
//////////////////////////////////////////////////////////////////////////////////////////
// wxWidgets
// ¯¯¯¯¯¯¯¯¯
class wxDLLApp : public wxApp class wxDLLApp : public wxApp
{ {
bool OnInit() bool OnInit()
@ -89,51 +89,61 @@ class wxDLLApp : public wxApp
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
////////////////////////////////////////////////////////////////////////////////////////// BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle
// DllMain DWORD dwReason, // reason called
// ¯¯¯¯¯¯¯ LPVOID lpvReserved) // reserved
BOOL APIENTRY DllMain( HINSTANCE hinstDLL, // DLL module handle
DWORD dwReason, // reason called
LPVOID lpvReserved) // reserved
{ {
switch (dwReason) switch (dwReason)
{ {
case DLL_PROCESS_ATTACH: case DLL_PROCESS_ATTACH:
{ {
#if defined(HAVE_WX) && HAVE_WX #if defined(HAVE_WX) && HAVE_WX
//use wxInitialize() if you don't want GUI instead of the following 12 lines
wxSetInstance((HINSTANCE)hinstDLL); wxSetInstance((HINSTANCE)hinstDLL);
int argc = 0; int argc = 0;
char **argv = NULL; char **argv = NULL;
wxEntryStart(argc, argv); wxEntryStart(argc, argv);
if (!wxTheApp || !wxTheApp->CallOnInit())
if ( !wxTheApp || !wxTheApp->CallOnInit() )
return FALSE; return FALSE;
#endif #endif
} }
break; break;
case DLL_PROCESS_DETACH: case DLL_PROCESS_DETACH:
#if defined(HAVE_WX) && HAVE_WX #if defined(HAVE_WX) && HAVE_WX
wxEntryCleanup(); //use wxUninitialize() if you don't want GUI wxEntryCleanup();
#endif #endif
break; break;
default:
default: break;
break;
} }
nJoy_hInst = hinstDLL; g_hInstance = hinstDLL;
return TRUE; return TRUE;
} }
#endif #endif
#if defined(HAVE_WX) && HAVE_WX
PADConfigDialognJoy4* m_ConfigFrame = NULL;
wxWindow* GetParentedWxWindow(HWND Parent)
{
#ifdef _WIN32
wxSetInstance((HINSTANCE)g_hInstance);
#endif
wxWindow *win = new wxWindow();
#ifdef _WIN32
win->SetHWND((WXHWND)Parent);
win->AdoptAttributesFromHWND();
#endif
return win;
}
#endif
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
// Input Plugin Functions (from spec's) // Input Plugin Functions (from spec's)
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
@ -167,36 +177,34 @@ void SetDllGlobals(PLUGIN_GLOBALS* _pPluginGlobals)
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
void DllConfig(HWND _hParent) void DllConfig(HWND _hParent)
{ {
#ifdef _WIN32 #ifdef _WIN32
if(SDL_Init(SDL_INIT_JOYSTICK ) < 0) if(SDL_Init(SDL_INIT_JOYSTICK ) < 0)
{ {
MessageBox(NULL, SDL_GetError(), "Could not initialize SDL!", MB_ICONERROR); MessageBox(NULL, SDL_GetError(), "Could not initialize SDL!", MB_ICONERROR);
return; return;
} }
#else
LoadConfig(); // load settings
#if defined(HAVE_WX) && HAVE_WX
wxWindow win;
win.SetHWND(_hParent);
ConfigBox frame(&win);
frame.ShowModal();
win.SetHWND(0);
#endif
#else
if(SDL_Init(SDL_INIT_JOYSTICK ) < 0) if(SDL_Init(SDL_INIT_JOYSTICK ) < 0)
{ {
printf("Could not initialize SDL! (%s)\n", SDL_GetError()); printf("Could not initialize SDL! (%s)\n", SDL_GetError());
return; return;
} }
#endif
LoadConfig(); // load settings LoadConfig(); // load settings
#if defined(HAVE_WX) && HAVE_WX #if defined(HAVE_WX) && HAVE_WX
ConfigBox frame(NULL); if (!m_ConfigFrame)
frame.ShowModal(); m_ConfigFrame = new PADConfigDialognJoy4(GetParentedWxWindow(_hParent));
else if (!m_ConfigFrame->GetParent()->IsShown())
m_ConfigFrame->Close(true);
// Only allow one open at a time
if (!m_ConfigFrame->IsShown())
m_ConfigFrame->ShowModal();
else
m_ConfigFrame->Hide();
#endif #endif
#endif
} }
void DllDebugger(HWND _hParent, bool Show) { void DllDebugger(HWND _hParent, bool Show) {