Import and merge Wine-20041201 Added: trunk/reactos/lib/dinput/ Added: trunk/reactos/lib/dinput/Makefile Added: trunk/reactos/lib/dinput/Makefile.ros-template Modified: trunk/reactos/lib/dinput/dinput_main.c Modified: trunk/reactos/lib/dinput/dinput_private.h Modified: trunk/reactos/lib/dinput/joystick_linux.c Modified: trunk/reactos/lib/dinput/keyboard.c Modified: trunk/reactos/lib/dinput/mouse.c _____
Copied: trunk/reactos/lib/dinput (from rev 12495, vendor/wine/dlls/dinput/current) _____
Added: trunk/reactos/lib/dinput/Makefile --- vendor/wine/dlls/dinput/current/Makefile 2004-12-31 14:45:29 UTC (rev 12495) +++ trunk/reactos/lib/dinput/Makefile 2004-12-31 14:46:26 UTC (rev 12496) @@ -0,0 +1,9 @@
+# $Id: Makefile 11864 2004-11-29 00:15:23Z greatlrd $ + +PATH_TO_TOP = ../.. + +TARGET_TYPE = winedll + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk _____
Added: trunk/reactos/lib/dinput/Makefile.ros-template --- vendor/wine/dlls/dinput/current/Makefile.ros-template 2004-12-31 14:45:29 UTC (rev 12495) +++ trunk/reactos/lib/dinput/Makefile.ros-template 2004-12-31 14:46:26 UTC (rev 12496) @@ -0,0 +1,30 @@
+# $Id: Makefile.ros-template 12238 2004-12-20 00:53:54Z greatlrd $ + +TARGET_NAME = dinput + +TARGET_BASE = $(TARGET_BASE_LIB_DINPUT) + +TARGET_OBJECTS = @C_SRCS@ + +TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ + +TARGET_SDKLIBS = wine.a @IMPORTS@ ole32.a wine_uuid.a ntdll.a winmm.a dxguid.a + + + +TARGET_RC_SRCS = @RC_SRCS@ +TARGET_RC_BINSRC = @RC_BINSRC@ +TARGET_RC_BINARIES = @RC_BINARIES@ + +default: all + +authors.c: +ifeq ($(HOST),mingw32-linux) + echo 'const char * const SHELL_Authors[] = { "WINE team", "ReactOS team", 0 };' > authors.c +else + echo const char * const SHELL_Authors[] = { "WINE team", "ReactOS team", 0 }; > authors.c +endif + +DEP_OBJECTS = $(TARGET_OBJECTS) + +include $(TOOLS_PATH)/depend.mk _____
Modified: trunk/reactos/lib/dinput/dinput_main.c --- vendor/wine/dlls/dinput/current/dinput_main.c 2004-12-31 14:45:29 UTC (rev 12495) +++ trunk/reactos/lib/dinput/dinput_main.c 2004-12-31 14:46:26 UTC (rev 12496) @@ -30,6 +30,8 @@
*/
#include "config.h" +#include "wine/port.h" + #include <assert.h> #include <stdarg.h> #include <string.h> @@ -72,7 +74,6 @@ return TRUE; }
- /* register a direct draw driver. We better not use malloc for we are in * the ELF startup initialisation at this point. */ @@ -161,10 +162,12 @@ { IDirectInputImpl* This; TRACE("(0x%08lx,%04lx,%p,%p)\n", (DWORD)hinst,dwVersion,ppDI,punkOuter); + + //trace:dinput:DirectInputCreateA (0x00400000,0500,0x42bafc54,(nil)) This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl) ); This->lpVtbl = &ddi7avt; This->ref = 1; - if (dwVersion >= 0x0800) { + if (dwVersion > 0x0700) { This->version = 8; } else { /* We do not differientiate between version 1, 2 and 7 */ @@ -245,12 +248,21 @@ TRACE("(this=%p,0x%04lx '%s',%p,%p,%04lx)\n", This, dwDevType, _dump_DIDEVTYPE_value(dwDevType), lpCallback, pvRef, dwFlags); + + if (nrof_dinput_devices==0){ + scan_mouse(); + scan_keyboard(); + } + TRACE(" flags: "); _dump_EnumDevices_dwFlags(dwFlags); TRACE("\n");
+ for (i = 0; i < nrof_dinput_devices; i++) { for (j = 0, r = -1; r != 0; j++) { devInstance.dwSize = sizeof(devInstance); TRACE(" - checking device %d ('%s')\n", i, dinput_devices[i]->name); + + if ((r = dinput_devices[i]->enum_deviceA(dwDevType, dwFlags, &devInstance, This->version, j))) { if (lpCallback(&devInstance,pvRef) == DIENUM_STOP) return 0; @@ -271,11 +283,17 @@ DIDEVICEINSTANCEW devInstance; int i, j, r;
+ if (nrof_dinput_devices==0){ + scan_mouse(); + scan_keyboard(); + } + TRACE("(this=%p,0x%04lx '%s',%p,%p,%04lx)\n", This, dwDevType, _dump_DIDEVTYPE_value(dwDevType), lpCallback, pvRef, dwFlags); TRACE(" flags: "); _dump_EnumDevices_dwFlags(dwFlags); TRACE("\n"); - + + for (i = 0; i < nrof_dinput_devices; i++) { for (j = 0, r = -1; r != 0; j++) { devInstance.dwSize = sizeof(devInstance); @@ -347,7 +365,12 @@ int i;
TRACE("(this=%p,%s,%p,%p)\n",This,debugstr_guid(rguid),pdev,punk); - + + if (nrof_dinput_devices==0){ + scan_mouse(); + scan_keyboard(); + } + /* Loop on all the devices to see if anyone matches the given GUID */ for (i = 0; i < nrof_dinput_devices; i++) { HRESULT ret; @@ -366,9 +389,14 @@ IDirectInputImpl *This = (IDirectInputImpl *)iface; HRESULT ret_value = DIERR_DEVICENOTREG; int i; - +
TRACE("(this=%p,%s,%p,%p)\n",This,debugstr_guid(rguid),pdev,punk);
+ if (nrof_dinput_devices==0){ + scan_mouse(); + scan_keyboard(); + } + /* Loop on all the devices to see if anyone matches the given GUID */ for (i = 0; i < nrof_dinput_devices; i++) { HRESULT ret; @@ -429,6 +457,11 @@
TRACE("(%p)->(%s, %s, %p, %p)\n", This, debugstr_guid(rguid), debugstr_guid(riid), pvOut, lpUnknownOuter);
+ if (nrof_dinput_devices==0){ + scan_mouse(); + scan_keyboard(); + } + /* Loop on all the devices to see if anyone matches the given GUID */ for (i = 0; i < nrof_dinput_devices; i++) { HRESULT ret; @@ -451,6 +484,13 @@
TRACE("(%p)->(%s, %s, %p, %p)\n", This, debugstr_guid(rguid), debugstr_guid(riid), pvOut, lpUnknownOuter);
+ if (nrof_dinput_devices==0){ + scan_mouse(); + scan_keyboard(); + } + + + /* Loop on all the devices to see if anyone matches the given GUID */ for (i = 0; i < nrof_dinput_devices; i++) { HRESULT ret; _____
Modified: trunk/reactos/lib/dinput/dinput_private.h --- vendor/wine/dlls/dinput/current/dinput_private.h 2004-12-31 14:45:29 UTC (rev 12495) +++ trunk/reactos/lib/dinput/dinput_private.h 2004-12-31 14:46:26 UTC (rev 12496) @@ -52,4 +52,7 @@
extern HINSTANCE DINPUT_instance;
+void scan_keyboard(); +void scan_mouse(); + #endif /* __WINE_DLLS_DINPUT_DINPUT_PRIVATE_H */ _____
Modified: trunk/reactos/lib/dinput/joystick_linux.c --- vendor/wine/dlls/dinput/current/joystick_linux.c 2004-12-31 14:45:29 UTC (rev 12495) +++ trunk/reactos/lib/dinput/joystick_linux.c 2004-12-31 14:46:26 UTC (rev 12496) @@ -656,6 +656,8 @@
DECL_GLOBAL_CONSTRUCTOR(joydev_register) { dinput_register_device(&joydev); }
+ +
/*********************************************************************** ******* * Joystick */ _____
Modified: trunk/reactos/lib/dinput/keyboard.c --- vendor/wine/dlls/dinput/current/keyboard.c 2004-12-31 14:45:29 UTC (rev 12495) +++ trunk/reactos/lib/dinput/keyboard.c 2004-12-31 14:46:26 UTC (rev 12496) @@ -37,6 +37,14 @@
WINE_DEFAULT_DEBUG_CHANNEL(dinput);
+//fast fix misning from mingw headers +#ifdef __REACTOS__ +#define LLKHF_EXTENDED (KF_EXTENDED >> 8) +#define LLKHF_INJECTED 0x00000010 +//#define LLKHF_ALTDOWN (KF_ALTDOWN >> 8) +#define LLKHF_UP (KF_UP >> 8) +#endif + static IDirectInputDevice8AVtbl SysKeyboardAvt; static IDirectInputDevice8WVtbl SysKeyboardWvt;
@@ -84,8 +92,59 @@ static CRITICAL_SECTION keyboard_crit = { &critsect_debug, -1, 0, 0, 0, 0 };
static DWORD keyboard_users; + +#ifndef __REACTOS__ static HHOOK keyboard_hook; +#endif
+#ifdef __REACTOS__ +void reactos_input_keyboard(); + +void reactos_input_keyboard() +{ + MSG msg; + BOOL fDone; + int disk_code = -1; + BOOL down; + BYTE oldDInputKeyState[256]; + int t; + + memcpy(&oldDInputKeyState,&DInputKeyState,256); + GetKeyboardState(DInputKeyState); + + for( t=0;t<255;t++) + { + if (oldDInputKeyState[t]!=DInputKeyState[t]) disk_code=t; + } + + + if (disk_code!=-1) { + if (current->buffer != NULL) + { + int n; + n = (current->start + current->count) % current->buffersize; + + current->buffer[n].dwOfs = (BYTE) disk_code; + current->buffer[n].dwData = DInputKeyState[disk_code]; + current->buffer[n].dwTimeStamp = 10; + current->buffer[n].dwSequence = current->dinput->evsequence++; + + + if (current->count == current->buffersize) + { + current->start = ++current->start % current->buffersize; + current->overflow = TRUE; + } + else + current->count++; + + } + } + + +} +#endif +#ifndef __REACTOS__ LRESULT CALLBACK KeyboardCallback( int code, WPARAM wparam, LPARAM lparam ) { TRACE("(%d,%d,%ld)\n", code, wparam, lparam); @@ -143,6 +202,7 @@
return CallNextHookEx(keyboard_hook, code, wparam, lparam); } +#endif
static GUID DInput_Wine_Keyboard_GUID = { /* 0ab8648a-7735-11d2-8c73-71df54a96441 */ 0x0ab8648a, @@ -235,7 +295,7 @@ return FALSE; }
-static SysKeyboardImpl *alloc_device(REFGUID rguid, LPVOID kvt, IDirectInputImpl *dinput) +static SysKeyboardImpl *alloc_device_keyboard(REFGUID rguid, LPVOID kvt, IDirectInputImpl *dinput) { SysKeyboardImpl* newDevice; newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysKeyboardImpl)); @@ -244,11 +304,14 @@ memcpy(&(newDevice->guid),rguid,sizeof(*rguid)); newDevice->dinput = dinput;
+#ifndef __REACTOS__ EnterCriticalSection(&keyboard_crit); + if (!keyboard_users++) keyboard_hook = SetWindowsHookExW( WH_KEYBOARD_LL, KeyboardCallback, DINPUT_instance, 0 ); + LeaveCriticalSection(&keyboard_crit); - +#endif return newDevice; }
@@ -262,7 +325,7 @@ IsEqualGUID(&IID_IDirectInputDevice2A,riid) || IsEqualGUID(&IID_IDirectInputDevice7A,riid) || IsEqualGUID(&IID_IDirectInputDevice8A,riid)) { - *pdev = (IDirectInputDeviceA*) alloc_device(rguid, &SysKeyboardAvt, dinput); + *pdev = (IDirectInputDeviceA*) alloc_device_keyboard(rguid, &SysKeyboardAvt, dinput); TRACE("Creating a Keyboard device (%p)\n", *pdev); return DI_OK; } else @@ -280,7 +343,7 @@ IsEqualGUID(&IID_IDirectInputDevice2W,riid) || IsEqualGUID(&IID_IDirectInputDevice7W,riid) || IsEqualGUID(&IID_IDirectInputDevice8W,riid)) { - *pdev = (IDirectInputDeviceW*) alloc_device(rguid, &SysKeyboardWvt, dinput); + *pdev = (IDirectInputDeviceW*) alloc_device_keyboard(rguid, &SysKeyboardWvt, dinput); TRACE("Creating a Keyboard device (%p)\n", *pdev); return DI_OK; } else @@ -289,7 +352,7 @@ return DIERR_DEVICENOTREG; }
-static dinput_device keyboarddev = { +dinput_device keyboarddev = { 100, "Wine keyboard driver", keyboarddev_enum_deviceA, @@ -298,6 +361,11 @@ keyboarddev_create_deviceW };
+void scan_keyboard() +{ + dinput_register_device(&keyboarddev); +} + DECL_GLOBAL_CONSTRUCTOR(keyboarddev_register) { dinput_register_device(&keyboarddev); }
static ULONG WINAPI SysKeyboardAImpl_Release(LPDIRECTINPUTDEVICE8A iface) @@ -309,12 +377,14 @@ if (ref) return ref;
+#ifndef __REACTOS__ EnterCriticalSection(&keyboard_crit); if (!--keyboard_users) { UnhookWindowsHookEx( keyboard_hook ); keyboard_hook = 0; } LeaveCriticalSection(&keyboard_crit); +#endif
/* Free the data queue */ if (This->buffer != NULL) @@ -357,11 +427,16 @@ return DI_OK; }
+ static HRESULT WINAPI SysKeyboardAImpl_GetDeviceState( LPDIRECTINPUTDEVICE8A iface,DWORD len,LPVOID ptr ) { TRACE("(%p)->(%ld,%p)\n", iface, len, ptr); + +#ifdef __REACTOS__ + reactos_input_keyboard(); +#endif
/* Note: device does not need to be acquired */ if (len != 256) @@ -387,8 +462,12 @@ LPDWORD entries,DWORD flags ) { + SysKeyboardImpl *This = (SysKeyboardImpl *)iface; int ret = DI_OK, i = 0; +#ifdef __REACTOS__ + reactos_input_keyboard(); +#endif
TRACE("(this=%p,%ld,%p,%p(%ld)),0x%08lx)\n", This,dodsize,dod,entries,entries?*entries:0,flags); @@ -524,6 +603,7 @@ else This->buffer = NULL;
+ return DI_OK; }
_____
Modified: trunk/reactos/lib/dinput/mouse.c --- vendor/wine/dlls/dinput/current/mouse.c 2004-12-31 14:45:29 UTC (rev 12495) +++ trunk/reactos/lib/dinput/mouse.c 2004-12-31 14:46:26 UTC (rev 12496) @@ -40,6 +40,13 @@
#define MOUSE_HACK
WINE_DEFAULT_DEBUG_CHANNEL(dinput); +typedef struct { + POINT pt; + DWORD mouseData; + DWORD flags; + DWORD time; + ULONG_PTR dwExtraInfo; +} MSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT;
/* Wine mouse driver object instances */ #define WINE_MOUSE_X_AXIS_INSTANCE 0 @@ -148,6 +155,9 @@ /* FIXME: This is ugly and not thread safe :/ */ static IDirectInputDevice8A* current_lock = NULL;
+/* FIXME: This is ugly but needed on Windows */ +static int mouse_set = 0; + static GUID DInput_Wine_Mouse_GUID = { /* 9e573ed8-7734-11d2-8d4a-23903fb6bdf7 */ 0x9e573ed8, 0x7734, @@ -239,7 +249,7 @@ return FALSE; }
-static SysMouseImpl *alloc_device(REFGUID rguid, LPVOID mvt, IDirectInputImpl *dinput) +static SysMouseImpl *alloc_device_mouse(REFGUID rguid, LPVOID mvt, IDirectInputImpl *dinput) { int offset_array[WINE_INTERNALMOUSE_NUM_OBJS] = { FIELD_OFFSET(Wine_InternalMouseData, lX), @@ -253,7 +263,9 @@ newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysMouseImpl)); newDevice->ref = 1; newDevice->lpVtbl = mvt; +#ifndef __REACTOS__ InitializeCriticalSection(&(newDevice->crit)); +#endif memcpy(&(newDevice->guid),rguid,sizeof(*rguid));
/* Per default, Wine uses its internal data format */ @@ -277,7 +289,7 @@ IsEqualGUID(&IID_IDirectInputDevice2A,riid) || IsEqualGUID(&IID_IDirectInputDevice7A,riid) || IsEqualGUID(&IID_IDirectInputDevice8A,riid)) { - *pdev = (IDirectInputDeviceA*) alloc_device(rguid, &SysMouseAvt, dinput); + *pdev = (IDirectInputDeviceA*) alloc_device_mouse(rguid, &SysMouseAvt, dinput); TRACE("Creating a Mouse device (%p)\n", *pdev); return DI_OK; } else @@ -296,7 +308,7 @@ IsEqualGUID(&IID_IDirectInputDevice2W,riid) || IsEqualGUID(&IID_IDirectInputDevice7W,riid) || IsEqualGUID(&IID_IDirectInputDevice8W,riid)) { - *pdev = (IDirectInputDeviceW*) alloc_device(rguid, &SysMouseWvt, dinput); + *pdev = (IDirectInputDeviceW*) alloc_device_mouse(rguid, &SysMouseWvt, dinput); TRACE("Creating a Mouse device (%p)\n", *pdev); return DI_OK; } else @@ -305,6 +317,7 @@
return DIERR_DEVICENOTREG; } + static dinput_device mousedev = { 100, "Wine mouse driver", @@ -314,6 +327,11 @@ mousedev_create_deviceW };
+void scan_mouse() +{ + dinput_register_device(&mousedev); +} + DECL_GLOBAL_CONSTRUCTOR(mousedev_register) { dinput_register_device(&mousedev); }
/*********************************************************************** ******* @@ -335,14 +353,21 @@ /* Free the data queue */ if (This->data_queue != NULL) HeapFree(GetProcessHeap(),0,This->data_queue); - + +#ifndef __REACTOS__ if (This->hook) { UnhookWindowsHookEx( This->hook ); if (This->dwCoopLevel & DISCL_EXCLUSIVE) ShowCursor(TRUE); /* show cursor */ } DeleteCriticalSection(&(This->crit)); +#endif + +#ifdef __REACTOS__ +if (This->dwCoopLevel & DISCL_EXCLUSIVE) + ShowCursor(TRUE); /* show cursor */
+#endif /* Free the DataFormat */ if (This->df != &(Wine_InternalMouseFormat)) { HeapFree(GetProcessHeap(), 0, This->df->rgodf); @@ -585,9 +610,13 @@
TRACE("(this=%p)\n",This);
+ + if (This->acquired == 0) { POINT point; + + /* Store (in a global variable) the current lock */ current_lock = (IDirectInputDevice8A*)This; @@ -611,8 +640,9 @@ /* Install our mouse hook */ if (This->dwCoopLevel & DISCL_EXCLUSIVE) ShowCursor(FALSE); /* hide cursor */ +#ifndef __REACTOS__ This->hook = SetWindowsHookExA( WH_MOUSE_LL, dinput_mouse_hook, DINPUT_instance, 0 ); - +#endif /* Get the window dimension and find the center */ GetWindowRect(This->win, &rect); This->win_centerX = (rect.right - rect.left) / 2; @@ -649,6 +679,8 @@
if (This->acquired) { /* Reinstall previous mouse event handler */ + +#ifndef __REACTOS__ if (This->hook) { UnhookWindowsHookEx( This->hook ); This->hook = 0; @@ -656,7 +688,12 @@ if (This->dwCoopLevel & DISCL_EXCLUSIVE) ShowCursor(TRUE); /* show cursor */ } - +#endif +#ifdef __REACTOS__ + if (This->dwCoopLevel & DISCL_EXCLUSIVE) + ShowCursor(TRUE); /* show cursor */ +#endif + /* No more locks */ current_lock = NULL; @@ -675,6 +712,76 @@ return DI_OK; }
+// if you call poll then to getdevicestate +// it did not send back right value in windows +int poll_mouse=0; + +#ifdef __REACTOS__ +void getmousesvalue(LPDIRECTINPUTDEVICE8A iface); +int filp=0; +void getmousesvalue(LPDIRECTINPUTDEVICE8A iface) +{ + static long last_event = 0; + + POINT point; + SysMouseImpl *This = (SysMouseImpl *)iface; + + 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); + This->m_state.rgbButtons[3] = ((GetKeyState(VK_XBUTTON1) & 0x80) ? 0xFF : 0x00); + This->m_state.rgbButtons[4] = ((GetKeyState(VK_XBUTTON2) & 0x80) ? 0xFF : 0x00); + + + + + if (poll_mouse==1) filp=0; + if (filp==2) filp=0; + if (filp==0) { + GetCursorPos( &point ); + + if (This->prevX == point.x) This->m_state.lX = 0; + else { + This->prevX = point.x; + This->m_state.lX = point.x - This->org_coords.x; + } + + if (This->prevY == point.y) This->m_state.lY = 0; + else { + This->prevY = point.y; + This->m_state.lY = point.y - This->org_coords.y; + } + + } + else + { + This->m_state.lX = 0; + This->m_state.lY = 0; + } + filp++; + +// check see if buffer have been set + +} + +#endif + +static HRESULT WINAPI SysMouseAImpl_Poll(LPDIRECTINPUTDEVICE8A iface) +{ + int retValue = DI_OK; + +SysMouseImpl *This = (SysMouseImpl *)iface; + if (poll_mouse==0) { + retValue=SysMouseAImpl_Acquire(iface); + poll_mouse=1; + if (retValue!=DI_OK) retValue=DIERR_NOTACQUIRED; + else retValue = DI_OK; + } + + return retValue; +} + +
/*********************************************************************** ******* * GetDeviceState : returns the "state" of the mouse. * @@ -684,26 +791,42 @@ static HRESULT WINAPI SysMouseAImpl_GetDeviceState( LPDIRECTINPUTDEVICE8A iface,DWORD len,LPVOID ptr ) { - SysMouseImpl *This = (SysMouseImpl *)iface; - + SysMouseImpl *This = (SysMouseImpl *)iface; + POINT point; + +#ifndef __REACTOS__ EnterCriticalSection(&(This->crit)); +#endif + +#ifdef __REACTOS__ +getmousesvalue(iface); +#endif TRACE("(this=%p,0x%08lx,%p): \n",This,len,ptr); - - /* Copy the current mouse state */ + + /* Copy the current mouse state */ fill_DataFormat(ptr, &(This->m_state), This->wine_df); - - /* Initialize the buffer when in relative mode */ - if (This->absolute == 0) { - This->m_state.lX = 0; - This->m_state.lY = 0; - This->m_state.lZ = 0; - } - + + + // this fix windows bugs when + // some program calling on mouse poll + if (poll_mouse==1) poll_mouse=0; + else { + if (This->absolute == 0) { + This->m_state.lX = 0; + This->m_state.lY = 0; + This->m_state.lZ = 0; + } + } + + /* Check if we need to do a mouse warping */ if (This->need_warp == WARP_NEEDED) { dinput_window_check(This); - TRACE("Warping mouse to %ld - %ld\n", This->mapped_center.x, This->mapped_center.y); - SetCursorPos( This->mapped_center.x, This->mapped_center.y ); + TRACE("Warping mouse to %ld - %ld\n", This->mapped_center.x, This->mapped_center.y); + if (mouse_set==0){ + SetCursorPos( This->mapped_center.x, This->mapped_center.y ); + mouse_set++; + } #ifdef MOUSE_HACK This->need_warp = WARP_DONE; @@ -711,9 +834,11 @@ This->need_warp = WARP_STARTED; #endif } - + +#ifndef __REACTOS__ LeaveCriticalSection(&(This->crit)); - +#endif + 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]); @@ -724,6 +849,7 @@
/*********************************************************************** ******* * GetDeviceState : gets buffered input data. */ + static HRESULT WINAPI SysMouseAImpl_GetDeviceData(LPDIRECTINPUTDEVICE8A iface, DWORD dodsize, LPDIDEVICEOBJECTDATA dod, @@ -733,16 +859,73 @@ SysMouseImpl *This = (SysMouseImpl *)iface; DWORD len; int nqtail; +#ifdef __REACTOS__ +static int last_event=0; +const int size = sizeof(DIDEVICEOBJECTDATA) * 1; +static count=0; +static DWORD time=0; +#endif +
TRACE("(%p)->(dods=%ld,entries=%ld,fl=0x%08lx)\n",This,dodsize,*entries, flags);
+#ifdef __REACTOS__ +getmousesvalue(iface); +#endif + + // windows does not get any data if + // we do not call manual to mouse Acquire + // this is only need if some apps calling on getdevice data direcly + // in windows GetdeviceData does always update first the data + // then return it. + SysMouseAImpl_Acquire(iface); + + if (This->acquired == 0) { WARN(" application tries to get data from an unacquired device !\n"); return DIERR_NOTACQUIRED; }
+#ifdef __REACTOS__ + FIXME("This is broken in Tribes, need right implant of the buffer!!!!!!!!\n"); + + *entries = 5; + if (GetTickCount()-time <50) return DI_OK; + time = GetTickCount(); + + dod[0].dwOfs = DIMOFS_X; + dod[0].dwData = This->m_state.lX; + dod[0].dwTimeStamp = 0; + dod[0].dwSequence = last_event++; + + dod[1].dwOfs = DIMOFS_Y; + dod[1].dwData = This->m_state.lY; + dod[1].dwTimeStamp = 0; + dod[1].dwSequence = last_event++; + + dod[2].dwOfs = DIMOFS_BUTTON0; + dod[2].dwData = This->m_state.rgbButtons[0]; + dod[2].dwTimeStamp = 0; + dod[2].dwSequence = last_event++; + + dod[3].dwOfs = DIMOFS_BUTTON1; + dod[3].dwData = This->m_state.rgbButtons[1]; + dod[3].dwTimeStamp = 0; + dod[0].dwSequence = last_event++; + + dod[4].dwOfs = DIMOFS_BUTTON2; + dod[4].dwData = This->m_state.rgbButtons[2]; + dod[4].dwTimeStamp = 50; + dod[4].dwSequence = last_event++; + +#endif + +#ifndef __REACTOS__ EnterCriticalSection(&(This->crit)); - + + + // FIXME mouse are bit choppy here. + len = ((This->queue_head < This->queue_tail) ? This->queue_len : 0) + (This->queue_head - This->queue_tail); if (len > *entries) len = *entries; @@ -757,7 +940,9 @@ } else { if (dodsize < sizeof(DIDEVICEOBJECTDATA_DX3)) { ERR("Wrong structure size !\n"); + LeaveCriticalSection(&(This->crit)); + return DIERR_INVALIDPARAM; } @@ -773,6 +958,7 @@ /* Copy the buffered data into the application queue */ memcpy(dod + *entries, This->data_queue + nqtail, span * dodsize); + /* Advance position */ nqtail += span; if (nqtail >= This->queue_len) nqtail -= This->queue_len; @@ -782,14 +968,19 @@ } if (!(flags & DIGDD_PEEK)) This->queue_tail = nqtail; - + LeaveCriticalSection(&(This->crit)); - + /* Check if we need to do a mouse warping */ + + if (This->need_warp == WARP_NEEDED) { dinput_window_check(This); TRACE("Warping mouse to %ld - %ld\n", This->mapped_center.x, This->mapped_center.y); - SetCursorPos( This->mapped_center.x, This->mapped_center.y ); + if (mouse_set==0){ + SetCursorPos( This->mapped_center.x, This->mapped_center.y ); + mouse_set++; + } #ifdef MOUSE_HACK This->need_warp = WARP_DONE; @@ -797,6 +988,7 @@ This->need_warp = WARP_STARTED; #endif } +#endif return DI_OK; }
@@ -1110,7 +1302,7 @@ IDirectInputDevice2AImpl_SendForceFeedbackCommand, IDirectInputDevice2AImpl_EnumCreatedEffectObjects, IDirectInputDevice2AImpl_Escape, - IDirectInputDevice2AImpl_Poll, + SysMouseAImpl_Poll, IDirectInputDevice2AImpl_SendDeviceData, IDirectInputDevice7AImpl_EnumEffectsInFile, IDirectInputDevice7AImpl_WriteEffectToFile, @@ -1152,7 +1344,7 @@
XCAST(SendForceFeedbackCommand)IDirectInputDevice2AImpl_SendForceFeedbac kCommand,
XCAST(EnumCreatedEffectObjects)IDirectInputDevice2AImpl_EnumCreatedEffec tObjects, XCAST(Escape)IDirectInputDevice2AImpl_Escape, - XCAST(Poll)IDirectInputDevice2AImpl_Poll, + XCAST(Poll)SysMouseAImpl_Poll, XCAST(SendDeviceData)IDirectInputDevice2AImpl_SendDeviceData, IDirectInputDevice7WImpl_EnumEffectsInFile, IDirectInputDevice7WImpl_WriteEffectToFile,