dinput: COM cleanup - use interfaces instead of vtbl. Combine both Unicode and ASCII interfaces into the same classes.

This commit is contained in:
Vitaliy Margolen 2011-01-09 15:44:19 -07:00 committed by Alexandre Julliard
parent e6a8aa67d0
commit 6b30480021
9 changed files with 134 additions and 68 deletions

View File

@ -43,20 +43,20 @@ WINE_DEFAULT_DEBUG_CHANNEL(dinput);
static inline IDirectInputDeviceImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface) static inline IDirectInputDeviceImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface)
{ {
return (IDirectInputDeviceImpl *) iface; return CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8A_iface);
} }
static inline IDirectInputDeviceImpl *impl_from_IDirectInputDevice8W(IDirectInputDevice8W *iface) static inline IDirectInputDeviceImpl *impl_from_IDirectInputDevice8W(IDirectInputDevice8W *iface)
{ {
return (IDirectInputDeviceImpl *) iface; return CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8W_iface);
} }
static inline IDirectInputDevice8A *IDirectInputDevice8A_from_impl(IDirectInputDeviceImpl *This) static inline IDirectInputDevice8A *IDirectInputDevice8A_from_impl(IDirectInputDeviceImpl *This)
{ {
return (IDirectInputDevice8A *)This; return &This->IDirectInputDevice8A_iface;
} }
static inline IDirectInputDevice8W *IDirectInputDevice8W_from_impl(IDirectInputDeviceImpl *This) static inline IDirectInputDevice8W *IDirectInputDevice8W_from_impl(IDirectInputDeviceImpl *This)
{ {
return (IDirectInputDevice8W *)This; return &This->IDirectInputDevice8W_iface;
} }
/****************************************************************************** /******************************************************************************

View File

@ -51,7 +51,8 @@ typedef struct
typedef struct IDirectInputDeviceImpl IDirectInputDeviceImpl; typedef struct IDirectInputDeviceImpl IDirectInputDeviceImpl;
struct IDirectInputDeviceImpl struct IDirectInputDeviceImpl
{ {
const void *lpVtbl; IDirectInputDevice8A IDirectInputDevice8A_iface;
IDirectInputDevice8W IDirectInputDevice8W_iface;
LONG ref; LONG ref;
GUID guid; GUID guid;
CRITICAL_SECTION crit; CRITICAL_SECTION crit;

View File

@ -76,6 +76,15 @@ static inline IDirectInputImpl *impl_from_IDirectInput8W( IDirectInput8W *iface
return CONTAINING_RECORD( iface, IDirectInputImpl, IDirectInput8W_iface ); return CONTAINING_RECORD( iface, IDirectInputImpl, IDirectInput8W_iface );
} }
static inline IDirectInputDeviceImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface)
{
return CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8A_iface);
}
static inline IDirectInputDeviceImpl *impl_from_IDirectInputDevice8W(IDirectInputDevice8W *iface)
{
return CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8W_iface);
}
static const struct dinput_device *dinput_devices[] = static const struct dinput_device *dinput_devices[] =
{ {
&mouse_device, &mouse_device,
@ -498,8 +507,10 @@ static HRESULT WINAPI IDirectInput7AImpl_CreateDeviceEx(LPDIRECTINPUT7A iface, R
if (!dinput_devices[i]->create_deviceA) continue; if (!dinput_devices[i]->create_deviceA) continue;
if ((ret = dinput_devices[i]->create_deviceA(This, rguid, riid, (LPDIRECTINPUTDEVICEA*) pvOut)) == DI_OK) if ((ret = dinput_devices[i]->create_deviceA(This, rguid, riid, (LPDIRECTINPUTDEVICEA*) pvOut)) == DI_OK)
{ {
IDirectInputDeviceImpl *dev = impl_from_IDirectInputDevice8A(*pvOut);
EnterCriticalSection( &This->crit ); EnterCriticalSection( &This->crit );
list_add_tail( &This->devices_list, &(*(IDirectInputDeviceImpl**)pvOut)->entry ); list_add_tail( &This->devices_list, &dev->entry );
LeaveCriticalSection( &This->crit ); LeaveCriticalSection( &This->crit );
return DI_OK; return DI_OK;
} }
@ -534,8 +545,10 @@ static HRESULT WINAPI IDirectInput7WImpl_CreateDeviceEx(LPDIRECTINPUT7W iface, R
if (!dinput_devices[i]->create_deviceW) continue; if (!dinput_devices[i]->create_deviceW) continue;
if ((ret = dinput_devices[i]->create_deviceW(This, rguid, riid, (LPDIRECTINPUTDEVICEW*) pvOut)) == DI_OK) if ((ret = dinput_devices[i]->create_deviceW(This, rguid, riid, (LPDIRECTINPUTDEVICEW*) pvOut)) == DI_OK)
{ {
IDirectInputDeviceImpl *dev = impl_from_IDirectInputDevice8W(*pvOut);
EnterCriticalSection( &This->crit ); EnterCriticalSection( &This->crit );
list_add_tail( &This->devices_list, &(*(IDirectInputDeviceImpl**)pvOut)->entry ); list_add_tail( &This->devices_list, &dev->entry );
LeaveCriticalSection( &This->crit ); LeaveCriticalSection( &This->crit );
return DI_OK; return DI_OK;
} }
@ -922,7 +935,7 @@ static LRESULT CALLBACK LL_hook_proc( int code, WPARAM wparam, LPARAM lparam )
if (dev->acquired && dev->event_proc) if (dev->acquired && dev->event_proc)
{ {
TRACE("calling %p->%p (%lx %lx)\n", dev, dev->event_proc, wparam, lparam); TRACE("calling %p->%p (%lx %lx)\n", dev, dev->event_proc, wparam, lparam);
skip |= dev->event_proc( (LPDIRECTINPUTDEVICE8A)dev, wparam, lparam ); skip |= dev->event_proc( &dev->IDirectInputDevice8A_iface, wparam, lparam );
} }
LeaveCriticalSection( &dinput->crit ); LeaveCriticalSection( &dinput->crit );
} }
@ -957,7 +970,7 @@ static LRESULT CALLBACK callwndproc_proc( int code, WPARAM wparam, LPARAM lparam
if (msg->hwnd == dev->win && msg->hwnd != foreground) if (msg->hwnd == dev->win && msg->hwnd != foreground)
{ {
TRACE( "%p window is not foreground - unacquiring %p\n", dev->win, dev ); TRACE( "%p window is not foreground - unacquiring %p\n", dev->win, dev );
IDirectInputDevice_Unacquire( (LPDIRECTINPUTDEVICE8A)dev ); IDirectInputDevice_Unacquire( &dev->IDirectInputDevice8A_iface );
} }
} }
LeaveCriticalSection( &dinput->crit ); LeaveCriticalSection( &dinput->crit );
@ -1097,7 +1110,7 @@ void check_dinput_hooks(LPDIRECTINPUTDEVICE8W iface)
{ {
static HHOOK callwndproc_hook; static HHOOK callwndproc_hook;
static ULONG foreground_cnt; static ULONG foreground_cnt;
IDirectInputDeviceImpl *dev = (IDirectInputDeviceImpl *)iface; IDirectInputDeviceImpl *dev = impl_from_IDirectInputDevice8W(iface);
EnterCriticalSection(&dinput_hook_crit); EnterCriticalSection(&dinput_hook_crit);

View File

@ -34,19 +34,19 @@ WINE_DEFAULT_DEBUG_CHANNEL(dinput);
static inline JoystickGenericImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface) static inline JoystickGenericImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface)
{ {
return (JoystickGenericImpl *) iface; return CONTAINING_RECORD(CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8A_iface), JoystickGenericImpl, base);
} }
static inline JoystickGenericImpl *impl_from_IDirectInputDevice8W(IDirectInputDevice8W *iface) static inline JoystickGenericImpl *impl_from_IDirectInputDevice8W(IDirectInputDevice8W *iface)
{ {
return (JoystickGenericImpl *) iface; return CONTAINING_RECORD(CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8W_iface), JoystickGenericImpl, base);
} }
static inline IDirectInputDevice8A *IDirectInputDevice8A_from_impl(JoystickGenericImpl *This) static inline IDirectInputDevice8A *IDirectInputDevice8A_from_impl(JoystickGenericImpl *This)
{ {
return (IDirectInputDevice8A *)This; return &This->base.IDirectInputDevice8A_iface;
} }
static inline IDirectInputDevice8W *IDirectInputDevice8W_from_impl(JoystickGenericImpl *This) static inline IDirectInputDevice8W *IDirectInputDevice8W_from_impl(JoystickGenericImpl *This)
{ {
return (IDirectInputDevice8W *)This; return &This->base.IDirectInputDevice8W_iface;
} }
/****************************************************************************** /******************************************************************************

View File

@ -101,19 +101,21 @@ struct JoystickImpl
static inline JoystickImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface) static inline JoystickImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface)
{ {
return (JoystickImpl *) iface; return CONTAINING_RECORD(CONTAINING_RECORD(CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8A_iface),
JoystickGenericImpl, base), JoystickImpl, generic);
} }
static inline JoystickImpl *impl_from_IDirectInputDevice8W(IDirectInputDevice8W *iface) static inline JoystickImpl *impl_from_IDirectInputDevice8W(IDirectInputDevice8W *iface)
{ {
return (JoystickImpl *) iface; return CONTAINING_RECORD(CONTAINING_RECORD(CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8W_iface),
JoystickGenericImpl, base), JoystickImpl, generic);
} }
static inline IDirectInputDevice8A *IDirectInputDevice8A_from_impl(JoystickImpl *This) static inline IDirectInputDevice8A *IDirectInputDevice8A_from_impl(JoystickImpl *This)
{ {
return (IDirectInputDevice8A *)This; return &This->generic.base.IDirectInputDevice8A_iface;
} }
static inline IDirectInputDevice8W *IDirectInputDevice8W_from_impl(JoystickImpl *This) static inline IDirectInputDevice8W *IDirectInputDevice8W_from_impl(JoystickImpl *This)
{ {
return (IDirectInputDevice8W *)This; return &This->generic.base.IDirectInputDevice8W_iface;
} }
static const GUID DInput_Wine_Joystick_GUID = { /* 9e573ed9-7734-11d2-8d4a-23903fb6bdf7 */ static const GUID DInput_Wine_Joystick_GUID = { /* 9e573ed9-7734-11d2-8d4a-23903fb6bdf7 */
@ -296,8 +298,8 @@ static BOOL joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTAN
return FALSE; return FALSE;
} }
static HRESULT alloc_device(REFGUID rguid, const void *jvt, IDirectInputImpl *dinput, static HRESULT alloc_device(REFGUID rguid, IDirectInputImpl *dinput,
LPDIRECTINPUTDEVICEA* pdev, unsigned short index) JoystickImpl **pdev, unsigned short index)
{ {
DWORD i; DWORD i;
JoystickImpl* newDevice; JoystickImpl* newDevice;
@ -305,7 +307,7 @@ static HRESULT alloc_device(REFGUID rguid, const void *jvt, IDirectInputImpl *di
LPDIDATAFORMAT df = NULL; LPDIDATAFORMAT df = NULL;
int idx = 0; int idx = 0;
TRACE("%s %p %p %p %hu\n", debugstr_guid(rguid), jvt, dinput, pdev, index); TRACE("%s %p %p %hu\n", debugstr_guid(rguid), dinput, pdev, index);
newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(JoystickImpl)); newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(JoystickImpl));
if (newDevice == 0) { if (newDevice == 0) {
@ -330,7 +332,8 @@ static HRESULT alloc_device(REFGUID rguid, const void *jvt, IDirectInputImpl *di
newDevice->generic.devcaps.dwButtons = 128; newDevice->generic.devcaps.dwButtons = 128;
} }
newDevice->generic.base.lpVtbl = jvt; newDevice->generic.base.IDirectInputDevice8A_iface.lpVtbl = &JoystickAvt;
newDevice->generic.base.IDirectInputDevice8W_iface.lpVtbl = &JoystickWvt;
newDevice->generic.base.ref = 1; newDevice->generic.base.ref = 1;
newDevice->generic.base.dinput = dinput; newDevice->generic.base.dinput = dinput;
newDevice->generic.base.guid = *rguid; newDevice->generic.base.guid = *rguid;
@ -406,7 +409,7 @@ static HRESULT alloc_device(REFGUID rguid, const void *jvt, IDirectInputImpl *di
_dump_DIDEVCAPS(&newDevice->generic.devcaps); _dump_DIDEVCAPS(&newDevice->generic.devcaps);
} }
*pdev = (LPDIRECTINPUTDEVICEA)newDevice; *pdev = newDevice;
return DI_OK; return DI_OK;
@ -460,7 +463,11 @@ static HRESULT joydev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, RE
IsEqualGUID(&IID_IDirectInputDevice7A, riid) || IsEqualGUID(&IID_IDirectInputDevice7A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8A, riid)) IsEqualGUID(&IID_IDirectInputDevice8A, riid))
{ {
return alloc_device(rguid, &JoystickAvt, dinput, pdev, index); JoystickImpl *This;
HRESULT hr = alloc_device(rguid, dinput, &This, index);
*pdev = (LPDIRECTINPUTDEVICEA)(This ? &This->generic.base.IDirectInputDevice8A_iface : NULL);
return hr;
} }
WARN("no interface\n"); WARN("no interface\n");
@ -487,7 +494,11 @@ static HRESULT joydev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid, RE
IsEqualGUID(&IID_IDirectInputDevice7W, riid) || IsEqualGUID(&IID_IDirectInputDevice7W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8W, riid)) IsEqualGUID(&IID_IDirectInputDevice8W, riid))
{ {
return alloc_device(rguid, &JoystickWvt, dinput, (LPDIRECTINPUTDEVICEA *)pdev, index); JoystickImpl *This;
HRESULT hr = alloc_device(rguid, dinput, &This, index);
*pdev = (LPDIRECTINPUTDEVICEW)(This ? &This->generic.base.IDirectInputDevice8W_iface : NULL);
return hr;
} }
WARN("no interface\n"); WARN("no interface\n");
return DIERR_NOINTERFACE; return DIERR_NOINTERFACE;

