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);
239 SDL_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)) &&
317 void FreeRumbleEffectData(DIEFFECT *effect)
324 SDL_free(effect->lpvTypeSpecificParams);
328 DIEFFECT *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);
407 EnumJoysticksCallback(
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;
563 EnumDevObjectsCallback(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;
650 SortDevFunc(
const void *
a,
const void *
b)
655 if (inputA->
ofs < inputB->
ofs)
657 if (inputA->
ofs > inputB->
ofs)
664 SortDevObjects(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,
710 &(joystickdevice->
dxdevice.guidInstance), &device,
NULL);
712 return SetDIerror(
"IDirectInput::CreateDevice", result);
716 result = IDirectInputDevice8_QueryInterface(device,
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) {
818 }
else if (
FAILED(result)) {
819 return SetDIerror(
"IDirectInputDevice8::SetProperty", result);
825 SDL_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);
908 TranslatePOV(DWORD
value)
910 const int HAT_VALS[] = {
921 if (LOWORD(value) == 0xFFFF)
932 return HAT_VALS[
value];
936 UpdateDINPUTJoystickState_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);
995 UpdateDINPUTJoystickState_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);
1011 if (result != DI_OK) {
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) {
JoyStick_DeviceData * SYS_Joystick
int SDL_PrivateJoystickHat(SDL_Joystick *joystick, Uint8 hat, Uint8 value)
#define DIRECTINPUT_VERSION
#define SDL_HARDWARE_BUS_USB
struct JoyStick_DeviceData * pNext
SDL_bool SDL_ShouldIgnoreJoystick(const char *name, SDL_JoystickGUID guid)
int SDL_PrivateJoystickButton(SDL_Joystick *joystick, Uint8 button, Uint8 state)
int SDL_PrivateJoystickAxis(SDL_Joystick *joystick, Uint8 axis, Sint16 value)
#define SDL_HARDWARE_BUS_BLUETOOTH
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
#define SDL_JOYSTICK_AXIS_MIN
#define SDL_JOYSTICK_AXIS_MAX
HRESULT WIN_CoInitialize(void)
GLsizei const GLfloat * value
#define WIN_StringToUTF8(S)
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)
void WINDOWS_AddJoystickDevice(JoyStick_DeviceData *device)
#define SDL_OutOfMemory()
void WIN_CoUninitialize(void)
GLuint GLuint GLsizei GLenum type
#define SDL_arraysize(array)
DIDEVICEINSTANCE dxdevice
GLboolean GLboolean GLboolean GLboolean a
SDL_bool HIDAPI_IsDevicePresent(Uint16 vendor_id, Uint16 product_id, Uint16 version)
GLboolean GLboolean GLboolean b
#define FIELD_OFFSET(type, field)
#define SDL_Unsupported()