? dlls/dinput/dinput.dll-UQrvOo.spec.c Index: dlls/dinput/device.c =================================================================== RCS file: /home/wine/wine/dlls/dinput/device.c,v retrieving revision 1.16 diff -u -w -r1.16 device.c --- dlls/dinput/device.c 7 Oct 2003 03:30:47 -0000 1.16 +++ dlls/dinput/device.c 31 May 2004 19:27:04 -0000 @@ -42,77 +42,171 @@ * 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> 8) & 0xFFFF); + DPRINTF("Type:"); + if (type == DIDFT_ALL) { DPRINTF("DIDFT_ALL"); - return; - } - for (i=0;i> 8); + } + } + if (type) { + DPRINTF(" (unhandled: %08lx)", type); + } + } + DPRINTF(" / Instance: "); + if (instance == ((DIDFT_ANYINSTANCE >> 8) & 0xFFFF)) { + DPRINTF("DIDFT_ANYINSTANCE"); + } else { + DPRINTF("%3ld", instance); + } + } } 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 @@ 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 @@ 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 @@ 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(" - 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(" - 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) :\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 @@ 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 @@ 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;idwNumObjs;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 @@ return DI_OK; } + HRESULT WINAPI IDirectInputDevice2WImpl_GetDeviceInfo( LPDIRECTINPUTDEVICE8W iface, LPDIDEVICEINSTANCEW pdidi) Index: dlls/dinput/device_private.h =================================================================== RCS file: /home/wine/wine/dlls/dinput/device_private.h,v retrieving revision 1.6 diff -u -w -r1.6 device_private.h --- dlls/dinput/device_private.h 5 Sep 2003 23:08:40 -0000 1.6 +++ dlls/dinput/device_private.h 31 May 2004 19:27:04 -0000 @@ -49,7 +49,7 @@ 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_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( Index: dlls/dinput/joystick_linux.c =================================================================== RCS file: /home/wine/wine/dlls/dinput/joystick_linux.c,v retrieving revision 1.3 diff -u -w -r1.3 joystick_linux.c --- dlls/dinput/joystick_linux.c 27 May 2004 01:54:43 -0000 1.3 +++ dlls/dinput/joystick_linux.c 31 May 2004 19:27:04 -0000 @@ -258,22 +258,10 @@ ) { 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;idwNumObjs;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); Index: dlls/dinput/joystick_linuxinput.c =================================================================== RCS file: /home/wine/wine/dlls/dinput/joystick_linuxinput.c,v retrieving revision 1.4 diff -u -w -r1.4 joystick_linuxinput.c --- dlls/dinput/joystick_linuxinput.c 27 May 2004 01:54:43 -0000 1.4 +++ dlls/dinput/joystick_linuxinput.c 31 May 2004 19:27:04 -0000 @@ -349,22 +349,10 @@ ) { 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;idwNumObjs;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); Index: dlls/dinput/mouse.c =================================================================== RCS file: /home/wine/wine/dlls/dinput/mouse.c,v retrieving revision 1.1 diff -u -w -r1.1 mouse.c --- dlls/dinput/mouse.c 12 Feb 2004 23:28:00 -0000 1.1 +++ dlls/dinput/mouse.c 31 May 2004 19:27:05 -0000 @@ -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 @@ #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 @@ 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 @@ 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 @@ /* 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 @@ 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 @@ 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 @@ ) { 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;idwNumObjs;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 @@ 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 @@ 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++); @@ -544,17 +537,18 @@ 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 @@ 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 @@ } 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 @@ 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 @@ /* 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 @@ 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 @@ *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 @@ } } - return DI_OK; }