From 518d3854ba5c0016d9773a2f5a28f1063e25623e Mon Sep 17 00:00:00 2001 From: Shawn Hoffman Date: Fri, 3 Jul 2009 03:01:58 +0000 Subject: [PATCH] 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 --- Source/Plugins/Plugin_DSP_HLE/Src/main.cpp | 2 + Source/Plugins/Plugin_DSP_LLE/Src/main.cpp | 2 + .../Plugin_PadSimple/Src/PadSimple.cpp | 2 + Source/Plugins/Plugin_VideoOGL/Src/main.cpp | 2 + Source/Plugins/Plugin_Wiimote/Src/main.cpp | 2 + Source/Plugins/Plugin_nJoy_SDL/Src/Config.cpp | 8 +- .../Src/GUI/ConfigAdvanced.cpp | 10 +- .../Plugin_nJoy_SDL/Src/GUI/ConfigBox.cpp | 134 ++++++++-------- .../Plugin_nJoy_SDL/Src/GUI/ConfigBox.h | 6 +- .../Plugin_nJoy_SDL/Src/GUI/ConfigJoypad.cpp | 12 +- Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp | 148 +++++++++--------- .../Plugin_nJoy_Testing/Src/GUI/ConfigBox.cpp | 90 +++++------ .../Plugin_nJoy_Testing/Src/GUI/ConfigBox.h | 6 +- .../Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp | 90 ++++++----- 14 files changed, 270 insertions(+), 244 deletions(-) diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/main.cpp b/Source/Plugins/Plugin_DSP_HLE/Src/main.cpp index ea6637710e..a3a084b21e 100644 --- a/Source/Plugins/Plugin_DSP_HLE/Src/main.cpp +++ b/Source/Plugins/Plugin_DSP_HLE/Src/main.cpp @@ -172,6 +172,8 @@ void DllConfig(HWND _hParent) #if defined(HAVE_WX) && HAVE_WX if (!m_ConfigFrame) m_ConfigFrame = new DSPConfigDialogHLE(GetParentedWxWindow(_hParent)); + else if (!m_ConfigFrame->GetParent()->IsShown()) + m_ConfigFrame->Close(true); // add backends std::vector backends = AudioCommon::GetSoundBackends(); diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/main.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/main.cpp index 918649be76..78aa9c17e0 100644 --- a/Source/Plugins/Plugin_DSP_LLE/Src/main.cpp +++ b/Source/Plugins/Plugin_DSP_LLE/Src/main.cpp @@ -142,6 +142,8 @@ void DllConfig(HWND _hParent) #if defined(HAVE_WX) && HAVE_WX if (!m_ConfigFrame) m_ConfigFrame = new DSPConfigDialogLLE(GetParentedWxWindow(_hParent)); + else if (!m_ConfigFrame->GetParent()->IsShown()) + m_ConfigFrame->Close(true); // add backends std::vector backends = AudioCommon::GetSoundBackends(); diff --git a/Source/Plugins/Plugin_PadSimple/Src/PadSimple.cpp b/Source/Plugins/Plugin_PadSimple/Src/PadSimple.cpp index d65265b921..58a1cb322e 100644 --- a/Source/Plugins/Plugin_PadSimple/Src/PadSimple.cpp +++ b/Source/Plugins/Plugin_PadSimple/Src/PadSimple.cpp @@ -634,6 +634,8 @@ void DllConfig(HWND _hParent) #if defined(HAVE_WX) && HAVE_WX if (!m_ConfigFrame) m_ConfigFrame = new PADConfigDialogSimple(GetParentedWxWindow(_hParent)); + else if (!m_ConfigFrame->GetParent()->IsShown()) + m_ConfigFrame->Close(true); // Only allow one open at a time if (!m_ConfigFrame->IsShown()) diff --git a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp index b2067f23a0..e2f2ebd206 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp @@ -167,6 +167,8 @@ void DllConfig(HWND _hParent) #if defined(HAVE_WX) && HAVE_WX if (!m_ConfigFrame) m_ConfigFrame = new GFXConfigDialogOGL(GetParentedWxWindow(_hParent)); + else if (!m_ConfigFrame->GetParent()->IsShown()) + m_ConfigFrame->Close(true); #if defined(_WIN32) diff --git a/Source/Plugins/Plugin_Wiimote/Src/main.cpp b/Source/Plugins/Plugin_Wiimote/Src/main.cpp index 588f08bd22..b8282bc500 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/main.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/main.cpp @@ -192,6 +192,8 @@ void DllConfig(HWND _hParent) if (!m_ConfigFrame) m_ConfigFrame = new WiimoteConfigDialog(GetParentedWxWindow(_hParent)); + else if (!m_ConfigFrame->GetParent()->IsShown()) + m_ConfigFrame->Close(true); // Only allow one open at a time if (!m_ConfigFrame->IsShown()) diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/Config.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/Config.cpp index 6073af7746..2112bf00e0 100644 --- a/Source/Plugins/Plugin_nJoy_SDL/Src/Config.cpp +++ b/Source/Plugins/Plugin_nJoy_SDL/Src/Config.cpp @@ -38,7 +38,7 @@ Config g_Config; #if defined(HAVE_WX) && HAVE_WX -extern ConfigBox* m_frame; +extern PADConfigDialognJoy* m_ConfigFrame; #endif ////////////////////////////////// @@ -179,7 +179,7 @@ void Config::Save(int Slot) // ====================================== // 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); @@ -221,7 +221,7 @@ void Config::Load(bool ChangePad, bool ChangeSaveByID) { 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) { file.Get(SectionName.c_str(), "joy_id", &PadMapping[i].ID, 0); @@ -273,7 +273,7 @@ void Config::Load(bool ChangePad, bool ChangeSaveByID) // ============================= // 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); diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigAdvanced.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigAdvanced.cpp index e5e6a8eaee..95d4b9b8a0 100644 --- a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigAdvanced.cpp +++ b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigAdvanced.cpp @@ -46,7 +46,7 @@ bool StrangeHack = true; // 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 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 // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::Update() +void PADConfigDialognJoy::Update() { // 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, @@ -276,7 +276,7 @@ void ConfigBox::Update() // 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_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; wxBitmap bitmap(BoxW, BoxH); @@ -363,7 +363,7 @@ wxBitmap ConfigBox::CreateBitmap() // Create box return bitmap; } -wxBitmap ConfigBox::CreateBitmapDot() // Create dot +wxBitmap PADConfigDialognJoy::CreateBitmapDot() // Create dot { int w = 2, h = 2; wxBitmap bitmap(w, h); diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.cpp index a1d057610a..f7cde6d13d 100644 --- a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.cpp +++ b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.cpp @@ -60,65 +60,65 @@ static const char* TriggerType[] = ////////////////////////////////////////////////////////////////////////////////////////// // The wxWidgets class // ŻŻŻŻŻŻŻ -BEGIN_EVENT_TABLE(ConfigBox,wxDialog) - EVT_CLOSE(ConfigBox::OnClose) - EVT_BUTTON(ID_ABOUT, ConfigBox::AboutClick) - EVT_BUTTON(ID_OK, ConfigBox::OKClick) - EVT_BUTTON(ID_CANCEL, ConfigBox::CancelClick) - EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK, ConfigBox::NotebookPageChanged) +BEGIN_EVENT_TABLE(PADConfigDialognJoy,wxDialog) + EVT_CLOSE(PADConfigDialognJoy::OnClose) + EVT_BUTTON(ID_ABOUT, PADConfigDialognJoy::AboutClick) + EVT_BUTTON(ID_OK, PADConfigDialognJoy::OKClick) + EVT_BUTTON(ID_CANCEL, PADConfigDialognJoy::CancelClick) + EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK, PADConfigDialognJoy::NotebookPageChanged) // Change and enable or disable gamepad - EVT_COMBOBOX(IDC_JOYNAME, ConfigBox::ChangeSettings) - EVT_CHECKBOX(IDC_JOYATTACH, ConfigBox::ChangeSettings) + EVT_COMBOBOX(IDC_JOYNAME, PADConfigDialognJoy::ChangeSettings) + EVT_CHECKBOX(IDC_JOYATTACH, PADConfigDialognJoy::ChangeSettings) // Other settings - EVT_CHECKBOX(IDC_SAVEBYID, ConfigBox::ChangeSettings) - EVT_CHECKBOX(IDC_SHOWADVANCED, ConfigBox::ChangeSettings) - EVT_CHECKBOX(IDCB_CHECKFOCUS, ConfigBox::ChangeSettings) - EVT_COMBOBOX(IDCB_MAINSTICK_DIAGONAL, ConfigBox::ChangeSettings) - EVT_COMBOBOX(IDC_CONTROLTYPE, ConfigBox::ChangeSettings) - EVT_COMBOBOX(IDC_TRIGGERTYPE, ConfigBox::ChangeSettings) - EVT_COMBOBOX(IDC_DEADZONE, ConfigBox::ChangeSettings) + EVT_CHECKBOX(IDC_SAVEBYID, PADConfigDialognJoy::ChangeSettings) + EVT_CHECKBOX(IDC_SHOWADVANCED, PADConfigDialognJoy::ChangeSettings) + EVT_CHECKBOX(IDCB_CHECKFOCUS, PADConfigDialognJoy::ChangeSettings) + EVT_COMBOBOX(IDCB_MAINSTICK_DIAGONAL, PADConfigDialognJoy::ChangeSettings) + EVT_COMBOBOX(IDC_CONTROLTYPE, PADConfigDialognJoy::ChangeSettings) + EVT_COMBOBOX(IDC_TRIGGERTYPE, PADConfigDialognJoy::ChangeSettings) + EVT_COMBOBOX(IDC_DEADZONE, PADConfigDialognJoy::ChangeSettings) // Rumble settings - EVT_CHECKBOX(IDC_ENABLERUMBLE, ConfigBox::ChangeSettings) - EVT_COMBOBOX(IDC_RUMBLESTRENGTH, ConfigBox::ChangeSettings) + EVT_CHECKBOX(IDC_ENABLERUMBLE, PADConfigDialognJoy::ChangeSettings) + EVT_COMBOBOX(IDC_RUMBLESTRENGTH, PADConfigDialognJoy::ChangeSettings) // Advanced settings - EVT_COMBOBOX(IDCB_MAINSTICK_DIAGONAL, ConfigBox::ChangeSettings) - EVT_CHECKBOX(IDCB_MAINSTICK_S_TO_C, ConfigBox::ChangeSettings) - EVT_CHECKBOX(IDCB_FILTER_SETTINGS, ConfigBox::ChangeSettings) + EVT_COMBOBOX(IDCB_MAINSTICK_DIAGONAL, PADConfigDialognJoy::ChangeSettings) + EVT_CHECKBOX(IDCB_MAINSTICK_S_TO_C, PADConfigDialognJoy::ChangeSettings) + EVT_CHECKBOX(IDCB_FILTER_SETTINGS, PADConfigDialognJoy::ChangeSettings) #ifdef RERECORDING - EVT_CHECKBOX(ID_RECORDING, ConfigBox::ChangeSettings) - EVT_CHECKBOX(ID_PLAYBACK, ConfigBox::ChangeSettings) - EVT_BUTTON(ID_SAVE_RECORDING, ConfigBox::GetButtons) + EVT_CHECKBOX(ID_RECORDING, PADConfigDialognJoy::ChangeSettings) + EVT_CHECKBOX(ID_PLAYBACK, PADConfigDialognJoy::ChangeSettings) + EVT_BUTTON(ID_SAVE_RECORDING, PADConfigDialognJoy::GetButtons) #endif - EVT_BUTTON(IDB_SHOULDER_L, ConfigBox::GetButtons) - EVT_BUTTON(IDB_SHOULDER_R, ConfigBox::GetButtons) - EVT_BUTTON(IDB_BUTTON_A, ConfigBox::GetButtons) - EVT_BUTTON(IDB_BUTTON_B, ConfigBox::GetButtons) - EVT_BUTTON(IDB_BUTTON_X, ConfigBox::GetButtons) - EVT_BUTTON(IDB_BUTTON_Y, ConfigBox::GetButtons) - EVT_BUTTON(IDB_BUTTON_Z, ConfigBox::GetButtons) - EVT_BUTTON(IDB_BUTTONSTART, ConfigBox::GetButtons) - EVT_BUTTON(IDB_BUTTONHALFPRESS, ConfigBox::GetButtons) - EVT_BUTTON(IDB_DPAD_UP, ConfigBox::GetButtons) - EVT_BUTTON(IDB_DPAD_DOWN, ConfigBox::GetButtons) - EVT_BUTTON(IDB_DPAD_LEFT, ConfigBox::GetButtons) - EVT_BUTTON(IDB_DPAD_RIGHT, ConfigBox::GetButtons) - EVT_BUTTON(IDB_ANALOG_MAIN_X, ConfigBox::GetButtons) - EVT_BUTTON(IDB_ANALOG_MAIN_Y, ConfigBox::GetButtons) - EVT_BUTTON(IDB_ANALOG_SUB_X, ConfigBox::GetButtons) - EVT_BUTTON(IDB_ANALOG_SUB_Y, ConfigBox::GetButtons) + EVT_BUTTON(IDB_SHOULDER_L, PADConfigDialognJoy::GetButtons) + EVT_BUTTON(IDB_SHOULDER_R, PADConfigDialognJoy::GetButtons) + EVT_BUTTON(IDB_BUTTON_A, PADConfigDialognJoy::GetButtons) + EVT_BUTTON(IDB_BUTTON_B, PADConfigDialognJoy::GetButtons) + EVT_BUTTON(IDB_BUTTON_X, PADConfigDialognJoy::GetButtons) + EVT_BUTTON(IDB_BUTTON_Y, PADConfigDialognJoy::GetButtons) + EVT_BUTTON(IDB_BUTTON_Z, PADConfigDialognJoy::GetButtons) + EVT_BUTTON(IDB_BUTTONSTART, PADConfigDialognJoy::GetButtons) + EVT_BUTTON(IDB_BUTTONHALFPRESS, PADConfigDialognJoy::GetButtons) + EVT_BUTTON(IDB_DPAD_UP, PADConfigDialognJoy::GetButtons) + EVT_BUTTON(IDB_DPAD_DOWN, PADConfigDialognJoy::GetButtons) + EVT_BUTTON(IDB_DPAD_LEFT, PADConfigDialognJoy::GetButtons) + EVT_BUTTON(IDB_DPAD_RIGHT, PADConfigDialognJoy::GetButtons) + EVT_BUTTON(IDB_ANALOG_MAIN_X, PADConfigDialognJoy::GetButtons) + EVT_BUTTON(IDB_ANALOG_MAIN_Y, PADConfigDialognJoy::GetButtons) + EVT_BUTTON(IDB_ANALOG_SUB_X, PADConfigDialognJoy::GetButtons) + EVT_BUTTON(IDB_ANALOG_SUB_Y, PADConfigDialognJoy::GetButtons) #if wxUSE_TIMER - EVT_TIMER(IDTM_CONSTANT, ConfigBox::OnTimer) - EVT_TIMER(IDTM_BUTTON, ConfigBox::OnButtonTimer) + EVT_TIMER(IDTM_CONSTANT, PADConfigDialognJoy::OnTimer) + EVT_TIMER(IDTM_BUTTON, PADConfigDialognJoy::OnButtonTimer) #endif 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) : 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 wxTheApp->Connect(wxID_ANY, wxEVT_KEY_UP, - wxKeyEventHandler(ConfigBox::OnKeyDown), + wxKeyEventHandler(PADConfigDialognJoy::OnKeyDown), (wxObject*)0, this); } -ConfigBox::~ConfigBox() +PADConfigDialognJoy::~PADConfigDialognJoy() { // The statbar sample has this so I add this to #if wxUSE_TIMER @@ -158,7 +158,7 @@ ConfigBox::~ConfigBox() #endif } -void ConfigBox::OnKeyDown(wxKeyEvent& event) +void PADConfigDialognJoy::OnKeyDown(wxKeyEvent& event) { /*m_pStatusBar->SetLabel(wxString::Format( "Key: %i", event.GetKeyCode() @@ -168,7 +168,7 @@ void ConfigBox::OnKeyDown(wxKeyEvent& event) // Close window // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::OnClose(wxCloseEvent& event) +void PADConfigDialognJoy::OnClose(wxCloseEvent& event) { // Allow wxWidgets to close the window event.Skip(); @@ -182,7 +182,7 @@ void ConfigBox::OnClose(wxCloseEvent& event) // Call about dialog // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::AboutClick(wxCommandEvent& event) +void PADConfigDialognJoy::AboutClick(wxCommandEvent& event) { #ifdef _WIN32 wxWindow win; @@ -202,7 +202,7 @@ void ConfigBox::AboutClick(wxCommandEvent& event) // Click OK // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::OKClick(wxCommandEvent& event) +void PADConfigDialognJoy::OKClick(wxCommandEvent& event) { if (event.GetId() == ID_OK) { @@ -214,7 +214,7 @@ void ConfigBox::OKClick(wxCommandEvent& event) // Click Cancel // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::CancelClick(wxCommandEvent& event) +void PADConfigDialognJoy::CancelClick(wxCommandEvent& event) { if (event.GetId() == ID_CANCEL) { @@ -226,7 +226,7 @@ void ConfigBox::CancelClick(wxCommandEvent& event) // Debugging // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::LogMsg(const char* format, ...) +void PADConfigDialognJoy::LogMsg(const char* format, ...) { #ifdef _WIN32 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 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 ToBlank(false); @@ -289,7 +289,7 @@ void ConfigBox::DoSave(bool ChangePad, int Slot) // On changing the SaveById option we update all pages // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::OnSaveById() +void PADConfigDialognJoy::OnSaveById() { // Save current settings 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 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. */ -void ConfigBox::DoChangeJoystick() +void PADConfigDialognJoy::DoChangeJoystick() { // Close the current pad, unless it's used by another slot //if (PadMapping[notebookpage].enabled) PadClose(notebookpage); @@ -322,7 +322,7 @@ void ConfigBox::DoChangeJoystick() // Open the new pad 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 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); } -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); PadState[Close].joy = NULL; @@ -341,7 +341,7 @@ void ConfigBox::PadClose(int Close) // Close for slot 1, 2, 3 or 4 // Notebook page changed // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::NotebookPageChanged(wxNotebookEvent& event) +void PADConfigDialognJoy::NotebookPageChanged(wxNotebookEvent& event) { // Save current settings now, don't wait for OK 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 // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::ToBlank(bool ToBlank) +void PADConfigDialognJoy::ToBlank(bool ToBlank) { if (!ControlsCreated) return; @@ -383,7 +383,7 @@ void ConfigBox::ToBlank(bool ToBlank) /////////////////////////////////////////////////////////////////////////////////// // 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++) { @@ -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++) { @@ -405,7 +405,7 @@ void ConfigBox::SaveButtonMappingAll(int Slot) } } -void ConfigBox::UpdateGUIAll(int Slot) +void PADConfigDialognJoy::UpdateGUIAll(int Slot) { 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()) { @@ -519,7 +519,7 @@ void ConfigBox::ChangeSettings( wxCommandEvent& event ) // Update GUI // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ // 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 (NumGoodPads == 0) @@ -597,7 +597,7 @@ void ConfigBox::UpdateGUI(int _notebookpage) // Paint the background // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::OnPaint(wxPaintEvent &event) +void PADConfigDialognJoy::OnPaint(wxPaintEvent &event) { event.Skip(); @@ -611,7 +611,7 @@ void ConfigBox::OnPaint(wxPaintEvent &event) // Populate the config window // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::CreateGUIControls() +void PADConfigDialognJoy::CreateGUIControls() { 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 m_pKeys[i]->Connect(wxID_ANY, wxEVT_PAINT, - wxPaintEventHandler(ConfigBox::OnPaint), + wxPaintEventHandler(PADConfigDialognJoy::OnPaint), (wxObject*)0, this); @@ -1098,7 +1098,7 @@ void ConfigBox::CreateGUIControls() ToBlank(); } -void ConfigBox::SizeWindow() +void PADConfigDialognJoy::SizeWindow() { SetClientSize(m_MainSizer->GetMinSize().GetWidth(), m_MainSizer->GetMinSize().GetHeight()); } diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.h b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.h index 3144d17cd2..e42dccf156 100644 --- a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.h +++ b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.h @@ -50,17 +50,17 @@ #include "../nJoy.h" -class ConfigBox : public wxDialog +class PADConfigDialognJoy : public wxDialog { private: DECLARE_EVENT_TABLE(); public: - ConfigBox(wxWindow *parent, wxWindowID id = 1, + PADConfigDialognJoy(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); - virtual ~ConfigBox(); + virtual ~PADConfigDialognJoy(); #if wxUSE_TIMER void OnTimer(wxTimerEvent& WXUNUSED(event)) { Update(); } diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigJoypad.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigJoypad.cpp index c5a230734a..1e24c80f29 100644 --- a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigJoypad.cpp +++ b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigJoypad.cpp @@ -45,7 +45,7 @@ extern bool g_EmulatorRunning; // 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 wxString tmp; @@ -105,7 +105,7 @@ void ConfigBox::UpdateGUIButtonMapping(int controller) /* Populate the PadMapping array with the dialog items settings (for example 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 wxString tmp; @@ -169,7 +169,7 @@ void ConfigBox::SaveButtonMapping(int controller, bool DontChangeId, int FromSlo // 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 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 // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -wxString ConfigBox::GetButtonText(int id, int Page) +wxString PADConfigDialognJoy::GetButtonText(int id, int Page) { // Set controller value 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 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. */ -void ConfigBox::GetButtons(wxCommandEvent& event) +void PADConfigDialognJoy::GetButtons(wxCommandEvent& event) { DoGetButtons(event.GetId()); } -void ConfigBox::DoGetButtons(int GetId) +void PADConfigDialognJoy::DoGetButtons(int GetId) { // ============================================= // Collect the starting values diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp index e04655918c..d40a42ac01 100644 --- a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp +++ b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp @@ -56,7 +56,7 @@ 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 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 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 #if defined(HAVE_WX) && HAVE_WX - ConfigBox* m_frame; + PADConfigDialognJoy* m_ConfigFrame = NULL; #endif ///////////////////////// @@ -83,7 +83,6 @@ #define _EXCLUDE_MAIN_ // Avoid certain declarations in nJoy.h FILE *pFile; -HINSTANCE nJoy_hInst = NULL; std::vector joyinfo; InputCommon::CONTROLLER_STATE PadState[4]; InputCommon::CONTROLLER_MAPPING PadMapping[4]; @@ -100,59 +99,70 @@ PLUGIN_GLOBALS* globals = NULL; extern int fd; #endif -////////////////////////////////////////////////////////////////////////////////////////// -// wxWidgets -// ŻŻŻŻŻŻŻŻŻ -#if defined(HAVE_WX) && HAVE_WX - class wxDLLApp : public wxApp - { - bool OnInit() - { - return true; - } - }; +// Standard crap to make wxWidgets happy +#ifdef _WIN32 +HINSTANCE g_hInstance; - 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); #endif - -////////////////////////////////////////////////////////////////////////////////////////// -// DllMain -// ŻŻŻŻŻŻŻ -#ifdef _WIN32 -BOOL APIENTRY DllMain( HINSTANCE hinstDLL, // DLL module handle - DWORD dwReason, // reason called - LPVOID lpvReserved) // reserved +BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle + DWORD dwReason, // reason called + LPVOID lpvReserved) // reserved { switch (dwReason) { - case DLL_PROCESS_ATTACH: - { - //use wxInitialize() if you don't want GUI instead of the following 12 lines + case DLL_PROCESS_ATTACH: + { +#if defined(HAVE_WX) && HAVE_WX wxSetInstance((HINSTANCE)hinstDLL); int argc = 0; char **argv = NULL; wxEntryStart(argc, argv); - - if (!wxTheApp || !wxTheApp->CallOnInit() ) + if (!wxTheApp || !wxTheApp->CallOnInit()) return FALSE; +#endif } - break; + break; - case DLL_PROCESS_DETACH: - wxEntryCleanup(); //use wxUninitialize() if you don't want GUI + case DLL_PROCESS_DETACH: +#if defined(HAVE_WX) && HAVE_WX + wxEntryCleanup(); +#endif + break; + default: break; - - default: - break; } - nJoy_hInst = hinstDLL; + g_hInstance = hinstDLL; return TRUE; } #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) @@ -187,43 +197,41 @@ void SetDllGlobals(PLUGIN_GLOBALS* _pPluginGlobals) // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ void DllConfig(HWND _hParent) { - // Debugging - // #ifdef SHOW_PAD_STATUS - // Console::Open(100); - // m_hConsole = Console::GetHwnd(); - // #endif +#ifdef _WIN32 + // Start the pads so we can use them in the configuration and advanced controls + if (!g_EmulatorRunning) + { + Search_Devices(joyinfo, NumPads, NumGoodPads); // Populate joyinfo for all attached devices - #ifdef _WIN32 - // Start the pads so we can use them in the configuration and advanced controls - if(!g_EmulatorRunning) + // Check if a DirectInput error occured + if (ReloadDLL()) { - Search_Devices(joyinfo, NumPads, NumGoodPads); // Populate joyinfo for all attached devices - - // 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()); + PostMessage(_hParent, WM_USER, NJOY_RELOAD, 0); 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 - ConfigBox frame(NULL); - frame.ShowModal(); - #endif - #endif +#if defined(HAVE_WX) && HAVE_WX + if (!m_ConfigFrame) + m_ConfigFrame = new PADConfigDialognJoy(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 } 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 #if defined(HAVE_WX) && HAVE_WX - if(!m_frame) + if(!m_ConfigFrame) { Search_Devices(joyinfo, NumPads, NumGoodPads); // 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 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() { 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 // Todo: Coordinate with the Wiimote plugin, SDL_Quit() will remove the pad for it to #if defined(HAVE_WX) && HAVE_WX - if (m_frame) return; + if (m_ConfigFrame) return; #endif /* Close all devices carefully. We must check that we are not accessing any undefined vector elements or any bad devices */ @@ -663,7 +671,7 @@ return true; HWND RenderingWindow = NULL; if (g_PADInitialize) RenderingWindow = g_PADInitialize->hWnd; HWND Parent = GetParent(RenderingWindow); 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 if (GetForegroundWindow() == TopLevel || GetForegroundWindow() == RenderingWindow || GetForegroundWindow() == Config || GetForegroundWindow() == m_hConsole) return true; diff --git a/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.cpp b/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.cpp index 38f8cd28f3..86e20951c8 100644 --- a/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.cpp +++ b/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.cpp @@ -45,51 +45,51 @@ static const char* ControllerType[] = // "Keyboard" // Not supported yet, sorry F|RES ;( ... }; -BEGIN_EVENT_TABLE(ConfigBox,wxDialog) - EVT_CLOSE(ConfigBox::OnClose) - EVT_BUTTON(ID_ABOUT, ConfigBox::AboutClick) - EVT_BUTTON(ID_OK, ConfigBox::OKClick) - EVT_BUTTON(ID_CANCEL, ConfigBox::CancelClick) - EVT_COMBOBOX(IDC_JOYNAME, ConfigBox::ChangeJoystick) - EVT_COMBOBOX(IDC_CONTROLTYPE, ConfigBox::ChangeControllertype) - EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK, ConfigBox::NotebookPageChanged) +BEGIN_EVENT_TABLE(PADConfigDialognJoy4,wxDialog) + EVT_CLOSE(PADConfigDialognJoy4::OnClose) + EVT_BUTTON(ID_ABOUT, PADConfigDialognJoy4::AboutClick) + EVT_BUTTON(ID_OK, PADConfigDialognJoy4::OKClick) + EVT_BUTTON(ID_CANCEL, PADConfigDialognJoy4::CancelClick) + EVT_COMBOBOX(IDC_JOYNAME, PADConfigDialognJoy4::ChangeJoystick) + EVT_COMBOBOX(IDC_CONTROLTYPE, PADConfigDialognJoy4::ChangeControllertype) + EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK, PADConfigDialognJoy4::NotebookPageChanged) - EVT_BUTTON(IDB_SHOULDER_L, ConfigBox::GetInputs) - EVT_BUTTON(IDB_SHOULDER_R, ConfigBox::GetInputs) - EVT_BUTTON(IDB_BUTTON_A, ConfigBox::GetInputs) - EVT_BUTTON(IDB_BUTTON_B, ConfigBox::GetInputs) - EVT_BUTTON(IDB_BUTTON_X, ConfigBox::GetInputs) - EVT_BUTTON(IDB_BUTTON_Y, ConfigBox::GetInputs) - EVT_BUTTON(IDB_BUTTON_Z, ConfigBox::GetInputs) - EVT_BUTTON(IDB_BUTTONSTART, ConfigBox::GetInputs) - EVT_BUTTON(ID_BUTTONCALIBRATE, ConfigBox::Calibrate) - EVT_BUTTON(IDB_BUTTONHALFPRESS, ConfigBox::GetInputs) - EVT_BUTTON(IDB_DPAD_UP, ConfigBox::GetInputs) - EVT_BUTTON(IDB_DPAD_DOWN, ConfigBox::GetInputs) - EVT_BUTTON(IDB_DPAD_LEFT, ConfigBox::GetInputs) - EVT_BUTTON(IDB_DPAD_RIGHT, ConfigBox::GetInputs) + EVT_BUTTON(IDB_SHOULDER_L, PADConfigDialognJoy4::GetInputs) + EVT_BUTTON(IDB_SHOULDER_R, PADConfigDialognJoy4::GetInputs) + EVT_BUTTON(IDB_BUTTON_A, PADConfigDialognJoy4::GetInputs) + EVT_BUTTON(IDB_BUTTON_B, PADConfigDialognJoy4::GetInputs) + EVT_BUTTON(IDB_BUTTON_X, PADConfigDialognJoy4::GetInputs) + EVT_BUTTON(IDB_BUTTON_Y, PADConfigDialognJoy4::GetInputs) + EVT_BUTTON(IDB_BUTTON_Z, PADConfigDialognJoy4::GetInputs) + EVT_BUTTON(IDB_BUTTONSTART, PADConfigDialognJoy4::GetInputs) + EVT_BUTTON(ID_BUTTONCALIBRATE, PADConfigDialognJoy4::Calibrate) + EVT_BUTTON(IDB_BUTTONHALFPRESS, PADConfigDialognJoy4::GetInputs) + EVT_BUTTON(IDB_DPAD_UP, PADConfigDialognJoy4::GetInputs) + EVT_BUTTON(IDB_DPAD_DOWN, PADConfigDialognJoy4::GetInputs) + EVT_BUTTON(IDB_DPAD_LEFT, PADConfigDialognJoy4::GetInputs) + EVT_BUTTON(IDB_DPAD_RIGHT, PADConfigDialognJoy4::GetInputs) - EVT_BUTTON(IDB_ANALOG_MAIN_X, ConfigBox::GetInputs) - EVT_BUTTON(IDB_ANALOG_MAIN_Y, ConfigBox::GetInputs) - EVT_BUTTON(IDB_ANALOG_SUB_X, ConfigBox::GetInputs) - EVT_BUTTON(IDB_ANALOG_SUB_Y, ConfigBox::GetInputs) - EVT_BUTTON(IDB_BUTTONDEBUGSTART,ConfigBox::StartDebug) + EVT_BUTTON(IDB_ANALOG_MAIN_X, PADConfigDialognJoy4::GetInputs) + EVT_BUTTON(IDB_ANALOG_MAIN_Y, PADConfigDialognJoy4::GetInputs) + EVT_BUTTON(IDB_ANALOG_SUB_X, PADConfigDialognJoy4::GetInputs) + EVT_BUTTON(IDB_ANALOG_SUB_Y, PADConfigDialognJoy4::GetInputs) + EVT_BUTTON(IDB_BUTTONDEBUGSTART,PADConfigDialognJoy4::StartDebug) 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) { notebookpage = 0; CreateGUIControls(); } -ConfigBox::~ConfigBox() +PADConfigDialognJoy4::~PADConfigDialognJoy4() { // empty } // Warning: horrible code below proceed at own risk! -void ConfigBox::CreateGUIControls() +void PADConfigDialognJoy4::CreateGUIControls() { #ifndef _DEBUG 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")); } -void ConfigBox::OnClose(wxCloseEvent& /*event*/) +void PADConfigDialognJoy4::OnClose(wxCloseEvent& /*event*/) { EndModal(0); } -void ConfigBox::AboutClick(wxCommandEvent& event) +void PADConfigDialognJoy4::AboutClick(wxCommandEvent& event) { // Call about dialog // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ @@ -313,7 +313,7 @@ void ConfigBox::AboutClick(wxCommandEvent& event) #endif } -void ConfigBox::OKClick(wxCommandEvent& event) +void PADConfigDialognJoy4::OKClick(wxCommandEvent& event) { 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) { @@ -333,7 +333,7 @@ void ConfigBox::CancelClick(wxCommandEvent& event) Close(); } } -void ConfigBox::StartDebug(wxCommandEvent& event) +void PADConfigDialognJoy4::StartDebug(wxCommandEvent& event) { SDL_Joystick *joy = SDL_JoystickOpen(joysticks[0].ID); 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; @@ -391,7 +391,7 @@ void ConfigBox::Calibrate(wxCommandEvent& event) } // Set dialog items // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::SetControllerAll(int controller) +void PADConfigDialognJoy4::SetControllerAll(int controller) { // http://wiki.wxwidgets.org/Converting_everything_to_and_from_wxString wxString tmp; @@ -439,7 +439,7 @@ void ConfigBox::SetControllerAll(int controller) // Get dialog items // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::GetControllerAll(int controller) +void PADConfigDialognJoy4::GetControllerAll(int controller) { wxString tmp; long lvalue; @@ -481,7 +481,7 @@ void ConfigBox::GetControllerAll(int controller) joysticks[controller].deadzone = m_Deadzone[controller]->GetSelection(); } -void ConfigBox::UpdateVisibleItems(int controller) +void PADConfigDialognJoy4::UpdateVisibleItems(int controller) { 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[1].ID = m_Joyname[1]->GetSelection(); @@ -523,7 +523,7 @@ void ConfigBox::ChangeJoystick(wxCommandEvent& event) 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[1].controllertype = m_Controltype[1]->GetSelection(); @@ -534,12 +534,12 @@ void ConfigBox::ChangeControllertype(wxCommandEvent& event) UpdateVisibleItems(i); } -void ConfigBox::NotebookPageChanged(wxNotebookEvent& event) +void PADConfigDialognJoy4::NotebookPageChanged(wxNotebookEvent& event) { notebookpage = event.GetSelection(); } -void ConfigBox::SetButtonText(int id, char text[128]) +void PADConfigDialognJoy4::SetButtonText(int id, char text[128]) { int controller = notebookpage; @@ -651,7 +651,7 @@ void ConfigBox::SetButtonText(int id, char text[128]) break; } } -void ConfigBox::GetInputs(wxCommandEvent& event) +void PADConfigDialognJoy4::GetInputs(wxCommandEvent& event) { int ID = event.GetId(); int controller = notebookpage; @@ -744,7 +744,7 @@ InputEnd: // Wait for D-Pad // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::GetHats(int ID) +void PADConfigDialognJoy4::GetHats(int ID) { int controller = notebookpage; diff --git a/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.h b/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.h index a287dd8768..590cc3941a 100644 --- a/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.h +++ b/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.h @@ -47,15 +47,15 @@ #include -class ConfigBox : public wxDialog +class PADConfigDialognJoy4 : public wxDialog { private: DECLARE_EVENT_TABLE(); 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); - virtual ~ConfigBox(); + virtual ~PADConfigDialognJoy4(); private: wxButton *m_About; diff --git a/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp b/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp index dacc779439..e68ae37ee9 100644 --- a/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp +++ b/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp @@ -52,7 +52,6 @@ bool g_rumbleEnable = FALSE; // Rumble in windows #ifdef _WIN32 -HINSTANCE nJoy_hInst = NULL; #ifdef USE_RUMBLE_DINPUT_HACK LPDIRECTINPUT8 g_pDI = NULL; LPDIRECTINPUTDEVICE8 g_pDevice = NULL; @@ -77,11 +76,12 @@ HRESULT SetDeviceForcesXY(); struct ff_effect effect; bool CanRumble = false; #endif + +// Standard crap to make wxWidgets happy #ifdef _WIN32 +HINSTANCE g_hInstance; + #if defined(HAVE_WX) && HAVE_WX -////////////////////////////////////////////////////////////////////////////////////////// -// wxWidgets -// ŻŻŻŻŻŻŻŻŻ class wxDLLApp : public wxApp { bool OnInit() @@ -89,51 +89,61 @@ class wxDLLApp : public wxApp return true; } }; - -IMPLEMENT_APP_NO_MAIN(wxDLLApp) -WXDLLIMPEXP_BASE void wxSetInstance(HINSTANCE hInst); +IMPLEMENT_APP_NO_MAIN(wxDLLApp) + WXDLLIMPEXP_BASE void wxSetInstance(HINSTANCE hInst); #endif -////////////////////////////////////////////////////////////////////////////////////////// -// DllMain -// ŻŻŻŻŻŻŻ - -BOOL APIENTRY DllMain( HINSTANCE hinstDLL, // DLL module handle - DWORD dwReason, // reason called - LPVOID lpvReserved) // reserved +BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle + DWORD dwReason, // reason called + LPVOID lpvReserved) // reserved { switch (dwReason) { - case DLL_PROCESS_ATTACH: - { + case DLL_PROCESS_ATTACH: + { #if defined(HAVE_WX) && HAVE_WX - //use wxInitialize() if you don't want GUI instead of the following 12 lines wxSetInstance((HINSTANCE)hinstDLL); int argc = 0; char **argv = NULL; wxEntryStart(argc, argv); - - if ( !wxTheApp || !wxTheApp->CallOnInit() ) + if (!wxTheApp || !wxTheApp->CallOnInit()) return FALSE; #endif } - break; + break; - case DLL_PROCESS_DETACH: + case DLL_PROCESS_DETACH: #if defined(HAVE_WX) && HAVE_WX - wxEntryCleanup(); //use wxUninitialize() if you don't want GUI + wxEntryCleanup(); #endif break; - - default: - break; + default: + break; } - nJoy_hInst = hinstDLL; + g_hInstance = hinstDLL; return TRUE; } #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) // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ @@ -167,36 +177,34 @@ void SetDllGlobals(PLUGIN_GLOBALS* _pPluginGlobals) // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ void DllConfig(HWND _hParent) { - #ifdef _WIN32 +#ifdef _WIN32 if(SDL_Init(SDL_INIT_JOYSTICK ) < 0) { MessageBox(NULL, SDL_GetError(), "Could not initialize SDL!", MB_ICONERROR); return; } - - LoadConfig(); // load settings - -#if defined(HAVE_WX) && HAVE_WX - wxWindow win; - win.SetHWND(_hParent); - ConfigBox frame(&win); - frame.ShowModal(); - win.SetHWND(0); -#endif - #else +#else if(SDL_Init(SDL_INIT_JOYSTICK ) < 0) { printf("Could not initialize SDL! (%s)\n", SDL_GetError()); return; } +#endif LoadConfig(); // load settings #if defined(HAVE_WX) && HAVE_WX - ConfigBox frame(NULL); - frame.ShowModal(); + if (!m_ConfigFrame) + 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 } void DllDebugger(HWND _hParent, bool Show) {