- 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:
parent
6e28fe7144
commit
04d77f4dcc
|
@ -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)
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue