22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#import "OHXInputGameController.h"
#import "OFArray.h"
#import "OFDictionary.h"
#import "OFNumber.h"
#import "OHGameControllerAxis.h"
#import "OHGameControllerButton.h"
#import "OHGameControllerDirectionalPad.h"
#import "OHXInputExtendedGamepad.h"
#import "OFInitializationFailedException.h"
#import "OFReadFailedException.h"
#include <xinput.h>
#ifndef XINPUT_GAMEPAD_GUIDE
# define XINPUT_GAMEPAD_GUIDE 0x400
#endif
struct XInputCapabilitiesEx {
XINPUT_CAPABILITIES capabilities;
WORD vendorID;
WORD productID;
WORD versionNumber;
WORD unknown1;
DWORD unknown2;
};
int OHXInputVersion;
static WINAPI DWORD (*XInputGetStateFuncPtr)(DWORD, XINPUT_STATE *);
static WINAPI DWORD (*XInputGetCapabilitiesExFuncPtr)(DWORD, DWORD, DWORD,
struct XInputCapabilitiesEx *);
@implementation OHXInputGameController
@synthesize vendorID = _vendorID, productID = _productID;
@synthesize extendedGamepad = _extendedGamepad;
|
|
|
|
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#import "OHXInputGameController.h"
#import "OFArray.h"
#import "OFDictionary.h"
#import "OFNumber.h"
#import "OHGameControllerAxis.h"
#import "OHGameControllerButton.h"
#import "OHGameControllerDirectionalPad.h"
#import "OHXbox360Gamepad.h"
#import "OFInitializationFailedException.h"
#import "OFReadFailedException.h"
#include <xinput.h>
#ifndef XINPUT_GAMEPAD_GUIDE
# define XINPUT_GAMEPAD_GUIDE 0x400
#endif
struct XInputCapabilitiesEx {
XINPUT_CAPABILITIES capabilities;
WORD vendorID;
WORD productID;
WORD versionNumber;
WORD unknown1;
DWORD unknown2;
};
static int XInputVersion;
static WINAPI DWORD (*XInputGetStateFuncPtr)(DWORD, XINPUT_STATE *);
static WINAPI DWORD (*XInputGetCapabilitiesExFuncPtr)(DWORD, DWORD, DWORD,
struct XInputCapabilitiesEx *);
@implementation OHXInputGameController
@synthesize vendorID = _vendorID, productID = _productID;
@synthesize extendedGamepad = _extendedGamepad;
|
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
if ((module = LoadLibraryA("xinput1_4.dll")) != NULL) {
XInputGetStateFuncPtr =
(WINAPI DWORD (*)(DWORD, XINPUT_STATE *))
GetProcAddress(module, (LPCSTR)100);
XInputGetCapabilitiesExFuncPtr = (WINAPI DWORD (*)(DWORD, DWORD,
DWORD, struct XInputCapabilitiesEx *))
GetProcAddress(module, (LPCSTR)108);
OHXInputVersion = 14;
} else if ((module = LoadLibrary("xinput1_3.dll")) != NULL) {
XInputGetStateFuncPtr =
(WINAPI DWORD (*)(DWORD, XINPUT_STATE *))
GetProcAddress(module, (LPCSTR)100);
OHXInputVersion = 13;
} else if ((module = LoadLibrary("xinput9_1_0.dll")) != NULL) {
XInputGetStateFuncPtr =
(WINAPI DWORD (*)(DWORD, XINPUT_STATE *))
GetProcAddress(module, "XInputGetState");
OHXInputVersion = 910;
}
}
+ (OFArray OF_GENERIC(OHGameController *) *)controllers
{
OFMutableArray *controllers = [OFMutableArray array];
|
|
|
|
|
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
if ((module = LoadLibraryA("xinput1_4.dll")) != NULL) {
XInputGetStateFuncPtr =
(WINAPI DWORD (*)(DWORD, XINPUT_STATE *))
GetProcAddress(module, (LPCSTR)100);
XInputGetCapabilitiesExFuncPtr = (WINAPI DWORD (*)(DWORD, DWORD,
DWORD, struct XInputCapabilitiesEx *))
GetProcAddress(module, (LPCSTR)108);
XInputVersion = 14;
} else if ((module = LoadLibrary("xinput1_3.dll")) != NULL) {
XInputGetStateFuncPtr =
(WINAPI DWORD (*)(DWORD, XINPUT_STATE *))
GetProcAddress(module, (LPCSTR)100);
XInputVersion = 13;
} else if ((module = LoadLibrary("xinput9_1_0.dll")) != NULL) {
XInputGetStateFuncPtr =
(WINAPI DWORD (*)(DWORD, XINPUT_STATE *))
GetProcAddress(module, "XInputGetState");
XInputVersion = 910;
}
}
+ (OFArray OF_GENERIC(OHGameController *) *)controllers
{
OFMutableArray *controllers = [OFMutableArray array];
|
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
capabilities.vendorID];
_productID = [[OFNumber alloc]
initWithUnsignedShort:
capabilities.productID];
}
}
_extendedGamepad = [[OHXInputExtendedGamepad alloc] init];
[self retrieveState];
} @catch (id e) {
[self release];
@throw e;
}
|
|
>
|
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
capabilities.vendorID];
_productID = [[OFNumber alloc]
initWithUnsignedShort:
capabilities.productID];
}
}
_extendedGamepad = [[OHXbox360Gamepad alloc]
initWithHasGuideButton: (XInputVersion != 910)];
[self retrieveState];
} @catch (id e) {
[self release];
@throw e;
}
|
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
|
!!(state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB);
_extendedGamepad.rightThumbstickButton.value =
!!(state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB);
_extendedGamepad.menuButton.value =
!!(state.Gamepad.wButtons & XINPUT_GAMEPAD_START);
_extendedGamepad.optionsButton.value =
!!(state.Gamepad.wButtons & XINPUT_GAMEPAD_BACK);
if (OHXInputVersion != 910)
_extendedGamepad.homeButton.value =
!!(state.Gamepad.wButtons & XINPUT_GAMEPAD_GUIDE);
_extendedGamepad.leftTriggerButton.value =
(float)state.Gamepad.bLeftTrigger / 255;
_extendedGamepad.rightTriggerButton.value =
(float)state.Gamepad.bRightTrigger / 255;
|
|
|
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
|
!!(state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB);
_extendedGamepad.rightThumbstickButton.value =
!!(state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB);
_extendedGamepad.menuButton.value =
!!(state.Gamepad.wButtons & XINPUT_GAMEPAD_START);
_extendedGamepad.optionsButton.value =
!!(state.Gamepad.wButtons & XINPUT_GAMEPAD_BACK);
if (XInputVersion != 910)
_extendedGamepad.homeButton.value =
!!(state.Gamepad.wButtons & XINPUT_GAMEPAD_GUIDE);
_extendedGamepad.leftTriggerButton.value =
(float)state.Gamepad.bLeftTrigger / 255;
_extendedGamepad.rightTriggerButton.value =
(float)state.Gamepad.bRightTrigger / 255;
|
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
|
!!(state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT);
_extendedGamepad.dPad.right.value =
!!(state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT);
}
- (OFString *)name
{
switch (OHXInputVersion) {
case 14:
return @"XInput 1.4 device";
case 13:
return @"XInput 1.3 device";
case 910:
return @"XInput 9.1.0 device";
}
|
|
|
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
|
!!(state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT);
_extendedGamepad.dPad.right.value =
!!(state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT);
}
- (OFString *)name
{
switch (XInputVersion) {
case 14:
return @"XInput 1.4 device";
case 13:
return @"XInput 1.3 device";
case 910:
return @"XInput 9.1.0 device";
}
|