Added support to mu to input gui
This commit is contained in:
parent
1f404c57da
commit
1d9dc0df2d
|
@ -783,6 +783,8 @@ void Settings::SyncToEmulator()
|
|||
// register xbox device input settings
|
||||
for (int i = 0; i < 4; i++) {
|
||||
g_EmuShared->SetInputDevTypeSettings(&m_input_port[i].Type, i);
|
||||
g_EmuShared->SetInputSlotTypeSettings(&m_input_port[i].TopSlotType, i, MU_SLOT_TOP);
|
||||
g_EmuShared->SetInputSlotTypeSettings(&m_input_port[i].BottomSlotType, i, MU_SLOT_BOTTOM);
|
||||
if (m_input_port[i].Type != to_underlying(XBOX_INPUT_DEVICE::DEVICE_INVALID)) {
|
||||
g_EmuShared->SetInputDevNameSettings(m_input_port[i].DeviceName.c_str(), i);
|
||||
auto it = std::find_if(m_input_profiles[m_input_port[i].Type].begin(),
|
||||
|
|
|
@ -35,6 +35,8 @@
|
|||
#define SBC_NUM_BUTTONS 56
|
||||
#define HIGHEST_NUM_BUTTONS SBC_NUM_BUTTONS
|
||||
|
||||
#define MU_NUM_SLOTS 2
|
||||
|
||||
#define XBOX_BUTTON_NAME_LENGTH 30
|
||||
#define HOST_BUTTON_NAME_LENGTH 30
|
||||
|
||||
|
|
|
@ -37,6 +37,9 @@
|
|||
#undef SetPort
|
||||
#endif
|
||||
|
||||
#define MU_SLOT_TOP 0
|
||||
#define MU_SLOT_BOTTOM 1
|
||||
|
||||
extern int dev_num_buttons[to_underlying(XBOX_INPUT_DEVICE::DEVICE_MAX)];
|
||||
|
||||
inline XBOX_INPUT_DEVICE input_support_list[] = {
|
||||
|
|
|
@ -177,6 +177,29 @@ void InputWindow::BindButton(int ControlID)
|
|||
}
|
||||
}
|
||||
|
||||
void InputWindow::UpdateProfile(const std::string &name, int command)
|
||||
{
|
||||
switch (command)
|
||||
{
|
||||
case PROFILE_LOAD:
|
||||
LoadProfile(name);
|
||||
break;
|
||||
|
||||
case PROFILE_SAVE:
|
||||
SaveProfile(name);
|
||||
break;
|
||||
|
||||
case PROFILE_DELETE:
|
||||
DeleteProfile(name);
|
||||
break;
|
||||
|
||||
case BUTTON_CLEAR:
|
||||
case BUTTON_SWAP:
|
||||
m_bHasChanges = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
InputWindow::ProfileIt InputWindow::FindProfile(const std::string& name)
|
||||
{
|
||||
auto it = std::find_if(g_Settings->m_input_profiles[m_dev_type].begin(),
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#define RUMBLE_CLEAR 7
|
||||
#define BUTTON_CLEAR 8
|
||||
#define BUTTON_SWAP 9
|
||||
#define SLOTS_CHANGED 10
|
||||
|
||||
#define XINPUT_DEFAULT 0
|
||||
#define DINPUT_DEFAULT 1
|
||||
|
@ -58,9 +59,9 @@ public:
|
|||
void UpdateDeviceList();
|
||||
void BindButton(int ControlID);
|
||||
virtual void ClearBindings() = 0;
|
||||
virtual void UpdateProfile(const std::string& name, int command) = 0;
|
||||
virtual void UpdateProfile(const std::string& name, int command);
|
||||
void UpdateCurrentDevice();
|
||||
bool IsProfileSaved();
|
||||
virtual bool IsProfileSaved();
|
||||
void SwapMoCursorAxis(Button *button);
|
||||
|
||||
|
||||
|
@ -106,6 +107,7 @@ public:
|
|||
void BindDefault();
|
||||
void ClearBindings() override;
|
||||
void UpdateProfile(const std::string &name, int command) override;
|
||||
bool IsProfileSaved() override;
|
||||
|
||||
|
||||
private:
|
||||
|
@ -118,6 +120,10 @@ private:
|
|||
HWND m_hwnd_rumble;
|
||||
// handle of the rumble combobox
|
||||
HWND m_hwnd_rumble_list;
|
||||
// handle of the top slot combobox
|
||||
HWND m_hwnd_top_slot_list;
|
||||
// handle of the bottom slot combobox
|
||||
HWND m_hwnd_bottom_slot_list;
|
||||
// currently selected rumble control
|
||||
std::string m_rumble;
|
||||
};
|
||||
|
@ -127,7 +133,6 @@ class SbcInputWindow : public InputWindow
|
|||
public:
|
||||
void Initialize(HWND hwnd, int port_num, int dev_type) override;
|
||||
void ClearBindings() override;
|
||||
void UpdateProfile(const std::string &name, int command) override;
|
||||
|
||||
|
||||
private:
|
||||
|
|
|
@ -135,6 +135,8 @@ class EmuShared : public Mutex
|
|||
// ******************************************************************
|
||||
void GetInputDevTypeSettings(int* type, int port) { Lock(); *type = m_DeviceType[port]; Unlock(); }
|
||||
void SetInputDevTypeSettings(const int* type, int port) { Lock(); m_DeviceType[port] = *type; Unlock(); }
|
||||
void GetInputSlotTypeSettings(int *type, int port, int slot) { Lock(); *type = m_SlotDeviceType[port][slot]; Unlock(); }
|
||||
void SetInputSlotTypeSettings(const int *type, int port, int slot) { Lock(); m_SlotDeviceType[port][slot] = *type; Unlock(); }
|
||||
void GetInputDevNameSettings(char* name, int port) { Lock(); strncpy(name, m_DeviceName[port], 50); Unlock(); }
|
||||
void SetInputDevNameSettings(const char* name, int port) { Lock(); strncpy(m_DeviceName[port], name, 50); Unlock(); }
|
||||
void GetInputBindingsSettings(char button_str[][HOST_BUTTON_NAME_LENGTH], int max_num_buttons, int port)
|
||||
|
@ -366,6 +368,7 @@ class EmuShared : public Mutex
|
|||
bool m_bClipCursor;
|
||||
unsigned int m_dwKrnlProcID; // Only used for kernel mode level.
|
||||
int m_DeviceType[4];
|
||||
int m_SlotDeviceType[4][MU_NUM_SLOTS];
|
||||
char m_DeviceControlNames[4][HIGHEST_NUM_BUTTONS][HOST_BUTTON_NAME_LENGTH];
|
||||
char m_DeviceName[4][50];
|
||||
char m_TitleMountPath[xbox::max_path];
|
||||
|
|
|
@ -51,6 +51,8 @@ void SyncInputSettings(int port_num, int dev_type, bool is_opt)
|
|||
if (!is_opt) {
|
||||
// Sync updated input to kernel process to use run-time settings.
|
||||
g_EmuShared->SetInputDevTypeSettings(&g_Settings->m_input_port[port_num].Type, port_num);
|
||||
g_EmuShared->SetInputSlotTypeSettings(&g_Settings->m_input_port[port_num].TopSlotType, port_num, MU_SLOT_TOP);
|
||||
g_EmuShared->SetInputSlotTypeSettings(&g_Settings->m_input_port[port_num].BottomSlotType, port_num, MU_SLOT_BOTTOM);
|
||||
|
||||
if (dev_type != to_underlying(XBOX_INPUT_DEVICE::DEVICE_INVALID)) {
|
||||
std::string dev_name = g_Settings->m_input_port[port_num].DeviceName;
|
||||
|
|
|
@ -49,6 +49,8 @@ void DukeInputWindow::Initialize(HWND hwnd, int port_num, int dev_type)
|
|||
m_hwnd_device_list = GetDlgItem(m_hwnd_window, IDC_DEVICE_LIST);
|
||||
m_hwnd_profile_list = GetDlgItem(m_hwnd_window, IDC_PROFILE_NAME);
|
||||
m_hwnd_default = GetDlgItem(m_hwnd_window, IDC_DEFAULT);
|
||||
m_hwnd_top_slot_list = GetDlgItem(hwnd, IDC_DEVICE_LIST_TOP_SLOT);
|
||||
m_hwnd_bottom_slot_list = GetDlgItem(hwnd, IDC_DEVICE_LIST_BOTTOM_SLOT);
|
||||
m_dev_type = dev_type;
|
||||
m_max_num_buttons = dev_num_buttons[dev_type];
|
||||
m_port_num = port_num;
|
||||
|
@ -84,6 +86,24 @@ void DukeInputWindow::Initialize(HWND hwnd, int port_num, int dev_type)
|
|||
// Set the maximum profile name lenght the user can enter in the profile combobox
|
||||
SendMessage(m_hwnd_profile_list, CB_LIMITTEXT, 49, 0);
|
||||
|
||||
// Set up the device types we support in the slot ports
|
||||
SendMessage(m_hwnd_top_slot_list, CB_ADDSTRING, 0,
|
||||
reinterpret_cast<LPARAM>(GetInputDeviceName(to_underlying(XBOX_INPUT_DEVICE::DEVICE_INVALID)).c_str()));
|
||||
SendMessage(m_hwnd_bottom_slot_list, CB_ADDSTRING, 0,
|
||||
reinterpret_cast<LPARAM>(GetInputDeviceName(to_underlying(XBOX_INPUT_DEVICE::DEVICE_INVALID)).c_str()));
|
||||
|
||||
if (m_dev_type != to_underlying(XBOX_INPUT_DEVICE::ARCADE_STICK)) {
|
||||
SendMessage(m_hwnd_top_slot_list, CB_ADDSTRING, 0,
|
||||
reinterpret_cast<LPARAM>(GetInputDeviceName(to_underlying(XBOX_INPUT_DEVICE::MEMORY_UNIT)).c_str()));
|
||||
SendMessage(m_hwnd_bottom_slot_list, CB_ADDSTRING, 0,
|
||||
reinterpret_cast<LPARAM>(GetInputDeviceName(to_underlying(XBOX_INPUT_DEVICE::MEMORY_UNIT)).c_str()));
|
||||
}
|
||||
else {
|
||||
// The arcade joystick does not have slot ports so always disable the corresponding options
|
||||
EnableWindow(m_hwnd_top_slot_list, FALSE);
|
||||
EnableWindow(m_hwnd_bottom_slot_list, FALSE);
|
||||
}
|
||||
|
||||
// construct emu device
|
||||
m_DeviceConfig = new EmuDevice(m_dev_type, m_hwnd_window, this);
|
||||
|
||||
|
@ -181,32 +201,16 @@ void DukeInputWindow::UpdateProfile(const std::string &name, int command)
|
|||
{
|
||||
switch (command)
|
||||
{
|
||||
case PROFILE_LOAD: {
|
||||
LoadProfile(name);
|
||||
}
|
||||
break;
|
||||
|
||||
case PROFILE_SAVE: {
|
||||
SaveProfile(name);
|
||||
}
|
||||
break;
|
||||
|
||||
case PROFILE_DELETE: {
|
||||
DeleteProfile(name);
|
||||
}
|
||||
break;
|
||||
|
||||
case RUMBLE_CLEAR: {
|
||||
case RUMBLE_CLEAR:
|
||||
m_rumble = std::string();
|
||||
}
|
||||
break;
|
||||
break;
|
||||
|
||||
case BUTTON_CLEAR:
|
||||
case BUTTON_SWAP: {
|
||||
case SLOTS_CHANGED:
|
||||
m_bHasChanges = true;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
|
||||
default:
|
||||
dynamic_cast<InputWindow *>(this)->UpdateProfile(name, command);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -239,6 +243,20 @@ void DukeInputWindow::DetectOutput(int ms)
|
|||
}
|
||||
}
|
||||
|
||||
bool DukeInputWindow::IsProfileSaved()
|
||||
{
|
||||
if (dynamic_cast<InputWindow *>(this)->IsProfileSaved()) {
|
||||
int DeviceType = SendMessage(m_hwnd_top_slot_list, CB_GETITEMDATA, SendMessage(m_hwnd_top_slot_list, CB_GETCURSEL, 0, 0), 0);
|
||||
g_Settings->m_input_port[m_port_num].TopSlotType = DeviceType;
|
||||
DeviceType = SendMessage(m_hwnd_bottom_slot_list, CB_GETITEMDATA, SendMessage(m_hwnd_bottom_slot_list, CB_GETCURSEL, 0, 0), 0);
|
||||
g_Settings->m_input_port[m_port_num].BottomSlotType = DeviceType;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static INT_PTR CALLBACK DlgRumbleConfigProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
INT_PTR CALLBACK DlgXidControllerConfigProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
|
@ -284,6 +302,13 @@ INT_PTR CALLBACK DlgXidControllerConfigProc(HWND hWndDlg, UINT uMsg, WPARAM wPar
|
|||
}
|
||||
break;
|
||||
|
||||
case IDC_DEVICE_LIST_TOP_SLOT: {
|
||||
if (HIWORD(wParam) == CBN_SELCHANGE) {
|
||||
g_InputWindow->UpdateProfile(std::string(), SLOTS_CHANGED);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case IDC_PROFILE_NAME: {
|
||||
if (HIWORD(wParam) == CBN_SELCHANGE) {
|
||||
char name[50];
|
||||
|
|
|
@ -81,34 +81,6 @@ void SbcInputWindow::ClearBindings()
|
|||
m_bHasChanges = true;
|
||||
}
|
||||
|
||||
void SbcInputWindow::UpdateProfile(const std::string &name, int command)
|
||||
{
|
||||
switch (command)
|
||||
{
|
||||
case PROFILE_LOAD: {
|
||||
LoadProfile(name);
|
||||
}
|
||||
break;
|
||||
|
||||
case PROFILE_SAVE: {
|
||||
SaveProfile(name);
|
||||
}
|
||||
break;
|
||||
|
||||
case PROFILE_DELETE: {
|
||||
DeleteProfile(name);
|
||||
}
|
||||
break;
|
||||
|
||||
case BUTTON_CLEAR:
|
||||
case BUTTON_SWAP: {
|
||||
m_bHasChanges = true;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
int SbcInputWindow::EnableDefaultButton()
|
||||
{
|
||||
// The SBC window does not have a default button, so we return a dummy value here
|
||||
|
|
|
@ -31,6 +31,10 @@ BEGIN
|
|||
BEGIN
|
||||
END
|
||||
|
||||
IDD_XID_DUKE_CFG, DIALOG
|
||||
BEGIN
|
||||
END
|
||||
|
||||
IDD_SBC_CFG, DIALOG
|
||||
BEGIN
|
||||
BOTTOMMARGIN, 269
|
||||
|
@ -113,7 +117,7 @@ BEGIN
|
|||
"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,23,166,139,10
|
||||
END
|
||||
|
||||
IDD_XID_DUKE_CFG DIALOGEX 0, 0, 528, 280
|
||||
IDD_XID_DUKE_CFG DIALOGEX 0, 0, 528, 300
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
FONT 8, "Verdana", 0, 0, 0x1
|
||||
BEGIN
|
||||
|
@ -180,8 +184,12 @@ BEGIN
|
|||
GROUPBOX "Rumble",IDC_RUMBLE,396,212,121,34,WS_GROUP
|
||||
PUSHBUTTON "",IDC_SET_MOTOR,443,224,57,14,BS_FLAT
|
||||
LTEXT "Motor",IDC_STATIC,412,224,26,14,SS_CENTERIMAGE
|
||||
PUSHBUTTON "Default Bindings",IDC_DEFAULT,362,256,69,14,BS_FLAT
|
||||
PUSHBUTTON "Clear",IDC_CLEAR,443,256,50,14,BS_FLAT
|
||||
PUSHBUTTON "Default Bindings",IDC_DEFAULT,362,265,69,14,BS_FLAT
|
||||
PUSHBUTTON "Clear",IDC_CLEAR,443,265,50,14,BS_FLAT
|
||||
GROUPBOX "Top Slot",IDC_DEVICE_TOP_SLOT,12,254,97,35,WS_GROUP
|
||||
COMBOBOX IDC_DEVICE_LIST_TOP_SLOT,21,267,79,15,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
|
||||
GROUPBOX "Bottom Slot",IDC_DEVICE_BOTTOM_SLOT,117,254,97,35,WS_GROUP
|
||||
COMBOBOX IDC_DEVICE_LIST_BOTTOM_SLOT,126,267,79,15,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
|
||||
END
|
||||
|
||||
IDD_RUMBLE_CFG DIALOGEX 0, 0, 155, 35
|
||||
|
@ -566,6 +574,11 @@ BEGIN
|
|||
0
|
||||
END
|
||||
|
||||
IDD_XID_DUKE_CFG AFX_DIALOG_LAYOUT
|
||||
BEGIN
|
||||
0
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
@ -687,7 +700,7 @@ BEGIN
|
|||
MENUITEM "&Clear entire Symbol Cache", ID_CACHE_CLEARHLECACHE_ALL,MFT_STRING,MFS_ENABLED
|
||||
MENUITEM "&Rescan title Symbol Cache", ID_CACHE_CLEARHLECACHE_CURRENT,MFT_STRING,MFS_ENABLED
|
||||
END
|
||||
MENUITEM "Clear Cache Partitions", ID_SETTINGS_CLEAR_PARTITIONS,MFT_STRING,MFS_ENABLED
|
||||
MENUITEM "Clear Cache Partitions", ID_SETTINGS_CLEAR_PARTITIONS,MFT_STRING,MFS_ENABLED
|
||||
MENUITEM "", -1, MFT_SEPARATOR
|
||||
POPUP "Experimental", 65535,MFT_STRING,MFS_ENABLED
|
||||
BEGIN
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
//{{NO_DEPENDENCIES}}
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by Cxbx.rc
|
||||
//
|
||||
|
@ -94,6 +94,10 @@
|
|||
#define IDC_LOG_VSHCACHE 962
|
||||
#define IDC_LOG_RINP 963
|
||||
#define IDC_LOG_JVS 964
|
||||
#define IDC_DEVICE_LIST_TOP_SLOT 995
|
||||
#define IDC_DEVICE_LIST_BOTTOM_SLOT 996
|
||||
#define IDC_DEVICE_TOP_SLOT 997
|
||||
#define IDC_DEVICE_BOTTOM_SLOT 998
|
||||
#define IDC_SET_MOTOR 999
|
||||
#define IDC_SET_X 1000
|
||||
#define IDC_SET_Y 1001
|
||||
|
|
Loading…
Reference in New Issue