View File

@ -135,19 +135,21 @@ struct JoystickImpl
static inline JoystickImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface) static inline JoystickImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface)
{ {
return (JoystickImpl *) iface; return CONTAINING_RECORD(CONTAINING_RECORD(CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8A_iface),
JoystickGenericImpl, base), JoystickImpl, generic);
} }
static inline JoystickImpl *impl_from_IDirectInputDevice8W(IDirectInputDevice8W *iface) static inline JoystickImpl *impl_from_IDirectInputDevice8W(IDirectInputDevice8W *iface)
{ {
return (JoystickImpl *) iface; return CONTAINING_RECORD(CONTAINING_RECORD(CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8W_iface),
JoystickGenericImpl, base), JoystickImpl, generic);
} }
static inline IDirectInputDevice8A *IDirectInputDevice8A_from_impl(JoystickImpl *This) static inline IDirectInputDevice8A *IDirectInputDevice8A_from_impl(JoystickImpl *This)
{ {
return (IDirectInputDevice8A *) This; return &This->generic.base.IDirectInputDevice8A_iface;
} }
static inline IDirectInputDevice8W *IDirectInputDevice8W_from_impl(JoystickImpl *This) static inline IDirectInputDevice8W *IDirectInputDevice8W_from_impl(JoystickImpl *This)
{ {
return (IDirectInputDevice8W *) This; return &This->generic.base.IDirectInputDevice8W_iface;
} }
static void fake_current_js_state(JoystickImpl *ji); static void fake_current_js_state(JoystickImpl *ji);
@ -390,7 +392,7 @@ static BOOL joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTAN
return FALSE; return FALSE;
} }
static JoystickImpl *alloc_device(REFGUID rguid, const void *jvt, IDirectInputImpl *dinput, unsigned short index) static JoystickImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput, unsigned short index)
{ {
JoystickImpl* newDevice; JoystickImpl* newDevice;
LPDIDATAFORMAT df = NULL; LPDIDATAFORMAT df = NULL;
@ -400,7 +402,8 @@ static JoystickImpl *alloc_device(REFGUID rguid, const void *jvt, IDirectInputIm
newDevice = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(JoystickImpl)); newDevice = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(JoystickImpl));
if (!newDevice) return NULL; if (!newDevice) return NULL;
newDevice->generic.base.lpVtbl = jvt; newDevice->generic.base.IDirectInputDevice8A_iface.lpVtbl = &JoystickAvt;
newDevice->generic.base.IDirectInputDevice8W_iface.lpVtbl = &JoystickWvt;
newDevice->generic.base.ref = 1; newDevice->generic.base.ref = 1;
newDevice->generic.base.guid = *rguid; newDevice->generic.base.guid = *rguid;
newDevice->generic.base.dinput = dinput; newDevice->generic.base.dinput = dinput;
@ -567,14 +570,16 @@ static HRESULT joydev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, RE
IsEqualGUID(&IID_IDirectInputDevice7A, riid) || IsEqualGUID(&IID_IDirectInputDevice7A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8A, riid)) IsEqualGUID(&IID_IDirectInputDevice8A, riid))
{ {
*pdev = (IDirectInputDeviceA*) alloc_device(rguid, &JoystickAvt, dinput, index); JoystickImpl *This = alloc_device(rguid, dinput, index);
TRACE("Created a Joystick device (%p)\n", *pdev); TRACE("Created a Joystick device (%p)\n", This);
if (*pdev == NULL) if (!This)
{ {
ERR("out of memory\n"); ERR("out of memory\n");
*pdev = NULL;
return DIERR_OUTOFMEMORY; return DIERR_OUTOFMEMORY;
} }
*pdev = (IDirectInputDeviceA*) &This->generic.base.IDirectInputDevice8A_iface;
return DI_OK; return DI_OK;
} }
@ -601,14 +606,15 @@ static HRESULT joydev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid, RE
IsEqualGUID(&IID_IDirectInputDevice7W, riid) || IsEqualGUID(&IID_IDirectInputDevice7W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8W, riid)) IsEqualGUID(&IID_IDirectInputDevice8W, riid))
{ {
*pdev = (IDirectInputDeviceW*) alloc_device(rguid, &JoystickWvt, dinput, index); JoystickImpl *This = alloc_device(rguid, dinput, index);
TRACE("Created a Joystick device (%p)\n", *pdev); TRACE("Created a Joystick device (%p)\n", This);
if (*pdev == NULL) if (!This)
{ {
ERR("out of memory\n"); ERR("out of memory\n");
return DIERR_OUTOFMEMORY; return DIERR_OUTOFMEMORY;
} }
*pdev = (IDirectInputDeviceW*) &This->generic.base.IDirectInputDevice8W_iface;
return DI_OK; return DI_OK;
} }
WARN("no interface\n"); WARN("no interface\n");

View File

@ -137,11 +137,13 @@ struct JoystickImpl
static inline JoystickImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface) static inline JoystickImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface)
{ {
return (JoystickImpl *) iface; return CONTAINING_RECORD(CONTAINING_RECORD(CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8A_iface),
JoystickGenericImpl, base), JoystickImpl, generic);
} }
static inline JoystickImpl *impl_from_IDirectInputDevice8W(IDirectInputDevice8W *iface) static inline JoystickImpl *impl_from_IDirectInputDevice8W(IDirectInputDevice8W *iface)
{ {
return (JoystickImpl *) iface; return CONTAINING_RECORD(CONTAINING_RECORD(CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8W_iface),
JoystickGenericImpl, base), JoystickImpl, generic);
} }
static const GUID DInput_Wine_OsX_Joystick_GUID = { /* 59CAD8F6-E617-41E2-8EB7-47B23EEEDC5A */ static const GUID DInput_Wine_OsX_Joystick_GUID = { /* 59CAD8F6-E617-41E2-8EB7-47B23EEEDC5A */
@ -716,8 +718,8 @@ static BOOL joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTAN
return FALSE; return FALSE;
} }
static HRESULT alloc_device(REFGUID rguid, const void *jvt, IDirectInputImpl *dinput, static HRESULT alloc_device(REFGUID rguid, IDirectInputImpl *dinput,
LPDIRECTINPUTDEVICEA* pdev, unsigned short index) JoystickImpl **pdev, unsigned short index)
{ {
DWORD i; DWORD i;
JoystickImpl* newDevice; JoystickImpl* newDevice;
@ -728,7 +730,7 @@ static HRESULT alloc_device(REFGUID rguid, const void *jvt, IDirectInputImpl *di
int axis_map[8]; /* max axes */ int axis_map[8]; /* max axes */
int slider_count = 0; int slider_count = 0;
TRACE("%s %p %p %p %hu\n", debugstr_guid(rguid), jvt, dinput, pdev, index); TRACE("%s %p %p %hu\n", debugstr_guid(rguid), dinput, pdev, index);
newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(JoystickImpl)); newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(JoystickImpl));
if (newDevice == 0) { if (newDevice == 0) {
@ -763,7 +765,8 @@ static HRESULT alloc_device(REFGUID rguid, const void *jvt, IDirectInputImpl *di
newDevice->generic.devcaps.dwButtons = 128; newDevice->generic.devcaps.dwButtons = 128;
} }
newDevice->generic.base.lpVtbl = jvt; newDevice->generic.base.IDirectInputDevice8A_iface.lpVtbl = &JoystickAvt;
newDevice->generic.base.IDirectInputDevice8W_iface.lpVtbl = &JoystickWvt;
newDevice->generic.base.ref = 1; newDevice->generic.base.ref = 1;
newDevice->generic.base.dinput = dinput; newDevice->generic.base.dinput = dinput;
newDevice->generic.base.guid = *rguid; newDevice->generic.base.guid = *rguid;
@ -835,7 +838,7 @@ static HRESULT alloc_device(REFGUID rguid, const void *jvt, IDirectInputImpl *di
_dump_DIDEVCAPS(&newDevice->generic.devcaps); _dump_DIDEVCAPS(&newDevice->generic.devcaps);
} }
*pdev = (LPDIRECTINPUTDEVICEA)newDevice; *pdev = newDevice;
return DI_OK; return DI_OK;
@ -891,7 +894,11 @@ static HRESULT joydev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, RE
IsEqualGUID(&IID_IDirectInputDevice7A, riid) || IsEqualGUID(&IID_IDirectInputDevice7A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8A, riid)) IsEqualGUID(&IID_IDirectInputDevice8A, riid))
{ {
return alloc_device(rguid, &JoystickAvt, dinput, pdev, index); JoystickImpl *This;
HRESULT hr = alloc_device(rguid, dinput, &This, index);
*pdev = (LPDIRECTINPUTDEVICEA)(This ? &This->generic.base.IDirectInputDevice8A_iface : NULL);
return hr;
} }
WARN("no interface\n"); WARN("no interface\n");
@ -921,7 +928,11 @@ static HRESULT joydev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid, RE
IsEqualGUID(&IID_IDirectInputDevice7W, riid) || IsEqualGUID(&IID_IDirectInputDevice7W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8W, riid)) IsEqualGUID(&IID_IDirectInputDevice8W, riid))
{ {
return alloc_device(rguid, &JoystickWvt, dinput, (LPDIRECTINPUTDEVICEA *)pdev, index); JoystickImpl *This;
HRESULT hr = alloc_device(rguid, dinput, &This, index);
*pdev = (LPDIRECTINPUTDEVICEW)(This ? &This->generic.base.IDirectInputDevice8W_iface : NULL);
return hr;
} }
WARN("no interface\n"); WARN("no interface\n");
return DIERR_NOINTERFACE; return DIERR_NOINTERFACE;

View File

@ -52,19 +52,19 @@ struct SysKeyboardImpl
static inline SysKeyboardImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface) static inline SysKeyboardImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface)
{ {
return (SysKeyboardImpl *) iface; return CONTAINING_RECORD(CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8A_iface), SysKeyboardImpl, base);
} }
static inline SysKeyboardImpl *impl_from_IDirectInputDevice8W(IDirectInputDevice8W *iface) static inline SysKeyboardImpl *impl_from_IDirectInputDevice8W(IDirectInputDevice8W *iface)
{ {
return (SysKeyboardImpl *) iface; return CONTAINING_RECORD(CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8W_iface), SysKeyboardImpl, base);
} }
static inline IDirectInputDevice8A *IDirectInputDevice8A_from_impl(SysKeyboardImpl *This) static inline IDirectInputDevice8A *IDirectInputDevice8A_from_impl(SysKeyboardImpl *This)
{ {
return (IDirectInputDevice8A *)This; return &This->base.IDirectInputDevice8A_iface;
} }
static inline IDirectInputDevice8W *IDirectInputDevice8W_from_impl(SysKeyboardImpl *This) static inline IDirectInputDevice8W *IDirectInputDevice8W_from_impl(SysKeyboardImpl *This)
{ {
return (IDirectInputDevice8W *)This; return &This->base.IDirectInputDevice8W_iface;
} }
static BYTE map_dik_code(DWORD scanCode, DWORD vkCode) static BYTE map_dik_code(DWORD scanCode, DWORD vkCode)
@ -220,14 +220,15 @@ static BOOL keyboarddev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEI
return FALSE; return FALSE;
} }
static SysKeyboardImpl *alloc_device(REFGUID rguid, const void *kvt, IDirectInputImpl *dinput) static SysKeyboardImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput)
{ {
SysKeyboardImpl* newDevice; SysKeyboardImpl* newDevice;
LPDIDATAFORMAT df = NULL; LPDIDATAFORMAT df = NULL;
int i, idx = 0; int i, idx = 0;
newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysKeyboardImpl)); newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysKeyboardImpl));
newDevice->base.lpVtbl = kvt; newDevice->base.IDirectInputDevice8A_iface.lpVtbl = &SysKeyboardAvt;
newDevice->base.IDirectInputDevice8W_iface.lpVtbl = &SysKeyboardWvt;
newDevice->base.ref = 1; newDevice->base.ref = 1;
memcpy(&newDevice->base.guid, rguid, sizeof(*rguid)); memcpy(&newDevice->base.guid, rguid, sizeof(*rguid));
newDevice->base.dinput = dinput; newDevice->base.dinput = dinput;
@ -273,9 +274,14 @@ static HRESULT keyboarddev_create_deviceA(IDirectInputImpl *dinput, REFGUID rgui
IsEqualGUID(&IID_IDirectInputDevice2A,riid) || IsEqualGUID(&IID_IDirectInputDevice2A,riid) ||
IsEqualGUID(&IID_IDirectInputDevice7A,riid) || IsEqualGUID(&IID_IDirectInputDevice7A,riid) ||
IsEqualGUID(&IID_IDirectInputDevice8A,riid)) { IsEqualGUID(&IID_IDirectInputDevice8A,riid)) {
*pdev = (IDirectInputDeviceA*) alloc_device(rguid, &SysKeyboardAvt, dinput);
SysKeyboardImpl *This = alloc_device(rguid, dinput);
if (!This) {
*pdev = NULL;
return DIERR_OUTOFMEMORY;
}
*pdev = (IDirectInputDeviceA*) &This->base.IDirectInputDevice8A_iface;
TRACE("Creating a Keyboard device (%p)\n", *pdev); TRACE("Creating a Keyboard device (%p)\n", *pdev);
if (!*pdev) return DIERR_OUTOFMEMORY;
return DI_OK; return DI_OK;
} else } else
return DIERR_NOINTERFACE; return DIERR_NOINTERFACE;
@ -292,9 +298,14 @@ static HRESULT keyboarddev_create_deviceW(IDirectInputImpl *dinput, REFGUID rgui
IsEqualGUID(&IID_IDirectInputDevice2W,riid) || IsEqualGUID(&IID_IDirectInputDevice2W,riid) ||
IsEqualGUID(&IID_IDirectInputDevice7W,riid) || IsEqualGUID(&IID_IDirectInputDevice7W,riid) ||
IsEqualGUID(&IID_IDirectInputDevice8W,riid)) { IsEqualGUID(&IID_IDirectInputDevice8W,riid)) {
*pdev = (IDirectInputDeviceW*) alloc_device(rguid, &SysKeyboardWvt, dinput);
SysKeyboardImpl *This = alloc_device(rguid, dinput);
if (!This) {
*pdev = NULL;
return DIERR_OUTOFMEMORY;
}
*pdev = (IDirectInputDeviceW*) &This->base.IDirectInputDevice8W_iface;
TRACE("Creating a Keyboard device (%p)\n", *pdev); TRACE("Creating a Keyboard device (%p)\n", *pdev);
if (!*pdev) return DIERR_OUTOFMEMORY;
return DI_OK; return DI_OK;
} else } else
return DIERR_NOINTERFACE; return DIERR_NOINTERFACE;

View File

@ -80,19 +80,19 @@ struct SysMouseImpl
static inline SysMouseImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface) static inline SysMouseImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface)
{ {
return (SysMouseImpl *) iface; return CONTAINING_RECORD(CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8A_iface), SysMouseImpl, base);
} }
static inline SysMouseImpl *impl_from_IDirectInputDevice8W(IDirectInputDevice8W *iface) static inline SysMouseImpl *impl_from_IDirectInputDevice8W(IDirectInputDevice8W *iface)
{ {
return (SysMouseImpl *) iface; return CONTAINING_RECORD(CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8W_iface), SysMouseImpl, base);
} }
static inline IDirectInputDevice8A *IDirectInputDevice8A_from_impl(SysMouseImpl *This) static inline IDirectInputDevice8A *IDirectInputDevice8A_from_impl(SysMouseImpl *This)
{ {
return (IDirectInputDevice8A *)This; return &This->base.IDirectInputDevice8A_iface;
} }
static inline IDirectInputDevice8W *IDirectInputDevice8W_from_impl(SysMouseImpl *This) static inline IDirectInputDevice8W *IDirectInputDevice8W_from_impl(SysMouseImpl *This)
{ {
return (IDirectInputDevice8W *)This; return &This->base.IDirectInputDevice8W_iface;
} }
static int dinput_mouse_hook( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM lparam ); static int dinput_mouse_hook( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM lparam );
@ -196,7 +196,7 @@ static BOOL mousedev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINST
return FALSE; return FALSE;
} }
static SysMouseImpl *alloc_device(REFGUID rguid, const void *mvt, IDirectInputImpl *dinput) static SysMouseImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput)
{ {
SysMouseImpl* newDevice; SysMouseImpl* newDevice;
LPDIDATAFORMAT df = NULL; LPDIDATAFORMAT df = NULL;
@ -206,7 +206,8 @@ static SysMouseImpl *alloc_device(REFGUID rguid, const void *mvt, IDirectInputIm
newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysMouseImpl)); newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysMouseImpl));
if (!newDevice) return NULL; if (!newDevice) return NULL;
newDevice->base.lpVtbl = mvt; newDevice->base.IDirectInputDevice8A_iface.lpVtbl = &SysMouseAvt;
newDevice->base.IDirectInputDevice8W_iface.lpVtbl = &SysMouseWvt;
newDevice->base.ref = 1; newDevice->base.ref = 1;
newDevice->base.dwCoopLevel = DISCL_NONEXCLUSIVE | DISCL_BACKGROUND; newDevice->base.dwCoopLevel = DISCL_NONEXCLUSIVE | DISCL_BACKGROUND;
newDevice->base.guid = *rguid; newDevice->base.guid = *rguid;
@ -259,9 +260,15 @@ static HRESULT mousedev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid,
IsEqualGUID(&IID_IDirectInputDevice2A,riid) || IsEqualGUID(&IID_IDirectInputDevice2A,riid) ||
IsEqualGUID(&IID_IDirectInputDevice7A,riid) || IsEqualGUID(&IID_IDirectInputDevice7A,riid) ||
IsEqualGUID(&IID_IDirectInputDevice8A,riid)) { IsEqualGUID(&IID_IDirectInputDevice8A,riid)) {
*pdev = (IDirectInputDeviceA*) alloc_device(rguid, &SysMouseAvt, dinput);
TRACE("Creating a Mouse device (%p)\n", *pdev); SysMouseImpl* This = alloc_device(rguid, dinput);
if (!*pdev) return DIERR_OUTOFMEMORY; TRACE("Created a Mouse device (%p)\n", This);
if (!This) {
*pdev = NULL;
return DIERR_OUTOFMEMORY;
}
*pdev = (IDirectInputDeviceA*) &This->base.IDirectInputDevice8A_iface;
return DI_OK; return DI_OK;
} else } else
return DIERR_NOINTERFACE; return DIERR_NOINTERFACE;
@ -279,9 +286,15 @@ static HRESULT mousedev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid,
IsEqualGUID(&IID_IDirectInputDevice2W,riid) || IsEqualGUID(&IID_IDirectInputDevice2W,riid) ||
IsEqualGUID(&IID_IDirectInputDevice7W,riid) || IsEqualGUID(&IID_IDirectInputDevice7W,riid) ||
IsEqualGUID(&IID_IDirectInputDevice8W,riid)) { IsEqualGUID(&IID_IDirectInputDevice8W,riid)) {
*pdev = (IDirectInputDeviceW*) alloc_device(rguid, &SysMouseWvt, dinput);
TRACE("Creating a Mouse device (%p)\n", *pdev); SysMouseImpl* This = alloc_device(rguid, dinput);
if (!*pdev) return DIERR_OUTOFMEMORY; TRACE("Created a Mouse device (%p)\n", This);
if (!This) {
*pdev = NULL;
return DIERR_OUTOFMEMORY;
}
*pdev = (IDirectInputDeviceW*) &This->base.IDirectInputDevice8W_iface;
return DI_OK; return DI_OK;
} else } else
return DIERR_NOINTERFACE; return DIERR_NOINTERFACE;