Vitaliy Margolen : dinput: mouse: Copy and modify default data format.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Dec 28 07:40:29 CST 2006
Module: wine
Branch: master
Commit: 18ee811e4cc48d15bb44ffa0ef15a2a80c351ef2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=18ee811e4cc48d15bb44ffa0ef15a2a80c351ef2
Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date: Wed Dec 27 16:31:31 2006 -0700
dinput: mouse: Copy and modify default data format.
---
dlls/dinput/mouse.c | 22 +++++++++++++++++++++-
1 files changed, 21 insertions(+), 1 deletions(-)
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index 7b4fef6..4549ae0 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -182,6 +182,8 @@ static BOOL mousedev_enum_deviceW(DWORD
static SysMouseImpl *alloc_device(REFGUID rguid, const void *mvt, IDirectInputImpl *dinput)
{
SysMouseImpl* newDevice;
+ LPDIDATAFORMAT df = NULL;
+ int i;
newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysMouseImpl));
if (!newDevice) return NULL;
@@ -192,13 +194,29 @@ static SysMouseImpl *alloc_device(REFGUI
InitializeCriticalSection(&newDevice->base.crit);
newDevice->dinput = dinput;
- newDevice->base.data_format.wine_df = &c_dfDIMouse2;
+ /* 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);
+
+ /* Because we don't do any detection yet just modify instance and type */
+ for (i = 0; i < df->dwNumObjs; i++)
+ if (DIDFT_GETTYPE(df->rgodf[i].dwType) & DIDFT_AXIS)
+ df->rgodf[i].dwType = DIDFT_MAKEINSTANCE(i) | DIDFT_RELAXIS;
+ else
+ df->rgodf[i].dwType = DIDFT_MAKEINSTANCE(i) | DIDFT_PSHBUTTON;
+
+ newDevice->base.data_format.wine_df = df;
if (create_DataFormat(&c_dfDIMouse2, &newDevice->base.data_format) == DI_OK)
{
IDirectInput_AddRef((LPDIRECTINPUTDEVICE8A)newDevice->dinput);
return newDevice;
}
+failed:
+ if (df) HeapFree(GetProcessHeap(), 0, df->rgodf);
+ HeapFree(GetProcessHeap(), 0, df);
HeapFree(GetProcessHeap(), 0, newDevice);
return NULL;
}
@@ -272,6 +290,8 @@ static ULONG WINAPI SysMouseAImpl_Releas
/* Free the data queue */
HeapFree(GetProcessHeap(), 0, This->base.data_queue);
+ /* Free data format */
+ HeapFree(GetProcessHeap(), 0, (LPVOID)This->base.data_format.wine_df);
release_DataFormat(&This->base.data_format);
IDirectInput_Release((LPDIRECTINPUTDEVICE8A)This->dinput);
More information about the wine-cvs
mailing list