- some TRACEing improvements

- fix mouse Acquire which switched right and middle buttons
- reset the mouse cursor at its original location on Unacquiring the
  device
This commit is contained in:
Lionel Ulmer 2004-06-02 00:36:54 +00:00 committed by Alexandre Julliard
parent 6e28fe7144
commit 04d77f4dcc
5 changed files with 1276 additions and 1195 deletions

View File

@ -42,77 +42,171 @@ WINE_DEFAULT_DEBUG_CHANNEL(dinput);
* Various debugging tools
*/
void _dump_cooperativelevel_DI(DWORD dwFlags) {
if (TRACE_ON(dinput)) {
int i;
const struct {
static const struct {
DWORD mask;
const char *name;
} flags[] = {
#define FE(x) { x, #x},
FE(DISCL_BACKGROUND)
FE(DISCL_EXCLUSIVE)
FE(DISCL_FOREGROUND)
#define FE(x) { x, #x}
FE(DISCL_BACKGROUND),
FE(DISCL_EXCLUSIVE),
FE(DISCL_FOREGROUND),
FE(DISCL_NONEXCLUSIVE)
#undef FE
};
for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
for (i = 0; i < (sizeof(flags) / sizeof(flags[0])); i++)
if (flags[i].mask & dwFlags)
DPRINTF("%s ",flags[i].name);
DPRINTF("\n");
}
}
void _dump_EnumObjects_flags(DWORD dwFlags) {
if (TRACE_ON(dinput)) {
int i;
const struct {
DWORD type, instance;
static const struct {
DWORD mask;
const char *name;
} flags[] = {
#define FE(x) { x, #x},
FE(DIDFT_ABSAXIS)
FE(DIDFT_ALL)
FE(DIDFT_AXIS)
FE(DIDFT_BUTTON)
FE(DIDFT_COLLECTION)
FE(DIDFT_FFACTUATOR)
FE(DIDFT_FFEFFECTTRIGGER)
FE(DIDFT_NOCOLLECTION)
FE(DIDFT_NODATA)
#define FE(x) { x, #x}
FE(DIDFT_RELAXIS),
FE(DIDFT_ABSAXIS),
FE(DIDFT_PSHBUTTON),
FE(DIDFT_TGLBUTTON),
FE(DIDFT_POV),
FE(DIDFT_COLLECTION),
FE(DIDFT_NODATA),
FE(DIDFT_FFACTUATOR),
FE(DIDFT_FFEFFECTTRIGGER),
FE(DIDFT_OUTPUT)
FE(DIDFT_POV)
FE(DIDFT_PSHBUTTON)
FE(DIDFT_RELAXIS)
FE(DIDFT_TGLBUTTON)
#undef FE
};
if (dwFlags == DIDFT_ALL) {
DPRINTF("DIDFT_ALL");
return;
type = (dwFlags & 0xFF0000FF);
instance = ((dwFlags >> 8) & 0xFFFF);
DPRINTF("Type:");
if (type == DIDFT_ALL) {
DPRINTF(" DIDFT_ALL");
} else {
for (i = 0; i < (sizeof(flags) / sizeof(flags[0])); i++) {
if (flags[i].mask & type) {
type &= ~flags[i].mask;
DPRINTF(" %s",flags[i].name);
}
}
if (type) {
DPRINTF(" (unhandled: %08lx)", type);
}
}
DPRINTF(" / Instance: ");
if (instance == ((DIDFT_ANYINSTANCE >> 8) & 0xFFFF)) {
DPRINTF("DIDFT_ANYINSTANCE");
} else {
DPRINTF("%3ld", instance);
}
}
for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
if (flags[i].mask & dwFlags)
DPRINTF("%s ",flags[i].name);
if (dwFlags & DIDFT_INSTANCEMASK)
DPRINTF("Instance(%04lx) ", dwFlags >> 8);
}
void _dump_DIPROPHEADER(DIPROPHEADER *diph) {
if (TRACE_ON(dinput)) {
DPRINTF(" - dwObj = 0x%08lx\n", diph->dwObj);
DPRINTF(" - dwHow = %s\n",
((diph->dwHow == DIPH_DEVICE) ? "DIPH_DEVICE" :
((diph->dwHow == DIPH_BYOFFSET) ? "DIPH_BYOFFSET" :
((diph->dwHow == DIPH_BYID)) ? "DIPH_BYID" : "unknown")));
}
}
void _dump_OBJECTINSTANCEA(DIDEVICEOBJECTINSTANCEA *ddoi) {
if (TRACE_ON(dinput)) {
DPRINTF(" - enumerating : %s - %2ld - 0x%08lx - %s\n",
debugstr_guid(&ddoi->guidType), ddoi->dwOfs, ddoi->dwType, ddoi->tszName);
DPRINTF(" - enumerating : %s ('%s') - %2ld - 0x%08lx - %s\n",
debugstr_guid(&ddoi->guidType), _dump_dinput_GUID(&ddoi->guidType), ddoi->dwOfs, ddoi->dwType, ddoi->tszName);
}
}
void _dump_OBJECTINSTANCEW(DIDEVICEOBJECTINSTANCEW *ddoi) {
if (TRACE_ON(dinput)) {
DPRINTF(" - enumerating : %s - %2ld - 0x%08lx - %s\n",
debugstr_guid(&ddoi->guidType), ddoi->dwOfs, ddoi->dwType, debugstr_w(ddoi->tszName));
DPRINTF(" - enumerating : %s ('%s'), - %2ld - 0x%08lx - %s\n",
debugstr_guid(&ddoi->guidType), _dump_dinput_GUID(&ddoi->guidType), ddoi->dwOfs, ddoi->dwType, debugstr_w(ddoi->tszName));
}
}
/* This function is a helper to convert a GUID into any possible DInput GUID out there */
const char *_dump_dinput_GUID(const GUID *guid) {
int i;
static const struct {
const GUID *guid;
const char *name;
} guids[] = {
#define FE(x) { &x, #x}
FE(GUID_XAxis),
FE(GUID_YAxis),
FE(GUID_ZAxis),
FE(GUID_RxAxis),
FE(GUID_RyAxis),
FE(GUID_RzAxis),
FE(GUID_Slider),
FE(GUID_Button),
FE(GUID_Key),
FE(GUID_POV),
FE(GUID_Unknown),
FE(GUID_SysMouse),
FE(GUID_SysKeyboard),
FE(GUID_Joystick),
FE(GUID_ConstantForce),
FE(GUID_RampForce),
FE(GUID_Square),
FE(GUID_Sine),
FE(GUID_Triangle),
FE(GUID_SawtoothUp),
FE(GUID_SawtoothDown),
FE(GUID_Spring),
FE(GUID_Damper),
FE(GUID_Inertia),
FE(GUID_Friction),
FE(GUID_CustomForce)
#undef FE
};
if (guid == NULL)
return "null GUID";
for (i = 0; i < (sizeof(guids) / sizeof(guids[0])); i++) {
if (IsEqualGUID(guids[i].guid, guid)) {
return guids[i].name;
}
}
return "Unknown GUID";
}
void _dump_DIDATAFORMAT(const DIDATAFORMAT *df) {
int i;
TRACE("Dumping DIDATAFORMAT structure:\n");
TRACE(" - dwSize: %ld\n", df->dwSize);
if (df->dwSize != sizeof(DIDATAFORMAT)) {
WARN("Non-standard DIDATAFORMAT structure size (%ld instead of %d).\n", df->dwSize, sizeof(DIDATAFORMAT));
}
TRACE(" - dwObjsize: %ld\n", df->dwObjSize);
if (df->dwObjSize != sizeof(DIOBJECTDATAFORMAT)) {
WARN("Non-standard DIOBJECTDATAFORMAT structure size (%ld instead of %d).\n", df->dwObjSize, sizeof(DIOBJECTDATAFORMAT));
}
TRACE(" - dwFlags: 0x%08lx (", df->dwFlags);
switch (df->dwFlags) {
case DIDF_ABSAXIS: TRACE("DIDF_ABSAXIS"); break;
case DIDF_RELAXIS: TRACE("DIDF_RELAXIS"); break;
default: TRACE("unknown"); break;
}
TRACE(")\n");
TRACE(" - dwDataSize: %ld\n", df->dwDataSize);
TRACE(" - dwNumObjs: %ld\n", df->dwNumObjs);
for (i = 0; i < df->dwNumObjs; i++) {
TRACE(" - Object %d:\n", i);
TRACE(" * GUID: %s ('%s')\n", debugstr_guid(df->rgodf[i].pguid), _dump_dinput_GUID(df->rgodf[i].pguid));
TRACE(" * dwOfs: %ld\n", df->rgodf[i].dwOfs);
TRACE(" * dwType: 0x%08lx\n", df->rgodf[i].dwType);
TRACE(" "); _dump_EnumObjects_flags(df->rgodf[i].dwType); TRACE("\n");
TRACE(" * dwFlags: 0x%08lx\n", df->rgodf[i].dwFlags);
}
}
@ -149,6 +243,7 @@ void fill_DataFormat(void *out, void *in, DataFormat *df) {
default:
memcpy((out_c + df->dt[i].offset_out), (in_c + df->dt[i].offset_in), df->dt[i].size);
break;
}
} else {
switch (df->dt[i].size) {
@ -172,13 +267,14 @@ void fill_DataFormat(void *out, void *in, DataFormat *df) {
default:
memset((out_c + df->dt[i].offset_out), df->dt[i].size, 0);
break;
}
}
}
}
}
DataFormat *create_DataFormat(DIDATAFORMAT *wine_format, LPCDIDATAFORMAT asked_format, int *offset) {
DataFormat *create_DataFormat(const DIDATAFORMAT *wine_format, LPCDIDATAFORMAT asked_format, int *offset) {
DataFormat *ret;
DataTransform *dt;
int i, j;
@ -202,22 +298,36 @@ DataFormat *create_DataFormat(DIDATAFORMAT *wine_format, LPCDIDATAFORMAT asked_f
if (done[j] == 1)
continue;
if (((asked_format->rgodf[j].pguid == NULL) || (IsEqualGUID(wine_format->rgodf[i].pguid, asked_format->rgodf[j].pguid)))
if (/* Check if the application either requests any GUID and if not, it if matches
* the GUID of the Wine object.
*/
((asked_format->rgodf[j].pguid == NULL) ||
(IsEqualGUID(wine_format->rgodf[i].pguid, asked_format->rgodf[j].pguid)))
&&
(wine_format->rgodf[i].dwType & asked_format->rgodf[j].dwType)) {
(/* Then check if it accepts any instance id, and if not, if it matches Wine's
* instance id.
*/
((asked_format->rgodf[j].dwType & 0x00FFFF00) == DIDFT_ANYINSTANCE) ||
(DIDFT_GETINSTANCE(wine_format->rgodf[i].dwType) == DIDFT_GETINSTANCE(asked_format->rgodf[j].dwType)))) {
done[j] = 1;
TRACE("Matching : \n");
TRACE(" - Asked (%d) : %s - Ofs = %3ld - (Type = 0x%02x | Instance = %04x)\n",
j, debugstr_guid(asked_format->rgodf[j].pguid),
asked_format->rgodf[j].dwOfs,
DIDFT_GETTYPE(asked_format->rgodf[j].dwType), DIDFT_GETINSTANCE(asked_format->rgodf[j].dwType));
TRACE(" - Asked (%d) :\n", j);
TRACE(" * GUID: %s ('%s')\n",
debugstr_guid(asked_format->rgodf[j].pguid),
_dump_dinput_GUID(asked_format->rgodf[j].pguid));
TRACE(" * Offset: %3ld\n", asked_format->rgodf[j].dwOfs);
TRACE(" * dwType: %08lx\n", asked_format->rgodf[j].dwType);
TRACE(" "); _dump_EnumObjects_flags(asked_format->rgodf[j].dwType); TRACE("\n");
TRACE(" - Wine (%d) : %s - Ofs = %3ld - (Type = 0x%02x | Instance = %04x)\n",
j, debugstr_guid(wine_format->rgodf[i].pguid),
wine_format->rgodf[i].dwOfs,
DIDFT_GETTYPE(wine_format->rgodf[i].dwType), DIDFT_GETINSTANCE(wine_format->rgodf[i].dwType));
TRACE(" - Wine (%d) :\n", j);
TRACE(" * GUID: %s ('%s')\n",
debugstr_guid(wine_format->rgodf[j].pguid),
_dump_dinput_GUID(wine_format->rgodf[j].pguid));
TRACE(" * Offset: %3ld\n", wine_format->rgodf[j].dwOfs);
TRACE(" * dwType: %08lx\n", wine_format->rgodf[j].dwType);
TRACE(" "); _dump_EnumObjects_flags(wine_format->rgodf[j].dwType); TRACE("\n");
if (wine_format->rgodf[i].dwType & DIDFT_BUTTON)
dt[index].size = sizeof(BYTE);
@ -243,11 +353,13 @@ DataFormat *create_DataFormat(DIDATAFORMAT *wine_format, LPCDIDATAFORMAT asked_f
TRACE("Setting to default value :\n");
for (j = 0; j < asked_format->dwNumObjs; j++) {
if (done[j] == 0) {
TRACE(" - Asked (%d) : %s - Ofs = %3ld - (Type = 0x%02x | Instance = %04x)\n",
j, debugstr_guid(asked_format->rgodf[j].pguid),
asked_format->rgodf[j].dwOfs,
DIDFT_GETTYPE(asked_format->rgodf[j].dwType), DIDFT_GETINSTANCE(asked_format->rgodf[j].dwType));
TRACE(" - Asked (%d) :\n", j);
TRACE(" * GUID: %s ('%s')\n",
debugstr_guid(asked_format->rgodf[j].pguid),
_dump_dinput_GUID(asked_format->rgodf[j].pguid));
TRACE(" * Offset: %3ld\n", asked_format->rgodf[j].dwOfs);
TRACE(" * dwType: %08lx\n", asked_format->rgodf[j].dwType);
TRACE(" "); _dump_EnumObjects_flags(asked_format->rgodf[j].dwType); TRACE("\n");
if (asked_format->rgodf[j].dwType & DIDFT_BUTTON)
dt[index].size = sizeof(BYTE);
@ -316,23 +428,12 @@ BOOL DIEnumDevicesCallbackAtoW(LPCDIDEVICEOBJECTINSTANCEA lpddi, LPVOID lpvRef)
HRESULT WINAPI IDirectInputDevice2AImpl_SetDataFormat(
LPDIRECTINPUTDEVICE8A iface,LPCDIDATAFORMAT df
) {
int i;
ICOM_THIS(IDirectInputDevice2AImpl,iface);
TRACE("(this=%p,%p)\n",This,df);
TRACE("df.dwSize=%ld\n",df->dwSize);
TRACE("(df.dwObjsize=%ld)\n",df->dwObjSize);
TRACE("(df.dwFlags=0x%08lx)\n",df->dwFlags);
TRACE("(df.dwDataSize=%ld)\n",df->dwDataSize);
TRACE("(df.dwNumObjs=%ld)\n",df->dwNumObjs);
_dump_DIDATAFORMAT(df);
for (i=0;i<df->dwNumObjs;i++) {
TRACE("df.rgodf[%d].guid %s\n",i,debugstr_guid(df->rgodf[i].pguid));
TRACE("df.rgodf[%d].dwOfs %ld\n",i,df->rgodf[i].dwOfs);
TRACE("dwType 0x%02x,dwInstance %d\n",DIDFT_GETTYPE(df->rgodf[i].dwType),DIDFT_GETINSTANCE(df->rgodf[i].dwType));
TRACE("df.rgodf[%d].dwFlags 0x%08lx\n",i,df->rgodf[i].dwFlags);
}
return DI_OK;
}
@ -514,6 +615,7 @@ HRESULT WINAPI IDirectInputDevice2AImpl_GetDeviceInfo(
return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2WImpl_GetDeviceInfo(
LPDIRECTINPUTDEVICE8W iface,
LPDIDEVICEINSTANCEW pdidi)

View File

@ -49,7 +49,7 @@ typedef struct {
DataTransform *dt;
} DataFormat;
extern void fill_DataFormat(void *out, void *in, DataFormat *df) ;
extern DataFormat *create_DataFormat(DIDATAFORMAT *wine_format, LPCDIDATAFORMAT asked_format, int *offset) ;
extern DataFormat *create_DataFormat(const DIDATAFORMAT *wine_format, LPCDIDATAFORMAT asked_format, int *offset) ;
/* Used to fill events in the queue */
#define GEN_EVENT(offset,data,xtime,seq) \
@ -91,6 +91,8 @@ extern void _dump_EnumObjects_flags(DWORD dwFlags) ;
extern void _dump_DIPROPHEADER(DIPROPHEADER *diph) ;
extern void _dump_OBJECTINSTANCEA(DIDEVICEOBJECTINSTANCEA *ddoi) ;
extern void _dump_OBJECTINSTANCEW(DIDEVICEOBJECTINSTANCEW *ddoi) ;
extern void _dump_DIDATAFORMAT(const DIDATAFORMAT *df) ;
extern const char *_dump_dinput_GUID(const GUID *guid) ;
/* And the stubs */
extern HRESULT WINAPI IDirectInputDevice2AImpl_SetDataFormat(

View File

@ -258,22 +258,10 @@ static HRESULT WINAPI JoystickAImpl_SetDataFormat(
)
{
ICOM_THIS(JoystickImpl,iface);
int i;
TRACE("(this=%p,%p)\n",This,df);
TRACE("(df.dwSize=%ld)\n",df->dwSize);
TRACE("(df.dwObjsize=%ld)\n",df->dwObjSize);
TRACE("(df.dwFlags=0x%08lx)\n",df->dwFlags);
TRACE("(df.dwDataSize=%ld)\n",df->dwDataSize);
TRACE("(df.dwNumObjs=%ld)\n",df->dwNumObjs);
for (i=0;i<df->dwNumObjs;i++) {
TRACE("df.rgodf[%d].guid %s (%p)\n",i,debugstr_guid(df->rgodf[i].pguid), df->rgodf[i].pguid);
TRACE("df.rgodf[%d].dwOfs %ld\n",i,df->rgodf[i].dwOfs);
TRACE("dwType 0x%02x,dwInstance %d\n",DIDFT_GETTYPE(df->rgodf[i].dwType),DIDFT_GETINSTANCE(df->rgodf[i].dwType));
TRACE("df.rgodf[%d].dwFlags 0x%08lx\n",i,df->rgodf[i].dwFlags);
}
_dump_DIDATAFORMAT(df);
/* Store the new data format */
This->df = HeapAlloc(GetProcessHeap(),0,df->dwSize);

View File

@ -349,22 +349,10 @@ static HRESULT WINAPI JoystickAImpl_SetDataFormat(
)
{
ICOM_THIS(JoystickImpl,iface);
int i;
TRACE("(this=%p,%p)\n",This,df);
TRACE("(df.dwSize=%ld)\n",df->dwSize);
TRACE("(df.dwObjsize=%ld)\n",df->dwObjSize);
TRACE("(df.dwFlags=0x%08lx)\n",df->dwFlags);
TRACE("(df.dwDataSize=%ld)\n",df->dwDataSize);
TRACE("(df.dwNumObjs=%ld)\n",df->dwNumObjs);
for (i=0;i<df->dwNumObjs;i++) {
TRACE("df.rgodf[%d].guid %s (%p)\n",i,debugstr_guid(df->rgodf[i].pguid), df->rgodf[i].pguid);
TRACE("df.rgodf[%d].dwOfs %ld\n",i,df->rgodf[i].dwOfs);
TRACE("dwType 0x%02x,dwInstance %d\n",DIDFT_GETTYPE(df->rgodf[i].dwType),DIDFT_GETINSTANCE(df->rgodf[i].dwType));
TRACE("df.rgodf[%d].dwFlags 0x%08lx\n",i,df->rgodf[i].dwFlags);
}
_dump_DIDATAFORMAT(df);
/* Store the new data format */
This->df = HeapAlloc(GetProcessHeap(),0,df->dwSize);

View File

@ -42,12 +42,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(dinput);
/* Wine mouse driver object instances */
#define WINE_MOUSE_X_AXIS_INSTANCE 0x0001
#define WINE_MOUSE_Y_AXIS_INSTANCE 0x0002
#define WINE_MOUSE_Z_AXIS_INSTANCE 0x0004
#define WINE_MOUSE_L_BUTTON_INSTANCE 0x0008
#define WINE_MOUSE_R_BUTTON_INSTANCE 0x0010
#define WINE_MOUSE_M_BUTTON_INSTANCE 0x0020
#define WINE_MOUSE_X_AXIS_INSTANCE 0
#define WINE_MOUSE_Y_AXIS_INSTANCE 1
#define WINE_MOUSE_Z_AXIS_INSTANCE 2
#define WINE_MOUSE_L_BUTTON_INSTANCE 0
#define WINE_MOUSE_R_BUTTON_INSTANCE 1
#define WINE_MOUSE_M_BUTTON_INSTANCE 2
#define WINE_MOUSE_D_BUTTON_INSTANCE 3
/* ------------------------------- */
/* Wine mouse internal data format */
@ -70,7 +71,7 @@ typedef struct {
#define WINE_INTERNALMOUSE_NUM_OBJS 6
static DIOBJECTDATAFORMAT Wine_InternalMouseObjectFormat[WINE_INTERNALMOUSE_NUM_OBJS] = {
static const DIOBJECTDATAFORMAT Wine_InternalMouseObjectFormat[WINE_INTERNALMOUSE_NUM_OBJS] = {
{ &GUID_XAxis, FIELD_OFFSET(Wine_InternalMouseData, lX),
DIDFT_MAKEINSTANCE(WINE_MOUSE_X_AXIS_INSTANCE) | DIDFT_RELAXIS, 0 },
{ &GUID_YAxis, FIELD_OFFSET(Wine_InternalMouseData, lY),
@ -85,13 +86,13 @@ static DIOBJECTDATAFORMAT Wine_InternalMouseObjectFormat[WINE_INTERNALMOUSE_NUM_
DIDFT_MAKEINSTANCE(WINE_MOUSE_M_BUTTON_INSTANCE) | DIDFT_PSHBUTTON, 0 }
};
static DIDATAFORMAT Wine_InternalMouseFormat = {
static const DIDATAFORMAT Wine_InternalMouseFormat = {
0, /* dwSize - unused */
0, /* dwObjsize - unused */
0, /* dwFlags - unused */
sizeof(Wine_InternalMouseData),
WINE_INTERNALMOUSE_NUM_OBJS, /* dwNumObjs */
Wine_InternalMouseObjectFormat
(LPDIOBJECTDATAFORMAT) Wine_InternalMouseObjectFormat
};
static ICOM_VTABLE(IDirectInputDevice8A) SysMouseAvt;
@ -100,9 +101,9 @@ static ICOM_VTABLE(IDirectInputDevice8W) SysMouseWvt;
typedef struct SysMouseImpl SysMouseImpl;
typedef enum {
WARP_DONE, /* Warping has been done */
WARP_NEEDED, /* Warping is needed */
WARP_STARTED, /* Warping has been done, waiting for the warp event */
WARP_DONE /* Warping has been done */
WARP_STARTED /* Warping has been done, waiting for the warp event */
} WARP_STATUS;
struct SysMouseImpl
@ -115,7 +116,7 @@ struct SysMouseImpl
/* The current data format and the conversion between internal
and external data formats */
LPDIDATAFORMAT df;
DIDATAFORMAT *df;
DataFormat *wine_df;
int offset_array[WINE_INTERNALMOUSE_NUM_OBJS];
@ -123,6 +124,8 @@ struct SysMouseImpl
BYTE absolute;
/* Previous position for relative moves */
LONG prevX, prevY;
/* These are used in case of relative -> absolute transitions */
POINT org_coords;
HHOOK hook;
HWND win;
DWORD dwCoopLevel;
@ -247,7 +250,7 @@ static SysMouseImpl *alloc_device(REFGUID rguid, LPVOID mvt, IDirectInputImpl *d
memcpy(&(newDevice->guid),rguid,sizeof(*rguid));
/* Per default, Wine uses its internal data format */
newDevice->df = &Wine_InternalMouseFormat;
newDevice->df = (DIDATAFORMAT *) &Wine_InternalMouseFormat;
memcpy(newDevice->offset_array, offset_array, WINE_INTERNALMOUSE_NUM_OBJS * sizeof(int));
newDevice->wine_df = (DataFormat *) HeapAlloc(GetProcessHeap(), 0, sizeof(DataFormat));
newDevice->wine_df->size = 0;
@ -381,23 +384,10 @@ static HRESULT WINAPI SysMouseAImpl_SetDataFormat(
)
{
ICOM_THIS(SysMouseImpl,iface);
int i;
TRACE("(this=%p,%p)\n",This,df);
TRACE("(df.dwSize=%ld)\n",df->dwSize);
TRACE("(df.dwObjsize=%ld)\n",df->dwObjSize);
TRACE("(df.dwFlags=0x%08lx)\n",df->dwFlags);
TRACE("(df.dwDataSize=%ld)\n",df->dwDataSize);
TRACE("(df.dwNumObjs=%ld)\n",df->dwNumObjs);
for (i=0;i<df->dwNumObjs;i++) {
TRACE("df.rgodf[%d].guid %s (%p)\n",i, debugstr_guid(df->rgodf[i].pguid), df->rgodf[i].pguid);
TRACE("df.rgodf[%d].dwOfs %ld\n",i,df->rgodf[i].dwOfs);
TRACE("dwType 0x%02x,dwInstance %d\n",DIDFT_GETTYPE(df->rgodf[i].dwType),DIDFT_GETINSTANCE(df->rgodf[i].dwType));
TRACE("df.rgodf[%d].dwFlags 0x%08lx\n",i,df->rgodf[i].dwFlags);
}
_dump_DIDATAFORMAT(df);
/* Tests under windows show that a call to SetDataFormat always sets the mouse
in relative mode whatever the dwFlags value (DIDF_ABSAXIS/DIDF_RELAXIS).
@ -464,19 +454,23 @@ static LRESULT CALLBACK dinput_mouse_hook( int code, WPARAM wparam, LPARAM lpara
if ((This->need_warp == WARP_NEEDED) ||
(This->need_warp == WARP_STARTED)) {
if (hook->pt.x != This->prevX)
GEN_EVENT(This->offset_array[WINE_MOUSE_X_POSITION], hook->pt.x - This->prevX, hook->time, (This->dinput->evsequence)++);
GEN_EVENT(This->offset_array[WINE_MOUSE_X_POSITION], hook->pt.x - This->prevX,
hook->time, (This->dinput->evsequence)++);
if (hook->pt.y != This->prevY)
GEN_EVENT(This->offset_array[WINE_MOUSE_Y_POSITION], hook->pt.y - This->prevY, hook->time, (This->dinput->evsequence)++);
GEN_EVENT(This->offset_array[WINE_MOUSE_Y_POSITION], hook->pt.y - This->prevY,
hook->time, (This->dinput->evsequence)++);
} else {
/* This is the first time the event handler has been called after a
GetDeviceData or GetDeviceState. */
if (hook->pt.x != This->mapped_center.x) {
GEN_EVENT(This->offset_array[WINE_MOUSE_X_POSITION], hook->pt.x - This->mapped_center.x, hook->time, (This->dinput->evsequence)++);
GEN_EVENT(This->offset_array[WINE_MOUSE_X_POSITION], hook->pt.x - This->mapped_center.x,
hook->time, (This->dinput->evsequence)++);
This->need_warp = WARP_NEEDED;
}
if (hook->pt.y != This->mapped_center.y) {
GEN_EVENT(This->offset_array[WINE_MOUSE_Y_POSITION], hook->pt.y - This->mapped_center.y, hook->time, (This->dinput->evsequence)++);
GEN_EVENT(This->offset_array[WINE_MOUSE_Y_POSITION], hook->pt.y - This->mapped_center.y,
hook->time, (This->dinput->evsequence)++);
This->need_warp = WARP_NEEDED;
}
}
@ -497,8 +491,7 @@ static LRESULT CALLBACK dinput_mouse_hook( int code, WPARAM wparam, LPARAM lpara
TRACE(" msg %x pt %ld %ld (W=%d)\n",
wparam, hook->pt.x, hook->pt.y, (!This->absolute) && This->need_warp );
switch(wparam)
{
switch(wparam) {
case WM_LBUTTONDOWN:
GEN_EVENT(This->offset_array[WINE_MOUSE_L_POSITION], 0xFF,
hook->time, This->dinput->evsequence++);
@ -541,20 +534,21 @@ static LRESULT CALLBACK dinput_mouse_hook( int code, WPARAM wparam, LPARAM lpara
This->m_state.lX, This->m_state.lY,
This->m_state.rgbButtons[0], This->m_state.rgbButtons[2], This->m_state.rgbButtons[1]);
end:
end:
LeaveCriticalSection(&(This->crit));
if (dwCoop & DISCL_NONEXCLUSIVE)
{ /* pass the events down to previous handlers (e.g. win32 input) */
if (dwCoop & DISCL_NONEXCLUSIVE) {
/* Pass the events down to previous handlers (e.g. win32 input) */
ret = CallNextHookEx( This->hook, code, wparam, lparam );
} else {
/* Ignore message */
ret = 1;
}
else ret = 1; /* ignore message */
return ret;
}
static void dinput_window_check(SysMouseImpl* This)
{
static void dinput_window_check(SysMouseImpl* This) {
RECT rect;
DWORD centerX, centerY;
@ -589,8 +583,8 @@ static HRESULT WINAPI SysMouseAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
current_lock = (IDirectInputDevice8A*)This;
/* Init the mouse state */
if (This->absolute) {
GetCursorPos( &point );
if (This->absolute) {
This->m_state.lX = point.x;
This->m_state.lY = point.y;
This->prevX = point.x;
@ -598,11 +592,12 @@ static HRESULT WINAPI SysMouseAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
} else {
This->m_state.lX = 0;
This->m_state.lY = 0;
This->org_coords = point;
}
This->m_state.lZ = 0;
This->m_state.rgbButtons[0] = (GetKeyState(VK_LBUTTON) ? 0xFF : 0x00);
This->m_state.rgbButtons[1] = (GetKeyState(VK_MBUTTON) ? 0xFF : 0x00);
This->m_state.rgbButtons[2] = (GetKeyState(VK_RBUTTON) ? 0xFF : 0x00);
This->m_state.rgbButtons[0] = ((GetKeyState(VK_LBUTTON) & 0x80) ? 0xFF : 0x00);
This->m_state.rgbButtons[1] = ((GetKeyState(VK_RBUTTON) & 0x80) ? 0xFF : 0x00);
This->m_state.rgbButtons[2] = ((GetKeyState(VK_MBUTTON) & 0x80) ? 0xFF : 0x00);
/* Install our mouse hook */
if (This->dwCoopLevel & DISCL_EXCLUSIVE)
@ -643,12 +638,12 @@ static HRESULT WINAPI SysMouseAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface)
TRACE("(this=%p)\n",This);
if (This->acquired)
{
if (This->acquired) {
/* Reinstall previous mouse event handler */
if (This->hook) {
UnhookWindowsHookEx( This->hook );
This->hook = 0;
if (This->dwCoopLevel & DISCL_EXCLUSIVE)
ShowCursor(TRUE); /* show cursor */
}
@ -658,9 +653,15 @@ static HRESULT WINAPI SysMouseAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface)
/* Unacquire device */
This->acquired = 0;
/* And put the mouse cursor back where it was at acquire time */
if (This->absolute == 0) {
TRACE(" warping mouse back to (%ld , %ld)\n", This->org_coords.x, This->org_coords.y);
SetCursorPos(This->org_coords.x, This->org_coords.y);
}
else
} else {
return DI_NOEFFECT;
}
return DI_OK;
}
@ -704,8 +705,8 @@ static HRESULT WINAPI SysMouseAImpl_GetDeviceState(
LeaveCriticalSection(&(This->crit));
TRACE("(X: %ld - Y: %ld L: %02x M: %02x R: %02x)\n",
This->m_state.lX, This->m_state.lY,
TRACE("(X: %ld - Y: %ld - Z: %ld L: %02x M: %02x R: %02x)\n",
This->m_state.lX, This->m_state.lY, This->m_state.lZ,
This->m_state.rgbButtons[0], This->m_state.rgbButtons[2], This->m_state.rgbButtons[1]);
return DI_OK;
@ -756,9 +757,10 @@ static HRESULT WINAPI SysMouseAImpl_GetDeviceData(LPDIRECTINPUTDEVICE8A iface,
*entries = 0;
nqtail = This->queue_tail;
while (len) {
DWORD span = ((This->queue_head < nqtail) ? This->queue_len : This->queue_head)
- nqtail;
if (span > len) span = len;
DWORD span = ((This->queue_head < nqtail) ? This->queue_len : This->queue_head) - nqtail;
if (span > len)
span = len;
/* Copy the buffered data into the application queue */
memcpy(dod + *entries, This->data_queue + nqtail, span * dodsize);
/* Advance position */
@ -884,7 +886,6 @@ static HRESULT WINAPI SysMouseAImpl_GetProperty(LPDIRECTINPUTDEVICE8A iface,
}
}
return DI_OK;
}