Skip to content

Instantly share code, notes, and snippets.

@anpage
Created August 12, 2025 22:07
Show Gist options
  • Select an option

  • Save anpage/648d8699adf82ea0ecdebbfd0e1d98a5 to your computer and use it in GitHub Desktop.

Select an option

Save anpage/648d8699adf82ea0ecdebbfd0e1d98a5 to your computer and use it in GitHub Desktop.
Wine Patch for CRKD and Santroller guitars with working whammy in GH3PC
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