21 #include "../../SDL_internal.h"
23 #include "../SDL_sysjoystick.h"
25 #if SDL_JOYSTICK_DINPUT
30 #include "../hidapi/SDL_hidapijoystick_c.h"
32 #ifndef DIDFT_OPTIONAL
33 #define DIDFT_OPTIONAL 0x80000000
36 #define INPUT_QSIZE 32
37 #define JOY_AXIS_THRESHOLD (((SDL_JOYSTICK_AXIS_MAX)-(SDL_JOYSTICK_AXIS_MIN))/100)
39 #define CONVERT_MAGNITUDE(x) (((x)*10000) / 0x7FFF)
42 extern HWND SDL_HelperWindow;
46 static LPDIRECTINPUT8 dinput =
NULL;
47 static PRAWINPUTDEVICELIST SDL_RawDevList =
NULL;
48 static UINT SDL_RawDevListCount = 0;
51 static DIOBJECTDATAFORMAT dfDIJoystick2[] = {
52 { &GUID_XAxis, DIJOFS_X, DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
53 { &GUID_YAxis, DIJOFS_Y, DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
54 { &GUID_ZAxis, DIJOFS_Z, DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
55 { &GUID_RxAxis, DIJOFS_RX, DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
56 { &GUID_RyAxis, DIJOFS_RY, DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
57 { &GUID_RzAxis, DIJOFS_RZ, DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
58 { &GUID_Slider, DIJOFS_SLIDER(0), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
59 { &GUID_Slider, DIJOFS_SLIDER(1), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
60 { &GUID_POV, DIJOFS_POV(0), DIDFT_OPTIONAL | DIDFT_POV | DIDFT_ANYINSTANCE, 0 },
61 { &GUID_POV, DIJOFS_POV(1), DIDFT_OPTIONAL | DIDFT_POV | DIDFT_ANYINSTANCE, 0 },
62 { &GUID_POV, DIJOFS_POV(2), DIDFT_OPTIONAL | DIDFT_POV | DIDFT_ANYINSTANCE, 0 },
63 { &GUID_POV, DIJOFS_POV(3), DIDFT_OPTIONAL | DIDFT_POV | DIDFT_ANYINSTANCE, 0 },
64 {
NULL, DIJOFS_BUTTON(0), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
65 {
NULL, DIJOFS_BUTTON(1), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
66 {
NULL, DIJOFS_BUTTON(2), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
67 {
NULL, DIJOFS_BUTTON(3), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
68 {
NULL, DIJOFS_BUTTON(4), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
69 {
NULL, DIJOFS_BUTTON(5), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
70 {
NULL, DIJOFS_BUTTON(6), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
71 {
NULL, DIJOFS_BUTTON(7), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
72 {
NULL, DIJOFS_BUTTON(8), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
73 {
NULL, DIJOFS_BUTTON(9), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
74 {
NULL, DIJOFS_BUTTON(10), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
75 {
NULL, DIJOFS_BUTTON(11), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
76 {
NULL, DIJOFS_BUTTON(12), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
77 {
NULL, DIJOFS_BUTTON(13), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
78 {
NULL, DIJOFS_BUTTON(14), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
79 {
NULL, DIJOFS_BUTTON(15), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
80 {
NULL, DIJOFS_BUTTON(16), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
81 {
NULL, DIJOFS_BUTTON(17), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
82 {
NULL, DIJOFS_BUTTON(18), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
83 {
NULL, DIJOFS_BUTTON(19), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
84 {
NULL, DIJOFS_BUTTON(20), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
85 {
NULL, DIJOFS_BUTTON(21), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
86 {
NULL, DIJOFS_BUTTON(22), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
87 {
NULL, DIJOFS_BUTTON(23), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
88 {
NULL, DIJOFS_BUTTON(24), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
89 {
NULL, DIJOFS_BUTTON(25), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
90 {
NULL, DIJOFS_BUTTON(26), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
91 {
NULL, DIJOFS_BUTTON(27), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
92 {
NULL, DIJOFS_BUTTON(28), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
93 {
NULL, DIJOFS_BUTTON(29), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
94 {
NULL, DIJOFS_BUTTON(30), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
95 {
NULL, DIJOFS_BUTTON(31), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
96 {
NULL, DIJOFS_BUTTON(32), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
97 {
NULL, DIJOFS_BUTTON(33), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
98 {
NULL, DIJOFS_BUTTON(34), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
99 {
NULL, DIJOFS_BUTTON(35), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
100 {
NULL, DIJOFS_BUTTON(36), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
101 {
NULL, DIJOFS_BUTTON(37), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
102 {
NULL, DIJOFS_BUTTON(38), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
103 {
NULL, DIJOFS_BUTTON(39), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
104 {
NULL, DIJOFS_BUTTON(40), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
105 {
NULL, DIJOFS_BUTTON(41), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
106 {
NULL, DIJOFS_BUTTON(42), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
107 {
NULL, DIJOFS_BUTTON(43), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
108 {
NULL, DIJOFS_BUTTON(44), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
109 {
NULL, DIJOFS_BUTTON(45), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
110 {
NULL, DIJOFS_BUTTON(46), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
111 {
NULL, DIJOFS_BUTTON(47), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
112 {
NULL, DIJOFS_BUTTON(48), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
113 {
NULL, DIJOFS_BUTTON(49), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
114 {
NULL, DIJOFS_BUTTON(50), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
115 {
NULL, DIJOFS_BUTTON(51), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
116 {
NULL, DIJOFS_BUTTON(52), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
117 {
NULL, DIJOFS_BUTTON(53), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
118 {
NULL, DIJOFS_BUTTON(54), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
119 {
NULL, DIJOFS_BUTTON(55), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
120 {
NULL, DIJOFS_BUTTON(56), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
121 {
NULL, DIJOFS_BUTTON(57), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
122 {
NULL, DIJOFS_BUTTON(58), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
123 {
NULL, DIJOFS_BUTTON(59), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
124 {
NULL, DIJOFS_BUTTON(60), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
125 {
NULL, DIJOFS_BUTTON(61), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
126 {
NULL, DIJOFS_BUTTON(62), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
127 {
NULL, DIJOFS_BUTTON(63), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
128 {
NULL, DIJOFS_BUTTON(64), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
129 {
NULL, DIJOFS_BUTTON(65), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
130 {
NULL, DIJOFS_BUTTON(66), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
131 {
NULL, DIJOFS_BUTTON(67), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
132 {
NULL, DIJOFS_BUTTON(68), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
133 {
NULL, DIJOFS_BUTTON(69), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
134 {
NULL, DIJOFS_BUTTON(70), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
135 {
NULL, DIJOFS_BUTTON(71), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
136 {
NULL, DIJOFS_BUTTON(72), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
137 {
NULL, DIJOFS_BUTTON(73), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
138 {
NULL, DIJOFS_BUTTON(74), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
139 {
NULL, DIJOFS_BUTTON(75), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
140 {
NULL, DIJOFS_BUTTON(76), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
141 {
NULL, DIJOFS_BUTTON(77), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
142 {
NULL, DIJOFS_BUTTON(78), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
143 {
NULL, DIJOFS_BUTTON(79), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
144 {
NULL, DIJOFS_BUTTON(80), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
145 {
NULL, DIJOFS_BUTTON(81), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
146 {
NULL, DIJOFS_BUTTON(82), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
147 {
NULL, DIJOFS_BUTTON(83), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
148 {
NULL, DIJOFS_BUTTON(84), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
149 {
NULL, DIJOFS_BUTTON(85), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
150 {
NULL, DIJOFS_BUTTON(86), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
151 {
NULL, DIJOFS_BUTTON(87), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
152 {
NULL, DIJOFS_BUTTON(88), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
153 {
NULL, DIJOFS_BUTTON(89), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
154 {
NULL, DIJOFS_BUTTON(90), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
155 {
NULL, DIJOFS_BUTTON(91), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
156 {
NULL, DIJOFS_BUTTON(92), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
157 {
NULL, DIJOFS_BUTTON(93), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
158 {
NULL, DIJOFS_BUTTON(94), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
159 {
NULL, DIJOFS_BUTTON(95), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
160 {
NULL, DIJOFS_BUTTON(96), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
161 {
NULL, DIJOFS_BUTTON(97), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
162 {
NULL, DIJOFS_BUTTON(98), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
163 {
NULL, DIJOFS_BUTTON(99), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
164 {
NULL, DIJOFS_BUTTON(100), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
165 {
NULL, DIJOFS_BUTTON(101), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
166 {
NULL, DIJOFS_BUTTON(102), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
167 {
NULL, DIJOFS_BUTTON(103), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
168 {
NULL, DIJOFS_BUTTON(104), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
169 {
NULL, DIJOFS_BUTTON(105), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
170 {
NULL, DIJOFS_BUTTON(106), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
171 {
NULL, DIJOFS_BUTTON(107), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
172 {
NULL, DIJOFS_BUTTON(108), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
173 {
NULL, DIJOFS_BUTTON(109), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
174 {
NULL, DIJOFS_BUTTON(110), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
175 {
NULL, DIJOFS_BUTTON(111), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
176 {
NULL, DIJOFS_BUTTON(112), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
177 {
NULL, DIJOFS_BUTTON(113), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
178 {
NULL, DIJOFS_BUTTON(114), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
179 {
NULL, DIJOFS_BUTTON(115), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
180 {
NULL, DIJOFS_BUTTON(116), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
181 {
NULL, DIJOFS_BUTTON(117), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
182 {
NULL, DIJOFS_BUTTON(118), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
183 {
NULL, DIJOFS_BUTTON(119), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
184 {
NULL, DIJOFS_BUTTON(120), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
185 {
NULL, DIJOFS_BUTTON(121), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
186 {
NULL, DIJOFS_BUTTON(122), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
187 {
NULL, DIJOFS_BUTTON(123), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
188 {
NULL, DIJOFS_BUTTON(124), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
189 {
NULL, DIJOFS_BUTTON(125), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
190 {
NULL, DIJOFS_BUTTON(126), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
191 {
NULL, DIJOFS_BUTTON(127), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
192 { &GUID_XAxis,
FIELD_OFFSET(DIJOYSTATE2, lVX), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
193 { &GUID_YAxis,
FIELD_OFFSET(DIJOYSTATE2, lVY), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
194 { &GUID_ZAxis,
FIELD_OFFSET(DIJOYSTATE2, lVZ), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
195 { &GUID_RxAxis,
FIELD_OFFSET(DIJOYSTATE2, lVRx), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
196 { &GUID_RyAxis,
FIELD_OFFSET(DIJOYSTATE2, lVRy), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
197 { &GUID_RzAxis,
FIELD_OFFSET(DIJOYSTATE2, lVRz), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
198 { &GUID_Slider,
FIELD_OFFSET(DIJOYSTATE2, rglVSlider[0]), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
199 { &GUID_Slider,
FIELD_OFFSET(DIJOYSTATE2, rglVSlider[1]), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
200 { &GUID_XAxis,
FIELD_OFFSET(DIJOYSTATE2, lAX), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
201 { &GUID_YAxis,
FIELD_OFFSET(DIJOYSTATE2, lAY), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
202 { &GUID_ZAxis,
FIELD_OFFSET(DIJOYSTATE2, lAZ), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
203 { &GUID_RxAxis,
FIELD_OFFSET(DIJOYSTATE2, lARx), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
204 { &GUID_RyAxis,
FIELD_OFFSET(DIJOYSTATE2, lARy), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
205 { &GUID_RzAxis,
FIELD_OFFSET(DIJOYSTATE2, lARz), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
206 { &GUID_Slider,
FIELD_OFFSET(DIJOYSTATE2, rglASlider[0]), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
207 { &GUID_Slider,
FIELD_OFFSET(DIJOYSTATE2, rglASlider[1]), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
208 { &GUID_XAxis,
FIELD_OFFSET(DIJOYSTATE2, lFX), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
209 { &GUID_YAxis,
FIELD_OFFSET(DIJOYSTATE2, lFY), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
210 { &GUID_ZAxis,
FIELD_OFFSET(DIJOYSTATE2, lFZ), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
211 { &GUID_RxAxis,
FIELD_OFFSET(DIJOYSTATE2, lFRx), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
212 { &GUID_RyAxis,
FIELD_OFFSET(DIJOYSTATE2, lFRy), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
213 { &GUID_RzAxis,
FIELD_OFFSET(DIJOYSTATE2, lFRz), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
214 { &GUID_Slider,
FIELD_OFFSET(DIJOYSTATE2, rglFSlider[0]), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
215 { &GUID_Slider,
FIELD_OFFSET(DIJOYSTATE2, rglFSlider[1]), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
218 const DIDATAFORMAT SDL_c_dfDIJoystick2 = {
219 sizeof(DIDATAFORMAT),
220 sizeof(DIOBJECTDATAFORMAT),
229 SetDIerror(
const char *
function, HRESULT code)
235 return SDL_SetError(
"%s() DirectX error 0x%8.8lx",
function, code);
243 static const IID CLSID_WbemLocator = { 0x4590f811, 0x1d3a, 0x11d0,{ 0x89, 0x1f, 0x00, 0xaa, 0x00, 0x4b, 0x2e, 0x24 } };
244 static const IID IID_IWbemLocator = { 0xdc12a687, 0x737f, 0x11cf,{ 0x88, 0x4d, 0x00, 0xaa, 0x00, 0x4b, 0x2e, 0x24 } };
247 WIN_IsXInputDevice(
const GUID* pGuidProductFromDirectInput)
249 IWbemLocator* pIWbemLocator =
NULL;
250 IEnumWbemClassObject* pEnumDevices =
NULL;
251 IWbemClassObject* pDevices[20];
252 IWbemServices* pIWbemServices =
NULL;
253 BSTR bstrNamespace =
NULL;
254 BSTR bstrDeviceID =
NULL;
255 BSTR bstrClassName =
NULL;
265 hr = CoCreateInstance(&CLSID_WbemLocator,
267 CLSCTX_INPROC_SERVER,
269 (LPVOID*)&pIWbemLocator);
273 bstrNamespace = SysAllocString(L
"\\\\.\\root\\cimv2");
if (bstrNamespace ==
NULL)
goto LCleanup;
274 bstrClassName = SysAllocString(L
"Win32_PNPEntity");
if (bstrClassName ==
NULL)
goto LCleanup;
275 bstrDeviceID = SysAllocString(L
"DeviceID");
if (bstrDeviceID ==
NULL)
goto LCleanup;
278 hr = IWbemLocator_ConnectServer(pIWbemLocator, bstrNamespace,
NULL,
NULL, 0L,
285 CoSetProxyBlanket((IUnknown *)pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
NULL,
286 RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE,
NULL, EOAC_NONE);
288 hr = IWbemServices_CreateInstanceEnum(pIWbemServices, bstrClassName, 0,
NULL, &pEnumDevices);
295 hr = IEnumWbemClassObject_Next(pEnumDevices, 10000,
SDL_arraysize(pDevices), pDevices, &uReturned);
299 if (uReturned == 0) {
303 for (iDevice = 0; iDevice < uReturned; iDevice++) {
305 hr = IWbemClassObject_Get(pDevices[iDevice], bstrDeviceID, 0L, &var,
NULL,
NULL);
306 if (
SUCCEEDED(hr) && var.vt == VT_BSTR && var.bstrVal !=
NULL) {
313 DWORD dwPid = 0, dwVid = 0, dwVidPid;
314 const char *strVid, *strPid;
316 if (strVid &&
SDL_sscanf(strVid,
"VID_%4X", &dwVid) != 1)
319 if (strPid &&
SDL_sscanf(strPid,
"PID_%4X", &dwPid) != 1)
325 dwVidPid = MAKELONG(dwVid, dwPid);
326 if (dwVidPid == pGuidProductFromDirectInput->Data1) {
332 IWbemClassObject_Release(pDevices[iDevice]);
338 SysFreeString(bstrNamespace);
341 SysFreeString(bstrDeviceID);
344 SysFreeString(bstrClassName);
346 for (iDevice = 0; iDevice <
SDL_arraysize(pDevices); iDevice++) {
347 if (pDevices[iDevice]) {
348 IWbemClassObject_Release(pDevices[iDevice]);
352 IEnumWbemClassObject_Release(pEnumDevices);
355 IWbemLocator_Release(pIWbemLocator);
357 if (pIWbemServices) {
358 IWbemServices_Release(pIWbemServices);
361 return bIsXinputDevice;
366 SDL_IsXInputDevice(
const GUID* pGuidProductFromDirectInput)
374 if (
SDL_memcmp(&pGuidProductFromDirectInput->Data4[2],
"PIDVID", 6) == 0) {
375 Uint16 vendor_id = (
Uint16)LOWORD(pGuidProductFromDirectInput->Data1);
376 Uint16 product_id = (
Uint16)HIWORD(pGuidProductFromDirectInput->Data1);
380 (vendor_id == 0x28DE && product_id == 0x11FF)) {
387 if (SDL_RawDevList ==
NULL) {
388 if ((GetRawInputDeviceList(
NULL, &SDL_RawDevListCount,
sizeof(RAWINPUTDEVICELIST)) == -1) || (!SDL_RawDevListCount)) {
392 SDL_RawDevList = (PRAWINPUTDEVICELIST)
SDL_malloc(
sizeof(RAWINPUTDEVICELIST) * SDL_RawDevListCount);
393 if (SDL_RawDevList ==
NULL) {
398 if (GetRawInputDeviceList(SDL_RawDevList, &SDL_RawDevListCount,
sizeof(RAWINPUTDEVICELIST)) == -1) {
400 SDL_RawDevList =
NULL;
405 for (
i = 0;
i < SDL_RawDevListCount;
i++) {
408 UINT rdiSize =
sizeof(rdi);
411 rdi.cbSize =
sizeof(rdi);
412 if ((SDL_RawDevList[
i].dwType == RIM_TYPEHID) &&
413 (GetRawInputDeviceInfoA(SDL_RawDevList[
i].hDevice, RIDI_DEVICEINFO, &rdi, &rdiSize) != ((UINT)-1)) &&
414 (MAKELONG(rdi.hid.dwVendorId, rdi.hid.dwProductId) == ((LONG)pGuidProductFromDirectInput->Data1)) &&
415 (GetRawInputDeviceInfoA(SDL_RawDevList[
i].hDevice, RIDI_DEVICENAME, devName, &nameSize) != ((UINT)-1)) &&
424 void FreeRumbleEffectData(DIEFFECT *effect)
431 SDL_free(effect->lpvTypeSpecificParams);
435 DIEFFECT *CreateRumbleEffectData(
Sint16 magnitude)
438 DIPERIODIC *periodic;
441 effect = (DIEFFECT *)
SDL_calloc(1,
sizeof(*effect));
445 effect->dwSize =
sizeof(*effect);
446 effect->dwGain = 10000;
447 effect->dwFlags = DIEFF_OBJECTOFFSETS;
449 effect->dwTriggerButton = DIEB_NOTRIGGER;
452 effect->rgdwAxes = (DWORD *)
SDL_calloc(effect->cAxes,
sizeof(DWORD));
453 if (!effect->rgdwAxes) {
454 FreeRumbleEffectData(effect);
458 effect->rglDirection = (LONG *)
SDL_calloc(effect->cAxes,
sizeof(LONG));
459 if (!effect->rglDirection) {
460 FreeRumbleEffectData(effect);
463 effect->dwFlags |= DIEFF_CARTESIAN;
465 periodic = (DIPERIODIC *)
SDL_calloc(1,
sizeof(*periodic));
467 FreeRumbleEffectData(effect);
470 periodic->dwMagnitude = CONVERT_MAGNITUDE(magnitude);
471 periodic->dwPeriod = 1000000;
473 effect->cbTypeSpecificParams =
sizeof(*periodic);
474 effect->lpvTypeSpecificParams = periodic;
487 return SetDIerror(
"CoInitialize",
result);
492 result = CoCreateInstance(&CLSID_DirectInput8,
NULL, CLSCTX_INPROC_SERVER,
493 &IID_IDirectInput8, (LPVOID)&dinput);
496 return SetDIerror(
"CoCreateInstance",
result);
500 instance = GetModuleHandle(
NULL);
501 if (instance ==
NULL) {
502 return SDL_SetError(
"GetModuleHandle() failed with error code %lu.", GetLastError());
507 return SetDIerror(
"IDirectInput::Initialize",
result);
514 EnumJoysticksCallback(
const DIDEVICEINSTANCE * pdidInstance, VOID * pContext)
518 const DWORD devtype = (pdidInstance->dwDevType & 0xFF);
523 WCHAR hidPath[MAX_PATH];
526 if (devtype == DI8DEVTYPE_SUPPLEMENTAL) {
528 #define MAKE_TABLE_ENTRY(VID, PID) ((((DWORD)PID)<<16)|VID)
529 static DWORD ignored_devices[] = {
530 MAKE_TABLE_ENTRY(0, 0)
532 #undef MAKE_TABLE_ENTRY
536 if (pdidInstance->guidProduct.Data1 == ignored_devices[
i]) {
537 return DIENUM_CONTINUE;
542 if (SDL_IsXInputDevice(&pdidInstance->guidProduct)) {
543 return DIENUM_CONTINUE;
548 LPDIRECTINPUTDEVICE8
device;
549 LPDIRECTINPUTDEVICE8 InputDevice;
550 DIPROPGUIDANDPATH dipdw2;
552 result = IDirectInput8_CreateDevice(dinput, &(pdidInstance->guidInstance), &
device,
NULL);
554 return DIENUM_CONTINUE;
558 result = IDirectInputDevice8_QueryInterface(
device, &IID_IDirectInputDevice8, (LPVOID *)&InputDevice);
560 IDirectInputDevice8_Release(
device);
562 return DIENUM_CONTINUE;
564 dipdw2.diph.dwSize =
sizeof(dipdw2);
565 dipdw2.diph.dwHeaderSize =
sizeof(dipdw2.diph);
566 dipdw2.diph.dwObj = 0;
567 dipdw2.diph.dwHow = DIPH_DEVICE;
569 result = IDirectInputDevice8_GetProperty(InputDevice, DIPROP_GUIDANDPATH, &dipdw2.diph);
570 IDirectInputDevice8_Release(InputDevice);
572 return DIENUM_CONTINUE;
580 while (pNewJoystick) {
585 }
else if (pPrevJoystick) {
590 pNewJoystick->
dxdevice = *pdidInstance;
595 return DIENUM_CONTINUE;
598 pPrevJoystick = pNewJoystick;
599 pNewJoystick = pNewJoystick->
pNext;
604 return DIENUM_CONTINUE;
613 if (
SDL_memcmp(&pdidInstance->guidProduct.Data4[2],
"PIDVID", 6) == 0) {
614 vendor = (
Uint16)LOWORD(pdidInstance->guidProduct.Data1);
615 product = (
Uint16)HIWORD(pdidInstance->guidProduct.Data1);
640 return DIENUM_CONTINUE;
649 return DIENUM_CONTINUE;
655 return DIENUM_CONTINUE;
658 #ifdef SDL_JOYSTICK_HIDAPI
663 return DIENUM_CONTINUE;
669 return DIENUM_CONTINUE;
675 IDirectInput8_EnumDevices(dinput, DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback, pContext, DIEDFL_ATTACHEDONLY);
677 if (SDL_RawDevList) {
679 SDL_RawDevList =
NULL;
681 SDL_RawDevListCount = 0;
685 EnumDevObjectsCallback(LPCDIDEVICEOBJECTINSTANCE dev, LPVOID pvRef)
687 SDL_Joystick *joystick = (SDL_Joystick *)pvRef;
689 input_t *
in = &joystick->hwdata->Inputs[joystick->hwdata->NumInputs];
691 if (dev->dwType & DIDFT_BUTTON) {
693 in->num = joystick->nbuttons;
694 in->ofs = DIJOFS_BUTTON(
in->num);
695 joystick->nbuttons++;
696 }
else if (dev->dwType & DIDFT_POV) {
698 in->num = joystick->nhats;
699 in->ofs = DIJOFS_POV(
in->num);
701 }
else if (dev->dwType & DIDFT_AXIS) {
706 in->num = joystick->naxes;
707 if (!
SDL_memcmp(&dev->guidType, &GUID_XAxis,
sizeof(dev->guidType)))
709 else if (!
SDL_memcmp(&dev->guidType, &GUID_YAxis,
sizeof(dev->guidType)))
711 else if (!
SDL_memcmp(&dev->guidType, &GUID_ZAxis,
sizeof(dev->guidType)))
713 else if (!
SDL_memcmp(&dev->guidType, &GUID_RxAxis,
sizeof(dev->guidType)))
715 else if (!
SDL_memcmp(&dev->guidType, &GUID_RyAxis,
sizeof(dev->guidType)))
717 else if (!
SDL_memcmp(&dev->guidType, &GUID_RzAxis,
sizeof(dev->guidType)))
719 else if (!
SDL_memcmp(&dev->guidType, &GUID_Slider,
sizeof(dev->guidType))) {
720 in->ofs = DIJOFS_SLIDER(joystick->hwdata->NumSliders);
721 ++joystick->hwdata->NumSliders;
723 return DIENUM_CONTINUE;
726 diprg.diph.dwSize =
sizeof(diprg);
727 diprg.diph.dwHeaderSize =
sizeof(diprg.diph);
728 diprg.diph.dwObj = dev->dwType;
729 diprg.diph.dwHow = DIPH_BYID;
734 IDirectInputDevice8_SetProperty(joystick->hwdata->InputDevice,
735 DIPROP_RANGE, &diprg.diph);
737 return DIENUM_CONTINUE;
741 dilong.diph.dwSize =
sizeof(dilong);
742 dilong.diph.dwHeaderSize =
sizeof(dilong.diph);
743 dilong.diph.dwObj = dev->dwType;
744 dilong.diph.dwHow = DIPH_BYID;
747 IDirectInputDevice8_SetProperty(joystick->hwdata->InputDevice,
748 DIPROP_DEADZONE, &dilong.diph);
750 return DIENUM_CONTINUE;
756 return DIENUM_CONTINUE;
759 joystick->hwdata->NumInputs++;
761 if (joystick->hwdata->NumInputs ==
MAX_INPUTS) {
765 return DIENUM_CONTINUE;
772 SortDevFunc(
const void *
a,
const void *
b)
777 if (inputA->
ofs < inputB->
ofs)
779 if (inputA->
ofs > inputB->
ofs)
786 SortDevObjects(SDL_Joystick *joystick)
788 input_t *inputs = joystick->hwdata->Inputs;
794 SDL_qsort(inputs, joystick->hwdata->NumInputs,
sizeof(
input_t), SortDevFunc);
796 for (
n = 0;
n < joystick->hwdata->NumInputs;
n++) {
797 switch (inputs[
n].
type) {
799 inputs[
n].
num = nButtons;
804 inputs[
n].
num = nHats;
809 inputs[
n].
num = nAxis;
820 LPDIRECTINPUTDEVICE8
device;
823 joystick->hwdata->buffered =
SDL_TRUE;
824 joystick->hwdata->Capabilities.dwSize =
sizeof(DIDEVCAPS);
827 dipdw.diph.dwSize =
sizeof(DIPROPDWORD);
828 dipdw.diph.dwHeaderSize =
sizeof(DIPROPHEADER);
831 IDirectInput8_CreateDevice(dinput,
834 return SetDIerror(
"IDirectInput::CreateDevice",
result);
839 &IID_IDirectInputDevice8,
840 (LPVOID *)& joystick->
841 hwdata->InputDevice);
843 IDirectInputDevice8_Release(
device);
846 return SetDIerror(
"IDirectInputDevice8::QueryInterface",
result);
852 IDirectInputDevice8_SetCooperativeLevel(joystick->hwdata->
853 InputDevice, SDL_HelperWindow,
857 return SetDIerror(
"IDirectInputDevice8::SetCooperativeLevel",
result);
862 IDirectInputDevice8_SetDataFormat(joystick->hwdata->InputDevice,
863 &SDL_c_dfDIJoystick2);
865 return SetDIerror(
"IDirectInputDevice8::SetDataFormat",
result);
870 IDirectInputDevice8_GetCapabilities(joystick->hwdata->InputDevice,
871 &joystick->hwdata->Capabilities);
873 return SetDIerror(
"IDirectInputDevice8::GetCapabilities",
result);
877 if (joystick->hwdata->Capabilities.dwFlags & DIDC_FORCEFEEDBACK) {
878 result = IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
880 return SetDIerror(
"IDirectInputDevice8::Acquire",
result);
885 IDirectInputDevice8_SendForceFeedbackCommand(joystick->hwdata->
895 result = IDirectInputDevice8_Unacquire(joystick->hwdata->InputDevice);
898 return SetDIerror(
"IDirectInputDevice8::Unacquire",
result);
903 dipdw.diph.dwObj = 0;
904 dipdw.diph.dwHow = DIPH_DEVICE;
905 dipdw.dwData = DIPROPAUTOCENTER_ON;
908 IDirectInputDevice8_SetProperty(joystick->hwdata->InputDevice,
909 DIPROP_AUTOCENTER, &dipdw.diph);
919 IDirectInputDevice8_EnumObjects(joystick->hwdata->InputDevice,
920 EnumDevObjectsCallback, joystick,
921 DIDFT_BUTTON | DIDFT_AXIS | DIDFT_POV);
925 SortDevObjects(joystick);
927 dipdw.diph.dwObj = 0;
928 dipdw.diph.dwHow = DIPH_DEVICE;
929 dipdw.dwData = INPUT_QSIZE;
933 IDirectInputDevice8_SetProperty(joystick->hwdata->InputDevice,
934 DIPROP_BUFFERSIZE, &dipdw.diph);
936 if (
result == DI_POLLEDDEVICE) {
941 return SetDIerror(
"IDirectInputDevice8::SetProperty",
result);
947 SDL_DINPUT_JoystickInitRumble(SDL_Joystick * joystick,
Sint16 magnitude)
952 result = IDirectInputDevice8_SendForceFeedbackCommand(joystick->hwdata->InputDevice, DISFFC_RESET);
953 if (
result == DIERR_INPUTLOST ||
result == DIERR_NOTEXCLUSIVEACQUIRED) {
954 result = IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
956 result = IDirectInputDevice8_SendForceFeedbackCommand(joystick->hwdata->InputDevice, DISFFC_RESET);
960 return SetDIerror(
"IDirectInputDevice8::SendForceFeedbackCommand(DISFFC_RESET)",
result);
963 result = IDirectInputDevice8_SendForceFeedbackCommand(joystick->hwdata->InputDevice, DISFFC_SETACTUATORSON);
965 return SetDIerror(
"IDirectInputDevice8::SendForceFeedbackCommand(DISFFC_SETACTUATORSON)",
result);
969 joystick->hwdata->ffeffect = CreateRumbleEffectData(magnitude);
970 if (!joystick->hwdata->ffeffect) {
974 result = IDirectInputDevice8_CreateEffect(joystick->hwdata->InputDevice, &GUID_Sine,
975 joystick->hwdata->ffeffect, &joystick->hwdata->ffeffect_ref,
NULL);
977 return SetDIerror(
"IDirectInputDevice8::CreateEffect",
result);
988 Sint16 magnitude = (
Sint16)(((low_frequency_rumble / 2) + (high_frequency_rumble / 2)) / 2);
990 if (!(joystick->hwdata->Capabilities.dwFlags & DIDC_FORCEFEEDBACK)) {
994 if (joystick->hwdata->ff_initialized) {
995 DIPERIODIC *periodic = ((DIPERIODIC *)joystick->hwdata->ffeffect->lpvTypeSpecificParams);
996 periodic->dwMagnitude = CONVERT_MAGNITUDE(magnitude);
998 result = IDirectInputEffect_SetParameters(joystick->hwdata->ffeffect_ref, joystick->hwdata->ffeffect, (DIEP_DURATION | DIEP_TYPESPECIFICPARAMS));
999 if (
result == DIERR_INPUTLOST) {
1000 result = IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
1002 result = IDirectInputEffect_SetParameters(joystick->hwdata->ffeffect_ref, joystick->hwdata->ffeffect, (DIEP_DURATION | DIEP_TYPESPECIFICPARAMS));
1006 return SetDIerror(
"IDirectInputDevice8::SetParameters",
result);
1009 if (SDL_DINPUT_JoystickInitRumble(joystick, magnitude) < 0) {
1012 joystick->hwdata->ff_initialized =
SDL_TRUE;
1015 result = IDirectInputEffect_Start(joystick->hwdata->ffeffect_ref, 1, 0);
1016 if (
result == DIERR_INPUTLOST ||
result == DIERR_NOTEXCLUSIVEACQUIRED) {
1017 result = IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
1019 result = IDirectInputEffect_Start(joystick->hwdata->ffeffect_ref, 1, 0);
1023 return SetDIerror(
"IDirectInputDevice8::Start",
result);
1029 TranslatePOV(DWORD
value)
1031 const int HAT_VALS[] = {
1042 if (LOWORD(
value) == 0xFFFF)
1053 return HAT_VALS[
value];
1057 UpdateDINPUTJoystickState_Buffered(SDL_Joystick * joystick)
1062 DIDEVICEOBJECTDATA evtbuf[INPUT_QSIZE];
1064 numevents = INPUT_QSIZE;
1066 IDirectInputDevice8_GetDeviceData(joystick->hwdata->InputDevice,
1067 sizeof(DIDEVICEOBJECTDATA), evtbuf,
1069 if (
result == DIERR_INPUTLOST ||
result == DIERR_NOTACQUIRED) {
1070 IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
1072 IDirectInputDevice8_GetDeviceData(joystick->hwdata->InputDevice,
1073 sizeof(DIDEVICEOBJECTDATA),
1074 evtbuf, &numevents, 0);
1082 for (
i = 0;
i < (int)numevents; ++
i) {
1085 for (
j = 0;
j < joystick->hwdata->NumInputs; ++
j) {
1086 const input_t *
in = &joystick->hwdata->Inputs[
j];
1088 if (evtbuf[
i].dwOfs !=
in->ofs)
1101 Uint8 pos = TranslatePOV(evtbuf[
i].dwData);
1116 UpdateDINPUTJoystickState_Polled(SDL_Joystick * joystick)
1123 IDirectInputDevice8_GetDeviceState(joystick->hwdata->InputDevice,
1124 sizeof(DIJOYSTATE2), &
state);
1125 if (
result == DIERR_INPUTLOST ||
result == DIERR_NOTACQUIRED) {
1126 IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
1128 IDirectInputDevice8_GetDeviceState(joystick->hwdata->InputDevice,
1129 sizeof(DIJOYSTATE2), &
state);
1137 for (
i = 0;
i < joystick->hwdata->NumInputs; ++
i) {
1138 const input_t *
in = &joystick->hwdata->Inputs[
i];
1161 case DIJOFS_SLIDER(0):
1164 case DIJOFS_SLIDER(1):
1176 Uint8 pos = TranslatePOV(
state.rgdwPOV[
in->ofs - DIJOFS_POV(0)]);
1189 result = IDirectInputDevice8_Poll(joystick->hwdata->InputDevice);
1190 if (
result == DIERR_INPUTLOST ||
result == DIERR_NOTACQUIRED) {
1191 IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
1192 IDirectInputDevice8_Poll(joystick->hwdata->InputDevice);
1195 if (joystick->hwdata->buffered) {
1196 UpdateDINPUTJoystickState_Buffered(joystick);
1198 UpdateDINPUTJoystickState_Polled(joystick);
1205 if (joystick->hwdata->ffeffect_ref) {
1206 IDirectInputEffect_Unload(joystick->hwdata->ffeffect_ref);
1207 joystick->hwdata->ffeffect_ref =
NULL;
1209 if (joystick->hwdata->ffeffect) {
1210 FreeRumbleEffectData(joystick->hwdata->ffeffect);
1211 joystick->hwdata->ffeffect =
NULL;
1213 IDirectInputDevice8_Unacquire(joystick->hwdata->InputDevice);
1214 IDirectInputDevice8_Release(joystick->hwdata->InputDevice);
1215 joystick->hwdata->ff_initialized =
SDL_FALSE;
1221 if (dinput !=
NULL) {
1222 IDirectInput8_Release(dinput);
1226 if (coinitialized) {