Christoph Frick : dinput:
Adds offset and transform and their basic handling to the joystick
implementation .
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jul 7 11:09:56 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: f0f3b0a34a847f7811020ff6d67cbdec8054b481
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=f0f3b0a34a847f7811020ff6d67cbdec8054b481
Author: Christoph Frick <frick at sc-networks.de>
Date: Thu Jul 6 13:14:18 2006 +0200
dinput: Adds offset and transform and their basic handling to the joystick implementation.
---
dlls/dinput/joystick_linuxinput.c | 61 ++++++++++++++++++++++++++++++++++++-
1 files changed, 59 insertions(+), 2 deletions(-)
diff --git a/dlls/dinput/joystick_linuxinput.c b/dlls/dinput/joystick_linuxinput.c
index 669a474..b40a897 100644
--- a/dlls/dinput/joystick_linuxinput.c
+++ b/dlls/dinput/joystick_linuxinput.c
@@ -124,6 +124,8 @@ struct JoystickImpl
int joyfd;
LPDIDATAFORMAT df;
+ DataFormat *transform; /* wine to user format converter */
+ int *offsets; /* object offsets */
HANDLE hEvent;
LPDIDEVICEOBJECTDATA data_queue;
int queue_head, queue_tail, queue_len;
@@ -338,6 +340,10 @@ static JoystickImpl *alloc_device(REFGUI
int i;
newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(JoystickImpl));
+ if (newDevice==NULL) {
+ return NULL;
+ }
+
newDevice->lpVtbl = jvt;
newDevice->ref = 1;
newDevice->joyfd = -1;
@@ -358,7 +364,37 @@ #endif
newDevice->deadz[i] = 0;
}
fake_current_js_state(newDevice);
+
+ /* wine uses DIJOYSTATE2 as it's internal format so copy
+ * the already defined format c_dfDIJoystick2 */
+ newDevice->df = HeapAlloc(GetProcessHeap(),0,c_dfDIJoystick2.dwSize);
+ if (newDevice->df == 0)
+ goto FAILED;
+
+ CopyMemory(newDevice->df, &c_dfDIJoystick2, c_dfDIJoystick2.dwSize);
+
+ /* copy default objects */
+ newDevice->df->rgodf = HeapAlloc(GetProcessHeap(),0,c_dfDIJoystick2.dwNumObjs*c_dfDIJoystick2.dwObjSize);
+ if (newDevice->df->rgodf == 0)
+ goto FAILED;
+
+ CopyMemory(newDevice->df->rgodf,c_dfDIJoystick2.rgodf,c_dfDIJoystick2.dwNumObjs*c_dfDIJoystick2.dwObjSize);
+
+ /* create an offsets array */
+ newDevice->offsets = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,c_dfDIJoystick2.dwNumObjs*sizeof(int));
+ if (newDevice->offsets == 0)
+ goto FAILED;
+
+ /* create the default transform filter */
+ newDevice->transform = create_DataFormat(&c_dfDIJoystick2, newDevice->df, newDevice->offsets);
+
return newDevice;
+
+FAILED:
+ HeapFree(GetProcessHeap(),0,newDevice->df->rgodf);
+ HeapFree(GetProcessHeap(),0,newDevice->df);
+ HeapFree(GetProcessHeap(),0,newDevice);
+ return NULL;
}
static HRESULT joydev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev)
@@ -378,6 +414,10 @@ static HRESULT joydev_create_deviceA(IDi
IsEqualGUID(&IID_IDirectInputDevice8A,riid)) {
*pdev = (IDirectInputDeviceA*) alloc_device(rguid, &JoystickAvt, dinput, &joydevs[i]);
TRACE("Creating a Joystick device (%p)\n", *pdev);
+ if (*pdev==0) {
+ ERR("out of memory\n");
+ return DIERR_OUTOFMEMORY;
+ }
return DI_OK;
} else {
return DIERR_NOINTERFACE;
@@ -406,6 +446,10 @@ static HRESULT joydev_create_deviceW(IDi
IsEqualGUID(&IID_IDirectInputDevice8W,riid)) {
*pdev = (IDirectInputDeviceW*) alloc_device(rguid, &JoystickWvt, dinput, &joydevs[i]);
TRACE("Creating a Joystick device (%p)\n", *pdev);
+ if (*pdev==0) {
+ ERR("out of memory\n");
+ return DIERR_OUTOFMEMORY;
+ }
return DI_OK;
} else {
return DIERR_NOINTERFACE;
@@ -443,10 +487,17 @@ static ULONG WINAPI JoystickAImpl_Releas
HeapFree(GetProcessHeap(),0,This->data_queue);
/* Free the DataFormat */
+ HeapFree(GetProcessHeap(), 0, This->df->rgodf);
HeapFree(GetProcessHeap(), 0, This->df);
- HeapFree(GetProcessHeap(),0,This);
- return 0;
+ /* Free the offsets array */
+ HeapFree(GetProcessHeap(),0,This->offsets);
+
+ /* release the data transform filter */
+ release_DataFormat(This->transform);
+
+ HeapFree(GetProcessHeap(),0,This);
+ return 0;
}
/******************************************************************************
@@ -478,6 +529,10 @@ static HRESULT WINAPI JoystickAImpl_SetD
return DIERR_ACQUIRED;
}
+ HeapFree(GetProcessHeap(),0,This->df->rgodf);
+ HeapFree(GetProcessHeap(),0,This->df);
+ release_DataFormat(This->transform);
+
/* Store the new data format */
This->df = HeapAlloc(GetProcessHeap(),0,df->dwSize);
if (This->df==NULL) {
@@ -491,6 +546,8 @@ static HRESULT WINAPI JoystickAImpl_SetD
}
memcpy(This->df->rgodf,df->rgodf,df->dwNumObjs*df->dwObjSize);
+ This->transform = create_DataFormat(&c_dfDIJoystick2, This->df, This->offsets);
+
return DI_OK;
}
More information about the wine-cvs
mailing list