Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 1 | /* DirectInput |
| 2 | * |
| 3 | * Copyright 1998 Marcus Meissner |
Lionel Ulmer | 629b9fa | 1999-02-09 14:18:21 +0000 | [diff] [blame] | 4 | * Copyright 1998,1999 Lionel Ulmer |
Ove Kaaven | d2d08f0 | 2002-06-14 00:39:44 +0000 | [diff] [blame] | 5 | * Copyright 2000-2002 TransGaming Technologies Inc. |
Lionel Ulmer | 89f8ba2 | 1998-11-06 17:28:22 +0000 | [diff] [blame] | 6 | * |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 7 | * |
| 8 | * This library is free software; you can redistribute it and/or |
| 9 | * modify it under the terms of the GNU Lesser General Public |
| 10 | * License as published by the Free Software Foundation; either |
| 11 | * version 2.1 of the License, or (at your option) any later version. |
| 12 | * |
| 13 | * This library is distributed in the hope that it will be useful, |
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 16 | * Lesser General Public License for more details. |
| 17 | * |
| 18 | * You should have received a copy of the GNU Lesser General Public |
| 19 | * License along with this library; if not, write to the Free Software |
| 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 21 | */ |
| 22 | /* Status: |
| 23 | * |
| 24 | * - Tomb Raider 2 Demo: |
Alexandre Julliard | a11d7b1 | 1998-03-01 20:05:02 +0000 | [diff] [blame] | 25 | * Playable using keyboard only. |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 26 | * - WingCommander Prophecy Demo: |
Alexandre Julliard | a11d7b1 | 1998-03-01 20:05:02 +0000 | [diff] [blame] | 27 | * Doesn't get Input Focus. |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 28 | * |
Lionel Ulmer | 89f8ba2 | 1998-11-06 17:28:22 +0000 | [diff] [blame] | 29 | * - Fallout : works great in X and DGA mode |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 30 | */ |
| 31 | |
| 32 | #include "config.h" |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 33 | #include <assert.h> |
Alexandre Julliard | e37c6e1 | 2003-09-05 23:08:26 +0000 | [diff] [blame] | 34 | #include <stdarg.h> |
James Juran | f4d5fef | 2001-01-26 20:43:40 +0000 | [diff] [blame] | 35 | #include <string.h> |
Alexandre Julliard | bea617b | 2000-08-03 04:22:35 +0000 | [diff] [blame] | 36 | |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 37 | #include "wine/debug.h" |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 38 | #include "wine/unicode.h" |
Alexandre Julliard | e37c6e1 | 2003-09-05 23:08:26 +0000 | [diff] [blame] | 39 | #include "windef.h" |
Lionel Ulmer | 3b3dc5c | 1999-07-25 11:21:07 +0000 | [diff] [blame] | 40 | #include "winbase.h" |
Arjen Nienhuis | c9654a7 | 2002-05-19 22:26:16 +0000 | [diff] [blame] | 41 | #include "winuser.h" |
Patrik Stridvall | d96e1f1 | 1999-07-04 13:31:03 +0000 | [diff] [blame] | 42 | #include "winerror.h" |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 43 | #include "dinput_private.h" |
Alexandre Julliard | bea617b | 2000-08-03 04:22:35 +0000 | [diff] [blame] | 44 | |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 45 | WINE_DEFAULT_DEBUG_CHANNEL(dinput); |
Patrik Stridvall | b4b9fae | 1999-04-19 14:56:29 +0000 | [diff] [blame] | 46 | |
Alexandre Julliard | 48c4bb3 | 2004-08-12 23:00:51 +0000 | [diff] [blame] | 47 | static IDirectInput7AVtbl ddi7avt; |
| 48 | static IDirectInput7WVtbl ddi7wvt; |
| 49 | static IDirectInput8AVtbl ddi8avt; |
| 50 | static IDirectInput8WVtbl ddi8wvt; |
Francois Gouget | b233fc3 | 1999-02-22 09:52:54 +0000 | [diff] [blame] | 51 | |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 52 | /* This array will be filled a dinput.so loading */ |
Marcus Meissner | c9b3b2e | 2000-12-12 00:38:58 +0000 | [diff] [blame] | 53 | #define MAX_WINE_DINPUT_DEVICES 4 |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 54 | static dinput_device * dinput_devices[MAX_WINE_DINPUT_DEVICES]; |
| 55 | static int nrof_dinput_devices = 0; |
Francois Gouget | b233fc3 | 1999-02-22 09:52:54 +0000 | [diff] [blame] | 56 | |
Alexandre Julliard | 6ed40bb | 2002-12-24 01:18:21 +0000 | [diff] [blame] | 57 | HINSTANCE DINPUT_instance = NULL; |
| 58 | |
Alexandre Julliard | 1e1313d | 2002-11-04 23:53:41 +0000 | [diff] [blame] | 59 | BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserv) |
Arjen Nienhuis | c9654a7 | 2002-05-19 22:26:16 +0000 | [diff] [blame] | 60 | { |
| 61 | switch(reason) |
| 62 | { |
| 63 | case DLL_PROCESS_ATTACH: |
Dmitry Timoshkov | 4e1ef0c | 2003-06-30 20:53:48 +0000 | [diff] [blame] | 64 | DisableThreadLibraryCalls(inst); |
Alexandre Julliard | 6ed40bb | 2002-12-24 01:18:21 +0000 | [diff] [blame] | 65 | DINPUT_instance = inst; |
Arjen Nienhuis | c9654a7 | 2002-05-19 22:26:16 +0000 | [diff] [blame] | 66 | break; |
| 67 | case DLL_PROCESS_DETACH: |
Arjen Nienhuis | c9654a7 | 2002-05-19 22:26:16 +0000 | [diff] [blame] | 68 | break; |
| 69 | } |
| 70 | return TRUE; |
| 71 | } |
| 72 | |
| 73 | |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 74 | /* register a direct draw driver. We better not use malloc for we are in |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 75 | * the ELF startup initialisation at this point. |
Lionel Ulmer | 629b9fa | 1999-02-09 14:18:21 +0000 | [diff] [blame] | 76 | */ |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 77 | void dinput_register_device(dinput_device *device) { |
Marcus Meissner | c9b3b2e | 2000-12-12 00:38:58 +0000 | [diff] [blame] | 78 | int i; |
| 79 | |
| 80 | /* insert according to priority */ |
| 81 | for (i=0;i<nrof_dinput_devices;i++) { |
| 82 | if (dinput_devices[i]->pref <= device->pref) { |
| 83 | memcpy(dinput_devices+i+1,dinput_devices+i,sizeof(dinput_devices[0])*(nrof_dinput_devices-i)); |
| 84 | dinput_devices[i] = device; |
| 85 | break; |
| 86 | } |
| 87 | } |
| 88 | if (i==nrof_dinput_devices) /* not found, or too low priority */ |
| 89 | dinput_devices[nrof_dinput_devices] = device; |
| 90 | |
| 91 | nrof_dinput_devices++; |
Lionel Ulmer | 629b9fa | 1999-02-09 14:18:21 +0000 | [diff] [blame] | 92 | |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 93 | /* increase MAX_DDRAW_DRIVERS if the line below triggers */ |
| 94 | assert(nrof_dinput_devices <= MAX_WINE_DINPUT_DEVICES); |
Lionel Ulmer | 5e6d062 | 2000-02-26 13:15:17 +0000 | [diff] [blame] | 95 | } |
| 96 | |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 97 | /****************************************************************************** |
Patrik Stridvall | 8b216b3 | 2001-06-19 18:20:47 +0000 | [diff] [blame] | 98 | * DirectInputCreateEx (DINPUT.@) |
Marcus Meissner | 4b3afdc | 2000-10-13 23:07:29 +0000 | [diff] [blame] | 99 | */ |
| 100 | HRESULT WINAPI DirectInputCreateEx( |
| 101 | HINSTANCE hinst, DWORD dwVersion, REFIID riid, LPVOID *ppDI, |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 102 | LPUNKNOWN punkOuter) |
| 103 | { |
| 104 | IDirectInputImpl* This; |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 105 | |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 106 | TRACE("(0x%08lx,%04lx,%s,%p,%p)\n", (DWORD)hinst,dwVersion,debugstr_guid(riid),ppDI,punkOuter); |
| 107 | |
Ove Kaaven | d2d08f0 | 2002-06-14 00:39:44 +0000 | [diff] [blame] | 108 | if (IsEqualGUID(&IID_IDirectInputA,riid) || |
| 109 | IsEqualGUID(&IID_IDirectInput2A,riid) || |
| 110 | IsEqualGUID(&IID_IDirectInput7A,riid)) { |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 111 | This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl)); |
Ove Kaaven | d2d08f0 | 2002-06-14 00:39:44 +0000 | [diff] [blame] | 112 | This->lpVtbl = &ddi7avt; |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 113 | This->ref = 1; |
Christian Costa | 77c00c9 | 2003-06-13 18:55:41 +0000 | [diff] [blame] | 114 | This->version = 1; |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 115 | *ppDI = This; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 116 | |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 117 | return DI_OK; |
| 118 | } |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 119 | |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 120 | if (IsEqualGUID(&IID_IDirectInputW,riid) || |
| 121 | IsEqualGUID(&IID_IDirectInput2W,riid) || |
| 122 | IsEqualGUID(&IID_IDirectInput7W,riid)) { |
| 123 | This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl)); |
| 124 | This->lpVtbl = &ddi7wvt; |
| 125 | This->ref = 1; |
| 126 | This->version = 1; |
| 127 | *ppDI = This; |
| 128 | |
| 129 | return DI_OK; |
| 130 | } |
Ove Kaaven | d2d08f0 | 2002-06-14 00:39:44 +0000 | [diff] [blame] | 131 | |
| 132 | if (IsEqualGUID(&IID_IDirectInput8A,riid)) { |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 133 | This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl)); |
Ove Kaaven | d2d08f0 | 2002-06-14 00:39:44 +0000 | [diff] [blame] | 134 | This->lpVtbl = &ddi8avt; |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 135 | This->ref = 1; |
Christian Costa | 77c00c9 | 2003-06-13 18:55:41 +0000 | [diff] [blame] | 136 | This->version = 8; |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 137 | *ppDI = This; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 138 | |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 139 | return DI_OK; |
| 140 | } |
| 141 | |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 142 | if (IsEqualGUID(&IID_IDirectInput8W,riid)) { |
| 143 | This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl)); |
| 144 | This->lpVtbl = &ddi8wvt; |
| 145 | This->ref = 1; |
| 146 | This->version = 8; |
| 147 | *ppDI = This; |
| 148 | |
| 149 | return DI_OK; |
| 150 | } |
| 151 | |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 152 | return DIERR_OLDDIRECTINPUTVERSION; |
Marcus Meissner | 4b3afdc | 2000-10-13 23:07:29 +0000 | [diff] [blame] | 153 | } |
| 154 | |
| 155 | /****************************************************************************** |
Patrik Stridvall | 8b216b3 | 2001-06-19 18:20:47 +0000 | [diff] [blame] | 156 | * DirectInputCreateA (DINPUT.@) |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 157 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 158 | HRESULT WINAPI DirectInputCreateA(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTA *ppDI, LPUNKNOWN punkOuter) |
Francois Gouget | b233fc3 | 1999-02-22 09:52:54 +0000 | [diff] [blame] | 159 | { |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 160 | IDirectInputImpl* This; |
| 161 | TRACE("(0x%08lx,%04lx,%p,%p)\n", (DWORD)hinst,dwVersion,ppDI,punkOuter); |
| 162 | This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl)); |
Ove Kaaven | d2d08f0 | 2002-06-14 00:39:44 +0000 | [diff] [blame] | 163 | This->lpVtbl = &ddi7avt; |
Francois Gouget | b233fc3 | 1999-02-22 09:52:54 +0000 | [diff] [blame] | 164 | This->ref = 1; |
Lionel Ulmer | 4f64069 | 2004-06-04 18:06:37 +0000 | [diff] [blame] | 165 | if (dwVersion >= 0x0800) { |
| 166 | This->version = 8; |
| 167 | } else { |
| 168 | /* We do not differientiate between version 1, 2 and 7 */ |
| 169 | This->version = 1; |
| 170 | } |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 171 | *ppDI = (IDirectInputA*)This; |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 172 | return 0; |
Ove Kaaven | d2d08f0 | 2002-06-14 00:39:44 +0000 | [diff] [blame] | 173 | |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 174 | } |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 175 | |
| 176 | /****************************************************************************** |
| 177 | * DirectInputCreateW (DINPUT.@) |
| 178 | */ |
| 179 | HRESULT WINAPI DirectInputCreateW(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTW *ppDI, LPUNKNOWN punkOuter) |
| 180 | { |
| 181 | IDirectInputImpl* This; |
| 182 | TRACE("(0x%08lx,%04lx,%p,%p)\n", (DWORD)hinst,dwVersion,ppDI,punkOuter); |
| 183 | This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl)); |
| 184 | This->lpVtbl = &ddi7wvt; |
| 185 | This->ref = 1; |
Lionel Ulmer | 4f64069 | 2004-06-04 18:06:37 +0000 | [diff] [blame] | 186 | if (dwVersion >= 0x0800) { |
| 187 | This->version = 8; |
| 188 | } else { |
| 189 | /* We do not differientiate between version 1, 2 and 7 */ |
| 190 | This->version = 1; |
| 191 | } |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 192 | *ppDI = (IDirectInputW*)This; |
| 193 | return 0; |
Lionel Ulmer | 4f64069 | 2004-06-04 18:06:37 +0000 | [diff] [blame] | 194 | } |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 195 | |
Lionel Ulmer | 4f64069 | 2004-06-04 18:06:37 +0000 | [diff] [blame] | 196 | static char *_dump_DIDEVTYPE_value(DWORD dwDevType) { |
| 197 | switch (dwDevType) { |
| 198 | case 0: return "All devices"; |
| 199 | case DIDEVTYPE_MOUSE: return "DIDEVTYPE_MOUSE"; |
| 200 | case DIDEVTYPE_KEYBOARD: return "DIDEVTYPE_KEYBOARD"; |
| 201 | case DIDEVTYPE_JOYSTICK: return "DIDEVTYPE_JOYSTICK"; |
| 202 | case DIDEVTYPE_DEVICE: return "DIDEVTYPE_DEVICE"; |
| 203 | default: return "Unkown"; |
| 204 | } |
| 205 | } |
| 206 | |
| 207 | static void _dump_EnumDevices_dwFlags(DWORD dwFlags) { |
| 208 | if (TRACE_ON(dinput)) { |
Hans Leidekker | fe442b2 | 2004-09-08 01:23:57 +0000 | [diff] [blame] | 209 | unsigned int i; |
Lionel Ulmer | 4f64069 | 2004-06-04 18:06:37 +0000 | [diff] [blame] | 210 | static const struct { |
| 211 | DWORD mask; |
| 212 | const char *name; |
| 213 | } flags[] = { |
| 214 | #define FE(x) { x, #x} |
| 215 | FE(DIEDFL_ALLDEVICES), |
| 216 | FE(DIEDFL_ATTACHEDONLY), |
| 217 | FE(DIEDFL_FORCEFEEDBACK), |
| 218 | FE(DIEDFL_INCLUDEALIASES), |
| 219 | FE(DIEDFL_INCLUDEPHANTOMS) |
| 220 | #undef FE |
| 221 | }; |
| 222 | if (dwFlags == 0) { |
| 223 | DPRINTF("DIEDFL_ALLDEVICES"); |
| 224 | return; |
| 225 | } |
| 226 | for (i = 0; i < (sizeof(flags) / sizeof(flags[0])); i++) |
| 227 | if (flags[i].mask & dwFlags) |
| 228 | DPRINTF("%s ",flags[i].name); |
| 229 | } |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 230 | } |
| 231 | |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 232 | /****************************************************************************** |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 233 | * IDirectInputA_EnumDevices |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 234 | */ |
Francois Gouget | b233fc3 | 1999-02-22 09:52:54 +0000 | [diff] [blame] | 235 | static HRESULT WINAPI IDirectInputAImpl_EnumDevices( |
Alexandre Julliard | e81843b | 2001-01-28 23:14:25 +0000 | [diff] [blame] | 236 | LPDIRECTINPUT7A iface, DWORD dwDevType, LPDIENUMDEVICESCALLBACKA lpCallback, |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 237 | LPVOID pvRef, DWORD dwFlags) |
Francois Gouget | b233fc3 | 1999-02-22 09:52:54 +0000 | [diff] [blame] | 238 | { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 239 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Lionel Ulmer | 4f64069 | 2004-06-04 18:06:37 +0000 | [diff] [blame] | 240 | DIDEVICEINSTANCEA devInstance; |
Robert Reif | 76447ec | 2004-09-13 19:16:47 +0000 | [diff] [blame] | 241 | int i, j, r; |
Lionel Ulmer | 4f64069 | 2004-06-04 18:06:37 +0000 | [diff] [blame] | 242 | |
| 243 | TRACE("(this=%p,0x%04lx '%s',%p,%p,%04lx)\n", |
| 244 | This, dwDevType, _dump_DIDEVTYPE_value(dwDevType), |
| 245 | lpCallback, pvRef, dwFlags); |
| 246 | TRACE(" flags: "); _dump_EnumDevices_dwFlags(dwFlags); TRACE("\n"); |
| 247 | |
| 248 | for (i = 0; i < nrof_dinput_devices; i++) { |
Robert Reif | 76447ec | 2004-09-13 19:16:47 +0000 | [diff] [blame] | 249 | for (j = 0, r = -1; r != 0; j++) { |
| 250 | devInstance.dwSize = sizeof(devInstance); |
| 251 | TRACE(" - checking device %d ('%s')\n", i, dinput_devices[i]->name); |
| 252 | if ((r = dinput_devices[i]->enum_deviceA(dwDevType, dwFlags, &devInstance, This->version, j))) { |
| 253 | if (lpCallback(&devInstance,pvRef) == DIENUM_STOP) |
| 254 | return 0; |
| 255 | } |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 256 | } |
Lionel Ulmer | 4f64069 | 2004-06-04 18:06:37 +0000 | [diff] [blame] | 257 | } |
| 258 | |
| 259 | return 0; |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 260 | } |
| 261 | /****************************************************************************** |
| 262 | * IDirectInputW_EnumDevices |
| 263 | */ |
| 264 | static HRESULT WINAPI IDirectInputWImpl_EnumDevices( |
| 265 | LPDIRECTINPUT7W iface, DWORD dwDevType, LPDIENUMDEVICESCALLBACKW lpCallback, |
| 266 | LPVOID pvRef, DWORD dwFlags) |
| 267 | { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 268 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Lionel Ulmer | 4f64069 | 2004-06-04 18:06:37 +0000 | [diff] [blame] | 269 | DIDEVICEINSTANCEW devInstance; |
Robert Reif | 76447ec | 2004-09-13 19:16:47 +0000 | [diff] [blame] | 270 | int i, j, r; |
Lionel Ulmer | 4f64069 | 2004-06-04 18:06:37 +0000 | [diff] [blame] | 271 | |
| 272 | TRACE("(this=%p,0x%04lx '%s',%p,%p,%04lx)\n", |
| 273 | This, dwDevType, _dump_DIDEVTYPE_value(dwDevType), |
| 274 | lpCallback, pvRef, dwFlags); |
| 275 | TRACE(" flags: "); _dump_EnumDevices_dwFlags(dwFlags); TRACE("\n"); |
| 276 | |
| 277 | for (i = 0; i < nrof_dinput_devices; i++) { |
Robert Reif | 76447ec | 2004-09-13 19:16:47 +0000 | [diff] [blame] | 278 | for (j = 0, r = -1; r != 0; j++) { |
| 279 | devInstance.dwSize = sizeof(devInstance); |
| 280 | TRACE(" - checking device %d ('%s')\n", i, dinput_devices[i]->name); |
| 281 | if ((r = dinput_devices[i]->enum_deviceW(dwDevType, dwFlags, &devInstance, This->version, j))) { |
| 282 | if (lpCallback(&devInstance,pvRef) == DIENUM_STOP) |
| 283 | return 0; |
| 284 | } |
Marcus Meissner | bc2ad4a | 1999-07-27 16:08:59 +0000 | [diff] [blame] | 285 | } |
Lionel Ulmer | 4f64069 | 2004-06-04 18:06:37 +0000 | [diff] [blame] | 286 | } |
| 287 | |
| 288 | return 0; |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 289 | } |
| 290 | |
Alexandre Julliard | e81843b | 2001-01-28 23:14:25 +0000 | [diff] [blame] | 291 | static ULONG WINAPI IDirectInputAImpl_AddRef(LPDIRECTINPUT7A iface) |
Francois Gouget | b233fc3 | 1999-02-22 09:52:54 +0000 | [diff] [blame] | 292 | { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 293 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Francois Gouget | b233fc3 | 1999-02-22 09:52:54 +0000 | [diff] [blame] | 294 | return ++(This->ref); |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 295 | } |
| 296 | |
Alexandre Julliard | e81843b | 2001-01-28 23:14:25 +0000 | [diff] [blame] | 297 | static ULONG WINAPI IDirectInputAImpl_Release(LPDIRECTINPUT7A iface) |
Francois Gouget | b233fc3 | 1999-02-22 09:52:54 +0000 | [diff] [blame] | 298 | { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 299 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Francois Gouget | b233fc3 | 1999-02-22 09:52:54 +0000 | [diff] [blame] | 300 | if (!(--This->ref)) { |
| 301 | HeapFree(GetProcessHeap(),0,This); |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 302 | return 0; |
| 303 | } |
Francois Gouget | b233fc3 | 1999-02-22 09:52:54 +0000 | [diff] [blame] | 304 | return This->ref; |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 305 | } |
| 306 | |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 307 | static HRESULT WINAPI IDirectInputAImpl_QueryInterface(LPDIRECTINPUT7A iface, REFIID riid, LPVOID *ppobj) { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 308 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 309 | |
| 310 | TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(riid),ppobj); |
| 311 | if (IsEqualGUID(&IID_IUnknown,riid) || |
| 312 | IsEqualGUID(&IID_IDirectInputA,riid) || |
| 313 | IsEqualGUID(&IID_IDirectInput2A,riid) || |
| 314 | IsEqualGUID(&IID_IDirectInput7A,riid)) { |
| 315 | IDirectInputAImpl_AddRef(iface); |
| 316 | *ppobj = This; |
| 317 | return 0; |
| 318 | } |
| 319 | TRACE("Unsupported interface !\n"); |
| 320 | return E_FAIL; |
| 321 | } |
| 322 | |
| 323 | static HRESULT WINAPI IDirectInputWImpl_QueryInterface(LPDIRECTINPUT7W iface, REFIID riid, LPVOID *ppobj) { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 324 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 325 | |
| 326 | TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(riid),ppobj); |
| 327 | if (IsEqualGUID(&IID_IUnknown,riid) || |
| 328 | IsEqualGUID(&IID_IDirectInputW,riid) || |
| 329 | IsEqualGUID(&IID_IDirectInput2W,riid) || |
| 330 | IsEqualGUID(&IID_IDirectInput7W,riid)) { |
| 331 | IDirectInputAImpl_AddRef((LPDIRECTINPUT7A) iface); |
| 332 | *ppobj = This; |
| 333 | return 0; |
| 334 | } |
| 335 | TRACE("Unsupported interface !\n"); |
| 336 | return E_FAIL; |
| 337 | } |
| 338 | |
Francois Gouget | b233fc3 | 1999-02-22 09:52:54 +0000 | [diff] [blame] | 339 | static HRESULT WINAPI IDirectInputAImpl_CreateDevice( |
Alexandre Julliard | e81843b | 2001-01-28 23:14:25 +0000 | [diff] [blame] | 340 | LPDIRECTINPUT7A iface,REFGUID rguid,LPDIRECTINPUTDEVICEA* pdev, |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 341 | LPUNKNOWN punk |
| 342 | ) { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 343 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 344 | HRESULT ret_value = DIERR_DEVICENOTREG; |
| 345 | int i; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 346 | |
Alexandre Julliard | 681c75b | 2000-01-18 05:09:49 +0000 | [diff] [blame] | 347 | TRACE("(this=%p,%s,%p,%p)\n",This,debugstr_guid(rguid),pdev,punk); |
Lionel Ulmer | 78e8410 | 2000-02-14 19:55:26 +0000 | [diff] [blame] | 348 | |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 349 | /* Loop on all the devices to see if anyone matches the given GUID */ |
| 350 | for (i = 0; i < nrof_dinput_devices; i++) { |
| 351 | HRESULT ret; |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 352 | if ((ret = dinput_devices[i]->create_deviceA(This, rguid, NULL, pdev)) == DI_OK) |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 353 | return DI_OK; |
Lionel Ulmer | 78e8410 | 2000-02-14 19:55:26 +0000 | [diff] [blame] | 354 | |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 355 | if (ret == DIERR_NOINTERFACE) |
| 356 | ret_value = DIERR_NOINTERFACE; |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 357 | } |
Lionel Ulmer | 78e8410 | 2000-02-14 19:55:26 +0000 | [diff] [blame] | 358 | |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 359 | return ret_value; |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 360 | } |
| 361 | |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 362 | static HRESULT WINAPI IDirectInputWImpl_CreateDevice(LPDIRECTINPUT7A iface, |
| 363 | REFGUID rguid, LPDIRECTINPUTDEVICEW* pdev, LPUNKNOWN punk) { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 364 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 365 | HRESULT ret_value = DIERR_DEVICENOTREG; |
| 366 | int i; |
| 367 | |
| 368 | TRACE("(this=%p,%s,%p,%p)\n",This,debugstr_guid(rguid),pdev,punk); |
| 369 | |
| 370 | /* Loop on all the devices to see if anyone matches the given GUID */ |
| 371 | for (i = 0; i < nrof_dinput_devices; i++) { |
| 372 | HRESULT ret; |
| 373 | if ((ret = dinput_devices[i]->create_deviceW(This, rguid, NULL, pdev)) == DI_OK) |
| 374 | return DI_OK; |
| 375 | |
| 376 | if (ret == DIERR_NOINTERFACE) |
| 377 | ret_value = DIERR_NOINTERFACE; |
| 378 | } |
| 379 | |
| 380 | return ret_value; |
| 381 | } |
| 382 | |
| 383 | static HRESULT WINAPI IDirectInputAImpl_Initialize(LPDIRECTINPUT7A iface, HINSTANCE hinst, DWORD x) { |
Alexandre Julliard | a11d7b1 | 1998-03-01 20:05:02 +0000 | [diff] [blame] | 384 | return DIERR_ALREADYINITIALIZED; |
| 385 | } |
| 386 | |
Alexandre Julliard | e81843b | 2001-01-28 23:14:25 +0000 | [diff] [blame] | 387 | static HRESULT WINAPI IDirectInputAImpl_GetDeviceStatus(LPDIRECTINPUT7A iface, |
Lionel Ulmer | 75e8a78 | 1999-02-24 10:53:30 +0000 | [diff] [blame] | 388 | REFGUID rguid) { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 389 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 390 | |
Alexandre Julliard | 681c75b | 2000-01-18 05:09:49 +0000 | [diff] [blame] | 391 | FIXME("(%p)->(%s): stub\n",This,debugstr_guid(rguid)); |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 392 | |
Lionel Ulmer | 75e8a78 | 1999-02-24 10:53:30 +0000 | [diff] [blame] | 393 | return DI_OK; |
| 394 | } |
| 395 | |
Alexandre Julliard | e81843b | 2001-01-28 23:14:25 +0000 | [diff] [blame] | 396 | static HRESULT WINAPI IDirectInputAImpl_RunControlPanel(LPDIRECTINPUT7A iface, |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 397 | HWND hwndOwner, |
Lionel Ulmer | 75e8a78 | 1999-02-24 10:53:30 +0000 | [diff] [blame] | 398 | DWORD dwFlags) { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 399 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 400 | FIXME("(%p)->(%08lx,%08lx): stub\n",This, (DWORD) hwndOwner, dwFlags); |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 401 | |
Lionel Ulmer | 75e8a78 | 1999-02-24 10:53:30 +0000 | [diff] [blame] | 402 | return DI_OK; |
| 403 | } |
| 404 | |
Ove Kaaven | d2d08f0 | 2002-06-14 00:39:44 +0000 | [diff] [blame] | 405 | static HRESULT WINAPI IDirectInput2AImpl_FindDevice(LPDIRECTINPUT7A iface, REFGUID rguid, |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 406 | LPCSTR pszName, LPGUID pguidInstance) { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 407 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 408 | FIXME("(%p)->(%s, %s, %p): stub\n", This, debugstr_guid(rguid), pszName, pguidInstance); |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 409 | |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 410 | return DI_OK; |
| 411 | } |
| 412 | |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 413 | static HRESULT WINAPI IDirectInput2WImpl_FindDevice(LPDIRECTINPUT7W iface, REFGUID rguid, |
| 414 | LPCWSTR pszName, LPGUID pguidInstance) { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 415 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 416 | FIXME("(%p)->(%s, %s, %p): stub\n", This, debugstr_guid(rguid), debugstr_w(pszName), pguidInstance); |
| 417 | |
| 418 | return DI_OK; |
| 419 | } |
| 420 | |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 421 | static HRESULT WINAPI IDirectInput7AImpl_CreateDeviceEx(LPDIRECTINPUT7A iface, REFGUID rguid, |
| 422 | REFIID riid, LPVOID* pvOut, LPUNKNOWN lpUnknownOuter) |
| 423 | { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 424 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 425 | HRESULT ret_value = DIERR_DEVICENOTREG; |
| 426 | int i; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 427 | |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 428 | TRACE("(%p)->(%s, %s, %p, %p)\n", This, debugstr_guid(rguid), debugstr_guid(riid), pvOut, lpUnknownOuter); |
| 429 | |
| 430 | /* Loop on all the devices to see if anyone matches the given GUID */ |
| 431 | for (i = 0; i < nrof_dinput_devices; i++) { |
| 432 | HRESULT ret; |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 433 | if ((ret = dinput_devices[i]->create_deviceA(This, rguid, riid, (LPDIRECTINPUTDEVICEA*) pvOut)) == DI_OK) |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 434 | return DI_OK; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 435 | |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 436 | if (ret == DIERR_NOINTERFACE) |
| 437 | ret_value = DIERR_NOINTERFACE; |
| 438 | } |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 439 | |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 440 | return ret_value; |
| 441 | } |
| 442 | |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 443 | static HRESULT WINAPI IDirectInput7WImpl_CreateDeviceEx(LPDIRECTINPUT7W iface, REFGUID rguid, |
| 444 | REFIID riid, LPVOID* pvOut, LPUNKNOWN lpUnknownOuter) |
| 445 | { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 446 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 447 | HRESULT ret_value = DIERR_DEVICENOTREG; |
| 448 | int i; |
| 449 | |
| 450 | TRACE("(%p)->(%s, %s, %p, %p)\n", This, debugstr_guid(rguid), debugstr_guid(riid), pvOut, lpUnknownOuter); |
| 451 | |
| 452 | /* Loop on all the devices to see if anyone matches the given GUID */ |
| 453 | for (i = 0; i < nrof_dinput_devices; i++) { |
| 454 | HRESULT ret; |
| 455 | if ((ret = dinput_devices[i]->create_deviceW(This, rguid, riid, (LPDIRECTINPUTDEVICEW*) pvOut)) == DI_OK) |
| 456 | return DI_OK; |
| 457 | |
| 458 | if (ret == DIERR_NOINTERFACE) |
| 459 | ret_value = DIERR_NOINTERFACE; |
| 460 | } |
| 461 | |
| 462 | return ret_value; |
| 463 | } |
| 464 | |
| 465 | static HRESULT WINAPI IDirectInput8AImpl_QueryInterface(LPDIRECTINPUT8A iface, REFIID riid, LPVOID *ppobj) { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 466 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Patrik Stridvall | 2344798 | 2001-07-26 21:44:44 +0000 | [diff] [blame] | 467 | |
Ove Kaaven | d2d08f0 | 2002-06-14 00:39:44 +0000 | [diff] [blame] | 468 | TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(riid),ppobj); |
| 469 | if (IsEqualGUID(&IID_IUnknown,riid) || |
| 470 | IsEqualGUID(&IID_IDirectInput8A,riid)) { |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 471 | IDirectInputAImpl_AddRef((LPDIRECTINPUT7A) iface); |
Ove Kaaven | d2d08f0 | 2002-06-14 00:39:44 +0000 | [diff] [blame] | 472 | *ppobj = This; |
| 473 | return 0; |
| 474 | } |
| 475 | TRACE("Unsupported interface !\n"); |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 476 | return E_NOINTERFACE; |
| 477 | } |
| 478 | |
| 479 | static HRESULT WINAPI IDirectInput8WImpl_QueryInterface(LPDIRECTINPUT8W iface, REFIID riid, LPVOID *ppobj) { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 480 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 481 | |
| 482 | TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(riid),ppobj); |
| 483 | if (IsEqualGUID(&IID_IUnknown,riid) || |
| 484 | IsEqualGUID(&IID_IDirectInput8W,riid)) { |
| 485 | IDirectInputAImpl_AddRef((LPDIRECTINPUT7A) iface); |
| 486 | *ppobj = This; |
| 487 | return 0; |
| 488 | } |
| 489 | TRACE("Unsupported interface !\n"); |
| 490 | return E_NOINTERFACE; |
Ove Kaaven | d2d08f0 | 2002-06-14 00:39:44 +0000 | [diff] [blame] | 491 | } |
| 492 | |
| 493 | static HRESULT WINAPI IDirectInput8AImpl_EnumDevicesBySemantics( |
| 494 | LPDIRECTINPUT8A iface, LPCSTR ptszUserName, LPDIACTIONFORMATA lpdiActionFormat, |
| 495 | LPDIENUMDEVICESBYSEMANTICSCBA lpCallback, |
| 496 | LPVOID pvRef, DWORD dwFlags |
| 497 | ) |
Paul Quinn | 2305f3c | 1999-05-22 11:41:38 +0000 | [diff] [blame] | 498 | { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 499 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Ove Kaaven | d2d08f0 | 2002-06-14 00:39:44 +0000 | [diff] [blame] | 500 | |
| 501 | FIXME("(this=%p,%s,%p,%p,%p,%04lx): stub\n", This, ptszUserName, lpdiActionFormat, |
| 502 | lpCallback, pvRef, dwFlags); |
| 503 | return 0; |
| 504 | } |
| 505 | |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 506 | static HRESULT WINAPI IDirectInput8WImpl_EnumDevicesBySemantics( |
| 507 | LPDIRECTINPUT8W iface, LPCWSTR ptszUserName, LPDIACTIONFORMATW lpdiActionFormat, |
| 508 | LPDIENUMDEVICESBYSEMANTICSCBW lpCallback, |
| 509 | LPVOID pvRef, DWORD dwFlags |
| 510 | ) |
| 511 | { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 512 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 513 | |
| 514 | FIXME("(this=%p,%s,%p,%p,%p,%04lx): stub\n", This, debugstr_w(ptszUserName), lpdiActionFormat, |
| 515 | lpCallback, pvRef, dwFlags); |
| 516 | return 0; |
| 517 | } |
| 518 | |
Ove Kaaven | d2d08f0 | 2002-06-14 00:39:44 +0000 | [diff] [blame] | 519 | static HRESULT WINAPI IDirectInput8AImpl_ConfigureDevices( |
| 520 | LPDIRECTINPUT8A iface, LPDICONFIGUREDEVICESCALLBACK lpdiCallback, |
| 521 | LPDICONFIGUREDEVICESPARAMSA lpdiCDParams, DWORD dwFlags, LPVOID pvRefData |
| 522 | ) |
| 523 | { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 524 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 525 | |
| 526 | FIXME("(this=%p,%p,%p,%04lx,%p): stub\n", This, lpdiCallback, lpdiCDParams, |
| 527 | dwFlags, pvRefData); |
| 528 | return 0; |
| 529 | } |
| 530 | |
| 531 | static HRESULT WINAPI IDirectInput8WImpl_ConfigureDevices( |
| 532 | LPDIRECTINPUT8W iface, LPDICONFIGUREDEVICESCALLBACK lpdiCallback, |
| 533 | LPDICONFIGUREDEVICESPARAMSW lpdiCDParams, DWORD dwFlags, LPVOID pvRefData |
| 534 | ) |
| 535 | { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 536 | IDirectInputImpl *This = (IDirectInputImpl *)iface; |
Ove Kaaven | d2d08f0 | 2002-06-14 00:39:44 +0000 | [diff] [blame] | 537 | |
| 538 | FIXME("(this=%p,%p,%p,%04lx,%p): stub\n", This, lpdiCallback, lpdiCDParams, |
| 539 | dwFlags, pvRefData); |
| 540 | return 0; |
| 541 | } |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 542 | |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 543 | #if !defined(__STRICT_ANSI__) && defined(__GNUC__) |
Ove Kaaven | d2d08f0 | 2002-06-14 00:39:44 +0000 | [diff] [blame] | 544 | # define XCAST(fun) (typeof(ddi7avt.fun)) |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 545 | #else |
| 546 | # define XCAST(fun) (void*) |
Lionel Ulmer | 5e6d062 | 2000-02-26 13:15:17 +0000 | [diff] [blame] | 547 | #endif |
| 548 | |
Alexandre Julliard | 48c4bb3 | 2004-08-12 23:00:51 +0000 | [diff] [blame] | 549 | static IDirectInput7AVtbl ddi7avt = { |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 550 | XCAST(QueryInterface)IDirectInputAImpl_QueryInterface, |
| 551 | XCAST(AddRef)IDirectInputAImpl_AddRef, |
| 552 | XCAST(Release)IDirectInputAImpl_Release, |
| 553 | XCAST(CreateDevice)IDirectInputAImpl_CreateDevice, |
| 554 | XCAST(EnumDevices)IDirectInputAImpl_EnumDevices, |
| 555 | XCAST(GetDeviceStatus)IDirectInputAImpl_GetDeviceStatus, |
| 556 | XCAST(RunControlPanel)IDirectInputAImpl_RunControlPanel, |
| 557 | XCAST(Initialize)IDirectInputAImpl_Initialize, |
| 558 | XCAST(FindDevice)IDirectInput2AImpl_FindDevice, |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 559 | XCAST(CreateDeviceEx)IDirectInput7AImpl_CreateDeviceEx |
| 560 | }; |
| 561 | |
| 562 | #undef XCAST |
| 563 | #if !defined(__STRICT_ANSI__) && defined(__GNUC__) |
| 564 | # define XCAST(fun) (typeof(ddi7wvt.fun)) |
| 565 | #else |
| 566 | # define XCAST(fun) (void*) |
| 567 | #endif |
| 568 | |
Alexandre Julliard | 48c4bb3 | 2004-08-12 23:00:51 +0000 | [diff] [blame] | 569 | static IDirectInput7WVtbl ddi7wvt = { |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 570 | XCAST(QueryInterface)IDirectInputWImpl_QueryInterface, |
| 571 | XCAST(AddRef)IDirectInputAImpl_AddRef, |
| 572 | XCAST(Release)IDirectInputAImpl_Release, |
| 573 | XCAST(CreateDevice)IDirectInputWImpl_CreateDevice, |
| 574 | XCAST(EnumDevices)IDirectInputWImpl_EnumDevices, |
| 575 | XCAST(GetDeviceStatus)IDirectInputAImpl_GetDeviceStatus, |
| 576 | XCAST(RunControlPanel)IDirectInputAImpl_RunControlPanel, |
| 577 | XCAST(Initialize)IDirectInputAImpl_Initialize, |
| 578 | XCAST(FindDevice)IDirectInput2WImpl_FindDevice, |
| 579 | XCAST(CreateDeviceEx)IDirectInput7WImpl_CreateDeviceEx |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 580 | }; |
Lionel Ulmer | 6301e94 | 2000-11-05 20:25:02 +0000 | [diff] [blame] | 581 | #undef XCAST |
Patrik Stridvall | 55ef9a5 | 2000-04-24 18:03:54 +0000 | [diff] [blame] | 582 | |
Ove Kaaven | d2d08f0 | 2002-06-14 00:39:44 +0000 | [diff] [blame] | 583 | #if !defined(__STRICT_ANSI__) && defined(__GNUC__) |
| 584 | # define XCAST(fun) (typeof(ddi8avt.fun)) |
| 585 | #else |
| 586 | # define XCAST(fun) (void*) |
| 587 | #endif |
| 588 | |
Alexandre Julliard | 48c4bb3 | 2004-08-12 23:00:51 +0000 | [diff] [blame] | 589 | static IDirectInput8AVtbl ddi8avt = { |
Ove Kaaven | d2d08f0 | 2002-06-14 00:39:44 +0000 | [diff] [blame] | 590 | XCAST(QueryInterface)IDirectInput8AImpl_QueryInterface, |
| 591 | XCAST(AddRef)IDirectInputAImpl_AddRef, |
| 592 | XCAST(Release)IDirectInputAImpl_Release, |
| 593 | XCAST(CreateDevice)IDirectInputAImpl_CreateDevice, |
| 594 | XCAST(EnumDevices)IDirectInputAImpl_EnumDevices, |
| 595 | XCAST(GetDeviceStatus)IDirectInputAImpl_GetDeviceStatus, |
| 596 | XCAST(RunControlPanel)IDirectInputAImpl_RunControlPanel, |
| 597 | XCAST(Initialize)IDirectInputAImpl_Initialize, |
| 598 | XCAST(FindDevice)IDirectInput2AImpl_FindDevice, |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 599 | XCAST(EnumDevicesBySemantics)IDirectInput8AImpl_EnumDevicesBySemantics, |
| 600 | XCAST(ConfigureDevices)IDirectInput8AImpl_ConfigureDevices |
| 601 | }; |
| 602 | #undef XCAST |
| 603 | |
| 604 | #if !defined(__STRICT_ANSI__) && defined(__GNUC__) |
| 605 | # define XCAST(fun) (typeof(ddi8wvt.fun)) |
| 606 | #else |
| 607 | # define XCAST(fun) (void*) |
| 608 | #endif |
Alexandre Julliard | 48c4bb3 | 2004-08-12 23:00:51 +0000 | [diff] [blame] | 609 | static IDirectInput8WVtbl ddi8wvt = { |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 610 | XCAST(QueryInterface)IDirectInput8WImpl_QueryInterface, |
| 611 | XCAST(AddRef)IDirectInputAImpl_AddRef, |
| 612 | XCAST(Release)IDirectInputAImpl_Release, |
| 613 | XCAST(CreateDevice)IDirectInputWImpl_CreateDevice, |
| 614 | XCAST(EnumDevices)IDirectInputWImpl_EnumDevices, |
| 615 | XCAST(GetDeviceStatus)IDirectInputAImpl_GetDeviceStatus, |
| 616 | XCAST(RunControlPanel)IDirectInputAImpl_RunControlPanel, |
| 617 | XCAST(Initialize)IDirectInputAImpl_Initialize, |
| 618 | XCAST(FindDevice)IDirectInput2WImpl_FindDevice, |
| 619 | XCAST(EnumDevicesBySemantics)IDirectInput8WImpl_EnumDevicesBySemantics, |
| 620 | XCAST(ConfigureDevices)IDirectInput8WImpl_ConfigureDevices |
Ove Kaaven | d2d08f0 | 2002-06-14 00:39:44 +0000 | [diff] [blame] | 621 | }; |
| 622 | #undef XCAST |
| 623 | |
Christian Costa | b92a58e | 2003-04-29 22:43:48 +0000 | [diff] [blame] | 624 | /******************************************************************************* |
| 625 | * DirectInput ClassFactory |
| 626 | */ |
| 627 | typedef struct |
| 628 | { |
| 629 | /* IUnknown fields */ |
Alexandre Julliard | 0467ce9 | 2004-08-12 19:52:49 +0000 | [diff] [blame] | 630 | IClassFactoryVtbl *lpVtbl; |
Christian Costa | b92a58e | 2003-04-29 22:43:48 +0000 | [diff] [blame] | 631 | DWORD ref; |
| 632 | } IClassFactoryImpl; |
| 633 | |
| 634 | static HRESULT WINAPI DICF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 635 | IClassFactoryImpl *This = (IClassFactoryImpl *)iface; |
Christian Costa | b92a58e | 2003-04-29 22:43:48 +0000 | [diff] [blame] | 636 | |
| 637 | FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj); |
| 638 | return E_NOINTERFACE; |
| 639 | } |
| 640 | |
| 641 | static ULONG WINAPI DICF_AddRef(LPCLASSFACTORY iface) { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 642 | IClassFactoryImpl *This = (IClassFactoryImpl *)iface; |
Christian Costa | b92a58e | 2003-04-29 22:43:48 +0000 | [diff] [blame] | 643 | return ++(This->ref); |
| 644 | } |
| 645 | |
| 646 | static ULONG WINAPI DICF_Release(LPCLASSFACTORY iface) { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 647 | IClassFactoryImpl *This = (IClassFactoryImpl *)iface; |
Christian Costa | b92a58e | 2003-04-29 22:43:48 +0000 | [diff] [blame] | 648 | /* static class, won't be freed */ |
| 649 | return --(This->ref); |
| 650 | } |
| 651 | |
| 652 | static HRESULT WINAPI DICF_CreateInstance( |
| 653 | LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj |
| 654 | ) { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 655 | IClassFactoryImpl *This = (IClassFactoryImpl *)iface; |
Christian Costa | b92a58e | 2003-04-29 22:43:48 +0000 | [diff] [blame] | 656 | |
| 657 | TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj); |
| 658 | if ( IsEqualGUID( &IID_IDirectInputA, riid ) || |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 659 | IsEqualGUID( &IID_IDirectInputW, riid ) || |
Christian Costa | b92a58e | 2003-04-29 22:43:48 +0000 | [diff] [blame] | 660 | IsEqualGUID( &IID_IDirectInput2A, riid ) || |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 661 | IsEqualGUID( &IID_IDirectInput2W, riid ) || |
Christian Costa | b92a58e | 2003-04-29 22:43:48 +0000 | [diff] [blame] | 662 | IsEqualGUID( &IID_IDirectInput7A, riid ) || |
Raphael Junqueira | c405019 | 2003-06-16 20:22:13 +0000 | [diff] [blame] | 663 | IsEqualGUID( &IID_IDirectInput7W, riid ) || |
| 664 | IsEqualGUID( &IID_IDirectInput8A, riid ) || |
| 665 | IsEqualGUID( &IID_IDirectInput8W, riid ) ) { |
Christian Costa | b92a58e | 2003-04-29 22:43:48 +0000 | [diff] [blame] | 666 | /* FIXME: reuse already created dinput if present? */ |
| 667 | return DirectInputCreateEx(0,0,riid,ppobj,pOuter); |
| 668 | } |
| 669 | |
| 670 | FIXME("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj); |
| 671 | return E_NOINTERFACE; |
| 672 | } |
| 673 | |
| 674 | static HRESULT WINAPI DICF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { |
Alexandre Julliard | 314b99c | 2004-09-09 20:17:07 +0000 | [diff] [blame] | 675 | IClassFactoryImpl *This = (IClassFactoryImpl *)iface; |
Christian Costa | b92a58e | 2003-04-29 22:43:48 +0000 | [diff] [blame] | 676 | FIXME("(%p)->(%d),stub!\n",This,dolock); |
| 677 | return S_OK; |
| 678 | } |
| 679 | |
Alexandre Julliard | 48c4bb3 | 2004-08-12 23:00:51 +0000 | [diff] [blame] | 680 | static IClassFactoryVtbl DICF_Vtbl = { |
Christian Costa | b92a58e | 2003-04-29 22:43:48 +0000 | [diff] [blame] | 681 | DICF_QueryInterface, |
| 682 | DICF_AddRef, |
| 683 | DICF_Release, |
| 684 | DICF_CreateInstance, |
| 685 | DICF_LockServer |
| 686 | }; |
| 687 | static IClassFactoryImpl DINPUT_CF = {&DICF_Vtbl, 1 }; |
| 688 | |
Patrik Stridvall | 55ef9a5 | 2000-04-24 18:03:54 +0000 | [diff] [blame] | 689 | /*********************************************************************** |
| 690 | * DllCanUnloadNow (DINPUT.@) |
| 691 | */ |
| 692 | HRESULT WINAPI DINPUT_DllCanUnloadNow(void) |
| 693 | { |
| 694 | FIXME("(void): stub\n"); |
| 695 | |
| 696 | return S_FALSE; |
| 697 | } |
| 698 | |
| 699 | /*********************************************************************** |
| 700 | * DllGetClassObject (DINPUT.@) |
| 701 | */ |
| 702 | HRESULT WINAPI DINPUT_DllGetClassObject(REFCLSID rclsid, REFIID riid, |
| 703 | LPVOID *ppv) |
| 704 | { |
Christian Costa | b92a58e | 2003-04-29 22:43:48 +0000 | [diff] [blame] | 705 | TRACE("(%p,%p,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); |
| 706 | if ( IsEqualCLSID( &IID_IClassFactory, riid ) ) { |
| 707 | *ppv = (LPVOID)&DINPUT_CF; |
| 708 | IClassFactory_AddRef((IClassFactory*)*ppv); |
| 709 | return S_OK; |
| 710 | } |
Patrik Stridvall | 55ef9a5 | 2000-04-24 18:03:54 +0000 | [diff] [blame] | 711 | |
Christian Costa | b92a58e | 2003-04-29 22:43:48 +0000 | [diff] [blame] | 712 | FIXME("(%p,%p,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); |
Patrik Stridvall | 55ef9a5 | 2000-04-24 18:03:54 +0000 | [diff] [blame] | 713 | return CLASS_E_CLASSNOTAVAILABLE; |
| 714 | } |