@@ -199,6 +199,20 @@ BOOL IsXInputDevice(DWORD dwVendorId, DWORD dwProductId) {
199
199
return bIsXinputDevice;
200
200
}
201
201
202
+ // The hack to get XInput Guide button state
203
+ #ifndef XINPUT_GAMEPAD_GUIDE
204
+ #define XINPUT_GAMEPAD_GUIDE (0x400 )
205
+ #endif // XINPUT_GAMEPAD_GUIDE
206
+ static DWORD XInputGetStateExt (DWORD dwUserIndex, XINPUT_STATE *pState) {
207
+ static DWORD (WINAPI *lpGetState)(DWORD, XINPUT_STATE*) = NULL ;
208
+ if ( lpGetState == NULL ) {
209
+ HMODULE hDLL = LoadLibrary (" xinput1_3.dll" );
210
+ if ( hDLL != NULL ) *(FARPROC *)&lpGetState = GetProcAddress (hDLL, MAKEINTRESOURCE (100 ));
211
+ if ( lpGetState == NULL ) lpGetState = XInputGetState;
212
+ }
213
+ return lpGetState (dwUserIndex, pState);
214
+ }
215
+
202
216
static BOOL CALLBACK RawInputCallBack (HANDLE hDevice, LPGUID lpGuid, PRID_DEVICE_INFO_HID lpInfo, LPVOID lpContext) {
203
217
if ( hDevice == INVALID_HANDLE_VALUE || lpGuid == NULL || lpInfo == NULL || lpContext == NULL )
204
218
return TRUE ;
@@ -324,7 +338,7 @@ DWORD __cdecl WinInReadJoystick(int *xPos, int *yPos) {
324
338
if ( XInputIndex >= 0 ) {
325
339
XInputEnable (TRUE );
326
340
XINPUT_STATE state;
327
- if ( ERROR_SUCCESS != XInputGetState (XInputIndex, &state) ) {
341
+ if ( ERROR_SUCCESS != XInputGetStateExt (XInputIndex, &state) ) {
328
342
return 0 ;
329
343
}
330
344
if ( (JoystickMovement || !XINPUT_DPAD (XInputCaps.Gamepad .wButtons )) && XInputCaps.Gamepad .sThumbLX && XInputCaps.Gamepad .sThumbLY ) {
@@ -348,6 +362,7 @@ DWORD __cdecl WinInReadJoystick(int *xPos, int *yPos) {
348
362
buttonStatus |= CHK_ANY (state.Gamepad .wButtons , XINPUT_GAMEPAD_START) ? 0x200 : 0 ;
349
363
buttonStatus |= CHK_ANY (state.Gamepad .wButtons , XINPUT_GAMEPAD_LEFT_THUMB) ? 0x400 : 0 ;
350
364
buttonStatus |= CHK_ANY (state.Gamepad .wButtons , XINPUT_GAMEPAD_RIGHT_THUMB) ? 0x800 : 0 ;
365
+ buttonStatus |= CHK_ANY (state.Gamepad .wButtons , XINPUT_GAMEPAD_GUIDE) ? 0x1000 : 0 ;
351
366
return buttonStatus;
352
367
}
353
368
0 commit comments