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
--- 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
--- 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
--- 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;
--- 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 */
--- 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
*/
--- 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;
}
--- 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_SendForceFeedbackCommand,
XCAST(EnumCreatedEffectObjects)IDirectInputDevice2AImpl_EnumCreatedEffectObjects,
XCAST(Escape)IDirectInputDevice2AImpl_Escape,
- XCAST(Poll)IDirectInputDevice2AImpl_Poll,
+ XCAST(Poll)SysMouseAImpl_Poll,
XCAST(SendDeviceData)IDirectInputDevice2AImpl_SendDeviceData,
IDirectInputDevice7WImpl_EnumEffectsInFile,
IDirectInputDevice7WImpl_WriteEffectToFile,