Created
August 12, 2025 22:07
-
-
Save anpage/648d8699adf82ea0ecdebbfd0e1d98a5 to your computer and use it in GitHub Desktop.
Wine Patch for CRKD and Santroller guitars with working whammy in GH3PC
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| diff --git a/dlls/xinput1_3/main.c b/dlls/xinput1_3/main.c | |
| index 28f57e93bce..3eb36473ba4 100644 | |
| --- a/dlls/xinput1_3/main.c | |
| +++ b/dlls/xinput1_3/main.c | |
| @@ -265,7 +265,7 @@ static BOOL controller_check_caps(struct xinput_controller *controller, HANDLE d | |
| else caps->Gamepad.sThumbRY = (1u << (sizeof(caps->Gamepad.sThumbRY) + 1)) - 1; | |
| caps->Type = XINPUT_DEVTYPE_GAMEPAD; | |
| - caps->SubType = XINPUT_DEVSUBTYPE_GAMEPAD; | |
| + caps->SubType = XINPUT_DEVSUBTYPE_GUITAR_ALTERNATE; | |
| collections_count = controller->hid.caps.NumberLinkCollectionNodes; | |
| if (!(collections = malloc(sizeof(*collections) * controller->hid.caps.NumberLinkCollectionNodes))) return FALSE; | |
| @@ -621,15 +621,15 @@ static void read_controller_state(struct xinput_controller *controller) | |
| status = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_X, &value, controller->hid.preparsed, report_buf, report_len); | |
| if (status != HIDP_STATUS_SUCCESS) WARN("HidP_GetUsageValue HID_USAGE_PAGE_GENERIC / HID_USAGE_GENERIC_X returned %#lx\n", status); | |
| - else state.Gamepad.sThumbLX = scale_value(value, &controller->hid.lx_caps, -32768, 32767); | |
| + else state.Gamepad.sThumbRX = scale_value(value, &controller->hid.lx_caps, 0, 32767); | |
| status = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_Y, &value, controller->hid.preparsed, report_buf, report_len); | |
| if (status != HIDP_STATUS_SUCCESS) WARN("HidP_GetUsageValue HID_USAGE_PAGE_GENERIC / HID_USAGE_GENERIC_Y returned %#lx\n", status); | |
| else state.Gamepad.sThumbLY = -scale_value(value, &controller->hid.ly_caps, -32768, 32767) - 1; | |
| - status = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_RX, &value, controller->hid.preparsed, report_buf, report_len); | |
| - if (status != HIDP_STATUS_SUCCESS) WARN("HidP_GetUsageValue HID_USAGE_PAGE_GENERIC / HID_USAGE_GENERIC_RX returned %#lx\n", status); | |
| - else state.Gamepad.sThumbRX = scale_value(value, &controller->hid.rx_caps, -32768, 32767); | |
| + // status = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_RX, &value, controller->hid.preparsed, report_buf, report_len); | |
| + // if (status != HIDP_STATUS_SUCCESS) WARN("HidP_GetUsageValue HID_USAGE_PAGE_GENERIC / HID_USAGE_GENERIC_RX returned %#lx\n", status); | |
| + // else state.Gamepad.sThumbRX = scale_value(value, &controller->hid.rx_caps, -32768, 32767); | |
| status = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_RY, &value, controller->hid.preparsed, report_buf, report_len); | |
| if (status != HIDP_STATUS_SUCCESS) WARN("HidP_GetUsageValue HID_USAGE_PAGE_GENERIC / HID_USAGE_GENERIC_RY returned %#lx\n", status); | |
| @@ -641,7 +641,14 @@ static void read_controller_state(struct xinput_controller *controller) | |
| status = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_Z, &value, controller->hid.preparsed, report_buf, report_len); | |
| if (status != HIDP_STATUS_SUCCESS) WARN("HidP_GetUsageValue HID_USAGE_PAGE_GENERIC / HID_USAGE_GENERIC_Z returned %#lx\n", status); | |
| - else state.Gamepad.bLeftTrigger = scale_value(value, &controller->hid.lt_caps, 0, 255); | |
| + else | |
| + { | |
| + LONG scaled_value = scale_value(value, &controller->hid.lt_caps, 16383, 32767); | |
| + if (scaled_value > (16383 + XINPUT_GAMEPAD_TRIGGER_THRESHOLD)) | |
| + { | |
| + state.Gamepad.sThumbRX = scaled_value; | |
| + } | |
| + } | |
| EnterCriticalSection(&controller->crit); | |
| if (controller->enabled) | |
| @@ -1132,7 +1139,7 @@ DWORD WINAPI DECLSPEC_HOTPATCH XInputGetCapabilitiesEx(DWORD unk, DWORD index, D | |
| if (!controller_lock(&controllers[index])) return ERROR_DEVICE_NOT_CONNECTED; | |
| - if (flags & XINPUT_FLAG_GAMEPAD && controllers[index].caps.SubType != XINPUT_DEVSUBTYPE_GAMEPAD) | |
| + if (flags & XINPUT_FLAG_GAMEPAD && controllers[index].caps.Type != XINPUT_DEVTYPE_GAMEPAD) | |
| ret = ERROR_DEVICE_NOT_CONNECTED; | |
| else if (!HidD_GetAttributes(controllers[index].device, &attr)) | |
| ret = ERROR_DEVICE_NOT_CONNECTED; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment