dinput: Allocate data format on device creation.
It's accessed on Release, and this will make it easier to handle device creation failure cleanup. Signed-off-by: Rémi Bernon <rbernon@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
74b7845ff0
commit
2726644124
|
@ -1708,11 +1708,20 @@ HRESULT direct_input_device_alloc( SIZE_T size, const IDirectInputDevice8WVtbl *
|
|||
const GUID *guid, IDirectInputImpl *dinput, void **out )
|
||||
{
|
||||
IDirectInputDeviceImpl *This;
|
||||
DIDATAFORMAT *format;
|
||||
|
||||
if (!(This = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size ))) return DIERR_OUTOFMEMORY;
|
||||
if (!(format = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*format) )))
|
||||
{
|
||||
HeapFree( GetProcessHeap(), 0, This );
|
||||
return DIERR_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
This->IDirectInputDevice8A_iface.lpVtbl = &dinput_device_a_vtbl;
|
||||
This->IDirectInputDevice8W_iface.lpVtbl = vtbl;
|
||||
This->ref = 1;
|
||||
This->guid = *guid;
|
||||
This->data_format.wine_df = format;
|
||||
InitializeCriticalSection( &This->crit );
|
||||
This->dinput = dinput;
|
||||
IDirectInput_AddRef( &dinput->IDirectInput7A_iface );
|
||||
|
|
|
@ -411,6 +411,7 @@ static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, JoystickIm
|
|||
|
||||
if (FAILED(hr = direct_input_device_alloc( sizeof(JoystickImpl), &JoystickWvt, rguid, dinput, (void **)&newDevice )))
|
||||
return hr;
|
||||
df = newDevice->generic.base.data_format.wine_df;
|
||||
newDevice->generic.base.crit.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": JoystickImpl*->generic.base.crit");
|
||||
|
||||
newDevice->joydev = &joystick_devices[index];
|
||||
|
@ -438,7 +439,6 @@ static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, JoystickIm
|
|||
goto FAILED1;
|
||||
|
||||
/* Create copy of default data format */
|
||||
if (!(df = HeapAlloc(GetProcessHeap(), 0, c_dfDIJoystick2.dwSize))) goto FAILED;
|
||||
memcpy(df, &c_dfDIJoystick2, c_dfDIJoystick2.dwSize);
|
||||
|
||||
df->dwNumObjs = newDevice->generic.devcaps.dwAxes + newDevice->generic.devcaps.dwPOVs + newDevice->generic.devcaps.dwButtons;
|
||||
|
@ -465,7 +465,6 @@ static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, JoystickIm
|
|||
df->rgodf[idx ].pguid = &GUID_Button;
|
||||
df->rgodf[idx++].dwType = DIDFT_MAKEINSTANCE(i) | DIDFT_PSHBUTTON;
|
||||
}
|
||||
newDevice->generic.base.data_format.wine_df = df;
|
||||
|
||||
/* initialize default properties */
|
||||
for (i = 0; i < c_dfDIJoystick2.dwNumObjs; i++) {
|
||||
|
|
|
@ -407,6 +407,7 @@ static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, JoystickIm
|
|||
|
||||
if (FAILED(hr = direct_input_device_alloc( sizeof(JoystickImpl), &JoystickWvt, rguid, dinput, (void **)&newDevice )))
|
||||
return hr;
|
||||
df = newDevice->generic.base.data_format.wine_df;
|
||||
newDevice->generic.base.crit.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": JoystickImpl*->base.crit");
|
||||
|
||||
newDevice->generic.joy_polldev = joy_polldev;
|
||||
|
@ -468,7 +469,6 @@ static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, JoystickIm
|
|||
if (setup_dinput_options(&newDevice->generic, default_axis_map) != DI_OK) goto failed;
|
||||
|
||||
/* Create copy of default data format */
|
||||
if (!(df = HeapAlloc(GetProcessHeap(), 0, c_dfDIJoystick2.dwSize))) goto failed;
|
||||
memcpy(df, &c_dfDIJoystick2, c_dfDIJoystick2.dwSize);
|
||||
if (!(df->rgodf = HeapAlloc(GetProcessHeap(), 0, df->dwNumObjs * df->dwObjSize))) goto failed;
|
||||
|
||||
|
@ -514,7 +514,6 @@ static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, JoystickIm
|
|||
df->rgodf[idx++].dwType = DIDFT_MAKEINSTANCE(newDevice->generic.devcaps.dwButtons++) | DIDFT_PSHBUTTON;
|
||||
}
|
||||
df->dwNumObjs = idx;
|
||||
newDevice->generic.base.data_format.wine_df = df;
|
||||
|
||||
fake_current_js_state(newDevice);
|
||||
|
||||
|
|
|
@ -1075,6 +1075,7 @@ static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, JoystickIm
|
|||
|
||||
if (FAILED(hr = direct_input_device_alloc( sizeof(JoystickImpl), &JoystickWvt, rguid, dinput, (void **)&newDevice )))
|
||||
return hr;
|
||||
df = newDevice->generic.base.data_format.wine_df;
|
||||
newDevice->generic.base.crit.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": JoystickImpl*->generic.base.crit");
|
||||
|
||||
newDevice->id = index;
|
||||
|
@ -1138,7 +1139,6 @@ static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, JoystickIm
|
|||
}
|
||||
|
||||
/* Create copy of default data format */
|
||||
if (!(df = HeapAlloc(GetProcessHeap(), 0, c_dfDIJoystick2.dwSize))) goto FAILED;
|
||||
memcpy(df, &c_dfDIJoystick2, c_dfDIJoystick2.dwSize);
|
||||
|
||||
df->dwNumObjs = newDevice->generic.devcaps.dwAxes + newDevice->generic.devcaps.dwPOVs + newDevice->generic.devcaps.dwButtons;
|
||||
|
@ -1203,7 +1203,6 @@ static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, JoystickIm
|
|||
df->rgodf[idx ].pguid = &GUID_Button;
|
||||
df->rgodf[idx++].dwType = DIDFT_MAKEINSTANCE(i) | DIDFT_PSHBUTTON;
|
||||
}
|
||||
newDevice->generic.base.data_format.wine_df = df;
|
||||
|
||||
/* initialize default properties */
|
||||
get_osx_device_elements_props(newDevice);
|
||||
|
|
|
@ -203,12 +203,12 @@ static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, SysKeyboar
|
|||
|
||||
if (FAILED(hr = direct_input_device_alloc( sizeof(SysKeyboardImpl), &SysKeyboardWvt, rguid, dinput, (void **)&newDevice )))
|
||||
return hr;
|
||||
df = newDevice->base.data_format.wine_df;
|
||||
newDevice->base.crit.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": SysKeyboardImpl*->base.crit");
|
||||
|
||||
newDevice->subtype = get_keyboard_subtype();
|
||||
|
||||
/* Create copy of default data format */
|
||||
if (!(df = HeapAlloc(GetProcessHeap(), 0, c_dfDIKeyboard.dwSize))) goto failed;
|
||||
memcpy(df, &c_dfDIKeyboard, c_dfDIKeyboard.dwSize);
|
||||
if (!(df->rgodf = HeapAlloc(GetProcessHeap(), 0, df->dwNumObjs * df->dwObjSize))) goto failed;
|
||||
|
||||
|
@ -226,8 +226,6 @@ static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, SysKeyboar
|
|||
}
|
||||
df->dwNumObjs = idx;
|
||||
|
||||
newDevice->base.data_format.wine_df = df;
|
||||
|
||||
*out = newDevice;
|
||||
return DI_OK;
|
||||
|
||||
|
|
|
@ -149,6 +149,7 @@ static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, SysMouseIm
|
|||
|
||||
if (FAILED(hr = direct_input_device_alloc( sizeof(SysMouseImpl), &SysMouseWvt, rguid, dinput, (void **)&newDevice )))
|
||||
return hr;
|
||||
df = newDevice->base.data_format.wine_df;
|
||||
newDevice->base.crit.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": SysMouseImpl*->base.crit");
|
||||
|
||||
newDevice->base.dwCoopLevel = DISCL_NONEXCLUSIVE | DISCL_BACKGROUND;
|
||||
|
@ -165,7 +166,6 @@ static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, SysMouseIm
|
|||
if (hkey) RegCloseKey(hkey);
|
||||
|
||||
/* Create copy of default data format */
|
||||
if (!(df = HeapAlloc(GetProcessHeap(), 0, c_dfDIMouse2.dwSize))) goto failed;
|
||||
memcpy(df, &c_dfDIMouse2, c_dfDIMouse2.dwSize);
|
||||
if (!(df->rgodf = HeapAlloc(GetProcessHeap(), 0, df->dwNumObjs * df->dwObjSize))) goto failed;
|
||||
memcpy(df->rgodf, c_dfDIMouse2.rgodf, df->dwNumObjs * df->dwObjSize);
|
||||
|
@ -177,7 +177,6 @@ static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, SysMouseIm
|
|||
else
|
||||
df->rgodf[i].dwType = DIDFT_MAKEINSTANCE(i) | DIDFT_PSHBUTTON;
|
||||
|
||||
newDevice->base.data_format.wine_df = df;
|
||||
if (dinput->dwVersion >= 0x0800)
|
||||
{
|
||||
newDevice->base.use_raw_input = TRUE;
|
||||
|
|
Loading…
Reference in New Issue