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)
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp *numpix else pixst endif endm macro pixld1_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl else error unsupported endif endm macro pixld2_s mem_operand if mov asr add asl add asl mov asr sub UNIT_X add asl mov asr add asl add asl mov asr add UNIT_X add asl else pixld1_s mem_operand pixld1_s mem_operand endif endm macro pixld0_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl endif endm macro pixld_s_internal mem_operand if mem_operand pixld2_s mem_operand pixdeinterleave basereg elseif mem_operand elseif mem_operand elseif mem_operand elseif mem_operand pixld0_s mem_operand else pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else error unsupported mem_operand if bpp mem_operand endif endm macro vuzp8 reg2 vuzp d d ®2 endm macro vzip8 reg2 vzip d d ®2 endm macro pixdeinterleave basereg basereg basereg basereg basereg endif endm macro pixinterleave basereg basereg basereg basereg basereg endif endm macro PF boost_increment endif if endif PF tst PF addne PF subne PF cmp ORIG_W if endif if endif if endif PF subge ORIG_W PF subges if endif if endif if endif endif endm macro cache_preload_simple endif if dst_r_bpp pld [DST_R, #(PREFETCH_DISTANCE_SIMPLE *dst_r_bpp/8)] endif if mask_bpp pld if[MASK, #(PREFETCH_DISTANCE_SIMPLE *mask_bpp/8)] endif endif endm macro fetch_mask_pixblock pixld mask_basereg pixblock_size MASK endm macro ensure_destination_ptr_alignment process_pixblock_tail_head if beq irp local skip1(dst_w_bpp<=(lowbit *8)) &&((lowbit *8)<(pixblock_size *dst_w_bpp)) .if lowbit< 16 tst DST_R
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
static SDL_AudioDeviceID device
#define SDL_JOYSTICK_AXIS_MIN
#define SDL_JOYSTICK_AXIS_MAX
HRESULT WIN_CoInitialize(void)
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)
GLsizei const GLfloat * value
#define WIN_StringToUTF8(S)
void WINDOWS_AddJoystickDevice(JoyStick_DeviceData *device)
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)
#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()