21#include "../../SDL_internal.h"
23#include "../SDL_sysjoystick.h"
25#if SDL_JOYSTICK_DINPUT
30#include "../hidapi/SDL_hidapijoystick_c.h"
33#define DIDFT_OPTIONAL 0x80000000
37#define JOY_AXIS_THRESHOLD (((SDL_JOYSTICK_AXIS_MAX)-(SDL_JOYSTICK_AXIS_MIN))/100)
39#define CONVERT_MAGNITUDE(x) (((x)*10000) / 0x7FFF)
42extern HWND SDL_HelperWindow;
46static LPDIRECTINPUT8 dinput =
NULL;
47static PRAWINPUTDEVICELIST SDL_RawDevList =
NULL;
48static UINT SDL_RawDevListCount = 0;
51static 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 },
218const DIDATAFORMAT SDL_c_dfDIJoystick2 = {
219 sizeof(DIDATAFORMAT),
220 sizeof(DIOBJECTDATAFORMAT),
229SetDIerror(
const char *function, HRESULT code)
235 return SDL_SetError(
"%s() DirectX error 0x%8.8lx", function, code);
239SDL_IsXInputDevice(
const GUID* pGuidProductFromDirectInput)
241 static GUID IID_ValveStreamingGamepad = { MAKELONG(0x28DE, 0x11FF), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
242 static GUID IID_X360WiredGamepad = { MAKELONG(0x045E, 0x02A1), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
243 static GUID IID_X360WirelessGamepad = { MAKELONG(0x045E, 0x028E), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
244 static GUID IID_XOneWiredGamepad = { MAKELONG(0x045E, 0x02FF), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
245 static GUID IID_XOneWirelessGamepad = { MAKELONG(0x045E, 0x02DD), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
246 static GUID IID_XOneNewWirelessGamepad = { MAKELONG(0x045E, 0x02D1), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
247 static GUID IID_XOneSWirelessGamepad = { MAKELONG(0x045E, 0x02EA), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
248 static GUID IID_XOneSBluetoothGamepad = { MAKELONG(0x045E, 0x02E0), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
249 static GUID IID_XOneEliteWirelessGamepad = { MAKELONG(0x045E, 0x02E3), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
251 static const GUID *s_XInputProductGUID[] = {
252 &IID_ValveStreamingGamepad,
253 &IID_X360WiredGamepad,
254 &IID_X360WirelessGamepad,
255 &IID_XOneWiredGamepad,
256 &IID_XOneWirelessGamepad,
257 &IID_XOneNewWirelessGamepad,
258 &IID_XOneSWirelessGamepad,
259 &IID_XOneSBluetoothGamepad,
260 &IID_XOneEliteWirelessGamepad
272 for (iDevice = 0; iDevice <
SDL_arraysize(s_XInputProductGUID); ++iDevice) {
273 if (
SDL_memcmp(pGuidProductFromDirectInput, s_XInputProductGUID[iDevice],
sizeof(GUID)) == 0) {
280 if (SDL_RawDevList ==
NULL) {
281 if ((GetRawInputDeviceList(
NULL, &SDL_RawDevListCount,
sizeof(RAWINPUTDEVICELIST)) == -1) || (!SDL_RawDevListCount)) {
285 SDL_RawDevList = (PRAWINPUTDEVICELIST)
SDL_malloc(
sizeof(RAWINPUTDEVICELIST) * SDL_RawDevListCount);
286 if (SDL_RawDevList ==
NULL) {
291 if (GetRawInputDeviceList(SDL_RawDevList, &SDL_RawDevListCount,
sizeof(RAWINPUTDEVICELIST)) == -1) {
293 SDL_RawDevList =
NULL;
298 for (
i = 0;
i < SDL_RawDevListCount;
i++) {
301 UINT rdiSize =
sizeof(rdi);
304 rdi.cbSize =
sizeof(rdi);
305 if ((SDL_RawDevList[
i].dwType == RIM_TYPEHID) &&
306 (GetRawInputDeviceInfoA(SDL_RawDevList[
i].hDevice, RIDI_DEVICEINFO, &rdi, &rdiSize) != ((UINT)-1)) &&
307 (MAKELONG(rdi.hid.dwVendorId, rdi.hid.dwProductId) == ((LONG)pGuidProductFromDirectInput->Data1)) &&
308 (GetRawInputDeviceInfoA(SDL_RawDevList[
i].hDevice, RIDI_DEVICENAME, devName, &nameSize) != ((UINT)-1)) &&
317void FreeRumbleEffectData(DIEFFECT *effect)
324 SDL_free(effect->lpvTypeSpecificParams);
328DIEFFECT *CreateRumbleEffectData(
Sint16 magnitude,
Uint32 duration_ms)
331 DIPERIODIC *periodic;
334 effect = (DIEFFECT *)
SDL_calloc(1,
sizeof(*effect));
338 effect->dwSize =
sizeof(*effect);
339 effect->dwGain = 10000;
340 effect->dwFlags = DIEFF_OBJECTOFFSETS;
341 effect->dwDuration = duration_ms * 1000;
342 effect->dwTriggerButton = DIEB_NOTRIGGER;
345 effect->rgdwAxes = (DWORD *)
SDL_calloc(effect->cAxes,
sizeof(DWORD));
346 if (!effect->rgdwAxes) {
347 FreeRumbleEffectData(effect);
351 effect->rglDirection = (LONG *)
SDL_calloc(effect->cAxes,
sizeof(LONG));
352 if (!effect->rglDirection) {
353 FreeRumbleEffectData(effect);
356 effect->dwFlags |= DIEFF_CARTESIAN;
358 periodic = (DIPERIODIC *)
SDL_calloc(1,
sizeof(*periodic));
360 FreeRumbleEffectData(effect);
363 periodic->dwMagnitude = CONVERT_MAGNITUDE(magnitude);
364 periodic->dwPeriod = 1000000;
366 effect->cbTypeSpecificParams =
sizeof(*periodic);
367 effect->lpvTypeSpecificParams = periodic;
380 return SetDIerror(
"CoInitialize",
result);
385 result = CoCreateInstance(&CLSID_DirectInput8,
NULL, CLSCTX_INPROC_SERVER,
386 &IID_IDirectInput8, (LPVOID)&dinput);
389 return SetDIerror(
"CoCreateInstance",
result);
393 instance = GetModuleHandle(
NULL);
394 if (instance ==
NULL) {
395 return SDL_SetError(
"GetModuleHandle() failed with error code %lu.", GetLastError());
400 return SetDIerror(
"IDirectInput::Initialize",
result);
407EnumJoysticksCallback(
const DIDEVICEINSTANCE * pdidInstance, VOID * pContext)
411 const DWORD devtype = (pdidInstance->dwDevType & 0xFF);
416 WCHAR hidPath[MAX_PATH];
418 if (devtype == DI8DEVTYPE_SUPPLEMENTAL) {
420#define MAKE_TABLE_ENTRY(VID, PID) ((((DWORD)PID)<<16)|VID)
421 static DWORD ignored_devices[] = {
422 MAKE_TABLE_ENTRY(0, 0)
424#undef MAKE_TABLE_ENTRY
428 if (pdidInstance->guidProduct.Data1 == ignored_devices[
i]) {
429 return DIENUM_CONTINUE;
434 if (SDL_IsXInputDevice(&pdidInstance->guidProduct)) {
435 return DIENUM_CONTINUE;
440 LPDIRECTINPUTDEVICE8
device;
441 LPDIRECTINPUTDEVICE8 InputDevice;
442 DIPROPGUIDANDPATH dipdw2;
444 result = IDirectInput8_CreateDevice(dinput, &(pdidInstance->guidInstance), &
device,
NULL);
446 return DIENUM_CONTINUE;
450 result = IDirectInputDevice8_QueryInterface(
device, &IID_IDirectInputDevice8, (LPVOID *)&InputDevice);
452 IDirectInputDevice8_Release(
device);
454 return DIENUM_CONTINUE;
456 dipdw2.diph.dwSize =
sizeof(dipdw2);
457 dipdw2.diph.dwHeaderSize =
sizeof(dipdw2.diph);
458 dipdw2.diph.dwObj = 0;
459 dipdw2.diph.dwHow = DIPH_DEVICE;
461 result = IDirectInputDevice8_GetProperty(InputDevice, DIPROP_GUIDANDPATH, &dipdw2.diph);
462 IDirectInputDevice8_Release(InputDevice);
464 return DIENUM_CONTINUE;
472 while (pNewJoystick) {
477 }
else if (pPrevJoystick) {
482 pNewJoystick->
dxdevice = *pdidInstance;
487 return DIENUM_CONTINUE;
490 pPrevJoystick = pNewJoystick;
491 pNewJoystick = pNewJoystick->
pNext;
496 return DIENUM_CONTINUE;
504 return DIENUM_CONTINUE;
513 if (
SDL_memcmp(&pdidInstance->guidProduct.Data4[2],
"PIDVID", 6) == 0) {
514 vendor = (
Uint16)LOWORD(pdidInstance->guidProduct.Data1);
515 product = (
Uint16)HIWORD(pdidInstance->guidProduct.Data1);
534 return DIENUM_CONTINUE;
537#ifdef SDL_JOYSTICK_HIDAPI
541 return DIENUM_CONTINUE;
547 return DIENUM_CONTINUE;
553 IDirectInput8_EnumDevices(dinput, DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback, pContext, DIEDFL_ATTACHEDONLY);
555 if (SDL_RawDevList) {
557 SDL_RawDevList =
NULL;
559 SDL_RawDevListCount = 0;
563EnumDevObjectsCallback(LPCDIDEVICEOBJECTINSTANCE dev, LPVOID pvRef)
565 SDL_Joystick *joystick = (SDL_Joystick *)pvRef;
567 input_t *
in = &joystick->hwdata->Inputs[joystick->hwdata->NumInputs];
569 if (dev->dwType & DIDFT_BUTTON) {
571 in->num = joystick->nbuttons;
572 in->ofs = DIJOFS_BUTTON(
in->num);
573 joystick->nbuttons++;
574 }
else if (dev->dwType & DIDFT_POV) {
576 in->num = joystick->nhats;
577 in->ofs = DIJOFS_POV(
in->num);
579 }
else if (dev->dwType & DIDFT_AXIS) {
584 in->num = joystick->naxes;
585 if (!
SDL_memcmp(&dev->guidType, &GUID_XAxis,
sizeof(dev->guidType)))
587 else if (!
SDL_memcmp(&dev->guidType, &GUID_YAxis,
sizeof(dev->guidType)))
589 else if (!
SDL_memcmp(&dev->guidType, &GUID_ZAxis,
sizeof(dev->guidType)))
591 else if (!
SDL_memcmp(&dev->guidType, &GUID_RxAxis,
sizeof(dev->guidType)))
593 else if (!
SDL_memcmp(&dev->guidType, &GUID_RyAxis,
sizeof(dev->guidType)))
595 else if (!
SDL_memcmp(&dev->guidType, &GUID_RzAxis,
sizeof(dev->guidType)))
597 else if (!
SDL_memcmp(&dev->guidType, &GUID_Slider,
sizeof(dev->guidType))) {
598 in->ofs = DIJOFS_SLIDER(joystick->hwdata->NumSliders);
599 ++joystick->hwdata->NumSliders;
601 return DIENUM_CONTINUE;
604 diprg.diph.dwSize =
sizeof(diprg);
605 diprg.diph.dwHeaderSize =
sizeof(diprg.diph);
606 diprg.diph.dwObj = dev->dwType;
607 diprg.diph.dwHow = DIPH_BYID;
612 IDirectInputDevice8_SetProperty(joystick->hwdata->InputDevice,
613 DIPROP_RANGE, &diprg.diph);
615 return DIENUM_CONTINUE;
619 dilong.diph.dwSize =
sizeof(dilong);
620 dilong.diph.dwHeaderSize =
sizeof(dilong.diph);
621 dilong.diph.dwObj = dev->dwType;
622 dilong.diph.dwHow = DIPH_BYID;
625 IDirectInputDevice8_SetProperty(joystick->hwdata->InputDevice,
626 DIPROP_DEADZONE, &dilong.diph);
628 return DIENUM_CONTINUE;
634 return DIENUM_CONTINUE;
637 joystick->hwdata->NumInputs++;
639 if (joystick->hwdata->NumInputs ==
MAX_INPUTS) {
643 return DIENUM_CONTINUE;
650SortDevFunc(
const void *
a,
const void *
b)
655 if (inputA->
ofs < inputB->
ofs)
657 if (inputA->
ofs > inputB->
ofs)
664SortDevObjects(SDL_Joystick *joystick)
666 input_t *inputs = joystick->hwdata->Inputs;
672 SDL_qsort(inputs, joystick->hwdata->NumInputs,
sizeof(
input_t), SortDevFunc);
674 for (
n = 0;
n < joystick->hwdata->NumInputs;
n++) {
675 switch (inputs[
n].
type) {
677 inputs[
n].
num = nButtons;
682 inputs[
n].
num = nHats;
687 inputs[
n].
num = nAxis;
698 LPDIRECTINPUTDEVICE8
device;
701 joystick->hwdata->buffered =
SDL_TRUE;
702 joystick->hwdata->Capabilities.dwSize =
sizeof(DIDEVCAPS);
705 dipdw.diph.dwSize =
sizeof(DIPROPDWORD);
706 dipdw.diph.dwHeaderSize =
sizeof(DIPROPHEADER);
709 IDirectInput8_CreateDevice(dinput,
712 return SetDIerror(
"IDirectInput::CreateDevice",
result);
717 &IID_IDirectInputDevice8,
718 (LPVOID *)& joystick->
719 hwdata->InputDevice);
721 IDirectInputDevice8_Release(
device);
724 return SetDIerror(
"IDirectInputDevice8::QueryInterface",
result);
730 IDirectInputDevice8_SetCooperativeLevel(joystick->hwdata->
731 InputDevice, SDL_HelperWindow,
735 return SetDIerror(
"IDirectInputDevice8::SetCooperativeLevel",
result);
740 IDirectInputDevice8_SetDataFormat(joystick->hwdata->InputDevice,
741 &SDL_c_dfDIJoystick2);
743 return SetDIerror(
"IDirectInputDevice8::SetDataFormat",
result);
748 IDirectInputDevice8_GetCapabilities(joystick->hwdata->InputDevice,
749 &joystick->hwdata->Capabilities);
751 return SetDIerror(
"IDirectInputDevice8::GetCapabilities",
result);
755 if (joystick->hwdata->Capabilities.dwFlags & DIDC_FORCEFEEDBACK) {
756 result = IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
758 return SetDIerror(
"IDirectInputDevice8::Acquire",
result);
763 IDirectInputDevice8_SendForceFeedbackCommand(joystick->hwdata->
773 result = IDirectInputDevice8_Unacquire(joystick->hwdata->InputDevice);
776 return SetDIerror(
"IDirectInputDevice8::Unacquire",
result);
781 dipdw.diph.dwObj = 0;
782 dipdw.diph.dwHow = DIPH_DEVICE;
783 dipdw.dwData = DIPROPAUTOCENTER_ON;
786 IDirectInputDevice8_SetProperty(joystick->hwdata->InputDevice,
787 DIPROP_AUTOCENTER, &dipdw.diph);
797 IDirectInputDevice8_EnumObjects(joystick->hwdata->InputDevice,
798 EnumDevObjectsCallback, joystick,
799 DIDFT_BUTTON | DIDFT_AXIS | DIDFT_POV);
803 SortDevObjects(joystick);
805 dipdw.diph.dwObj = 0;
806 dipdw.diph.dwHow = DIPH_DEVICE;
807 dipdw.dwData = INPUT_QSIZE;
811 IDirectInputDevice8_SetProperty(joystick->hwdata->InputDevice,
812 DIPROP_BUFFERSIZE, &dipdw.diph);
814 if (
result == DI_POLLEDDEVICE) {
819 return SetDIerror(
"IDirectInputDevice8::SetProperty",
result);
825SDL_DINPUT_JoystickInitRumble(SDL_Joystick * joystick,
Sint16 magnitude,
Uint32 duration_ms)
830 result = IDirectInputDevice8_SendForceFeedbackCommand(joystick->hwdata->InputDevice, DISFFC_RESET);
831 if (
result == DIERR_INPUTLOST ||
result == DIERR_NOTEXCLUSIVEACQUIRED) {
832 result = IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
834 result = IDirectInputDevice8_SendForceFeedbackCommand(joystick->hwdata->InputDevice, DISFFC_RESET);
838 return SetDIerror(
"IDirectInputDevice8::SendForceFeedbackCommand(DISFFC_RESET)",
result);
841 result = IDirectInputDevice8_SendForceFeedbackCommand(joystick->hwdata->InputDevice, DISFFC_SETACTUATORSON);
843 return SetDIerror(
"IDirectInputDevice8::SendForceFeedbackCommand(DISFFC_SETACTUATORSON)",
result);
847 joystick->hwdata->ffeffect = CreateRumbleEffectData(magnitude, duration_ms);
848 if (!joystick->hwdata->ffeffect) {
852 result = IDirectInputDevice8_CreateEffect(joystick->hwdata->InputDevice, &GUID_Sine,
853 joystick->hwdata->ffeffect, &joystick->hwdata->ffeffect_ref,
NULL);
855 return SetDIerror(
"IDirectInputDevice8::CreateEffect",
result);
866 Sint16 magnitude = (
Sint16)(((low_frequency_rumble / 2) + (high_frequency_rumble / 2)) / 2);
868 if (!(joystick->hwdata->Capabilities.dwFlags & DIDC_FORCEFEEDBACK)) {
872 if (joystick->hwdata->ff_initialized) {
873 DIPERIODIC *periodic = ((DIPERIODIC *)joystick->hwdata->ffeffect->lpvTypeSpecificParams);
874 joystick->hwdata->ffeffect->dwDuration = duration_ms * 1000;
875 periodic->dwMagnitude = CONVERT_MAGNITUDE(magnitude);
877 result = IDirectInputEffect_SetParameters(joystick->hwdata->ffeffect_ref, joystick->hwdata->ffeffect, (DIEP_DURATION | DIEP_TYPESPECIFICPARAMS));
878 if (
result == DIERR_INPUTLOST) {
879 result = IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
881 result = IDirectInputEffect_SetParameters(joystick->hwdata->ffeffect_ref, joystick->hwdata->ffeffect, (DIEP_DURATION | DIEP_TYPESPECIFICPARAMS));
885 return SetDIerror(
"IDirectInputDevice8::SetParameters",
result);
888 if (SDL_DINPUT_JoystickInitRumble(joystick, magnitude, duration_ms) < 0) {
891 joystick->hwdata->ff_initialized =
SDL_TRUE;
894 result = IDirectInputEffect_Start(joystick->hwdata->ffeffect_ref, 1, 0);
895 if (
result == DIERR_INPUTLOST ||
result == DIERR_NOTEXCLUSIVEACQUIRED) {
896 result = IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
898 result = IDirectInputEffect_Start(joystick->hwdata->ffeffect_ref, 1, 0);
902 return SetDIerror(
"IDirectInputDevice8::Start",
result);
908TranslatePOV(DWORD
value)
910 const int HAT_VALS[] = {
921 if (LOWORD(
value) == 0xFFFF)
932 return HAT_VALS[
value];
936UpdateDINPUTJoystickState_Buffered(SDL_Joystick * joystick)
941 DIDEVICEOBJECTDATA evtbuf[INPUT_QSIZE];
943 numevents = INPUT_QSIZE;
945 IDirectInputDevice8_GetDeviceData(joystick->hwdata->InputDevice,
946 sizeof(DIDEVICEOBJECTDATA), evtbuf,
948 if (
result == DIERR_INPUTLOST ||
result == DIERR_NOTACQUIRED) {
949 IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
951 IDirectInputDevice8_GetDeviceData(joystick->hwdata->InputDevice,
952 sizeof(DIDEVICEOBJECTDATA),
953 evtbuf, &numevents, 0);
961 for (
i = 0;
i < (int)numevents; ++
i) {
964 for (
j = 0;
j < joystick->hwdata->NumInputs; ++
j) {
965 const input_t *
in = &joystick->hwdata->Inputs[
j];
967 if (evtbuf[
i].dwOfs !=
in->ofs)
980 Uint8 pos = TranslatePOV(evtbuf[
i].dwData);
995UpdateDINPUTJoystickState_Polled(SDL_Joystick * joystick)
1002 IDirectInputDevice8_GetDeviceState(joystick->hwdata->InputDevice,
1003 sizeof(DIJOYSTATE2), &
state);
1004 if (
result == DIERR_INPUTLOST ||
result == DIERR_NOTACQUIRED) {
1005 IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
1007 IDirectInputDevice8_GetDeviceState(joystick->hwdata->InputDevice,
1008 sizeof(DIJOYSTATE2), &
state);
1016 for (
i = 0;
i < joystick->hwdata->NumInputs; ++
i) {
1017 const input_t *
in = &joystick->hwdata->Inputs[
i];
1040 case DIJOFS_SLIDER(0):
1043 case DIJOFS_SLIDER(1):
1055 Uint8 pos = TranslatePOV(
state.rgdwPOV[
in->ofs - DIJOFS_POV(0)]);
1068 result = IDirectInputDevice8_Poll(joystick->hwdata->InputDevice);
1069 if (
result == DIERR_INPUTLOST ||
result == DIERR_NOTACQUIRED) {
1070 IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
1071 IDirectInputDevice8_Poll(joystick->hwdata->InputDevice);
1074 if (joystick->hwdata->buffered) {
1075 UpdateDINPUTJoystickState_Buffered(joystick);
1077 UpdateDINPUTJoystickState_Polled(joystick);
1084 if (joystick->hwdata->ffeffect_ref) {
1085 IDirectInputEffect_Unload(joystick->hwdata->ffeffect_ref);
1086 joystick->hwdata->ffeffect_ref =
NULL;
1088 if (joystick->hwdata->ffeffect) {
1089 FreeRumbleEffectData(joystick->hwdata->ffeffect);
1090 joystick->hwdata->ffeffect =
NULL;
1092 IDirectInputDevice8_Unacquire(joystick->hwdata->InputDevice);
1093 IDirectInputDevice8_Release(joystick->hwdata->InputDevice);
1094 joystick->hwdata->ff_initialized =
SDL_FALSE;
1100 if (dinput !=
NULL) {
1101 IDirectInput8_Release(dinput);
1105 if (coinitialized) {
#define DIRECTINPUT_VERSION
#define FIELD_OFFSET(type, field)
#define SDL_OutOfMemory()
#define SDL_Unsupported()
SDL_bool HIDAPI_IsDevicePresent(Uint16 vendor_id, Uint16 product_id, Uint16 version)
int SDL_PrivateJoystickHat(SDL_Joystick *joystick, Uint8 hat, Uint8 value)
int SDL_PrivateJoystickAxis(SDL_Joystick *joystick, Uint8 axis, Sint16 value)
SDL_bool SDL_ShouldIgnoreJoystick(const char *name, SDL_JoystickGUID guid)
int SDL_PrivateJoystickButton(SDL_Joystick *joystick, Uint8 button, Uint8 state)
#define SDL_JOYSTICK_AXIS_MIN
#define SDL_JOYSTICK_AXIS_MAX
GLuint GLuint GLsizei GLenum type
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
GLsizei const GLfloat * value
#define SDL_arraysize(array)
#define SDL_HARDWARE_BUS_USB
#define SDL_HARDWARE_BUS_BLUETOOTH
HRESULT WIN_CoInitialize(void)
void WIN_CoUninitialize(void)
#define WIN_StringToUTF8(S)
void WINDOWS_AddJoystickDevice(JoyStick_DeviceData *device)
JoyStick_DeviceData * SYS_Joystick
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int int in j)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
static SDL_AudioDeviceID device
DIDEVICEINSTANCE dxdevice
struct JoyStick_DeviceData * pNext