From 8e136bc383457d160ec7c68e79c76eef62c2929d Mon Sep 17 00:00:00 2001 From: The Dax Date: Sat, 6 Jul 2013 17:31:07 -0400 Subject: [PATCH 01/14] Begin updating DirectInput for keymapping, and to take it off the legacy path. --- Windows/DinputDevice.cpp | 114 ++++++++++++++++++++++++++++----------- Windows/DinputDevice.h | 1 + 2 files changed, 85 insertions(+), 30 deletions(-) diff --git a/Windows/DinputDevice.cpp b/Windows/DinputDevice.cpp index 1af4ec1234..1a92ddb4b7 100644 --- a/Windows/DinputDevice.cpp +++ b/Windows/DinputDevice.cpp @@ -23,6 +23,8 @@ #include "ControlMapping.h" #include "Core/Config.h" #include "input/input_state.h" +#include "base/NativeApp.h" +#include"input/keycodes.h" #include "Core/Reporting.h" #include "Xinput.h" #pragma comment(lib,"dinput8.lib") @@ -32,26 +34,33 @@ #undef max #endif -unsigned int dinput_ctrl_map[] = { - 11, PAD_BUTTON_MENU, // Open PauseScreen - 10, PAD_BUTTON_BACK, // Toggle PauseScreen & Back Setting Page - 1, PAD_BUTTON_A, // Cross = XBOX-A - 2, PAD_BUTTON_B, // Circle = XBOX-B - 0, PAD_BUTTON_X, // Square = XBOX-X - 3, PAD_BUTTON_Y, // Triangle = XBOX-Y - 8, PAD_BUTTON_SELECT, - 9, PAD_BUTTON_START, - 4, PAD_BUTTON_LBUMPER, // LTrigger = XBOX-LBumper - 5, PAD_BUTTON_RBUMPER, // RTrigger = XBOX-RBumper - 6, PAD_BUTTON_LEFT_THUMB, // Turbo - 7, PAD_BUTTON_RIGHT_THUMB, // Open PauseScreen - POV_CODE_UP, PAD_BUTTON_UP, - POV_CODE_DOWN, PAD_BUTTON_DOWN, - POV_CODE_LEFT, PAD_BUTTON_LEFT, - POV_CODE_RIGHT, PAD_BUTTON_RIGHT, +static const struct {int from, to;} dinput_ctrl_map[] = { + {11, KEYCODE_BUTTON_THUMBR} , // Open PauseScreen + {10, KEYCODE_BACK} ,// Toggle PauseScreen & Back Setting Page + {1, KEYCODE_BUTTON_A } , // Cross = XBOX-A + {2, KEYCODE_BUTTON_B } , // Circle = XBOX-B + {0, KEYCODE_BUTTON_Y } , // Square = XBOX-X + {3, KEYCODE_BUTTON_X } , // Triangle = XBOX-Y + {8, KEYCODE_BUTTON_SELECT}, + {9, KEYCODE_BUTTON_START}, + {4, KEYCODE_BUTTON_L1 }, // LTrigger = XBOX-LBumper + {5, KEYCODE_BUTTON_R1 }, // RTrigger = XBOX-RBumper + {6, KEYCODE_BUTTON_THUMBL}, // Turbo + {7, KEYCODE_BUTTON_THUMBR }, // Open PauseScreen + {POV_CODE_UP, KEYCODE_DPAD_UP}, + {POV_CODE_DOWN, KEYCODE_DPAD_DOWN}, + {POV_CODE_LEFT, KEYCODE_DPAD_LEFT}, + {POV_CODE_RIGHT, KEYCODE_DPAD_RIGHT}, }; -const unsigned int dinput_ctrl_map_size = sizeof(dinput_ctrl_map); +struct Stick { + float x; + float y; +}; + +static Stick NormalizedDeadzoneFilter(short x, short y); + +const unsigned int dinput_ctrl_map_size = sizeof(dinput_ctrl_map) / sizeof(dinput_ctrl_map[0]); #define DIFF (JOY_POVRIGHT - JOY_POVFORWARD) / 2 #define JOY_POVFORWARD_RIGHT JOY_POVFORWARD + DIFF @@ -155,8 +164,8 @@ static inline int getPadCodeFromVirtualPovCode(unsigned int povCode) { int mergedCode = 0; for (int i = 0; i < dinput_ctrl_map_size / sizeof(dinput_ctrl_map[0]); i += 2) { - if (dinput_ctrl_map[i] != 0xFFFFFFFF && dinput_ctrl_map[i] > 0xFF && dinput_ctrl_map[i] & povCode) - mergedCode |= dinput_ctrl_map[i + 1]; + if (dinput_ctrl_map[i].from != 0xFFFFFFFF && dinput_ctrl_map[i].from > 0xFF && dinput_ctrl_map[i].from & povCode) + mergedCode |= dinput_ctrl_map[i + 1].from; } return mergedCode; } @@ -175,7 +184,8 @@ int DinputDevice::UpdateState(InputState &input_state) } if(FAILED(pJoystick->GetDeviceState(sizeof(DIJOYSTATE2), &js))) - return -1; + return -1; + switch (js.rgdwPOV[0]) { case JOY_POVFORWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_UP); break; @@ -190,25 +200,53 @@ int DinputDevice::UpdateState(InputState &input_state) if (analog) { - float x = (float)js.lX / 10000.f; - float y = -((float)js.lY / 10000.f); + Stick left = NormalizedDeadzoneFilter(js.lX, js.lY); + Stick right = NormalizedDeadzoneFilter(js.lZ, js.lRz); - // Expand and clamp. Hack to let us reach the corners on most pads. - x = std::min(1.0f, std::max(-1.0f, x * 1.2f)); - y = std::min(1.0f, std::max(-1.0f, y * 1.2f)); + input_state.pad_lstick_x += left.x; + input_state.pad_lstick_y += left.y; + input_state.pad_rstick_x += right.x; + input_state.pad_rstick_y += right.y; - input_state.pad_lstick_x += x; - input_state.pad_lstick_y += y; + AxisInput axis; + axis.deviceId = DEVICE_ID_PAD_0; + + axis.axisId = JOYSTICK_AXIS_X; + axis.value = left.x; + NativeAxis(axis); + + axis.axisId = JOYSTICK_AXIS_Y; + axis.value = left.y; + NativeAxis(axis); + + axis.axisId = JOYSTICK_AXIS_Z; + axis.value = right.x; + NativeAxis(axis); + + axis.axisId = JOYSTICK_AXIS_RZ; + axis.value = right.y; + NativeAxis(axis); } for (u8 i = 0; i < sizeof(dinput_ctrl_map)/sizeof(dinput_ctrl_map[0]); i += 2) { // DIJOYSTATE2 supported 128 buttons. for exclude the Virtual POV_CODE bit fields. - if (dinput_ctrl_map[i] < DIRECTINPUT_RGBBUTTONS_MAX && js.rgbButtons[dinput_ctrl_map[i]] & 0x80) + if (dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX && js.rgbButtons[dinput_ctrl_map[i].from] & 0x80) { - input_state.pad_buttons |= dinput_ctrl_map[i+1]; + //input_state.pad_buttons |= dinput_ctrl_map[i].to; + KeyInput key; + key.deviceId = DEVICE_ID_PAD_0; + key.flags = KEY_DOWN; + key.keyCode = dinput_ctrl_map[i].to; + NativeKey(key); + } } + //u32 downMask = buttons & (~prevState.Gamepad.wButtons); + //js. + //for(int i = 0; i < dinput_ctrl_map_size; i++) { + // if ( + //} const LONG rthreshold = 8000; @@ -282,6 +320,22 @@ int DinputDevice::UpdateState(InputState &input_state) return UPDATESTATE_SKIP_PAD; } +static Stick NormalizedDeadzoneFilter(short x, short y) { + Stick s; + s.x = (float)x / 10000.f; + s.y = -((float)y / 10000.f); + + // Expand and clamp. Hack to let us reach the corners on most pads. + s.x = std::min(1.0f, std::max(-1.0f, s.x * 1.2f)); + s.y = std::min(1.0f, std::max(-1.0f, s.y * 1.2f)); + + return s; +} + +void DinputDevice::ApplyButtons(InputState &input_state) { + +} + int DinputDevice::UpdateRawStateSingle(RawInputState &rawState) { if (g_Config.iForceInputDevice == 0) return FALSE; diff --git a/Windows/DinputDevice.h b/Windows/DinputDevice.h index 0ba4330573..e4506f3d7f 100644 --- a/Windows/DinputDevice.h +++ b/Windows/DinputDevice.h @@ -34,6 +34,7 @@ public: virtual bool IsPad() { return true; } int UpdateRawStateSingle(RawInputState &rawState); private: + void ApplyButtons(InputState &input_state); LPDIRECTINPUT8 pDI; LPDIRECTINPUTDEVICE8 pJoystick; bool analog; From bc06c5992e7f5cc26ee264635218874f4256a374 Mon Sep 17 00:00:00 2001 From: The Dax Date: Sat, 6 Jul 2013 17:33:51 -0400 Subject: [PATCH 02/14] Fix horrible styling. --- Windows/DinputDevice.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/Windows/DinputDevice.cpp b/Windows/DinputDevice.cpp index 1a92ddb4b7..e8e7e6e2a1 100644 --- a/Windows/DinputDevice.cpp +++ b/Windows/DinputDevice.cpp @@ -35,21 +35,21 @@ #endif static const struct {int from, to;} dinput_ctrl_map[] = { - {11, KEYCODE_BUTTON_THUMBR} , // Open PauseScreen - {10, KEYCODE_BACK} ,// Toggle PauseScreen & Back Setting Page - {1, KEYCODE_BUTTON_A } , // Cross = XBOX-A - {2, KEYCODE_BUTTON_B } , // Circle = XBOX-B - {0, KEYCODE_BUTTON_Y } , // Square = XBOX-X - {3, KEYCODE_BUTTON_X } , // Triangle = XBOX-Y - {8, KEYCODE_BUTTON_SELECT}, - {9, KEYCODE_BUTTON_START}, - {4, KEYCODE_BUTTON_L1 }, // LTrigger = XBOX-LBumper - {5, KEYCODE_BUTTON_R1 }, // RTrigger = XBOX-RBumper - {6, KEYCODE_BUTTON_THUMBL}, // Turbo - {7, KEYCODE_BUTTON_THUMBR }, // Open PauseScreen - {POV_CODE_UP, KEYCODE_DPAD_UP}, - {POV_CODE_DOWN, KEYCODE_DPAD_DOWN}, - {POV_CODE_LEFT, KEYCODE_DPAD_LEFT}, + {11, KEYCODE_BUTTON_THUMBR}, // Open PauseScreen + {10, KEYCODE_BACK}, // Toggle PauseScreen & Back Setting Page + {1, KEYCODE_BUTTON_A }, // Cross = XBOX-A + {2, KEYCODE_BUTTON_B }, // Circle = XBOX-B + {0, KEYCODE_BUTTON_Y }, // Square = XBOX-X + {3, KEYCODE_BUTTON_X }, // Triangle = XBOX-Y + {8, KEYCODE_BUTTON_SELECT}, + {9, KEYCODE_BUTTON_START}, + {4, KEYCODE_BUTTON_L1 }, // LTrigger = XBOX-LBumper + {5, KEYCODE_BUTTON_R1 }, // RTrigger = XBOX-RBumper + {6, KEYCODE_BUTTON_THUMBL}, // Turbo + {7, KEYCODE_BUTTON_THUMBR }, // Open PauseScreen + {POV_CODE_UP, KEYCODE_DPAD_UP}, + {POV_CODE_DOWN, KEYCODE_DPAD_DOWN}, + {POV_CODE_LEFT, KEYCODE_DPAD_LEFT}, {POV_CODE_RIGHT, KEYCODE_DPAD_RIGHT}, }; From 3023ab91ec6c8adc3b75cabcf5c16f9f79811dbc Mon Sep 17 00:00:00 2001 From: The Dax Date: Sat, 6 Jul 2013 20:19:17 -0400 Subject: [PATCH 03/14] Add POV support. --- Windows/DinputDevice.cpp | 118 +++++++++++++++++++++++++++++---------- Windows/DinputDevice.h | 3 +- 2 files changed, 89 insertions(+), 32 deletions(-) diff --git a/Windows/DinputDevice.cpp b/Windows/DinputDevice.cpp index e8e7e6e2a1..01ed5e9925 100644 --- a/Windows/DinputDevice.cpp +++ b/Windows/DinputDevice.cpp @@ -110,7 +110,7 @@ DinputDevice::DinputDevice() return; } - // ignore if device suppert XInput + // Ignore if device supports XInput DIDEVICEINSTANCE dinfo = {0}; pJoystick->GetDeviceInfo(&dinfo); if (IsXInputDevice(&dinfo.guidProduct)) @@ -131,8 +131,8 @@ DinputDevice::DinputDevice() analog = FAILED(pJoystick->SetProperty(DIPROP_RANGE, &diprg.diph))?false:true; - // Other devices suffer If do not set the dead zone. - // TODO: the dead zone will make configurable in the Control dialog. + // Other devices suffer if the deadzone is not set. + // TODO: The dead zone will be made configurable in the Control dialog. DIPROPDWORD dipw; dipw.diph.dwSize = sizeof(DIPROPDWORD); dipw.diph.dwHeaderSize = sizeof(DIPROPHEADER); @@ -142,7 +142,7 @@ DinputDevice::DinputDevice() dipw.dwData = 1000; analog |= FAILED(pJoystick->SetProperty(DIPROP_DEADZONE, &dipw.diph))?false:true; - + ZeroMemory(&this->prevState, sizeof(prevState)); } DinputDevice::~DinputDevice() @@ -150,22 +150,22 @@ DinputDevice::~DinputDevice() if (pJoystick) { pJoystick->Release(); - pJoystick= NULL; + pJoystick = NULL; } if (pDI) { pDI->Release(); - pDI= NULL; + pDI = NULL; } } static inline int getPadCodeFromVirtualPovCode(unsigned int povCode) { int mergedCode = 0; - for (int i = 0; i < dinput_ctrl_map_size / sizeof(dinput_ctrl_map[0]); i += 2) { + for (int i = 0; i < dinput_ctrl_map_size / sizeof(dinput_ctrl_map[0]); i++) { if (dinput_ctrl_map[i].from != 0xFFFFFFFF && dinput_ctrl_map[i].from > 0xFF && dinput_ctrl_map[i].from & povCode) - mergedCode |= dinput_ctrl_map[i + 1].from; + mergedCode |= dinput_ctrl_map[i].to; } return mergedCode; } @@ -186,7 +186,9 @@ int DinputDevice::UpdateState(InputState &input_state) if(FAILED(pJoystick->GetDeviceState(sizeof(DIJOYSTATE2), &js))) return -1; - switch (js.rgdwPOV[0]) + this->prevState = js; + + /*switch (js.rgdwPOV[0]) { case JOY_POVFORWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_UP); break; case JOY_POVBACKWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_DOWN); break; @@ -196,7 +198,10 @@ int DinputDevice::UpdateState(InputState &input_state) case JOY_POVRIGHT_BACKWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_RIGHT | POV_CODE_DOWN); break; case JOY_POVBACKWARD_LEFT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_DOWN | POV_CODE_LEFT); break; case JOY_POVLEFT_FORWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_LEFT | POV_CODE_UP); break; - } + }*/ + + + ApplyButtons(js, input_state); if (analog) { @@ -228,26 +233,6 @@ int DinputDevice::UpdateState(InputState &input_state) NativeAxis(axis); } - for (u8 i = 0; i < sizeof(dinput_ctrl_map)/sizeof(dinput_ctrl_map[0]); i += 2) - { - // DIJOYSTATE2 supported 128 buttons. for exclude the Virtual POV_CODE bit fields. - if (dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX && js.rgbButtons[dinput_ctrl_map[i].from] & 0x80) - { - //input_state.pad_buttons |= dinput_ctrl_map[i].to; - KeyInput key; - key.deviceId = DEVICE_ID_PAD_0; - key.flags = KEY_DOWN; - key.keyCode = dinput_ctrl_map[i].to; - NativeKey(key); - - } - } - //u32 downMask = buttons & (~prevState.Gamepad.wButtons); - //js. - //for(int i = 0; i < dinput_ctrl_map_size; i++) { - // if ( - //} - const LONG rthreshold = 8000; switch (g_Config.iRightStickBind) { @@ -332,8 +317,79 @@ static Stick NormalizedDeadzoneFilter(short x, short y) { return s; } -void DinputDevice::ApplyButtons(InputState &input_state) { +void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { + BYTE *buttons = state.rgbButtons; + u32 downMask = 0x80; + //switch (state.rgdwPOV[0]) + //{ + // case JOY_POVFORWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_UP); break; + // case JOY_POVBACKWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_DOWN); break; + // case JOY_POVLEFT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_LEFT); break; + // case JOY_POVRIGHT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_RIGHT); break; + // case JOY_POVFORWARD_RIGHT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_UP | POV_CODE_RIGHT); break; + // case JOY_POVRIGHT_BACKWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_RIGHT | POV_CODE_DOWN); break; + // case JOY_POVBACKWARD_LEFT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_DOWN | POV_CODE_LEFT); break; + // case JOY_POVLEFT_FORWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_LEFT | POV_CODE_UP); break; + //} + + for(u8 i = 0; i < dinput_ctrl_map_size; i++) { + if (dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX && (state.rgbButtons[dinput_ctrl_map[i].from] & downMask)) { + KeyInput key; + key.deviceId = DEVICE_ID_PAD_0; + key.flags = KEY_DOWN; + key.keyCode = dinput_ctrl_map[i].to; + NativeKey(key); + } + + if (dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX && (state.rgbButtons[dinput_ctrl_map[i].from] == 0)) { + KeyInput key; + key.deviceId = DEVICE_ID_PAD_0; + key.flags = KEY_UP; + key.keyCode = dinput_ctrl_map[i].to; + NativeKey(key); + } + + if(dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX) { + KeyInput key; + key.deviceId = DEVICE_ID_PAD_0; + //key.flags = KEY_UP; + switch(state.rgdwPOV[0]) { + case JOY_POVFORWARD: + key.keyCode = KEYCODE_DPAD_UP; + key.flags = KEY_DOWN; + break; + case JOY_POVBACKWARD: + key.keyCode = KEYCODE_DPAD_DOWN; + key.flags = KEY_DOWN; + break; + case JOY_POVLEFT: + key.keyCode = KEYCODE_DPAD_LEFT; + key.flags = KEY_DOWN; + break; + case JOY_POVRIGHT: + key.keyCode = KEYCODE_DPAD_RIGHT; + key.flags = KEY_DOWN; + break; + default: + key.keyCode = KEYCODE_DPAD_UP; + key.flags = KEY_UP; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_DOWN; + key.flags = KEY_UP; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_LEFT; + key.flags = KEY_UP; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_RIGHT; + key.flags = KEY_UP; + NativeKey(key); + break; + } + + NativeKey(key); + } + } } int DinputDevice::UpdateRawStateSingle(RawInputState &rawState) diff --git a/Windows/DinputDevice.h b/Windows/DinputDevice.h index e4506f3d7f..66a6ee56bd 100644 --- a/Windows/DinputDevice.h +++ b/Windows/DinputDevice.h @@ -34,8 +34,9 @@ public: virtual bool IsPad() { return true; } int UpdateRawStateSingle(RawInputState &rawState); private: - void ApplyButtons(InputState &input_state); + void ApplyButtons(DIJOYSTATE2 &state, InputState &input_state); LPDIRECTINPUT8 pDI; LPDIRECTINPUTDEVICE8 pJoystick; bool analog; + DIJOYSTATE2 prevState; }; From 9aaf4e5e081ccdcee61f40397d5c14c11371ce62 Mon Sep 17 00:00:00 2001 From: The Dax Date: Sat, 6 Jul 2013 21:29:30 -0400 Subject: [PATCH 04/14] Add RightStickBind support. It's still not 100% bug free... --- Windows/DinputDevice.cpp | 370 ++++++++++++++++++++++++++++----------- Windows/DinputDevice.h | 1 - 2 files changed, 269 insertions(+), 102 deletions(-) diff --git a/Windows/DinputDevice.cpp b/Windows/DinputDevice.cpp index 01ed5e9925..5a4bf4d65a 100644 --- a/Windows/DinputDevice.cpp +++ b/Windows/DinputDevice.cpp @@ -53,6 +53,8 @@ static const struct {int from, to;} dinput_ctrl_map[] = { {POV_CODE_RIGHT, KEYCODE_DPAD_RIGHT}, }; + + struct Stick { float x; float y; @@ -142,7 +144,6 @@ DinputDevice::DinputDevice() dipw.dwData = 1000; analog |= FAILED(pJoystick->SetProperty(DIPROP_DEADZONE, &dipw.diph))?false:true; - ZeroMemory(&this->prevState, sizeof(prevState)); } DinputDevice::~DinputDevice() @@ -186,21 +187,6 @@ int DinputDevice::UpdateState(InputState &input_state) if(FAILED(pJoystick->GetDeviceState(sizeof(DIJOYSTATE2), &js))) return -1; - this->prevState = js; - - /*switch (js.rgdwPOV[0]) - { - case JOY_POVFORWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_UP); break; - case JOY_POVBACKWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_DOWN); break; - case JOY_POVLEFT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_LEFT); break; - case JOY_POVRIGHT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_RIGHT); break; - case JOY_POVFORWARD_RIGHT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_UP | POV_CODE_RIGHT); break; - case JOY_POVRIGHT_BACKWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_RIGHT | POV_CODE_DOWN); break; - case JOY_POVBACKWARD_LEFT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_DOWN | POV_CODE_LEFT); break; - case JOY_POVLEFT_FORWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_LEFT | POV_CODE_UP); break; - }*/ - - ApplyButtons(js, input_state); if (analog) @@ -233,75 +219,6 @@ int DinputDevice::UpdateState(InputState &input_state) NativeAxis(axis); } - const LONG rthreshold = 8000; - - switch (g_Config.iRightStickBind) { - case 0: - break; - case 1: - if(!g_Config.iSwapRightAxes) { - if (js.lRz > rthreshold) input_state.pad_buttons |= PAD_BUTTON_RIGHT; - else if (js.lRz < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_LEFT; - if (js.lZ > rthreshold) input_state.pad_buttons |= PAD_BUTTON_UP; - else if (js.lZ < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_DOWN; - } - else { - if (js.lZ > rthreshold) input_state.pad_buttons |= PAD_BUTTON_RIGHT; - else if (js.lZ < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_LEFT; - if (js.lRz > rthreshold) input_state.pad_buttons |= PAD_BUTTON_UP; - else if (js.lRz < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_DOWN; - } - break; - case 2: - if(!g_Config.iSwapRightAxes) { - if (js.lRz > rthreshold) input_state.pad_buttons |= PAD_BUTTON_B; - else if (js.lRz < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_X; - if (js.lZ > rthreshold) input_state.pad_buttons |= PAD_BUTTON_Y; - else if (js.lZ < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_A; - } - else { - if (js.lZ > rthreshold) input_state.pad_buttons |= PAD_BUTTON_B; - else if (js.lZ < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_X; - if (js.lRz > rthreshold) input_state.pad_buttons |= PAD_BUTTON_Y; - else if (js.lRz < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_A; - } - break; - case 3: - if(!g_Config.iSwapRightAxes) { - if (js.lRz > rthreshold) input_state.pad_buttons |= PAD_BUTTON_RBUMPER; - else if (js.lRz < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_LBUMPER; - } - else { - if (js.lZ > rthreshold) input_state.pad_buttons |= PAD_BUTTON_RBUMPER; - else if (js.lZ < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_LBUMPER; - } - break; - case 4: - if(!g_Config.iSwapRightAxes) { - if (js.lRz > rthreshold) input_state.pad_buttons |= PAD_BUTTON_RBUMPER; - else if (js.lRz < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_LBUMPER; - if (js.lZ > rthreshold) input_state.pad_buttons |= PAD_BUTTON_Y; - else if (js.lZ < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_A; - } - else { - if (js.lZ > rthreshold) input_state.pad_buttons |= PAD_BUTTON_RBUMPER; - else if (js.lZ < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_LBUMPER; - if (js.lRz > rthreshold) input_state.pad_buttons |= PAD_BUTTON_Y; - else if (js.lRz < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_A; - } - break; - case 5: - if(!g_Config.iSwapRightAxes) { - if (js.lRz > rthreshold) input_state.pad_buttons |= PAD_BUTTON_RIGHT; - else if (js.lRz < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_LEFT; - } - else { - if (js.lZ > rthreshold) input_state.pad_buttons |= PAD_BUTTON_RIGHT; - else if (js.lZ < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_LEFT; - } - break; - } - return UPDATESTATE_SKIP_PAD; } @@ -321,18 +238,6 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { BYTE *buttons = state.rgbButtons; u32 downMask = 0x80; - //switch (state.rgdwPOV[0]) - //{ - // case JOY_POVFORWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_UP); break; - // case JOY_POVBACKWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_DOWN); break; - // case JOY_POVLEFT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_LEFT); break; - // case JOY_POVRIGHT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_RIGHT); break; - // case JOY_POVFORWARD_RIGHT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_UP | POV_CODE_RIGHT); break; - // case JOY_POVRIGHT_BACKWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_RIGHT | POV_CODE_DOWN); break; - // case JOY_POVBACKWARD_LEFT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_DOWN | POV_CODE_LEFT); break; - // case JOY_POVLEFT_FORWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_LEFT | POV_CODE_UP); break; - //} - for(u8 i = 0; i < dinput_ctrl_map_size; i++) { if (dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX && (state.rgbButtons[dinput_ctrl_map[i].from] & downMask)) { KeyInput key; @@ -340,6 +245,28 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { key.flags = KEY_DOWN; key.keyCode = dinput_ctrl_map[i].to; NativeKey(key); + + // Hack needed to let the special buttons work.. + switch(dinput_ctrl_map[i].from) + { + case 6: + input_state.pad_buttons |= PAD_BUTTON_LEFT_THUMB; + break; + case 7: + case 11: + input_state.pad_buttons |= PAD_BUTTON_RIGHT_THUMB; + break; + case 4: + input_state.pad_buttons |= PAD_BUTTON_LEFT_TRIGGER; + break; + case 5: + input_state.pad_buttons |= PAD_BUTTON_RIGHT_TRIGGER; + break; + case 10: + input_state.pad_buttons |= PAD_BUTTON_BACK; + break; + + } } if (dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX && (state.rgbButtons[dinput_ctrl_map[i].from] == 0)) { @@ -350,27 +277,71 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { NativeKey(key); } + // TODO: Is there really no better way to do the POV buttons? if(dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX) { KeyInput key; key.deviceId = DEVICE_ID_PAD_0; - //key.flags = KEY_UP; switch(state.rgdwPOV[0]) { case JOY_POVFORWARD: key.keyCode = KEYCODE_DPAD_UP; key.flags = KEY_DOWN; + NativeKey(key); break; + + case JOY_POVLEFT_FORWARD: + key.keyCode = KEYCODE_DPAD_UP; + key.flags = KEY_DOWN; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_LEFT; + key.flags = KEY_DOWN; + NativeKey(key); + break; + + case JOY_POVFORWARD_RIGHT: + key.keyCode = KEYCODE_DPAD_UP; + key.flags = KEY_DOWN; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_RIGHT; + key.flags = KEY_DOWN; + NativeKey(key); + break; + case JOY_POVBACKWARD: key.keyCode = KEYCODE_DPAD_DOWN; key.flags = KEY_DOWN; + NativeKey(key); break; + + case JOY_POVBACKWARD_LEFT: + key.keyCode = KEYCODE_DPAD_DOWN; + key.flags = KEY_DOWN; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_LEFT; + key.flags = KEY_DOWN; + NativeKey(key); + break; + + case JOY_POVRIGHT_BACKWARD: + key.keyCode = KEYCODE_DPAD_DOWN; + key.flags = KEY_DOWN; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_LEFT; + key.flags = KEY_DOWN; + NativeKey(key); + break; + case JOY_POVLEFT: key.keyCode = KEYCODE_DPAD_LEFT; key.flags = KEY_DOWN; + NativeKey(key); break; + case JOY_POVRIGHT: key.keyCode = KEYCODE_DPAD_RIGHT; key.flags = KEY_DOWN; + NativeKey(key); break; + default: key.keyCode = KEYCODE_DPAD_UP; key.flags = KEY_UP; @@ -386,10 +357,207 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { NativeKey(key); break; } - - NativeKey(key); } } + + const LONG rthreshold = 8000; + + KeyInput RAS; + RAS.deviceId = DEVICE_ID_PAD_0; + switch (g_Config.iRightStickBind) { + case 0: + break; + case 1: + if(!g_Config.iSwapRightAxes) { + if (state.lRz > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_RIGHT; + NativeKey(RAS); + } + else if (state.lRz < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_LEFT; + NativeKey(RAS); + } + if (state.lZ > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_UP; + NativeKey(RAS); + } + else if (state.lZ < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_DOWN; + NativeKey(RAS); + } + } + else { + if (state.lX > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_RIGHT; + NativeKey(RAS); + } + else if (state.lZ < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_LEFT; + NativeKey(RAS); + } + if (state.lRz > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_UP; + NativeKey(RAS); + } + else if (state.lRz < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_DOWN; + NativeKey(RAS); + } + } + break; + case 2: + if(!g_Config.iSwapRightAxes) { + if (state.lRz > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_B; + NativeKey(RAS); + } + else if (state.lRz < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_X; + NativeKey(RAS); + } + if (state.lZ > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_Y; + NativeKey(RAS); + } + else if (state.lZ < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_A; + NativeKey(RAS); + } + } + else { + if (state.lZ > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_B; + NativeKey(RAS); + } + else if (state.lZ < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_X; + NativeKey(RAS); + } + if (state.lRz > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_Y; + NativeKey(RAS); + } + else if (state.lRz < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = RAS.keyCode = KEYCODE_BUTTON_A; + NativeKey(RAS); + } + } + break; + case 3: + if(!g_Config.iSwapRightAxes) { + if (state.lRz > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_R1; + NativeKey(RAS); + } + else if (state.lRz < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_L1; + NativeKey(RAS); + } + } + else { + if (state.lZ > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_R1; + NativeKey(RAS); + } + else if (state.lZ < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_L1; + NativeKey(RAS); + } + } + break; + case 4: + if(!g_Config.iSwapRightAxes) { + if (state.lRz > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_R1; + NativeKey(RAS); + } + else if (state.lRz < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_L1; + NativeKey(RAS); + } + if (state.lZ > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_Y; + NativeKey(RAS); + } + else if (state.lZ < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_A; + NativeKey(RAS); + } + } + else { + if (state.lZ > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_R1; + NativeKey(RAS); + } + else if (state.lZ < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_L1; + NativeKey(RAS); + } + if (state.lRz > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_Y; + NativeKey(RAS); + } + else if (state.lRz < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = RAS.keyCode = KEYCODE_BUTTON_A; + NativeKey(RAS); + } + } + break; + case 5: + if(!g_Config.iSwapRightAxes) { + if (state.lRz > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_LEFT; + NativeKey(RAS); + } + else if (state.lRz < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_RIGHT; + NativeKey(RAS); + } + } + else { + if (state.lZ > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_LEFT; + NativeKey(RAS); + } + else if (state.lZ < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_RIGHT; + NativeKey(RAS); + } + } + break; + } } int DinputDevice::UpdateRawStateSingle(RawInputState &rawState) @@ -422,4 +590,4 @@ int DinputDevice::UpdateRawStateSingle(RawInputState &rawState) } } return FALSE; -} \ No newline at end of file +} diff --git a/Windows/DinputDevice.h b/Windows/DinputDevice.h index 66a6ee56bd..753a424c51 100644 --- a/Windows/DinputDevice.h +++ b/Windows/DinputDevice.h @@ -38,5 +38,4 @@ private: LPDIRECTINPUT8 pDI; LPDIRECTINPUTDEVICE8 pJoystick; bool analog; - DIJOYSTATE2 prevState; }; From c5ffd23fb19ff4e5299c2116e0cbf45c221d472d Mon Sep 17 00:00:00 2001 From: The Dax Date: Sun, 7 Jul 2013 15:27:35 -0400 Subject: [PATCH 05/14] Fix inverted buttons, and allow the special keys to be remapped[hopefully..]. --- Windows/DinputDevice.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/Windows/DinputDevice.cpp b/Windows/DinputDevice.cpp index 5a4bf4d65a..246f29715a 100644 --- a/Windows/DinputDevice.cpp +++ b/Windows/DinputDevice.cpp @@ -39,8 +39,8 @@ static const struct {int from, to;} dinput_ctrl_map[] = { {10, KEYCODE_BACK}, // Toggle PauseScreen & Back Setting Page {1, KEYCODE_BUTTON_A }, // Cross = XBOX-A {2, KEYCODE_BUTTON_B }, // Circle = XBOX-B - {0, KEYCODE_BUTTON_Y }, // Square = XBOX-X - {3, KEYCODE_BUTTON_X }, // Triangle = XBOX-Y + {0, KEYCODE_BUTTON_X }, // Square = XBOX-X + {3, KEYCODE_BUTTON_Y }, // Triangle = XBOX-Y {8, KEYCODE_BUTTON_SELECT}, {9, KEYCODE_BUTTON_START}, {4, KEYCODE_BUTTON_L1 }, // LTrigger = XBOX-LBumper @@ -247,22 +247,21 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { NativeKey(key); // Hack needed to let the special buttons work.. - switch(dinput_ctrl_map[i].from) + switch(dinput_ctrl_map[i].to) { - case 6: + case KEYCODE_BUTTON_THUMBL: input_state.pad_buttons |= PAD_BUTTON_LEFT_THUMB; break; - case 7: - case 11: + case KEYCODE_BUTTON_THUMBR: input_state.pad_buttons |= PAD_BUTTON_RIGHT_THUMB; break; - case 4: + case KEYCODE_BUTTON_L1: input_state.pad_buttons |= PAD_BUTTON_LEFT_TRIGGER; break; - case 5: + case KEYCODE_BUTTON_R1: input_state.pad_buttons |= PAD_BUTTON_RIGHT_TRIGGER; break; - case 10: + case KEYCODE_BACK: input_state.pad_buttons |= PAD_BUTTON_BACK; break; From c65a2eeda354fbd5085abfe143acb091712c8a98 Mon Sep 17 00:00:00 2001 From: The Dax Date: Sun, 7 Jul 2013 16:06:04 -0400 Subject: [PATCH 06/14] Fix default button mappings and incorrect axes(they are wrong on my controller, at least..). TODO: Fix comments. Also, is there no way to remove the hack for the special buttons..? --- Windows/DinputDevice.cpp | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Windows/DinputDevice.cpp b/Windows/DinputDevice.cpp index 246f29715a..d41c4cf216 100644 --- a/Windows/DinputDevice.cpp +++ b/Windows/DinputDevice.cpp @@ -36,17 +36,17 @@ static const struct {int from, to;} dinput_ctrl_map[] = { {11, KEYCODE_BUTTON_THUMBR}, // Open PauseScreen - {10, KEYCODE_BACK}, // Toggle PauseScreen & Back Setting Page - {1, KEYCODE_BUTTON_A }, // Cross = XBOX-A - {2, KEYCODE_BUTTON_B }, // Circle = XBOX-B - {0, KEYCODE_BUTTON_X }, // Square = XBOX-X - {3, KEYCODE_BUTTON_Y }, // Triangle = XBOX-Y + {10, KEYCODE_BUTTON_THUMBL}, // Toggle PauseScreen & Back Setting Page + {1, KEYCODE_BUTTON_B }, // Cross = XBOX-A + {2, KEYCODE_BUTTON_A }, // Circle = XBOX-B + {0, KEYCODE_BUTTON_Y }, // Square = XBOX-X + {3, KEYCODE_BUTTON_X }, // Triangle = XBOX-Y {8, KEYCODE_BUTTON_SELECT}, {9, KEYCODE_BUTTON_START}, - {4, KEYCODE_BUTTON_L1 }, // LTrigger = XBOX-LBumper - {5, KEYCODE_BUTTON_R1 }, // RTrigger = XBOX-RBumper - {6, KEYCODE_BUTTON_THUMBL}, // Turbo - {7, KEYCODE_BUTTON_THUMBR }, // Open PauseScreen + {4, KEYCODE_BUTTON_L2 }, // LTrigger = XBOX-LBumper + {5, KEYCODE_BUTTON_R2 }, // RTrigger = XBOX-RBumper + {6, KEYCODE_BUTTON_L1}, // Turbo + {7, KEYCODE_BUTTON_R1 }, // Open PauseScreen {POV_CODE_UP, KEYCODE_DPAD_UP}, {POV_CODE_DOWN, KEYCODE_DPAD_DOWN}, {POV_CODE_LEFT, KEYCODE_DPAD_LEFT}, @@ -253,12 +253,12 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { input_state.pad_buttons |= PAD_BUTTON_LEFT_THUMB; break; case KEYCODE_BUTTON_THUMBR: - input_state.pad_buttons |= PAD_BUTTON_RIGHT_THUMB; + input_state.pad_buttons |= PAD_BUTTON_BACK; break; - case KEYCODE_BUTTON_L1: + case KEYCODE_BUTTON_L2: input_state.pad_buttons |= PAD_BUTTON_LEFT_TRIGGER; break; - case KEYCODE_BUTTON_R1: + case KEYCODE_BUTTON_R2: input_state.pad_buttons |= PAD_BUTTON_RIGHT_TRIGGER; break; case KEYCODE_BACK: @@ -380,12 +380,12 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { } if (state.lZ > rthreshold) { RAS.flags = KEY_DOWN; - RAS.keyCode = KEYCODE_DPAD_UP; + RAS.keyCode = KEYCODE_DPAD_DOWN; NativeKey(RAS); } else if (state.lZ < -rthreshold) { RAS.flags = KEY_DOWN; - RAS.keyCode = KEYCODE_DPAD_DOWN; + RAS.keyCode = KEYCODE_DPAD_UP; NativeKey(RAS); } } @@ -534,12 +534,12 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { if(!g_Config.iSwapRightAxes) { if (state.lRz > rthreshold) { RAS.flags = KEY_DOWN; - RAS.keyCode = KEYCODE_DPAD_LEFT; + RAS.keyCode = KEYCODE_DPAD_RIGHT; NativeKey(RAS); } else if (state.lRz < -rthreshold) { RAS.flags = KEY_DOWN; - RAS.keyCode = KEYCODE_DPAD_RIGHT; + RAS.keyCode = KEYCODE_DPAD_LEFT; NativeKey(RAS); } } From d182a3388e6b00556ec08ec464a543af53d90da1 Mon Sep 17 00:00:00 2001 From: The Dax Date: Sun, 7 Jul 2013 16:14:55 -0400 Subject: [PATCH 07/14] Fix some styling issues, remove some old and irrelevant comments. --- Windows/DinputDevice.cpp | 45 ++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/Windows/DinputDevice.cpp b/Windows/DinputDevice.cpp index d41c4cf216..b8378c7f73 100644 --- a/Windows/DinputDevice.cpp +++ b/Windows/DinputDevice.cpp @@ -35,22 +35,22 @@ #endif static const struct {int from, to;} dinput_ctrl_map[] = { - {11, KEYCODE_BUTTON_THUMBR}, // Open PauseScreen - {10, KEYCODE_BUTTON_THUMBL}, // Toggle PauseScreen & Back Setting Page - {1, KEYCODE_BUTTON_B }, // Cross = XBOX-A - {2, KEYCODE_BUTTON_A }, // Circle = XBOX-B - {0, KEYCODE_BUTTON_Y }, // Square = XBOX-X - {3, KEYCODE_BUTTON_X }, // Triangle = XBOX-Y - {8, KEYCODE_BUTTON_SELECT}, - {9, KEYCODE_BUTTON_START}, - {4, KEYCODE_BUTTON_L2 }, // LTrigger = XBOX-LBumper - {5, KEYCODE_BUTTON_R2 }, // RTrigger = XBOX-RBumper - {6, KEYCODE_BUTTON_L1}, // Turbo - {7, KEYCODE_BUTTON_R1 }, // Open PauseScreen - {POV_CODE_UP, KEYCODE_DPAD_UP}, - {POV_CODE_DOWN, KEYCODE_DPAD_DOWN}, - {POV_CODE_LEFT, KEYCODE_DPAD_LEFT}, - {POV_CODE_RIGHT, KEYCODE_DPAD_RIGHT}, + { 11, KEYCODE_BUTTON_THUMBR }, + { 10, KEYCODE_BUTTON_THUMBL }, + { 1, KEYCODE_BUTTON_B }, + { 2, KEYCODE_BUTTON_A }, + { 0, KEYCODE_BUTTON_Y }, + { 3, KEYCODE_BUTTON_X }, + { 8, KEYCODE_BUTTON_SELECT }, + { 9, KEYCODE_BUTTON_START }, + { 4, KEYCODE_BUTTON_L2 }, + { 5, KEYCODE_BUTTON_R2 }, + { 6, KEYCODE_BUTTON_L1 }, + { 7, KEYCODE_BUTTON_R1 }, + { POV_CODE_UP, KEYCODE_DPAD_UP }, + { POV_CODE_DOWN, KEYCODE_DPAD_DOWN }, + { POV_CODE_LEFT, KEYCODE_DPAD_LEFT }, + { POV_CODE_RIGHT, KEYCODE_DPAD_RIGHT }, }; @@ -161,16 +161,6 @@ DinputDevice::~DinputDevice() } } -static inline int getPadCodeFromVirtualPovCode(unsigned int povCode) -{ - int mergedCode = 0; - for (int i = 0; i < dinput_ctrl_map_size / sizeof(dinput_ctrl_map[0]); i++) { - if (dinput_ctrl_map[i].from != 0xFFFFFFFF && dinput_ctrl_map[i].from > 0xFF && dinput_ctrl_map[i].from & povCode) - mergedCode |= dinput_ctrl_map[i].to; - } - return mergedCode; -} - int DinputDevice::UpdateState(InputState &input_state) { if (g_Config.iForceInputDevice == 0) return -1; @@ -247,6 +237,7 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { NativeKey(key); // Hack needed to let the special buttons work.. + // TODO: Is there no better way to handle this with DirectInput? switch(dinput_ctrl_map[i].to) { case KEYCODE_BUTTON_THUMBL: @@ -359,7 +350,7 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { } } - const LONG rthreshold = 8000; + const LONG rthreshold = 8000; KeyInput RAS; RAS.deviceId = DEVICE_ID_PAD_0; From 7e2c5815da2f3df9bdcf81a2b1eb76e22f4acc87 Mon Sep 17 00:00:00 2001 From: The Dax Date: Sun, 7 Jul 2013 16:20:25 -0400 Subject: [PATCH 08/14] Rebase to latest master. From 82b3afe923fe37d759fcad00acba067b44be2315 Mon Sep 17 00:00:00 2001 From: The Dax Date: Sun, 7 Jul 2013 16:25:23 -0400 Subject: [PATCH 09/14] Fix more styling issues. --- Windows/DinputDevice.cpp | 139 ++++++++++++++++++++------------------- 1 file changed, 70 insertions(+), 69 deletions(-) diff --git a/Windows/DinputDevice.cpp b/Windows/DinputDevice.cpp index b8378c7f73..0d05834c0a 100644 --- a/Windows/DinputDevice.cpp +++ b/Windows/DinputDevice.cpp @@ -238,8 +238,7 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { // Hack needed to let the special buttons work.. // TODO: Is there no better way to handle this with DirectInput? - switch(dinput_ctrl_map[i].to) - { + switch(dinput_ctrl_map[i].to) { case KEYCODE_BUTTON_THUMBL: input_state.pad_buttons |= PAD_BUTTON_LEFT_THUMB; break; @@ -267,89 +266,91 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { NativeKey(key); } - // TODO: Is there really no better way to do the POV buttons? + // TODO: Is there really no better way to handle the POV buttons? if(dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX) { KeyInput key; key.deviceId = DEVICE_ID_PAD_0; switch(state.rgdwPOV[0]) { - case JOY_POVFORWARD: - key.keyCode = KEYCODE_DPAD_UP; - key.flags = KEY_DOWN; - NativeKey(key); - break; + case JOY_POVFORWARD: + key.keyCode = KEYCODE_DPAD_UP; + key.flags = KEY_DOWN; + NativeKey(key); + break; - case JOY_POVLEFT_FORWARD: - key.keyCode = KEYCODE_DPAD_UP; - key.flags = KEY_DOWN; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_LEFT; - key.flags = KEY_DOWN; - NativeKey(key); - break; + case JOY_POVLEFT_FORWARD: + key.keyCode = KEYCODE_DPAD_UP; + key.flags = KEY_DOWN; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_LEFT; + key.flags = KEY_DOWN; + NativeKey(key); + break; - case JOY_POVFORWARD_RIGHT: - key.keyCode = KEYCODE_DPAD_UP; - key.flags = KEY_DOWN; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_RIGHT; - key.flags = KEY_DOWN; - NativeKey(key); - break; + case JOY_POVFORWARD_RIGHT: + key.keyCode = KEYCODE_DPAD_UP; + key.flags = KEY_DOWN; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_RIGHT; + key.flags = KEY_DOWN; + NativeKey(key); + break; - case JOY_POVBACKWARD: - key.keyCode = KEYCODE_DPAD_DOWN; - key.flags = KEY_DOWN; - NativeKey(key); - break; + case JOY_POVBACKWARD: + key.keyCode = KEYCODE_DPAD_DOWN; + key.flags = KEY_DOWN; + NativeKey(key); + break; - case JOY_POVBACKWARD_LEFT: - key.keyCode = KEYCODE_DPAD_DOWN; - key.flags = KEY_DOWN; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_LEFT; - key.flags = KEY_DOWN; - NativeKey(key); - break; + case JOY_POVBACKWARD_LEFT: + key.keyCode = KEYCODE_DPAD_DOWN; + key.flags = KEY_DOWN; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_LEFT; + key.flags = KEY_DOWN; + NativeKey(key); + break; - case JOY_POVRIGHT_BACKWARD: - key.keyCode = KEYCODE_DPAD_DOWN; - key.flags = KEY_DOWN; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_LEFT; - key.flags = KEY_DOWN; - NativeKey(key); - break; + case JOY_POVRIGHT_BACKWARD: + key.keyCode = KEYCODE_DPAD_DOWN; + key.flags = KEY_DOWN; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_LEFT; + key.flags = KEY_DOWN; + NativeKey(key); + break; - case JOY_POVLEFT: - key.keyCode = KEYCODE_DPAD_LEFT; - key.flags = KEY_DOWN; - NativeKey(key); - break; + case JOY_POVLEFT: + key.keyCode = KEYCODE_DPAD_LEFT; + key.flags = KEY_DOWN; + NativeKey(key); + break; - case JOY_POVRIGHT: - key.keyCode = KEYCODE_DPAD_RIGHT; - key.flags = KEY_DOWN; - NativeKey(key); - break; + case JOY_POVRIGHT: + key.keyCode = KEYCODE_DPAD_RIGHT; + key.flags = KEY_DOWN; + NativeKey(key); + break; - default: - key.keyCode = KEYCODE_DPAD_UP; - key.flags = KEY_UP; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_DOWN; - key.flags = KEY_UP; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_LEFT; - key.flags = KEY_UP; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_RIGHT; - key.flags = KEY_UP; - NativeKey(key); - break; + default: + key.keyCode = KEYCODE_DPAD_UP; + key.flags = KEY_UP; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_DOWN; + key.flags = KEY_UP; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_LEFT; + key.flags = KEY_UP; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_RIGHT; + key.flags = KEY_UP; + NativeKey(key); + break; } } } + // TODO: Remove this once proper analog stick + // binding is implemented. const LONG rthreshold = 8000; KeyInput RAS; From 175223118a311d51eae7df2446a265d992f5c196 Mon Sep 17 00:00:00 2001 From: The Dax Date: Sun, 7 Jul 2013 16:28:42 -0400 Subject: [PATCH 10/14] Make coding style consistent across entire DinputDevice.cpp file. --- Windows/DinputDevice.cpp | 49 ++++++++++++++-------------------------- 1 file changed, 17 insertions(+), 32 deletions(-) diff --git a/Windows/DinputDevice.cpp b/Windows/DinputDevice.cpp index 0d05834c0a..23d8ca9e43 100644 --- a/Windows/DinputDevice.cpp +++ b/Windows/DinputDevice.cpp @@ -70,15 +70,13 @@ const unsigned int dinput_ctrl_map_size = sizeof(dinput_ctrl_map) / sizeof(dinpu #define JOY_POVBACKWARD_LEFT JOY_POVBACKWARD + DIFF #define JOY_POVLEFT_FORWARD JOY_POVLEFT + DIFF -struct XINPUT_DEVICE_NODE -{ +struct XINPUT_DEVICE_NODE { DWORD dwVidPid; XINPUT_DEVICE_NODE* pNext; }; XINPUT_DEVICE_NODE* g_pXInputDeviceList = NULL; -bool IsXInputDevice( const GUID* pGuidProductFromDirectInput ) -{ +bool IsXInputDevice( const GUID* pGuidProductFromDirectInput ) { XINPUT_DEVICE_NODE* pNode = g_pXInputDeviceList; while( pNode ) { @@ -90,23 +88,20 @@ bool IsXInputDevice( const GUID* pGuidProductFromDirectInput ) return false; } -DinputDevice::DinputDevice() -{ +DinputDevice::DinputDevice() { pJoystick = NULL; pDI = NULL; if(FAILED(DirectInput8Create(GetModuleHandle(NULL),DIRECTINPUT_VERSION,IID_IDirectInput8,(void**)&pDI,NULL))) return; - if(FAILED(pDI->CreateDevice(GUID_Joystick, &pJoystick, NULL ))) - { + if(FAILED(pDI->CreateDevice(GUID_Joystick, &pJoystick, NULL ))) { pDI->Release(); pDI = NULL; return; } - if(FAILED(pJoystick->SetDataFormat(&c_dfDIJoystick2))) - { + if(FAILED(pJoystick->SetDataFormat(&c_dfDIJoystick2))) { pJoystick->Release(); pJoystick = NULL; return; @@ -115,8 +110,7 @@ DinputDevice::DinputDevice() // Ignore if device supports XInput DIDEVICEINSTANCE dinfo = {0}; pJoystick->GetDeviceInfo(&dinfo); - if (IsXInputDevice(&dinfo.guidProduct)) - { + if (IsXInputDevice(&dinfo.guidProduct)) { pDI->Release(); pDI = NULL; pJoystick->Release(); @@ -131,7 +125,7 @@ DinputDevice::DinputDevice() diprg.lMin = -10000; diprg.lMax = 10000; - analog = FAILED(pJoystick->SetProperty(DIPROP_RANGE, &diprg.diph))?false:true; + analog = FAILED(pJoystick->SetProperty(DIPROP_RANGE, &diprg.diph)) ? false : true; // Other devices suffer if the deadzone is not set. // TODO: The dead zone will be made configurable in the Control dialog. @@ -143,33 +137,28 @@ DinputDevice::DinputDevice() // dwData 1000 is deadzone(0% - 10%) dipw.dwData = 1000; - analog |= FAILED(pJoystick->SetProperty(DIPROP_DEADZONE, &dipw.diph))?false:true; + analog |= FAILED(pJoystick->SetProperty(DIPROP_DEADZONE, &dipw.diph)) ? false : true; } -DinputDevice::~DinputDevice() -{ - if (pJoystick) - { +DinputDevice::~DinputDevice() { + if (pJoystick) { pJoystick->Release(); pJoystick = NULL; } - if (pDI) - { + if (pDI) { pDI->Release(); pDI = NULL; } } -int DinputDevice::UpdateState(InputState &input_state) -{ +int DinputDevice::UpdateState(InputState &input_state) { if (g_Config.iForceInputDevice == 0) return -1; if (!pJoystick) return -1; DIJOYSTATE2 js; - if (FAILED(pJoystick->Poll())) - { + if (FAILED(pJoystick->Poll())) { if(pJoystick->Acquire() == DIERR_INPUTLOST) return -1; } @@ -179,8 +168,7 @@ int DinputDevice::UpdateState(InputState &input_state) ApplyButtons(js, input_state); - if (analog) - { + if (analog) { Stick left = NormalizedDeadzoneFilter(js.lX, js.lY); Stick right = NormalizedDeadzoneFilter(js.lZ, js.lRz); @@ -551,23 +539,20 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { } } -int DinputDevice::UpdateRawStateSingle(RawInputState &rawState) -{ +int DinputDevice::UpdateRawStateSingle(RawInputState &rawState) { if (g_Config.iForceInputDevice == 0) return FALSE; if (!pJoystick) return FALSE; DIJOYSTATE2 js; - if (FAILED(pJoystick->Poll())) - { + if (FAILED(pJoystick->Poll())) { if(pJoystick->Acquire() == DIERR_INPUTLOST) return FALSE; } if(FAILED(pJoystick->GetDeviceState(sizeof(DIJOYSTATE2), &js))) return -1; - switch (js.rgdwPOV[0]) - { + switch (js.rgdwPOV[0]) { case JOY_POVFORWARD: rawState.button = POV_CODE_UP; return TRUE; case JOY_POVBACKWARD: rawState.button = POV_CODE_DOWN; return TRUE; case JOY_POVLEFT: rawState.button = POV_CODE_LEFT; return TRUE; From 0003b4d4dd3b093d14989a21011613e4ba7a447a Mon Sep 17 00:00:00 2001 From: The Dax Date: Sun, 7 Jul 2013 16:33:15 -0400 Subject: [PATCH 11/14] Layout ApplyButtons to more closely resemble the XInput code. --- Windows/DinputDevice.cpp | 249 +++++++++++++++++++-------------------- 1 file changed, 123 insertions(+), 126 deletions(-) diff --git a/Windows/DinputDevice.cpp b/Windows/DinputDevice.cpp index 23d8ca9e43..29a98d0df8 100644 --- a/Windows/DinputDevice.cpp +++ b/Windows/DinputDevice.cpp @@ -53,8 +53,6 @@ static const struct {int from, to;} dinput_ctrl_map[] = { { POV_CODE_RIGHT, KEYCODE_DPAD_RIGHT }, }; - - struct Stick { float x; float y; @@ -213,130 +211,6 @@ static Stick NormalizedDeadzoneFilter(short x, short y) { } void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { - BYTE *buttons = state.rgbButtons; - u32 downMask = 0x80; - - for(u8 i = 0; i < dinput_ctrl_map_size; i++) { - if (dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX && (state.rgbButtons[dinput_ctrl_map[i].from] & downMask)) { - KeyInput key; - key.deviceId = DEVICE_ID_PAD_0; - key.flags = KEY_DOWN; - key.keyCode = dinput_ctrl_map[i].to; - NativeKey(key); - - // Hack needed to let the special buttons work.. - // TODO: Is there no better way to handle this with DirectInput? - switch(dinput_ctrl_map[i].to) { - case KEYCODE_BUTTON_THUMBL: - input_state.pad_buttons |= PAD_BUTTON_LEFT_THUMB; - break; - case KEYCODE_BUTTON_THUMBR: - input_state.pad_buttons |= PAD_BUTTON_BACK; - break; - case KEYCODE_BUTTON_L2: - input_state.pad_buttons |= PAD_BUTTON_LEFT_TRIGGER; - break; - case KEYCODE_BUTTON_R2: - input_state.pad_buttons |= PAD_BUTTON_RIGHT_TRIGGER; - break; - case KEYCODE_BACK: - input_state.pad_buttons |= PAD_BUTTON_BACK; - break; - - } - } - - if (dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX && (state.rgbButtons[dinput_ctrl_map[i].from] == 0)) { - KeyInput key; - key.deviceId = DEVICE_ID_PAD_0; - key.flags = KEY_UP; - key.keyCode = dinput_ctrl_map[i].to; - NativeKey(key); - } - - // TODO: Is there really no better way to handle the POV buttons? - if(dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX) { - KeyInput key; - key.deviceId = DEVICE_ID_PAD_0; - switch(state.rgdwPOV[0]) { - case JOY_POVFORWARD: - key.keyCode = KEYCODE_DPAD_UP; - key.flags = KEY_DOWN; - NativeKey(key); - break; - - case JOY_POVLEFT_FORWARD: - key.keyCode = KEYCODE_DPAD_UP; - key.flags = KEY_DOWN; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_LEFT; - key.flags = KEY_DOWN; - NativeKey(key); - break; - - case JOY_POVFORWARD_RIGHT: - key.keyCode = KEYCODE_DPAD_UP; - key.flags = KEY_DOWN; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_RIGHT; - key.flags = KEY_DOWN; - NativeKey(key); - break; - - case JOY_POVBACKWARD: - key.keyCode = KEYCODE_DPAD_DOWN; - key.flags = KEY_DOWN; - NativeKey(key); - break; - - case JOY_POVBACKWARD_LEFT: - key.keyCode = KEYCODE_DPAD_DOWN; - key.flags = KEY_DOWN; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_LEFT; - key.flags = KEY_DOWN; - NativeKey(key); - break; - - case JOY_POVRIGHT_BACKWARD: - key.keyCode = KEYCODE_DPAD_DOWN; - key.flags = KEY_DOWN; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_LEFT; - key.flags = KEY_DOWN; - NativeKey(key); - break; - - case JOY_POVLEFT: - key.keyCode = KEYCODE_DPAD_LEFT; - key.flags = KEY_DOWN; - NativeKey(key); - break; - - case JOY_POVRIGHT: - key.keyCode = KEYCODE_DPAD_RIGHT; - key.flags = KEY_DOWN; - NativeKey(key); - break; - - default: - key.keyCode = KEYCODE_DPAD_UP; - key.flags = KEY_UP; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_DOWN; - key.flags = KEY_UP; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_LEFT; - key.flags = KEY_UP; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_RIGHT; - key.flags = KEY_UP; - NativeKey(key); - break; - } - } - } - // TODO: Remove this once proper analog stick // binding is implemented. const LONG rthreshold = 8000; @@ -537,6 +411,129 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { } break; } + + u32 downMask = 0x80; + + for(u8 i = 0; i < dinput_ctrl_map_size; i++) { + if (dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX && (state.rgbButtons[dinput_ctrl_map[i].from] & downMask)) { + KeyInput key; + key.deviceId = DEVICE_ID_PAD_0; + key.flags = KEY_DOWN; + key.keyCode = dinput_ctrl_map[i].to; + NativeKey(key); + + // Hack needed to let the special buttons work.. + // TODO: Is there no better way to handle this with DirectInput? + switch(dinput_ctrl_map[i].to) { + case KEYCODE_BUTTON_THUMBL: + input_state.pad_buttons |= PAD_BUTTON_LEFT_THUMB; + break; + case KEYCODE_BUTTON_THUMBR: + input_state.pad_buttons |= PAD_BUTTON_BACK; + break; + case KEYCODE_BUTTON_L2: + input_state.pad_buttons |= PAD_BUTTON_LEFT_TRIGGER; + break; + case KEYCODE_BUTTON_R2: + input_state.pad_buttons |= PAD_BUTTON_RIGHT_TRIGGER; + break; + case KEYCODE_BACK: + input_state.pad_buttons |= PAD_BUTTON_BACK; + break; + + } + } + + if (dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX && (state.rgbButtons[dinput_ctrl_map[i].from] == 0)) { + KeyInput key; + key.deviceId = DEVICE_ID_PAD_0; + key.flags = KEY_UP; + key.keyCode = dinput_ctrl_map[i].to; + NativeKey(key); + } + + // TODO: Is there really no better way to handle the POV buttons? + if(dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX) { + KeyInput key; + key.deviceId = DEVICE_ID_PAD_0; + switch(state.rgdwPOV[0]) { + case JOY_POVFORWARD: + key.keyCode = KEYCODE_DPAD_UP; + key.flags = KEY_DOWN; + NativeKey(key); + break; + + case JOY_POVLEFT_FORWARD: + key.keyCode = KEYCODE_DPAD_UP; + key.flags = KEY_DOWN; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_LEFT; + key.flags = KEY_DOWN; + NativeKey(key); + break; + + case JOY_POVFORWARD_RIGHT: + key.keyCode = KEYCODE_DPAD_UP; + key.flags = KEY_DOWN; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_RIGHT; + key.flags = KEY_DOWN; + NativeKey(key); + break; + + case JOY_POVBACKWARD: + key.keyCode = KEYCODE_DPAD_DOWN; + key.flags = KEY_DOWN; + NativeKey(key); + break; + + case JOY_POVBACKWARD_LEFT: + key.keyCode = KEYCODE_DPAD_DOWN; + key.flags = KEY_DOWN; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_LEFT; + key.flags = KEY_DOWN; + NativeKey(key); + break; + + case JOY_POVRIGHT_BACKWARD: + key.keyCode = KEYCODE_DPAD_DOWN; + key.flags = KEY_DOWN; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_LEFT; + key.flags = KEY_DOWN; + NativeKey(key); + break; + + case JOY_POVLEFT: + key.keyCode = KEYCODE_DPAD_LEFT; + key.flags = KEY_DOWN; + NativeKey(key); + break; + + case JOY_POVRIGHT: + key.keyCode = KEYCODE_DPAD_RIGHT; + key.flags = KEY_DOWN; + NativeKey(key); + break; + + default: + key.keyCode = KEYCODE_DPAD_UP; + key.flags = KEY_UP; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_DOWN; + key.flags = KEY_UP; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_LEFT; + key.flags = KEY_UP; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_RIGHT; + key.flags = KEY_UP; + NativeKey(key); + break; + } + } + } } int DinputDevice::UpdateRawStateSingle(RawInputState &rawState) { From e6f4f3a9ac36d731229595e4dee96192251e8c5c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 7 Jul 2013 10:22:01 -0700 Subject: [PATCH 12/14] Fix POV so it resets, cooperates with kbd. Only resends on change. DirectInput is all about polling, unfortunately. We could use a separate thread and wait on events... --- Windows/DinputDevice.cpp | 215 +++++++++++++-------------------------- Windows/DinputDevice.h | 2 + 2 files changed, 74 insertions(+), 143 deletions(-) diff --git a/Windows/DinputDevice.cpp b/Windows/DinputDevice.cpp index 29a98d0df8..d21861f97b 100644 --- a/Windows/DinputDevice.cpp +++ b/Windows/DinputDevice.cpp @@ -34,23 +34,21 @@ #undef max #endif -static const struct {int from, to;} dinput_ctrl_map[] = { - { 11, KEYCODE_BUTTON_THUMBR }, - { 10, KEYCODE_BUTTON_THUMBL }, - { 1, KEYCODE_BUTTON_B }, - { 2, KEYCODE_BUTTON_A }, - { 0, KEYCODE_BUTTON_Y }, - { 3, KEYCODE_BUTTON_X }, - { 8, KEYCODE_BUTTON_SELECT }, - { 9, KEYCODE_BUTTON_START }, - { 4, KEYCODE_BUTTON_L2 }, - { 5, KEYCODE_BUTTON_R2 }, - { 6, KEYCODE_BUTTON_L1 }, - { 7, KEYCODE_BUTTON_R1 }, - { POV_CODE_UP, KEYCODE_DPAD_UP }, - { POV_CODE_DOWN, KEYCODE_DPAD_DOWN }, - { POV_CODE_LEFT, KEYCODE_DPAD_LEFT }, - { POV_CODE_RIGHT, KEYCODE_DPAD_RIGHT }, +// In order from 0. There can be 128, but most controllers do not have that many. +static const int dinput_buttons[] = { + KEYCODE_BUTTON_Y, + KEYCODE_BUTTON_A, + KEYCODE_BUTTON_B, + KEYCODE_BUTTON_X, + KEYCODE_BUTTON_L2, + KEYCODE_BUTTON_R2, + KEYCODE_BUTTON_L1, + KEYCODE_BUTTON_R1, + KEYCODE_BUTTON_SELECT, + KEYCODE_BUTTON_START, + KEYCODE_BUTTON_THUMBL, + KEYCODE_BUTTON_THUMBR, + KEYCODE_BUTTON_Z, }; struct Stick { @@ -60,8 +58,6 @@ struct Stick { static Stick NormalizedDeadzoneFilter(short x, short y); -const unsigned int dinput_ctrl_map_size = sizeof(dinput_ctrl_map) / sizeof(dinput_ctrl_map[0]); - #define DIFF (JOY_POVRIGHT - JOY_POVFORWARD) / 2 #define JOY_POVFORWARD_RIGHT JOY_POVFORWARD + DIFF #define JOY_POVRIGHT_BACKWARD JOY_POVRIGHT + DIFF @@ -89,6 +85,8 @@ bool IsXInputDevice( const GUID* pGuidProductFromDirectInput ) { DinputDevice::DinputDevice() { pJoystick = NULL; pDI = NULL; + memset(lastButtons_, 0, sizeof(lastButtons_)); + memset(lastPOV_, 0, sizeof(lastPOV_)); if(FAILED(DirectInput8Create(GetModuleHandle(NULL),DIRECTINPUT_VERSION,IID_IDirectInput8,(void**)&pDI,NULL))) return; @@ -211,10 +209,64 @@ static Stick NormalizedDeadzoneFilter(short x, short y) { } void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { + BYTE *buttons = state.rgbButtons; + u32 downMask = 0x80; + + for (int i = 0; i < ARRAY_SIZE(dinput_buttons); ++i) { + if (state.rgbButtons[i] == lastButtons_[i]) { + continue; + } + + bool down = (state.rgbButtons[i] & downMask) == downMask; + KeyInput key; + key.deviceId = DEVICE_ID_PAD_0; + key.flags = down ? KEY_DOWN : KEY_UP; + key.keyCode = dinput_buttons[i]; + NativeKey(key); + + lastButtons_[i] = state.rgbButtons[i]; + } + + // Now the POV hat, which can technically go in any degree but usually does not. + if (LOWORD(state.rgdwPOV[0]) != lastPOV_[0]) { + KeyInput dpad[4]; + for (int i = 0; i < 4; ++i) { + dpad[i].deviceId = DEVICE_ID_PAD_0; + dpad[i].flags = KEY_UP; + } + dpad[0].keyCode = KEYCODE_DPAD_UP; + dpad[1].keyCode = KEYCODE_DPAD_LEFT; + dpad[2].keyCode = KEYCODE_DPAD_DOWN; + dpad[3].keyCode = KEYCODE_DPAD_RIGHT; + + if (LOWORD(state.rgdwPOV[0]) != JOY_POVCENTERED) { + // These are the edges, so we use or. + if (state.rgdwPOV[0] >= JOY_POVLEFT_FORWARD || state.rgdwPOV[0] <= JOY_POVFORWARD_RIGHT) { + dpad[0].flags = KEY_DOWN; + } + if (state.rgdwPOV[0] >= JOY_POVBACKWARD_LEFT && state.rgdwPOV[0] <= JOY_POVLEFT_FORWARD) { + dpad[1].flags = KEY_DOWN; + } + if (state.rgdwPOV[0] >= JOY_POVRIGHT_BACKWARD && state.rgdwPOV[0] <= JOY_POVBACKWARD_LEFT) { + dpad[2].flags = KEY_DOWN; + } + if (state.rgdwPOV[0] >= JOY_POVFORWARD_RIGHT && state.rgdwPOV[0] <= JOY_POVRIGHT_BACKWARD) { + dpad[3].flags = KEY_DOWN; + } + } + + NativeKey(dpad[0]); + NativeKey(dpad[1]); + NativeKey(dpad[2]); + NativeKey(dpad[3]); + + lastPOV_[0] = LOWORD(state.rgdwPOV[0]); + } + // TODO: Remove this once proper analog stick // binding is implemented. const LONG rthreshold = 8000; - + KeyInput RAS; RAS.deviceId = DEVICE_ID_PAD_0; switch (g_Config.iRightStickBind) { @@ -411,129 +463,6 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { } break; } - - u32 downMask = 0x80; - - for(u8 i = 0; i < dinput_ctrl_map_size; i++) { - if (dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX && (state.rgbButtons[dinput_ctrl_map[i].from] & downMask)) { - KeyInput key; - key.deviceId = DEVICE_ID_PAD_0; - key.flags = KEY_DOWN; - key.keyCode = dinput_ctrl_map[i].to; - NativeKey(key); - - // Hack needed to let the special buttons work.. - // TODO: Is there no better way to handle this with DirectInput? - switch(dinput_ctrl_map[i].to) { - case KEYCODE_BUTTON_THUMBL: - input_state.pad_buttons |= PAD_BUTTON_LEFT_THUMB; - break; - case KEYCODE_BUTTON_THUMBR: - input_state.pad_buttons |= PAD_BUTTON_BACK; - break; - case KEYCODE_BUTTON_L2: - input_state.pad_buttons |= PAD_BUTTON_LEFT_TRIGGER; - break; - case KEYCODE_BUTTON_R2: - input_state.pad_buttons |= PAD_BUTTON_RIGHT_TRIGGER; - break; - case KEYCODE_BACK: - input_state.pad_buttons |= PAD_BUTTON_BACK; - break; - - } - } - - if (dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX && (state.rgbButtons[dinput_ctrl_map[i].from] == 0)) { - KeyInput key; - key.deviceId = DEVICE_ID_PAD_0; - key.flags = KEY_UP; - key.keyCode = dinput_ctrl_map[i].to; - NativeKey(key); - } - - // TODO: Is there really no better way to handle the POV buttons? - if(dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX) { - KeyInput key; - key.deviceId = DEVICE_ID_PAD_0; - switch(state.rgdwPOV[0]) { - case JOY_POVFORWARD: - key.keyCode = KEYCODE_DPAD_UP; - key.flags = KEY_DOWN; - NativeKey(key); - break; - - case JOY_POVLEFT_FORWARD: - key.keyCode = KEYCODE_DPAD_UP; - key.flags = KEY_DOWN; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_LEFT; - key.flags = KEY_DOWN; - NativeKey(key); - break; - - case JOY_POVFORWARD_RIGHT: - key.keyCode = KEYCODE_DPAD_UP; - key.flags = KEY_DOWN; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_RIGHT; - key.flags = KEY_DOWN; - NativeKey(key); - break; - - case JOY_POVBACKWARD: - key.keyCode = KEYCODE_DPAD_DOWN; - key.flags = KEY_DOWN; - NativeKey(key); - break; - - case JOY_POVBACKWARD_LEFT: - key.keyCode = KEYCODE_DPAD_DOWN; - key.flags = KEY_DOWN; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_LEFT; - key.flags = KEY_DOWN; - NativeKey(key); - break; - - case JOY_POVRIGHT_BACKWARD: - key.keyCode = KEYCODE_DPAD_DOWN; - key.flags = KEY_DOWN; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_LEFT; - key.flags = KEY_DOWN; - NativeKey(key); - break; - - case JOY_POVLEFT: - key.keyCode = KEYCODE_DPAD_LEFT; - key.flags = KEY_DOWN; - NativeKey(key); - break; - - case JOY_POVRIGHT: - key.keyCode = KEYCODE_DPAD_RIGHT; - key.flags = KEY_DOWN; - NativeKey(key); - break; - - default: - key.keyCode = KEYCODE_DPAD_UP; - key.flags = KEY_UP; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_DOWN; - key.flags = KEY_UP; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_LEFT; - key.flags = KEY_UP; - NativeKey(key); - key.keyCode = KEYCODE_DPAD_RIGHT; - key.flags = KEY_UP; - NativeKey(key); - break; - } - } - } } int DinputDevice::UpdateRawStateSingle(RawInputState &rawState) { diff --git a/Windows/DinputDevice.h b/Windows/DinputDevice.h index 753a424c51..13fecd8699 100644 --- a/Windows/DinputDevice.h +++ b/Windows/DinputDevice.h @@ -38,4 +38,6 @@ private: LPDIRECTINPUT8 pDI; LPDIRECTINPUTDEVICE8 pJoystick; bool analog; + BYTE lastButtons_[128]; + WORD lastPOV_[4]; }; From b3b22695364eefc2c0f5970662844a51d246a37a Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 7 Jul 2013 10:23:40 -0700 Subject: [PATCH 13/14] Remove some dead code. --- Windows/ControlMapping.h | 20 -------------------- Windows/DinputDevice.cpp | 28 ---------------------------- Windows/DinputDevice.h | 3 --- Windows/XinputDevice.h | 2 -- 4 files changed, 53 deletions(-) diff --git a/Windows/ControlMapping.h b/Windows/ControlMapping.h index 8f53c0dee5..ce495c5899 100644 --- a/Windows/ControlMapping.h +++ b/Windows/ControlMapping.h @@ -19,26 +19,6 @@ #include "InputDevice.h" -struct RawInputState -{ - UINT button; - UINT prevButton; - RawInputState() { - button = 0; - prevButton = 0; - } -}; - -#define POV_CODE_UP 0x0100 -#define POV_CODE_DOWN 0x0200 -#define POV_CODE_LEFT 0x0400 -#define POV_CODE_RIGHT 0x0800 #define XBOX_CODE_LEFTTRIGGER 0x00010000 #define XBOX_CODE_RIGHTTRIGGER 0x00020000 -#define CONTROLS_KEYBOARD_INDEX 0 -#define CONTROLS_DIRECT_INPUT_INDEX 1 -#define CONTROLS_XINPUT_INDEX 2 -#define CONTROLS_KEYBOARD_ANALOG_INDEX 3 -#define CONTROLS_DEVICE_NUM 4 - diff --git a/Windows/DinputDevice.cpp b/Windows/DinputDevice.cpp index d21861f97b..86ebdfff90 100644 --- a/Windows/DinputDevice.cpp +++ b/Windows/DinputDevice.cpp @@ -465,31 +465,3 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { } } -int DinputDevice::UpdateRawStateSingle(RawInputState &rawState) { - if (g_Config.iForceInputDevice == 0) return FALSE; - if (!pJoystick) return FALSE; - - DIJOYSTATE2 js; - - if (FAILED(pJoystick->Poll())) { - if(pJoystick->Acquire() == DIERR_INPUTLOST) - return FALSE; - } - - if(FAILED(pJoystick->GetDeviceState(sizeof(DIJOYSTATE2), &js))) - return -1; - switch (js.rgdwPOV[0]) { - case JOY_POVFORWARD: rawState.button = POV_CODE_UP; return TRUE; - case JOY_POVBACKWARD: rawState.button = POV_CODE_DOWN; return TRUE; - case JOY_POVLEFT: rawState.button = POV_CODE_LEFT; return TRUE; - case JOY_POVRIGHT: rawState.button = POV_CODE_RIGHT; return TRUE; - } - - for (int i = 0; i < DIRECTINPUT_RGBBUTTONS_MAX; i++) { - if (js.rgbButtons[i] & 0x80) { - rawState.button = i; - return TRUE; - } - } - return FALSE; -} diff --git a/Windows/DinputDevice.h b/Windows/DinputDevice.h index 13fecd8699..a2d9c14e0e 100644 --- a/Windows/DinputDevice.h +++ b/Windows/DinputDevice.h @@ -22,8 +22,6 @@ #include "InputDevice.h" #include "dinput.h" -struct RawInputState; - class DinputDevice : public InputDevice { @@ -32,7 +30,6 @@ public: ~DinputDevice(); virtual int UpdateState(InputState &input_state); virtual bool IsPad() { return true; } - int UpdateRawStateSingle(RawInputState &rawState); private: void ApplyButtons(DIJOYSTATE2 &state, InputState &input_state); LPDIRECTINPUT8 pDI; diff --git a/Windows/XinputDevice.h b/Windows/XinputDevice.h index 9ef1ae0b70..926221cc1c 100644 --- a/Windows/XinputDevice.h +++ b/Windows/XinputDevice.h @@ -2,8 +2,6 @@ #include "InputDevice.h" #include "Xinput.h" -struct RawInputState; - class XinputDevice : public InputDevice { From 3852e2655878c2810225dabada954e73b692c4d4 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 7 Jul 2013 10:25:33 -0700 Subject: [PATCH 14/14] Remove the force device setting, map instead. --- Core/Config.cpp | 2 -- Core/Config.h | 1 - Windows/DinputDevice.cpp | 1 - Windows/XinputDevice.cpp | 1 - 4 files changed, 5 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index aebb7523cd..ee8ff6d587 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -144,7 +144,6 @@ void Config::Load(const char *iniFileName) control->Get("LargeControls", &bLargeControls, false); // control->Get("KeyMapping",iMappingMap); control->Get("AccelerometerToAnalogHoriz", &bAccelerometerToAnalogHoriz, false); - control->Get("ForceInputDevice", &iForceInputDevice, -1); control->Get("RightStickBind", &iRightStickBind, 0); control->Get("SwapDInputRightAxes", &iSwapRightAxes, 0); control->Get("TouchButtonOpacity", &iTouchButtonOpacity, 65); @@ -258,7 +257,6 @@ void Config::Save() control->Set("LargeControls", bLargeControls); // control->Set("KeyMapping",iMappingMap); control->Set("AccelerometerToAnalogHoriz", bAccelerometerToAnalogHoriz); - control->Set("ForceInputDevice", iForceInputDevice); control->Set("RightStickBind", iRightStickBind); control->Set("SwapDInputRightAxes", iSwapRightAxes); control->Set("TouchButtonOpacity", iTouchButtonOpacity); diff --git a/Core/Config.h b/Core/Config.h index 68ec133ed2..3e0010b997 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -117,7 +117,6 @@ public: int iSwapRightAxes; // Control - int iForceInputDevice; int iTouchButtonOpacity; float fButtonScale; diff --git a/Windows/DinputDevice.cpp b/Windows/DinputDevice.cpp index 86ebdfff90..b2940155df 100644 --- a/Windows/DinputDevice.cpp +++ b/Windows/DinputDevice.cpp @@ -149,7 +149,6 @@ DinputDevice::~DinputDevice() { } int DinputDevice::UpdateState(InputState &input_state) { - if (g_Config.iForceInputDevice == 0) return -1; if (!pJoystick) return -1; DIJOYSTATE2 js; diff --git a/Windows/XinputDevice.cpp b/Windows/XinputDevice.cpp index 528a562410..47d2435217 100644 --- a/Windows/XinputDevice.cpp +++ b/Windows/XinputDevice.cpp @@ -46,7 +46,6 @@ struct Stick { static Stick NormalizedDeadzoneFilter(short x, short y); int XinputDevice::UpdateState(InputState &input_state) { - if (g_Config.iForceInputDevice > 0) return -1; if (this->check_delay-- > 0) return -1; XINPUT_STATE state; ZeroMemory( &state, sizeof(XINPUT_STATE) );