Added support for alternate data formats.

This commit is contained in:
Robert Reif 2004-09-02 20:09:54 +00:00 committed by Alexandre Julliard
parent 6825ed811d
commit 0b12efaa9e
3 changed files with 233 additions and 145 deletions

View File

@ -211,7 +211,7 @@ void _dump_DIDATAFORMAT(const DIDATAFORMAT *df) {
} }
/* Conversion between internal data buffer and external data buffer */ /* Conversion between internal data buffer and external data buffer */
void fill_DataFormat(void *out, void *in, DataFormat *df) { void fill_DataFormat(void *out, const void *in, DataFormat *df) {
int i; int i;
char *in_c = (char *) in; char *in_c = (char *) in;
char *out_c = (char *) out; char *out_c = (char *) out;
@ -274,6 +274,13 @@ void fill_DataFormat(void *out, void *in, DataFormat *df) {
} }
} }
void release_DataFormat(DataFormat * format)
{
TRACE("Deleting DataTransform : \n");
HeapFree(GetProcessHeap(), 0, format->dt);
}
DataFormat *create_DataFormat(const DIDATAFORMAT *wine_format, LPCDIDATAFORMAT asked_format, int *offset) { DataFormat *create_DataFormat(const DIDATAFORMAT *wine_format, LPCDIDATAFORMAT asked_format, int *offset) {
DataFormat *ret; DataFormat *ret;
DataTransform *dt; DataTransform *dt;

View File

@ -48,8 +48,9 @@ typedef struct {
int internal_format_size; int internal_format_size;
DataTransform *dt; DataTransform *dt;
} DataFormat; } DataFormat;
extern void fill_DataFormat(void *out, void *in, DataFormat *df) ; extern void fill_DataFormat(void *out, const void *in, DataFormat *df) ;
extern DataFormat *create_DataFormat(const DIDATAFORMAT *wine_format, LPCDIDATAFORMAT asked_format, int *offset) ; extern DataFormat *create_DataFormat(const DIDATAFORMAT *wine_format, LPCDIDATAFORMAT asked_format, int *offset) ;
extern void release_DataFormat(DataFormat *df) ;
/* Used to fill events in the queue */ /* Used to fill events in the queue */
#define GEN_EVENT(offset,data,xtime,seq) \ #define GEN_EVENT(offset,data,xtime,seq) \

View File

@ -28,6 +28,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include <errno.h>
#ifdef HAVE_UNISTD_H #ifdef HAVE_UNISTD_H
# include <unistd.h> # include <unistd.h>
#endif #endif
@ -87,12 +88,14 @@ struct JoystickImpl
/* joystick private */ /* joystick private */
int joyfd; int joyfd;
LPDIDATAFORMAT df; DIJOYSTATE2 js; /* wine data */
LPDIDATAFORMAT user_df; /* user defined format */
DataFormat *transform; /* wine to user format converter */
int *offsets; /* object offsets */
ObjProps *props; ObjProps *props;
HANDLE hEvent; HANDLE hEvent;
LPDIDEVICEOBJECTDATA data_queue; LPDIDEVICEOBJECTDATA data_queue;
int queue_head, queue_tail, queue_len; int queue_head, queue_tail, queue_len;
DIJOYSTATE2 js;
BOOL acquired; BOOL acquired;
}; };
@ -113,7 +116,7 @@ static BOOL joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTAN
if ((dwDevType==0) || (GET_DIDEVICE_TYPE(dwDevType)==DIDEVTYPE_JOYSTICK)) { if ((dwDevType==0) || (GET_DIDEVICE_TYPE(dwDevType)==DIDEVTYPE_JOYSTICK)) {
/* check whether we have a joystick */ /* check whether we have a joystick */
if ((fd = open(JOYDEV,O_RDONLY) != -1) || (errno!=ENODEV && errno!=ENOENT)) { if ((fd = open(JOYDEV,O_RDONLY) != -1) || (errno!=ENODEV && errno!=ENOENT)) {
TRACE("Enumerating the linux Joystick device\n"); TRACE("Enumerating the linux Joystick device: %s\n",JOYDEV);
/* Return joystick */ /* Return joystick */
lpddi->guidInstance = GUID_Joystick; lpddi->guidInstance = GUID_Joystick;
@ -185,31 +188,25 @@ static JoystickImpl *alloc_device(REFGUID rguid, LPVOID jvt, IDirectInputImpl *d
newDevice->acquired = FALSE; newDevice->acquired = FALSE;
CopyMemory(&(newDevice->guid),rguid,sizeof(*rguid)); CopyMemory(&(newDevice->guid),rguid,sizeof(*rguid));
/* copy default data format */ /* wine uses DIJOYSTATE2 as it's internal format so copy
newDevice->df = HeapAlloc(GetProcessHeap(),0,c_dfDIJoystick2.dwSize); * the already defined format c_dfDIJoystick2 */
if (newDevice->df == 0) { newDevice->user_df = HeapAlloc(GetProcessHeap(),0,c_dfDIJoystick2.dwSize);
HeapFree(GetProcessHeap(), 0, newDevice); if (newDevice->user_df == 0)
return 0; goto FAILED;
}
CopyMemory(newDevice->df, &c_dfDIJoystick2, c_dfDIJoystick2.dwSize); CopyMemory(newDevice->user_df, &c_dfDIJoystick2, c_dfDIJoystick2.dwSize);
/* copy default objects */ /* copy default objects */
newDevice->df->rgodf = HeapAlloc(GetProcessHeap(),0,c_dfDIJoystick2.dwNumObjs*c_dfDIJoystick2.dwObjSize); newDevice->user_df->rgodf = HeapAlloc(GetProcessHeap(),0,c_dfDIJoystick2.dwNumObjs*c_dfDIJoystick2.dwObjSize);
if (newDevice->df->rgodf == 0) { if (newDevice->user_df->rgodf == 0)
HeapFree(GetProcessHeap(), 0, newDevice->df); goto FAILED;
HeapFree(GetProcessHeap(), 0, newDevice);
return 0; CopyMemory(newDevice->user_df->rgodf,c_dfDIJoystick2.rgodf,c_dfDIJoystick2.dwNumObjs*c_dfDIJoystick2.dwObjSize);
}
CopyMemory(newDevice->df->rgodf,c_dfDIJoystick2.rgodf,c_dfDIJoystick2.dwNumObjs*c_dfDIJoystick2.dwObjSize);
/* create default properties */ /* create default properties */
newDevice->props = HeapAlloc(GetProcessHeap(),0,c_dfDIJoystick2.dwNumObjs*sizeof(ObjProps)); newDevice->props = HeapAlloc(GetProcessHeap(),0,c_dfDIJoystick2.dwNumObjs*sizeof(ObjProps));
if (newDevice->props == 0) { if (newDevice->props == 0)
HeapFree(GetProcessHeap(), 0, newDevice->df->rgodf); goto FAILED;
HeapFree(GetProcessHeap(), 0, newDevice->df);
HeapFree(GetProcessHeap(), 0, newDevice);
return 0;
}
/* initialize default properties */ /* initialize default properties */
for (i = 0; i < c_dfDIJoystick2.dwNumObjs; i++) { for (i = 0; i < c_dfDIJoystick2.dwNumObjs; i++) {
@ -219,10 +216,31 @@ static JoystickImpl *alloc_device(REFGUID rguid, LPVOID jvt, IDirectInputImpl *d
newDevice->props[i].lSaturation = 0; newDevice->props[i].lSaturation = 0;
} }
/* 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->user_df, newDevice->offsets);
IDirectInputDevice_AddRef((LPDIRECTINPUTDEVICE8A)newDevice->dinput);
if (TRACE_ON(dinput)) if (TRACE_ON(dinput))
_dump_DIDATAFORMAT(newDevice->df); _dump_DIDATAFORMAT(newDevice->user_df);
return newDevice; return newDevice;
FAILED:
if (newDevice->props)
HeapFree(GetProcessHeap(),0,newDevice->props);
if (newDevice->user_df->rgodf)
HeapFree(GetProcessHeap(),0,newDevice->user_df->rgodf);
if (newDevice->user_df)
HeapFree(GetProcessHeap(),0,newDevice->user_df);
if (newDevice)
HeapFree(GetProcessHeap(),0,newDevice);
return 0;
} }
static HRESULT joydev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev) static HRESULT joydev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev)
@ -310,12 +328,20 @@ static ULONG WINAPI JoystickAImpl_Release(LPDIRECTINPUTDEVICE8A iface)
HeapFree(GetProcessHeap(),0,This->data_queue); HeapFree(GetProcessHeap(),0,This->data_queue);
/* Free the DataFormat */ /* Free the DataFormat */
HeapFree(GetProcessHeap(), 0, This->df->rgodf); HeapFree(GetProcessHeap(), 0, This->user_df->rgodf);
HeapFree(GetProcessHeap(), 0, This->df); HeapFree(GetProcessHeap(), 0, This->user_df);
/* Free the properties */ /* Free the properties */
HeapFree(GetProcessHeap(), 0, This->props); HeapFree(GetProcessHeap(), 0, This->props);
/* Free the offsets array */
HeapFree(GetProcessHeap(),0,This->offsets);
/* release the data transform filter */
release_DataFormat(This->transform);
IDirectInputDevice_Release((LPDIRECTINPUTDEVICE8A)This->dinput);
HeapFree(GetProcessHeap(),0,This); HeapFree(GetProcessHeap(),0,This);
return 0; return 0;
} }
@ -330,13 +356,14 @@ static HRESULT WINAPI JoystickAImpl_SetDataFormat(
{ {
ICOM_THIS(JoystickImpl,iface); ICOM_THIS(JoystickImpl,iface);
int i; int i;
LPDIDATAFORMAT new_df; LPDIDATAFORMAT new_df = 0;
LPDIOBJECTDATAFORMAT new_rgodf; LPDIOBJECTDATAFORMAT new_rgodf = 0;
ObjProps * new_props; ObjProps * new_props = 0;
int * new_offsets = 0;
TRACE("(%p,%p)\n",This,df); TRACE("(%p,%p)\n",This,df);
if (This->acquired == TRUE) { if (This->acquired) {
WARN("acquired\n"); WARN("acquired\n");
return DIERR_ACQUIRED; return DIERR_ACQUIRED;
} }
@ -346,43 +373,54 @@ static HRESULT WINAPI JoystickAImpl_SetDataFormat(
/* Store the new data format */ /* Store the new data format */
new_df = HeapAlloc(GetProcessHeap(),0,df->dwSize); new_df = HeapAlloc(GetProcessHeap(),0,df->dwSize);
if (new_df == 0) { if (new_df == 0)
WARN("out of memory\n"); goto FAILED;
return DIERR_OUTOFMEMORY;
}
new_rgodf = HeapAlloc(GetProcessHeap(),0,df->dwNumObjs*df->dwObjSize); new_rgodf = HeapAlloc(GetProcessHeap(),0,df->dwNumObjs*df->dwObjSize);
if (new_rgodf == 0) { if (new_rgodf == 0)
WARN("out of memory\n"); goto FAILED;
HeapFree(GetProcessHeap(),0,new_df);
return DIERR_OUTOFMEMORY;
}
new_props = HeapAlloc(GetProcessHeap(),0,df->dwNumObjs*sizeof(ObjProps)); new_props = HeapAlloc(GetProcessHeap(),0,df->dwNumObjs*sizeof(ObjProps));
if (This->props == 0) { if (new_props == 0)
WARN("out of memory\n"); goto FAILED;
HeapFree(GetProcessHeap(),0,new_rgodf);
HeapFree(GetProcessHeap(),0,new_df);
return DIERR_OUTOFMEMORY;
}
HeapFree(GetProcessHeap(),0,This->df); new_offsets = HeapAlloc(GetProcessHeap(),0,df->dwNumObjs*sizeof(int));
HeapFree(GetProcessHeap(),0,This->df->rgodf); if (new_offsets == 0)
goto FAILED;
HeapFree(GetProcessHeap(),0,This->user_df);
HeapFree(GetProcessHeap(),0,This->user_df->rgodf);
HeapFree(GetProcessHeap(),0,This->props); HeapFree(GetProcessHeap(),0,This->props);
HeapFree(GetProcessHeap(),0,This->offsets);
release_DataFormat(This->transform);
This->df = new_df; This->user_df = new_df;
CopyMemory(This->df, df, df->dwSize); CopyMemory(This->user_df, df, df->dwSize);
This->df->rgodf = new_rgodf; This->user_df->rgodf = new_rgodf;
CopyMemory(This->df->rgodf,df->rgodf,df->dwNumObjs*df->dwObjSize); CopyMemory(This->user_df->rgodf,df->rgodf,df->dwNumObjs*df->dwObjSize);
This->props = new_props; This->props = new_props;
for (i = 0; i < df->dwNumObjs; i++) { for (i = 0; i < df->dwNumObjs; i++) {
This->props[i].lMin = 0; This->props[i].lMin = 0;
This->props[i].lMax = 0xffff; This->props[i].lMax = 0xffff;
This->props[i].lDeadZone = 1000; This->props[i].lDeadZone = 1000;
This->props[i].lSaturation = 0; This->props[i].lSaturation = 0;
} }
This->offsets = new_offsets;
This->transform = create_DataFormat(&c_dfDIJoystick2, This->user_df, This->offsets);
return DI_OK; return DI_OK;
FAILED:
WARN("out of memory\n");
if (new_offsets)
HeapFree(GetProcessHeap(),0,new_offsets);
if (new_props)
HeapFree(GetProcessHeap(),0,new_props);
if (new_rgodf)
HeapFree(GetProcessHeap(),0,new_rgodf);
if (new_df)
HeapFree(GetProcessHeap(),0,new_df);
return DIERR_OUTOFMEMORY;
} }
/****************************************************************************** /******************************************************************************
@ -392,13 +430,26 @@ static HRESULT WINAPI JoystickAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
{ {
ICOM_THIS(JoystickImpl,iface); ICOM_THIS(JoystickImpl,iface);
TRACE("(this=%p)\n",This); TRACE("(%p)\n",This);
if (This->joyfd!=-1)
return 0; if (This->acquired) {
This->joyfd=open(JOYDEV,O_RDONLY); WARN("already acquired\n");
if (This->joyfd==-1) return S_FALSE;
return DIERR_NOTFOUND; }
/* open the joystick device */
if (This->joyfd==-1) {
TRACE("opening joystick device %s\n", JOYDEV);
This->joyfd=open(JOYDEV,O_RDONLY);
if (This->joyfd==-1) {
ERR("open(%s) failed: %s\n", JOYDEV, strerror(errno));
return DIERR_NOTFOUND;
}
}
This->acquired = TRUE; This->acquired = TRUE;
return DI_OK; return DI_OK;
} }
@ -409,24 +460,32 @@ static HRESULT WINAPI JoystickAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface)
{ {
ICOM_THIS(JoystickImpl,iface); ICOM_THIS(JoystickImpl,iface);
TRACE("(this=%p)\n",This); TRACE("(%p)\n",This);
if (!This->acquired) {
WARN("not acquired\n");
return DIERR_NOTACQUIRED;
}
if (This->joyfd!=-1) { if (This->joyfd!=-1) {
close(This->joyfd); TRACE("closing joystick device\n");
This->joyfd = -1; close(This->joyfd);
This->joyfd = -1;
This->acquired = FALSE; This->acquired = FALSE;
return DI_OK; return DI_OK;
} }
This->acquired = FALSE; This->acquired = FALSE;
return DI_NOEFFECT; return DI_NOEFFECT;
} }
LONG map_axis(JoystickImpl * This, short val, short index) LONG map_axis(JoystickImpl * This, short val, short index)
{ {
double fval = val; double fval = val;
double fmin = This->props[index].lMin; double fmin = This->props[index].lMin;
double fmax = This->props[index].lMax; double fmax = This->props[index].lMax;
double fret; double fret;
fret = (((fval + 32767.0) * (fmax - fmin)) / (32767.0*2.0)) + fmin; fret = (((fval + 32767.0) * (fmax - fmin)) / (32767.0*2.0)) + fmin;
@ -438,14 +497,28 @@ LONG map_axis(JoystickImpl * This, short val, short index)
return fret; return fret;
} }
/* convert user format offset to user format object index */
int offset_to_object(JoystickImpl *This, int offset)
{
int i;
for (i = 0; i < This->user_df->dwNumObjs; i++) {
if (This->user_df->rgodf[i].dwOfs == offset)
return i;
}
return -1;
}
static void joy_polldev(JoystickImpl *This) { static void joy_polldev(JoystickImpl *This) {
struct timeval tv; struct timeval tv;
fd_set readfds; fd_set readfds;
struct js_event jse; struct js_event jse;
TRACE("(%p)\n", This);
if (This->joyfd==-1) { if (This->joyfd==-1) {
WARN("device not open\n"); WARN("no device\n");
return; return;
} }
while (1) { while (1) {
memset(&tv,0,sizeof(tv)); memset(&tv,0,sizeof(tv));
@ -456,51 +529,53 @@ static void joy_polldev(JoystickImpl *This) {
if (sizeof(jse)!=read(This->joyfd,&jse,sizeof(jse))) { if (sizeof(jse)!=read(This->joyfd,&jse,sizeof(jse))) {
return; return;
} }
TRACE("js_event: type 0x%x, number %d, value %d\n", TRACE("js_event: type 0x%x, number %d, value %d\n",
jse.type,jse.number,jse.value); jse.type,jse.number,jse.value);
if (jse.type & JS_EVENT_BUTTON) { if (jse.type & JS_EVENT_BUTTON) {
GEN_EVENT(DIJOFS_BUTTON(jse.number),jse.value?0x80:0x00,jse.time,(This->dinput->evsequence)++); int offset = This->offsets[jse.number + 12];
This->js.rgbButtons[jse.number] = jse.value?0x80:0x00; int value = jse.value?0x80:0x00;
}
if (jse.type & JS_EVENT_AXIS) { This->js.rgbButtons[jse.number] = value;
switch (jse.number) { GEN_EVENT(offset,value,jse.time,(This->dinput->evsequence)++);
case 0: } else if (jse.type & JS_EVENT_AXIS) {
GEN_EVENT(jse.number*4,jse.value,jse.time,(This->dinput->evsequence)++); if (jse.number < 8) {
This->js.lX = map_axis(This, jse.value, jse.number); int offset = This->offsets[jse.number];
break; int index = offset_to_object(This, offset);
case 1: LONG value = map_axis(This, jse.value, index);
GEN_EVENT(jse.number*4,jse.value,jse.time,(This->dinput->evsequence)++);
This->js.lY = map_axis(This, jse.value, jse.number); /* FIXME do deadzone and saturation here */
break;
case 2: switch (jse.number) {
GEN_EVENT(jse.number*4,jse.value,jse.time,(This->dinput->evsequence)++); case 0:
This->js.lZ = map_axis(This, jse.value, jse.number); This->js.lX = value;
break; break;
case 3: case 1:
GEN_EVENT(jse.number*4,jse.value,jse.time,(This->dinput->evsequence)++); This->js.lY = value;
This->js.lRx = map_axis(This, jse.value, jse.number); break;
break; case 2:
case 4: This->js.lZ = value;
GEN_EVENT(jse.number*4,jse.value,jse.time,(This->dinput->evsequence)++); break;
This->js.lRy = map_axis(This, jse.value, jse.number); case 3:
break; This->js.lRx = value;
case 5: break;
GEN_EVENT(jse.number*4,jse.value,jse.time,(This->dinput->evsequence)++); case 4:
This->js.lRz = map_axis(This, jse.value, jse.number); This->js.lRy = value;
break; break;
case 6: case 5:
GEN_EVENT(jse.number*4,jse.value,jse.time,(This->dinput->evsequence)++); This->js.lRz = value;
This->js.rglSlider[0] = map_axis(This, jse.value, jse.number); break;
break; case 6:
case 7: This->js.rglSlider[0] = value;
GEN_EVENT(jse.number*4,jse.value,jse.time,(This->dinput->evsequence)++); break;
This->js.rglSlider[1] = map_axis(This, jse.value, jse.number); case 7:
break; This->js.rglSlider[1] = value;
default: break;
FIXME("more than 8 axes (%d) not handled!\n",jse.number); }
break;
} GEN_EVENT(offset,value,jse.time,(This->dinput->evsequence)++);
} } else
WARN("axis %d not supported\n", jse.number);
}
} }
} }
@ -517,14 +592,17 @@ static HRESULT WINAPI JoystickAImpl_GetDeviceState(
TRACE("(%p,0x%08lx,%p)\n",This,len,ptr); TRACE("(%p,0x%08lx,%p)\n",This,len,ptr);
joy_polldev(This); if (!This->acquired) {
if ((len != sizeof(DIJOYSTATE)) && (len != sizeof(DIJOYSTATE2))) { WARN("not acquired\n");
FIXME("len %ld is not sizeof(DIJOYSTATE), unsupported format.\n",len); return DIERR_NOTACQUIRED;
return E_FAIL;
} }
memcpy(ptr,&(This->js),len);
This->queue_head = 0; /* update joystick state */
This->queue_tail = 0; joy_polldev(This);
/* convert and copy data to user supplied buffer */
fill_DataFormat(ptr, &This->js, This->transform);
return DI_OK; return DI_OK;
} }
@ -555,26 +633,22 @@ int find_property(JoystickImpl * This, LPCDIPROPHEADER ph)
{ {
int i; int i;
if (ph->dwHow == DIPH_BYOFFSET) { if (ph->dwHow == DIPH_BYOFFSET) {
for (i = 0; i < This->df->dwNumObjs; i++) { return offset_to_object(This, ph->dwObj);
if (This->df->rgodf[i].dwOfs == ph->dwObj) {
return i;
}
}
} else if (ph->dwHow == DIPH_BYID) { } else if (ph->dwHow == DIPH_BYID) {
int axis = 0; int axis = 0;
int button = 0; int button = 0;
for (i = 0; i < This->df->dwNumObjs; i++) { for (i = 0; i < This->user_df->dwNumObjs; i++) {
DWORD type = 0; DWORD type = 0;
if (DIDFT_GETTYPE(This->df->rgodf[i].dwType) & DIDFT_AXIS) { if (DIDFT_GETTYPE(This->user_df->rgodf[i].dwType) & DIDFT_AXIS) {
axis++; axis++;
type = DIDFT_GETTYPE(This->df->rgodf[i].dwType) | type = DIDFT_GETTYPE(This->user_df->rgodf[i].dwType) |
DIDFT_MAKEINSTANCE(axis << WINE_JOYSTICK_AXIS_BASE); DIDFT_MAKEINSTANCE(axis << WINE_JOYSTICK_AXIS_BASE);
TRACE("type = 0x%08lx\n", type); TRACE("type = 0x%08lx\n", type);
} }
if (DIDFT_GETTYPE(This->df->rgodf[i].dwType) & DIDFT_BUTTON) { if (DIDFT_GETTYPE(This->user_df->rgodf[i].dwType) & DIDFT_BUTTON) {
button++; button++;
type = DIDFT_GETTYPE(This->df->rgodf[i].dwType) | type = DIDFT_GETTYPE(This->user_df->rgodf[i].dwType) |
DIDFT_MAKEINSTANCE(button << WINE_JOYSTICK_BUTTON_BASE); DIDFT_MAKEINSTANCE(button << WINE_JOYSTICK_BUTTON_BASE);
TRACE("type = 0x%08lx\n", type); TRACE("type = 0x%08lx\n", type);
} }
if (type == ph->dwObj) { if (type == ph->dwObj) {
@ -616,7 +690,7 @@ static HRESULT WINAPI JoystickAImpl_SetProperty(
This->props[obj].lMin = pr->lMin; This->props[obj].lMin = pr->lMin;
This->props[obj].lMax = pr->lMax; This->props[obj].lMax = pr->lMax;
return DI_OK; return DI_OK;
} }
break; break;
} }
case (DWORD)DIPROP_DEADZONE: { case (DWORD)DIPROP_DEADZONE: {
@ -727,7 +801,13 @@ static HRESULT WINAPI JoystickAImpl_GetCapabilities(
static HRESULT WINAPI JoystickAImpl_Poll(LPDIRECTINPUTDEVICE8A iface) static HRESULT WINAPI JoystickAImpl_Poll(LPDIRECTINPUTDEVICE8A iface)
{ {
ICOM_THIS(JoystickImpl,iface); ICOM_THIS(JoystickImpl,iface);
TRACE("()\n");
TRACE("(%p)\n",This);
if (!This->acquired) {
WARN("not acquired\n");
return DIERR_NOTACQUIRED;
}
joy_polldev(This); joy_polldev(This);
return DI_OK; return DI_OK;
@ -883,7 +963,7 @@ static HRESULT WINAPI JoystickAImpl_GetProperty(
case (DWORD) DIPROP_RANGE: { case (DWORD) DIPROP_RANGE: {
LPDIPROPRANGE pr = (LPDIPROPRANGE) pdiph; LPDIPROPRANGE pr = (LPDIPROPRANGE) pdiph;
int obj = find_property(This, pdiph); int obj = find_property(This, pdiph);
/* The app is querying the current range of the axis /* The app is querying the current range of the axis
* return the lMin and lMax values */ * return the lMin and lMax values */
if (obj >= 0) { if (obj >= 0) {
pr->lMin = This->props[obj].lMin; pr->lMin = This->props[obj].lMin;
@ -960,16 +1040,16 @@ HRESULT WINAPI JoystickAImpl_GetObjectInfo(
switch (dwHow) { switch (dwHow) {
case DIPH_BYOFFSET: case DIPH_BYOFFSET:
for (i = 0; i < This->df->dwNumObjs; i++) { for (i = 0; i < This->user_df->dwNumObjs; i++) {
if (This->df->rgodf[i].dwOfs == dwObj) { if (This->user_df->rgodf[i].dwOfs == dwObj) {
if (This->df->rgodf[i].pguid) if (This->user_df->rgodf[i].pguid)
didoiA.guidType = *This->df->rgodf[i].pguid; didoiA.guidType = *This->user_df->rgodf[i].pguid;
else else
didoiA.guidType = GUID_NULL; didoiA.guidType = GUID_NULL;
didoiA.dwOfs = dwObj; didoiA.dwOfs = dwObj;
didoiA.dwType = This->df->rgodf[i].dwType; didoiA.dwType = This->user_df->rgodf[i].dwType;
didoiA.dwFlags = This->df->rgodf[i].dwFlags; didoiA.dwFlags = This->user_df->rgodf[i].dwFlags;
strcpy(didoiA.tszName, "?????"); strcpy(didoiA.tszName, "?????");
CopyMemory(pdidoi, &didoiA, pdidoi->dwSize); CopyMemory(pdidoi, &didoiA, pdidoi->dwSize);
return DI_OK; return DI_OK;
} }