diff --git a/src/common/Settings.cpp b/src/common/Settings.cpp index 2da72ba25..29f78223c 100644 --- a/src/common/Settings.cpp +++ b/src/common/Settings.cpp @@ -131,6 +131,7 @@ static const char *section_input_general = "input-general"; static struct { const char *mo_axis_range = "MouseAxisRange"; const char *mo_wheel_range = "MouseWheelRange"; + const char *ignore_kbmo_unfocus = "IgnoreKbMoUnfocus"; } sect_input_general; static const char* section_controller_dinput = "controller-dinput"; @@ -451,6 +452,7 @@ bool Settings::LoadConfig() m_input_general.MoAxisRange = m_si.GetLongValue(section_input_general, sect_input_general.mo_axis_range, MO_AXIS_DEFAULT_RANGE); m_input_general.MoWheelRange = m_si.GetLongValue(section_input_general, sect_input_general.mo_wheel_range, MO_WHEEL_DEFAULT_RANGE); + m_input_general.IgnoreKbMoUnfocus = m_si.GetLongValue(section_input_general, sect_input_general.ignore_kbmo_unfocus, 1); // ==== Input General End ============== @@ -615,6 +617,7 @@ bool Settings::Save(std::string file_path) m_si.SetLongValue(section_input_general, sect_input_general.mo_axis_range, m_input_general.MoAxisRange, nullptr, false, true); m_si.SetLongValue(section_input_general, sect_input_general.mo_wheel_range, m_input_general.MoWheelRange, nullptr, false, true); + m_si.SetLongValue(section_input_general, sect_input_general.ignore_kbmo_unfocus, m_input_general.IgnoreKbMoUnfocus, nullptr, false, true); // ==== Input General End ========= @@ -765,6 +768,7 @@ void Settings::SyncToEmulator() g_EmuShared->SetInputMoAxisSettings(m_input_general.MoAxisRange); g_EmuShared->SetInputMoWheelSettings(m_input_general.MoWheelRange); + g_EmuShared->SetInputKbMoUnfocusSettings(m_input_general.IgnoreKbMoUnfocus); // register Hacks settings g_EmuShared->SetHackSettings(&m_hacks); diff --git a/src/common/Settings.hpp b/src/common/Settings.hpp index 68e4a0dfc..c55c14671 100644 --- a/src/common/Settings.hpp +++ b/src/common/Settings.hpp @@ -137,6 +137,7 @@ public: struct s_input_general { long MoAxisRange; long MoWheelRange; + bool IgnoreKbMoUnfocus; }; s_input_general m_input_general; diff --git a/src/common/input/DInputKeyboardMouse.cpp b/src/common/input/DInputKeyboardMouse.cpp index 609514891..cea1bd124 100644 --- a/src/common/input/DInputKeyboardMouse.cpp +++ b/src/common/input/DInputKeyboardMouse.cpp @@ -158,7 +158,7 @@ namespace DInput bool KeyboardMouse::UpdateInput() { - if (mo_leave_wnd) { + if (static_cast(mo_leave_wnd) & static_cast(IgnoreKbMoUnfocus)) { std::memset(&m_state_in, 0, sizeof(m_state_in)); return true; } diff --git a/src/common/input/DInputKeyboardMouse.h b/src/common/input/DInputKeyboardMouse.h index 215d52ce3..aea158e6d 100644 --- a/src/common/input/DInputKeyboardMouse.h +++ b/src/common/input/DInputKeyboardMouse.h @@ -36,6 +36,7 @@ namespace DInput { inline bool bKbMoEnumerated = false; inline bool mo_leave_wnd = false; + inline bool IgnoreKbMoUnfocus = true; inline LONG mo_axis_range_pos = 0; inline LONG mo_axis_range_neg = 0; inline LONG mo_wheel_range_pos = 0; diff --git a/src/common/input/InputManager.cpp b/src/common/input/InputManager.cpp index c213153ce..a793f92d5 100644 --- a/src/common/input/InputManager.cpp +++ b/src/common/input/InputManager.cpp @@ -701,12 +701,15 @@ void InputDeviceManager::UpdateOpt(bool is_gui) { if (!is_gui) { long axis_range, wheel_range; + bool ignore_kbmo; g_EmuShared->GetInputMoAxisSettings(&axis_range); g_EmuShared->GetInputMoWheelSettings(&wheel_range); + g_EmuShared->GetInputKbMoUnfocusSettings(&ignore_kbmo); DInput::mo_axis_range_pos = axis_range; DInput::mo_wheel_range_pos = wheel_range; DInput::mo_axis_range_neg = -(axis_range); DInput::mo_wheel_range_neg = -(wheel_range); + DInput::IgnoreKbMoUnfocus = ignore_kbmo; } else { DInput::mo_axis_range_pos = g_Settings->m_input_general.MoAxisRange; diff --git a/src/common/win32/EmuShared.cpp b/src/common/win32/EmuShared.cpp index 10236e19e..8fa68d203 100644 --- a/src/common/win32/EmuShared.cpp +++ b/src/common/win32/EmuShared.cpp @@ -152,9 +152,9 @@ EmuShared::EmuShared() m_bEmulating_status = false; m_bFirstLaunch = false; m_bClipCursor = false; + m_bIgnoreKbMoUnfocus = true; // Reserve space (default to 0) - m_bReserved3 = false; m_bReserved4 = false; m_Reserved5 = 0; m_Reserved6 = 0.0f; diff --git a/src/common/win32/EmuShared.h b/src/common/win32/EmuShared.h index d32f41879..40d1e530c 100644 --- a/src/common/win32/EmuShared.h +++ b/src/common/win32/EmuShared.h @@ -156,6 +156,8 @@ class EmuShared : public Mutex void SetInputMoAxisSettings(const long axis) { Lock(); m_MoAxisRange = axis; Unlock(); } void GetInputMoWheelSettings(long *wheel) { Lock(); *wheel = m_MoWheelRange; Unlock(); } void SetInputMoWheelSettings(const long wheel) { Lock(); m_MoWheelRange = wheel; Unlock(); } + void GetInputKbMoUnfocusSettings(bool *flag) { Lock(); *flag = m_bIgnoreKbMoUnfocus; Unlock(); } + void SetInputKbMoUnfocusSettings(const bool flag) { Lock(); m_bIgnoreKbMoUnfocus = flag; Unlock(); } // ****************************************************************** // * LLE Flags Accessors @@ -299,7 +301,7 @@ class EmuShared : public Mutex #endif bool m_bFirstLaunch; bool m_bClipCursor; - bool m_bReserved3; + bool m_bIgnoreKbMoUnfocus; bool m_bReserved4; unsigned int m_dwKrnlProcID; // Only used for kernel mode level. int m_DeviceType[4]; diff --git a/src/gui/DlgInputConfig.cpp b/src/gui/DlgInputConfig.cpp index a1efc5720..338e3a17c 100644 --- a/src/gui/DlgInputConfig.cpp +++ b/src/gui/DlgInputConfig.cpp @@ -76,6 +76,7 @@ void SyncInputSettings(int port_num, int dev_type, bool is_opt) else { g_EmuShared->SetInputMoAxisSettings(g_Settings->m_input_general.MoAxisRange); g_EmuShared->SetInputMoWheelSettings(g_Settings->m_input_general.MoWheelRange); + g_EmuShared->SetInputKbMoUnfocusSettings(g_Settings->m_input_general.IgnoreKbMoUnfocus); port_num = PORT_INVALID; } #if 0 // lle usb @@ -94,6 +95,8 @@ void UpdateInputOpt(HWND hwnd) g_Settings->m_input_general.MoAxisRange = std::stol(buffer); SendMessage(GetDlgItem(hwnd, IDC_WHEEL_RANGE), WM_GETTEXT, 30, reinterpret_cast(buffer)); g_Settings->m_input_general.MoWheelRange = std::stol(buffer); + LRESULT ret = SendMessage(GetDlgItem(hwnd, IDC_IGNORE_KBMO_UNFOCUS), BM_GETCHECK, 0, 0); + g_Settings->m_input_general.IgnoreKbMoUnfocus = (ret == BST_CHECKED); } void ShowInputConfig(HWND hwnd, HWND ChildWnd) @@ -138,6 +141,7 @@ INT_PTR CALLBACK DlgInputConfigProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPAR std::to_string(g_Settings->m_input_general.MoAxisRange).c_str() : std::to_string(g_Settings->m_input_general.MoWheelRange).c_str())); } + SendMessage(GetDlgItem(hWndDlg, IDC_IGNORE_KBMO_UNFOCUS), BM_SETCHECK, static_cast(g_Settings->m_input_general.IgnoreKbMoUnfocus), 0); // Reset option/input changes flag g_bHasOptChanges = false; @@ -251,6 +255,16 @@ INT_PTR CALLBACK DlgInputConfigProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPAR g_bHasOptChanges = true; } } + break; + + case IDC_IGNORE_KBMO_UNFOCUS: + { + if (HIWORD(wParam) == BN_CLICKED) { + g_bHasOptChanges = true; + } + } + break; + } } break; diff --git a/src/gui/resource/Cxbx.rc b/src/gui/resource/Cxbx.rc index 17d07af7d..cff7032d9 100644 --- a/src/gui/resource/Cxbx.rc +++ b/src/gui/resource/Cxbx.rc @@ -84,7 +84,7 @@ END // Dialog // -IDD_INPUT_CFG DIALOGEX 0, 0, 243, 175 +IDD_INPUT_CFG DIALOGEX 0, 0, 243, 188 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Cxbx-Reloaded : Input Configuration" FONT 8, "Verdana", 0, 0, 0x1 @@ -102,11 +102,13 @@ BEGIN LTEXT "Port 2",IDC_STATIC,23,48,20,10 LTEXT "Port 3",IDC_STATIC,23,69,20,10 LTEXT "Port 4",IDC_STATIC,23,90,20,10 - GROUPBOX "Options",IDC_INPUT_OPTIONS,13,119,217,49,WS_GROUP,WS_EX_CLIENTEDGE + GROUPBOX "Options",IDC_INPUT_OPTIONS,13,119,217,64,WS_GROUP,WS_EX_CLIENTEDGE EDITTEXT IDC_MOUSE_RANGE,95,129,121,14 EDITTEXT IDC_WHEEL_RANGE,95,147,121,14 LTEXT "Mouse axis range",IDC_STATIC,23,129,69,14,SS_CENTERIMAGE LTEXT "Mouse wheel range",IDC_STATIC,23,146,68,14,SS_CENTERIMAGE + CONTROL "Ignore Keyboard/Mouse when unfocus",IDC_IGNORE_KBMO_UNFOCUS, + "Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,23,166,139,10 END IDD_XID_DUKE_CFG DIALOGEX 0, 0, 528, 280 @@ -218,8 +220,8 @@ BEGIN LTEXT "Oxygen Supply System",IDC_STATIC,133,118,80,14,SS_CENTERIMAGE PUSHBUTTON "",IDC_FILT_CONTROL_SYSTEM,223,136,57,14,BS_FLAT LTEXT "Filt Control System",IDC_STATIC,133,136,80,14,SS_CENTERIMAGE - PUSHBUTTON "",IDC_BTN_SIGHT_CHANGE,223,154,57,14, BS_FLAT - LTEXT "Sight Change",IDC_STATIC,133,154,80,14, SS_CENTERIMAGE + PUSHBUTTON "",IDC_BTN_SIGHT_CHANGE,223,154,57,14,BS_FLAT + LTEXT "Sight Change",IDC_STATIC,133,154,80,14,SS_CENTERIMAGE PUSHBUTTON "",IDC_LEVER_LEFT,67,172,57,14,BS_FLAT LTEXT "Lever Left",IDC_STATIC,25,172,42,14,SS_CENTERIMAGE PUSHBUTTON "",IDC_LEVER_RIGHT,67,191,57,14,BS_FLAT @@ -387,7 +389,7 @@ BEGIN COMBOBOX IDC_EE_AVSETTINGS,100,135,140,10,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_EE_AUDIOSETTINGS,100,150,140,10,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_EE_GAME_PRTL_CRTL,100,166,140,10,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_EE_PRTL_PASS,100,183,140,12, ES_PASSWORD + EDITTEXT IDC_EE_PRTL_PASS,100,183,140,12,ES_PASSWORD COMBOBOX IDC_EE_MOVIE_PRTL_CRTL,100,198,140,10,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_EE_DVDREGION,100,214,140,10,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "PAL 60Hz",IDC_EE_PAL60HZ,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_DISABLED | WS_TABSTOP,13,235,50,10 diff --git a/src/gui/resource/ResCxbx.h b/src/gui/resource/ResCxbx.h index cfa03b0b1..eab4e2379 100644 --- a/src/gui/resource/ResCxbx.h +++ b/src/gui/resource/ResCxbx.h @@ -195,6 +195,7 @@ #define ID_GUI_STATUS_XBOX_LED_COLOUR 1098 #define ID_GUI_STATUS_LOG_ENABLED 1099 #define IDC_AC_MUTE_WHEN_UNFOCUS 1100 +#define IDC_IGNORE_KBMO_UNFOCUS 1101 #define IDC_XBOX_PORT_0 1158 #define IDC_XBOX_PORT_1 1166 #define IDC_XBOX_PORT_2 1174