Make dinput8 behaviour more correct for mouse and keyboard.
Fix small bug when keyboard buffer overflows.
Use DI_OK instead of 0 for returned values.
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index b7e8ac8..be088a5 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -291,7 +291,7 @@
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 0;
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2AImpl_SetCooperativeLevel(
@@ -303,7 +303,7 @@
TRACE(" cooperative level : ");
_dump_cooperativelevel_DI(dwflags);
}
- return 0;
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2AImpl_SetEventNotification(
@@ -311,7 +311,7 @@
) {
ICOM_THIS(IDirectInputDevice2AImpl,iface);
FIXME("(this=%p,0x%08lx): stub\n",This,(DWORD)hnd);
- return 0;
+ return DI_OK;
}
ULONG WINAPI IDirectInputDevice2AImpl_Release(LPDIRECTINPUTDEVICE8A iface)
@@ -321,7 +321,7 @@
if (This->ref)
return This->ref;
HeapFree(GetProcessHeap(),0,This);
- return 0;
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2AImpl_QueryInterface(
@@ -334,22 +334,22 @@
if (IsEqualGUID(&IID_IUnknown,riid)) {
IDirectInputDevice2_AddRef(iface);
*ppobj = This;
- return 0;
+ return DI_OK;
}
if (IsEqualGUID(&IID_IDirectInputDeviceA,riid)) {
IDirectInputDevice2_AddRef(iface);
*ppobj = This;
- return 0;
+ return DI_OK;
}
if (IsEqualGUID(&IID_IDirectInputDevice2A,riid)) {
IDirectInputDevice2_AddRef(iface);
*ppobj = This;
- return 0;
+ return DI_OK;
}
if (IsEqualGUID(&IID_IDirectInputDevice7A,riid)) {
IDirectInputDevice7_AddRef(iface);
*ppobj = This;
- return 0;
+ return DI_OK;
}
TRACE("Unsupported interface !\n");
return E_FAIL;
diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index 7363cc8..9db5478 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -107,6 +107,7 @@
This = (IDirectInputAImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputAImpl));
This->lpVtbl = &ddi7avt;
This->ref = 1;
+ This->version = 1;
*ppDI = This;
return DI_OK;
@@ -117,6 +118,7 @@
This = (IDirectInputAImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputAImpl));
This->lpVtbl = &ddi8avt;
This->ref = 1;
+ This->version = 8;
*ppDI = This;
return DI_OK;
@@ -157,7 +159,7 @@
for (i = 0; i < nrof_dinput_devices; i++) {
devInstance.dwSize = sizeof(devInstance);
- if (dinput_devices[i]->enum_device(dwDevType, dwFlags, &devInstance)) {
+ if (dinput_devices[i]->enum_device(dwDevType, dwFlags, &devInstance, This->version)) {
if (lpCallback(&devInstance,pvRef) == DIENUM_STOP)
return 0;
}
diff --git a/dlls/dinput/dinput_private.h b/dlls/dinput/dinput_private.h
index 1c537a0..918714b 100644
--- a/dlls/dinput/dinput_private.h
+++ b/dlls/dinput/dinput_private.h
@@ -31,12 +31,14 @@
/* Used to have an unique sequence number for all the events */
DWORD evsequence;
+
+ int version;
};
/* Function called by all devices that Wine supports */
typedef struct dinput_device {
INT pref;
- BOOL (*enum_device)(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi);
+ BOOL (*enum_device)(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, int version);
HRESULT (*create_device)(IDirectInputAImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev);
} dinput_device;
diff --git a/dlls/dinput/joystick/linux.c b/dlls/dinput/joystick/linux.c
index bbc45a4..66e7a08 100644
--- a/dlls/dinput/joystick/linux.c
+++ b/dlls/dinput/joystick/linux.c
@@ -89,7 +89,7 @@
{0x8d, 0x4a, 0x23, 0x90, 0x3f, 0xb6, 0xbd, 0xf7}
};
-static BOOL joydev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi)
+static BOOL joydev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, int version)
{
int fd = -1;
diff --git a/dlls/dinput/joystick/linuxinput.c b/dlls/dinput/joystick/linuxinput.c
index ba09bf1..c0c31d1 100644
--- a/dlls/dinput/joystick/linuxinput.c
+++ b/dlls/dinput/joystick/linuxinput.c
@@ -122,7 +122,7 @@
#define test_bit(arr,bit) (((BYTE*)arr)[bit>>3]&(1<<(bit&7)))
-static BOOL joydev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi)
+static BOOL joydev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, int version)
{
int i, fd, havejoy = 0;
diff --git a/dlls/dinput/keyboard/main.c b/dlls/dinput/keyboard/main.c
index e27461d..651ce2a 100644
--- a/dlls/dinput/keyboard/main.c
+++ b/dlls/dinput/keyboard/main.c
@@ -117,7 +117,7 @@
if (current->count == current->buffersize)
{
- current->start++;
+ current->start = ++current->start % current->buffersize;
current->overflow = TRUE;
}
else
@@ -138,7 +138,7 @@
{0x8c, 0x73, 0x71, 0xdf, 0x54, 0xa9, 0x64, 0x41}
};
-static void fill_keyboard_dideviceinstancea(LPDIDEVICEINSTANCEA lpddi) {
+static void fill_keyboard_dideviceinstancea(LPDIDEVICEINSTANCEA lpddi, int version) {
DWORD dwSize;
DIDEVICEINSTANCEA ddi;
@@ -152,19 +152,24 @@
ddi.dwSize = dwSize;
ddi.guidInstance = GUID_SysKeyboard;/* DInput's GUID */
ddi.guidProduct = DInput_Wine_Keyboard_GUID; /* Vendor's GUID */
- ddi.dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8);
+ if (version >= 8)
+ ddi.dwDevType = DI8DEVTYPE_KEYBOARD | (DI8DEVTYPEKEYBOARD_UNKNOWN << 8);
+ else
+ ddi.dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8);
strcpy(ddi.tszInstanceName, "Keyboard");
strcpy(ddi.tszProductName, "Wine Keyboard");
memcpy(lpddi, &ddi, (dwSize < sizeof(ddi) ? dwSize : sizeof(ddi)));
}
-static BOOL keyboarddev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi)
+static BOOL keyboarddev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, int version)
{
- if ((dwDevType == 0) || (dwDevType == DIDEVTYPE_KEYBOARD)) {
+ if ((dwDevType == 0) ||
+ ((dwDevType == DIDEVTYPE_KEYBOARD) && (version < 8)) ||
+ ((dwDevType == DI8DEVTYPE_KEYBOARD) && (version >= 8))) {
TRACE("Enumerating the Keyboard device\n");
- fill_keyboard_dideviceinstancea(lpddi);
+ fill_keyboard_dideviceinstancea(lpddi, version);
return TRUE;
}
@@ -239,7 +244,7 @@
DeleteCriticalSection(&(This->crit));
HeapFree(GetProcessHeap(),0,This);
- return 0;
+ return DI_OK;
}
static HRESULT WINAPI SysKeyboardAImpl_SetProperty(
@@ -270,13 +275,15 @@
break;
}
}
- return 0;
+ return DI_OK;
}
static HRESULT WINAPI SysKeyboardAImpl_GetDeviceState(
LPDIRECTINPUTDEVICE8A iface,DWORD len,LPVOID ptr
)
{
+ TRACE("(%p)->(%ld,%p)\n", iface, len, ptr);
+
/* Note: device does not need to be acquired */
if (len != 256)
return DIERR_INVALIDPARAM;
@@ -465,7 +472,10 @@
if (lpDIDevCaps->dwSize == sizeof(DIDEVCAPS)) {
lpDIDevCaps->dwFlags = DIDC_ATTACHED;
- lpDIDevCaps->dwDevType = DIDEVTYPE_KEYBOARD;
+ if (This->dinput->version >= 8)
+ lpDIDevCaps->dwDevType = DI8DEVTYPE_KEYBOARD | (DI8DEVTYPEKEYBOARD_UNKNOWN << 8);
+ else
+ lpDIDevCaps->dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8);
lpDIDevCaps->dwAxes = 0;
lpDIDevCaps->dwButtons = 256;
lpDIDevCaps->dwPOVs = 0;
@@ -536,7 +546,7 @@
return DI_OK;
}
- fill_keyboard_dideviceinstancea(pdidi);
+ fill_keyboard_dideviceinstancea(pdidi, This->dinput->version);
return DI_OK;
}
diff --git a/dlls/dinput/mouse/main.c b/dlls/dinput/mouse/main.c
index 2684463..fe20130 100644
--- a/dlls/dinput/mouse/main.c
+++ b/dlls/dinput/mouse/main.c
@@ -146,7 +146,7 @@
{0x8d, 0x4a, 0x23, 0x90, 0x3f, 0xb6, 0xbd, 0xf7}
};
-static void fill_mouse_dideviceinstancea(LPDIDEVICEINSTANCEA lpddi) {
+static void fill_mouse_dideviceinstancea(LPDIDEVICEINSTANCEA lpddi, int version) {
DWORD dwSize;
DIDEVICEINSTANCEA ddi;
@@ -160,19 +160,24 @@
ddi.dwSize = dwSize;
ddi.guidInstance = GUID_SysMouse;/* DInput's GUID */
ddi.guidProduct = DInput_Wine_Mouse_GUID; /* Vendor's GUID */
- ddi.dwDevType = DIDEVTYPE_MOUSE | (DIDEVTYPEMOUSE_UNKNOWN << 8);
+ if (version >= 8)
+ ddi.dwDevType = DI8DEVTYPE_MOUSE | (DI8DEVTYPEMOUSE_TRADITIONAL << 8);
+ else
+ ddi.dwDevType = DIDEVTYPE_MOUSE | (DIDEVTYPEMOUSE_TRADITIONAL << 8);
strcpy(ddi.tszInstanceName, "Mouse");
strcpy(ddi.tszProductName, "Wine Mouse");
memcpy(lpddi, &ddi, (dwSize < sizeof(ddi) ? dwSize : sizeof(ddi)));
}
-static BOOL mousedev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi)
+static BOOL mousedev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, int version)
{
- if ((dwDevType == 0) || (dwDevType == DIDEVTYPE_MOUSE)) {
+ if ((dwDevType == 0) ||
+ ((dwDevType == DIDEVTYPE_MOUSE) && (version < 8)) ||
+ ((dwDevType == DI8DEVTYPE_MOUSE) && (version >= 8))) {
TRACE("Enumerating the mouse device\n");
- fill_mouse_dideviceinstancea(lpddi);
+ fill_mouse_dideviceinstancea(lpddi, version);
return TRUE;
}
@@ -269,7 +274,7 @@
}
HeapFree(GetProcessHeap(),0,This);
- return 0;
+ return DI_OK;
}
@@ -296,7 +301,7 @@
This->win = hwnd;
This->dwCoopLevel = dwflags;
- return 0;
+ return DI_OK;
}
@@ -344,7 +349,7 @@
/* Prepare all the data-conversion filters */
This->wine_df = create_DataFormat(&(Wine_InternalMouseFormat), df, This->offset_array);
- return 0;
+ return DI_OK;
}
/* low-level mouse hook */
@@ -639,7 +644,7 @@
This->m_state.lX, This->m_state.lY,
This->m_state.rgbButtons[0], This->m_state.rgbButtons[2], This->m_state.rgbButtons[1]);
- return 0;
+ return DI_OK;
}
/******************************************************************************
@@ -716,7 +721,7 @@
This->need_warp = WARP_STARTED;
#endif
}
- return 0;
+ return DI_OK;
}
/******************************************************************************
@@ -756,7 +761,7 @@
}
}
- return 0;
+ return DI_OK;
}
/******************************************************************************
@@ -848,7 +853,10 @@
if (lpDIDevCaps->dwSize == sizeof(DIDEVCAPS)) {
lpDIDevCaps->dwFlags = DIDC_ATTACHED;
- lpDIDevCaps->dwDevType = DIDEVTYPE_MOUSE;
+ if (This->dinput->version >= 8)
+ lpDIDevCaps->dwDevType = DI8DEVTYPE_MOUSE | (DI8DEVTYPEMOUSE_TRADITIONAL << 8);
+ else
+ lpDIDevCaps->dwDevType = DIDEVTYPE_MOUSE | (DIDEVTYPEMOUSE_TRADITIONAL << 8);
lpDIDevCaps->dwAxes = 3;
lpDIDevCaps->dwButtons = 3;
lpDIDevCaps->dwPOVs = 0;
@@ -961,7 +969,7 @@
return DI_OK;
}
- fill_mouse_dideviceinstancea(pdidi);
+ fill_mouse_dideviceinstancea(pdidi, This->dinput->version);
return DI_OK;
}