21 #include "../../SDL_internal.h" 23 #include "../SDL_sysjoystick.h" 25 #if SDL_JOYSTICK_DINPUT 31 #ifndef DIDFT_OPTIONAL 32 #define DIDFT_OPTIONAL 0x80000000 35 #define INPUT_QSIZE 32 36 #define AXIS_MIN -32768 37 #define AXIS_MAX 32767 38 #define JOY_AXIS_THRESHOLD (((AXIS_MAX)-(AXIS_MIN))/100) 41 extern HWND SDL_HelperWindow;
45 static LPDIRECTINPUT8 dinput =
NULL;
46 static PRAWINPUTDEVICELIST SDL_RawDevList =
NULL;
47 static UINT SDL_RawDevListCount = 0;
50 static DIOBJECTDATAFORMAT dfDIJoystick2[] = {
51 { &GUID_XAxis, DIJOFS_X, DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
52 { &GUID_YAxis, DIJOFS_Y, DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
53 { &GUID_ZAxis, DIJOFS_Z, DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
54 { &GUID_RxAxis, DIJOFS_RX, DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
55 { &GUID_RyAxis, DIJOFS_RY, DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
56 { &GUID_RzAxis, DIJOFS_RZ, DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
57 { &GUID_Slider, DIJOFS_SLIDER(0), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
58 { &GUID_Slider, DIJOFS_SLIDER(1), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
59 { &GUID_POV, DIJOFS_POV(0), DIDFT_OPTIONAL | DIDFT_POV | DIDFT_ANYINSTANCE, 0 },
60 { &GUID_POV, DIJOFS_POV(1), DIDFT_OPTIONAL | DIDFT_POV | DIDFT_ANYINSTANCE, 0 },
61 { &GUID_POV, DIJOFS_POV(2), DIDFT_OPTIONAL | DIDFT_POV | DIDFT_ANYINSTANCE, 0 },
62 { &GUID_POV, DIJOFS_POV(3), DIDFT_OPTIONAL | DIDFT_POV | DIDFT_ANYINSTANCE, 0 },
63 {
NULL, DIJOFS_BUTTON(0), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
64 {
NULL, DIJOFS_BUTTON(1), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
65 {
NULL, DIJOFS_BUTTON(2), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
66 {
NULL, DIJOFS_BUTTON(3), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
67 {
NULL, DIJOFS_BUTTON(4), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
68 {
NULL, DIJOFS_BUTTON(5), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
69 {
NULL, DIJOFS_BUTTON(6), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
70 {
NULL, DIJOFS_BUTTON(7), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
71 {
NULL, DIJOFS_BUTTON(8), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
72 {
NULL, DIJOFS_BUTTON(9), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
73 {
NULL, DIJOFS_BUTTON(10), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
74 {
NULL, DIJOFS_BUTTON(11), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
75 {
NULL, DIJOFS_BUTTON(12), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
76 {
NULL, DIJOFS_BUTTON(13), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
77 {
NULL, DIJOFS_BUTTON(14), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
78 {
NULL, DIJOFS_BUTTON(15), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
79 {
NULL, DIJOFS_BUTTON(16), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
80 {
NULL, DIJOFS_BUTTON(17), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
81 {
NULL, DIJOFS_BUTTON(18), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
82 {
NULL, DIJOFS_BUTTON(19), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
83 {
NULL, DIJOFS_BUTTON(20), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
84 {
NULL, DIJOFS_BUTTON(21), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
85 {
NULL, DIJOFS_BUTTON(22), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
86 {
NULL, DIJOFS_BUTTON(23), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
87 {
NULL, DIJOFS_BUTTON(24), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
88 {
NULL, DIJOFS_BUTTON(25), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
89 {
NULL, DIJOFS_BUTTON(26), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
90 {
NULL, DIJOFS_BUTTON(27), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
91 {
NULL, DIJOFS_BUTTON(28), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
92 {
NULL, DIJOFS_BUTTON(29), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
93 {
NULL, DIJOFS_BUTTON(30), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
94 {
NULL, DIJOFS_BUTTON(31), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
95 {
NULL, DIJOFS_BUTTON(32), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
96 {
NULL, DIJOFS_BUTTON(33), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
97 {
NULL, DIJOFS_BUTTON(34), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
98 {
NULL, DIJOFS_BUTTON(35), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
99 {
NULL, DIJOFS_BUTTON(36), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
100 {
NULL, DIJOFS_BUTTON(37), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
101 {
NULL, DIJOFS_BUTTON(38), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
102 {
NULL, DIJOFS_BUTTON(39), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
103 {
NULL, DIJOFS_BUTTON(40), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
104 {
NULL, DIJOFS_BUTTON(41), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
105 {
NULL, DIJOFS_BUTTON(42), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
106 {
NULL, DIJOFS_BUTTON(43), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
107 {
NULL, DIJOFS_BUTTON(44), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
108 {
NULL, DIJOFS_BUTTON(45), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
109 {
NULL, DIJOFS_BUTTON(46), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
110 {
NULL, DIJOFS_BUTTON(47), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
111 {
NULL, DIJOFS_BUTTON(48), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
112 {
NULL, DIJOFS_BUTTON(49), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
113 {
NULL, DIJOFS_BUTTON(50), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
114 {
NULL, DIJOFS_BUTTON(51), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
115 {
NULL, DIJOFS_BUTTON(52), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
116 {
NULL, DIJOFS_BUTTON(53), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
117 {
NULL, DIJOFS_BUTTON(54), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
118 {
NULL, DIJOFS_BUTTON(55), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
119 {
NULL, DIJOFS_BUTTON(56), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
120 {
NULL, DIJOFS_BUTTON(57), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
121 {
NULL, DIJOFS_BUTTON(58), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
122 {
NULL, DIJOFS_BUTTON(59), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
123 {
NULL, DIJOFS_BUTTON(60), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
124 {
NULL, DIJOFS_BUTTON(61), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
125 {
NULL, DIJOFS_BUTTON(62), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
126 {
NULL, DIJOFS_BUTTON(63), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
127 {
NULL, DIJOFS_BUTTON(64), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
128 {
NULL, DIJOFS_BUTTON(65), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
129 {
NULL, DIJOFS_BUTTON(66), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
130 {
NULL, DIJOFS_BUTTON(67), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
131 {
NULL, DIJOFS_BUTTON(68), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
132 {
NULL, DIJOFS_BUTTON(69), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
133 {
NULL, DIJOFS_BUTTON(70), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
134 {
NULL, DIJOFS_BUTTON(71), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
135 {
NULL, DIJOFS_BUTTON(72), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
136 {
NULL, DIJOFS_BUTTON(73), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
137 {
NULL, DIJOFS_BUTTON(74), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
138 {
NULL, DIJOFS_BUTTON(75), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
139 {
NULL, DIJOFS_BUTTON(76), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
140 {
NULL, DIJOFS_BUTTON(77), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
141 {
NULL, DIJOFS_BUTTON(78), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
142 {
NULL, DIJOFS_BUTTON(79), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
143 {
NULL, DIJOFS_BUTTON(80), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
144 {
NULL, DIJOFS_BUTTON(81), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
145 {
NULL, DIJOFS_BUTTON(82), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
146 {
NULL, DIJOFS_BUTTON(83), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
147 {
NULL, DIJOFS_BUTTON(84), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
148 {
NULL, DIJOFS_BUTTON(85), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
149 {
NULL, DIJOFS_BUTTON(86), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
150 {
NULL, DIJOFS_BUTTON(87), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
151 {
NULL, DIJOFS_BUTTON(88), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
152 {
NULL, DIJOFS_BUTTON(89), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
153 {
NULL, DIJOFS_BUTTON(90), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
154 {
NULL, DIJOFS_BUTTON(91), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
155 {
NULL, DIJOFS_BUTTON(92), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
156 {
NULL, DIJOFS_BUTTON(93), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
157 {
NULL, DIJOFS_BUTTON(94), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
158 {
NULL, DIJOFS_BUTTON(95), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
159 {
NULL, DIJOFS_BUTTON(96), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
160 {
NULL, DIJOFS_BUTTON(97), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
161 {
NULL, DIJOFS_BUTTON(98), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
162 {
NULL, DIJOFS_BUTTON(99), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
163 {
NULL, DIJOFS_BUTTON(100), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
164 {
NULL, DIJOFS_BUTTON(101), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
165 {
NULL, DIJOFS_BUTTON(102), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
166 {
NULL, DIJOFS_BUTTON(103), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
167 {
NULL, DIJOFS_BUTTON(104), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
168 {
NULL, DIJOFS_BUTTON(105), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
169 {
NULL, DIJOFS_BUTTON(106), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
170 {
NULL, DIJOFS_BUTTON(107), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
171 {
NULL, DIJOFS_BUTTON(108), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
172 {
NULL, DIJOFS_BUTTON(109), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
173 {
NULL, DIJOFS_BUTTON(110), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
174 {
NULL, DIJOFS_BUTTON(111), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
175 {
NULL, DIJOFS_BUTTON(112), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
176 {
NULL, DIJOFS_BUTTON(113), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
177 {
NULL, DIJOFS_BUTTON(114), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
178 {
NULL, DIJOFS_BUTTON(115), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
179 {
NULL, DIJOFS_BUTTON(116), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
180 {
NULL, DIJOFS_BUTTON(117), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
181 {
NULL, DIJOFS_BUTTON(118), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
182 {
NULL, DIJOFS_BUTTON(119), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
183 {
NULL, DIJOFS_BUTTON(120), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
184 {
NULL, DIJOFS_BUTTON(121), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
185 {
NULL, DIJOFS_BUTTON(122), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
186 {
NULL, DIJOFS_BUTTON(123), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
187 {
NULL, DIJOFS_BUTTON(124), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
188 {
NULL, DIJOFS_BUTTON(125), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
189 {
NULL, DIJOFS_BUTTON(126), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
190 {
NULL, DIJOFS_BUTTON(127), DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },
191 { &GUID_XAxis,
FIELD_OFFSET(DIJOYSTATE2, lVX), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
192 { &GUID_YAxis,
FIELD_OFFSET(DIJOYSTATE2, lVY), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
193 { &GUID_ZAxis,
FIELD_OFFSET(DIJOYSTATE2, lVZ), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
194 { &GUID_RxAxis,
FIELD_OFFSET(DIJOYSTATE2, lVRx), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
195 { &GUID_RyAxis,
FIELD_OFFSET(DIJOYSTATE2, lVRy), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
196 { &GUID_RzAxis,
FIELD_OFFSET(DIJOYSTATE2, lVRz), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
197 { &GUID_Slider,
FIELD_OFFSET(DIJOYSTATE2, rglVSlider[0]), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
198 { &GUID_Slider,
FIELD_OFFSET(DIJOYSTATE2, rglVSlider[1]), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
199 { &GUID_XAxis,
FIELD_OFFSET(DIJOYSTATE2, lAX), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
200 { &GUID_YAxis,
FIELD_OFFSET(DIJOYSTATE2, lAY), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
201 { &GUID_ZAxis,
FIELD_OFFSET(DIJOYSTATE2, lAZ), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
202 { &GUID_RxAxis,
FIELD_OFFSET(DIJOYSTATE2, lARx), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
203 { &GUID_RyAxis,
FIELD_OFFSET(DIJOYSTATE2, lARy), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
204 { &GUID_RzAxis,
FIELD_OFFSET(DIJOYSTATE2, lARz), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
205 { &GUID_Slider,
FIELD_OFFSET(DIJOYSTATE2, rglASlider[0]), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
206 { &GUID_Slider,
FIELD_OFFSET(DIJOYSTATE2, rglASlider[1]), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
207 { &GUID_XAxis,
FIELD_OFFSET(DIJOYSTATE2, lFX), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
208 { &GUID_YAxis,
FIELD_OFFSET(DIJOYSTATE2, lFY), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
209 { &GUID_ZAxis,
FIELD_OFFSET(DIJOYSTATE2, lFZ), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
210 { &GUID_RxAxis,
FIELD_OFFSET(DIJOYSTATE2, lFRx), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
211 { &GUID_RyAxis,
FIELD_OFFSET(DIJOYSTATE2, lFRy), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
212 { &GUID_RzAxis,
FIELD_OFFSET(DIJOYSTATE2, lFRz), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
213 { &GUID_Slider,
FIELD_OFFSET(DIJOYSTATE2, rglFSlider[0]), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
214 { &GUID_Slider,
FIELD_OFFSET(DIJOYSTATE2, rglFSlider[1]), DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },
217 const DIDATAFORMAT c_dfDIJoystick2 = {
218 sizeof(DIDATAFORMAT),
219 sizeof(DIOBJECTDATAFORMAT),
228 SetDIerror(
const char *
function, HRESULT code)
234 return SDL_SetError(
"%s() DirectX error 0x%8.8lx",
function, code);
238 SDL_IsXInputDevice(
const GUID* pGuidProductFromDirectInput)
240 static GUID IID_ValveStreamingGamepad = { MAKELONG(0x28DE, 0x11FF), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
241 static GUID IID_X360WiredGamepad = { MAKELONG(0x045E, 0x02A1), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
242 static GUID IID_X360WirelessGamepad = { MAKELONG(0x045E, 0x028E), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
244 static const GUID *s_XInputProductGUID[] = {
245 &IID_ValveStreamingGamepad,
246 &IID_X360WiredGamepad,
247 &IID_X360WirelessGamepad
259 for (iDevice = 0; iDevice <
SDL_arraysize(s_XInputProductGUID); ++iDevice) {
260 if (
SDL_memcmp(pGuidProductFromDirectInput, s_XInputProductGUID[iDevice],
sizeof(GUID)) == 0) {
267 if (SDL_RawDevList ==
NULL) {
268 if ((GetRawInputDeviceList(
NULL, &SDL_RawDevListCount,
sizeof(RAWINPUTDEVICELIST)) == -1) || (!SDL_RawDevListCount)) {
272 SDL_RawDevList = (PRAWINPUTDEVICELIST)
SDL_malloc(
sizeof(RAWINPUTDEVICELIST) * SDL_RawDevListCount);
273 if (SDL_RawDevList ==
NULL) {
278 if (GetRawInputDeviceList(SDL_RawDevList, &SDL_RawDevListCount,
sizeof(RAWINPUTDEVICELIST)) == -1) {
280 SDL_RawDevList =
NULL;
285 for (i = 0; i < SDL_RawDevListCount; i++) {
288 UINT rdiSize =
sizeof(rdi);
291 rdi.cbSize =
sizeof(rdi);
292 if ((SDL_RawDevList[i].dwType == RIM_TYPEHID) &&
293 (GetRawInputDeviceInfoA(SDL_RawDevList[i].hDevice, RIDI_DEVICEINFO, &rdi, &rdiSize) != ((UINT)-1)) &&
294 (MAKELONG(rdi.hid.dwVendorId, rdi.hid.dwProductId) == ((LONG)pGuidProductFromDirectInput->Data1)) &&
295 (GetRawInputDeviceInfoA(SDL_RawDevList[i].hDevice, RIDI_DEVICENAME, devName, &nameSize) != ((UINT)-1)) &&
312 return SetDIerror(
"CoInitialize", result);
317 result = CoCreateInstance(&CLSID_DirectInput8,
NULL, CLSCTX_INPROC_SERVER,
318 &IID_IDirectInput8, (LPVOID)&dinput);
321 return SetDIerror(
"CoCreateInstance", result);
325 instance = GetModuleHandle(
NULL);
326 if (instance ==
NULL) {
327 return SDL_SetError(
"GetModuleHandle() failed with error code %lu.", GetLastError());
332 return SetDIerror(
"IDirectInput::Initialize", result);
339 EnumJoysticksCallback(
const DIDEVICEINSTANCE * pdidInstance, VOID * pContext)
343 const DWORD devtype = (pdidInstance->dwDevType & 0xFF);
345 if (devtype == DI8DEVTYPE_SUPPLEMENTAL) {
346 return DIENUM_CONTINUE;
349 if (SDL_IsXInputDevice(&pdidInstance->guidProduct)) {
350 return DIENUM_CONTINUE;
354 while (pNewJoystick) {
355 if (!
SDL_memcmp(&pNewJoystick->
dxdevice.guidInstance, &pdidInstance->guidInstance,
sizeof(pNewJoystick->
dxdevice.guidInstance))) {
359 }
else if (pPrevJoystick) {
366 return DIENUM_CONTINUE;
369 pPrevJoystick = pNewJoystick;
370 pNewJoystick = pNewJoystick->
pNext;
375 return DIENUM_CONTINUE;
382 return DIENUM_CONTINUE;
388 SDL_memcpy(&pNewJoystick->
guid, &pdidInstance->guidProduct,
sizeof(pNewJoystick->
guid));
391 return DIENUM_CONTINUE;
397 IDirectInput8_EnumDevices(dinput, DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback, pContext, DIEDFL_ATTACHEDONLY);
399 if (SDL_RawDevList) {
401 SDL_RawDevList =
NULL;
403 SDL_RawDevListCount = 0;
407 EnumDevObjectsCallback(LPCDIDEVICEOBJECTINSTANCE dev, LPVOID pvRef)
409 SDL_Joystick *joystick = (SDL_Joystick *)pvRef;
411 input_t *
in = &joystick->hwdata->Inputs[joystick->hwdata->NumInputs];
413 if (dev->dwType & DIDFT_BUTTON) {
415 in->
num = joystick->nbuttons;
416 in->
ofs = DIJOFS_BUTTON(in->
num);
417 joystick->nbuttons++;
418 }
else if (dev->dwType & DIDFT_POV) {
420 in->
num = joystick->nhats;
421 in->
ofs = DIJOFS_POV(in->
num);
423 }
else if (dev->dwType & DIDFT_AXIS) {
428 in->
num = joystick->naxes;
429 if (!
SDL_memcmp(&dev->guidType, &GUID_XAxis,
sizeof(dev->guidType)))
431 else if (!
SDL_memcmp(&dev->guidType, &GUID_YAxis,
sizeof(dev->guidType)))
433 else if (!
SDL_memcmp(&dev->guidType, &GUID_ZAxis,
sizeof(dev->guidType)))
435 else if (!
SDL_memcmp(&dev->guidType, &GUID_RxAxis,
sizeof(dev->guidType)))
437 else if (!
SDL_memcmp(&dev->guidType, &GUID_RyAxis,
sizeof(dev->guidType)))
439 else if (!
SDL_memcmp(&dev->guidType, &GUID_RzAxis,
sizeof(dev->guidType)))
441 else if (!
SDL_memcmp(&dev->guidType, &GUID_Slider,
sizeof(dev->guidType))) {
442 in->
ofs = DIJOFS_SLIDER(joystick->hwdata->NumSliders);
443 ++joystick->hwdata->NumSliders;
445 return DIENUM_CONTINUE;
448 diprg.diph.dwSize =
sizeof(diprg);
449 diprg.diph.dwHeaderSize =
sizeof(diprg.diph);
450 diprg.diph.dwObj = dev->dwType;
451 diprg.diph.dwHow = DIPH_BYID;
452 diprg.lMin = AXIS_MIN;
453 diprg.lMax = AXIS_MAX;
456 IDirectInputDevice8_SetProperty(joystick->hwdata->InputDevice,
457 DIPROP_RANGE, &diprg.diph);
459 return DIENUM_CONTINUE;
463 dilong.diph.dwSize =
sizeof(dilong);
464 dilong.diph.dwHeaderSize =
sizeof(dilong.diph);
465 dilong.diph.dwObj = dev->dwType;
466 dilong.diph.dwHow = DIPH_BYID;
469 IDirectInputDevice8_SetProperty(joystick->hwdata->InputDevice,
470 DIPROP_DEADZONE, &dilong.diph);
472 return DIENUM_CONTINUE;
478 return DIENUM_CONTINUE;
481 joystick->hwdata->NumInputs++;
483 if (joystick->hwdata->NumInputs ==
MAX_INPUTS) {
487 return DIENUM_CONTINUE;
494 SortDevFunc(
const void *
a,
const void *
b)
499 if (inputA->
ofs < inputB->
ofs)
501 if (inputA->
ofs > inputB->
ofs)
508 SortDevObjects(SDL_Joystick *joystick)
510 input_t *inputs = joystick->hwdata->Inputs;
516 SDL_qsort(inputs, joystick->hwdata->NumInputs,
sizeof(
input_t), SortDevFunc);
518 for (n = 0; n < joystick->hwdata->NumInputs; n++) {
519 switch (inputs[n].
type) {
521 inputs[
n].
num = nButtons;
526 inputs[
n].
num = nHats;
531 inputs[
n].
num = nAxis;
542 LPDIRECTINPUTDEVICE8 device;
545 joystick->hwdata->buffered =
SDL_TRUE;
546 joystick->hwdata->Capabilities.dwSize =
sizeof(DIDEVCAPS);
549 dipdw.diph.dwSize =
sizeof(DIPROPDWORD);
550 dipdw.diph.dwHeaderSize =
sizeof(DIPROPHEADER);
553 IDirectInput8_CreateDevice(dinput,
554 &(joystickdevice->
dxdevice.guidInstance), &device,
NULL);
556 return SetDIerror(
"IDirectInput::CreateDevice", result);
560 result = IDirectInputDevice8_QueryInterface(device,
561 &IID_IDirectInputDevice8,
562 (LPVOID *)& joystick->
565 IDirectInputDevice8_Release(device);
568 return SetDIerror(
"IDirectInputDevice8::QueryInterface", result);
574 IDirectInputDevice8_SetCooperativeLevel(joystick->hwdata->
575 InputDevice, SDL_HelperWindow,
579 return SetDIerror(
"IDirectInputDevice8::SetCooperativeLevel", result);
584 IDirectInputDevice8_SetDataFormat(joystick->hwdata->InputDevice,
587 return SetDIerror(
"IDirectInputDevice8::SetDataFormat", result);
592 IDirectInputDevice8_GetCapabilities(joystick->hwdata->InputDevice,
593 &joystick->hwdata->Capabilities);
595 return SetDIerror(
"IDirectInputDevice8::GetCapabilities", result);
599 if (joystick->hwdata->Capabilities.dwFlags & DIDC_FORCEFEEDBACK) {
601 result = IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
603 return SetDIerror(
"IDirectInputDevice8::Acquire", result);
608 IDirectInputDevice8_SendForceFeedbackCommand(joystick->hwdata->
618 result = IDirectInputDevice8_Unacquire(joystick->hwdata->InputDevice);
621 return SetDIerror(
"IDirectInputDevice8::Unacquire", result);
626 dipdw.diph.dwObj = 0;
627 dipdw.diph.dwHow = DIPH_DEVICE;
628 dipdw.dwData = DIPROPAUTOCENTER_ON;
631 IDirectInputDevice8_SetProperty(joystick->hwdata->InputDevice,
632 DIPROP_AUTOCENTER, &dipdw.diph);
642 IDirectInputDevice8_EnumObjects(joystick->hwdata->InputDevice,
643 EnumDevObjectsCallback, joystick,
644 DIDFT_BUTTON | DIDFT_AXIS | DIDFT_POV);
648 SortDevObjects(joystick);
650 dipdw.diph.dwObj = 0;
651 dipdw.diph.dwHow = DIPH_DEVICE;
652 dipdw.dwData = INPUT_QSIZE;
656 IDirectInputDevice8_SetProperty(joystick->hwdata->InputDevice,
657 DIPROP_BUFFERSIZE, &dipdw.diph);
659 if (result == DI_POLLEDDEVICE) {
663 }
else if (
FAILED(result)) {
664 return SetDIerror(
"IDirectInputDevice8::SetProperty", result);
670 TranslatePOV(DWORD
value)
672 const int HAT_VALS[] = {
683 if (LOWORD(value) == 0xFFFF)
694 return HAT_VALS[
value];
698 UpdateDINPUTJoystickState_Buffered(SDL_Joystick * joystick)
703 DIDEVICEOBJECTDATA evtbuf[INPUT_QSIZE];
705 numevents = INPUT_QSIZE;
707 IDirectInputDevice8_GetDeviceData(joystick->hwdata->InputDevice,
708 sizeof(DIDEVICEOBJECTDATA), evtbuf,
710 if (result == DIERR_INPUTLOST || result == DIERR_NOTACQUIRED) {
711 IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
713 IDirectInputDevice8_GetDeviceData(joystick->hwdata->InputDevice,
714 sizeof(DIDEVICEOBJECTDATA),
715 evtbuf, &numevents, 0);
720 joystick->hwdata->send_remove_event =
SDL_TRUE;
721 joystick->hwdata->removed =
SDL_TRUE;
725 for (i = 0; i < (int)numevents; ++
i) {
728 for (j = 0; j < joystick->hwdata->NumInputs; ++
j) {
729 const input_t *in = &joystick->hwdata->Inputs[
j];
731 if (evtbuf[i].dwOfs != in->
ofs)
744 Uint8 pos = TranslatePOV(evtbuf[i].dwData);
759 UpdateDINPUTJoystickState_Polled(SDL_Joystick * joystick)
766 IDirectInputDevice8_GetDeviceState(joystick->hwdata->InputDevice,
767 sizeof(DIJOYSTATE2), &state);
768 if (result == DIERR_INPUTLOST || result == DIERR_NOTACQUIRED) {
769 IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
771 IDirectInputDevice8_GetDeviceState(joystick->hwdata->InputDevice,
772 sizeof(DIJOYSTATE2), &state);
775 if (result != DI_OK) {
776 joystick->hwdata->send_remove_event =
SDL_TRUE;
777 joystick->hwdata->removed =
SDL_TRUE;
782 for (i = 0; i < joystick->hwdata->NumInputs; ++
i) {
783 const input_t *in = &joystick->hwdata->Inputs[
i];
806 case DIJOFS_SLIDER(0):
809 case DIJOFS_SLIDER(1):
821 Uint8 pos = TranslatePOV(state.rgdwPOV[in->
ofs - DIJOFS_POV(0)]);
834 result = IDirectInputDevice8_Poll(joystick->hwdata->InputDevice);
835 if (result == DIERR_INPUTLOST || result == DIERR_NOTACQUIRED) {
836 IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
837 IDirectInputDevice8_Poll(joystick->hwdata->InputDevice);
840 if (joystick->hwdata->buffered) {
841 UpdateDINPUTJoystickState_Buffered(joystick);
843 UpdateDINPUTJoystickState_Polled(joystick);
850 IDirectInputDevice8_Unacquire(joystick->hwdata->InputDevice);
851 IDirectInputDevice8_Release(joystick->hwdata->InputDevice);
857 if (dinput !=
NULL) {
858 IDirectInput8_Release(dinput);
JoyStick_DeviceData * SYS_Joystick
int SDL_PrivateJoystickHat(SDL_Joystick *joystick, Uint8 hat, Uint8 value)
#define DIRECTINPUT_VERSION
struct JoyStick_DeviceData * pNext
void SDL_SYS_AddJoystickDevice(JoyStick_DeviceData *device)
int SDL_PrivateJoystickButton(SDL_Joystick *joystick, Uint8 button, Uint8 state)
int SDL_PrivateJoystickAxis(SDL_Joystick *joystick, Uint8 axis, Sint16 value)
struct joystick_hwdata * hwdata
GLuint GLuint GLsizei GLenum type
GLsizei const GLfloat * value
HRESULT WIN_CoInitialize(void)
uint8_t Uint8
An unsigned 8-bit integer type.
#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 in i)
#define SDL_OutOfMemory()
void WIN_CoUninitialize(void)
#define SDL_arraysize(array)
DIDEVICEINSTANCE dxdevice
GLboolean GLboolean GLboolean GLboolean a
GLboolean GLboolean GLboolean b
#define FIELD_OFFSET(type, field)
#define SDL_Unsupported()
int16_t Sint16
A signed 16-bit integer type.
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)