- added argument printing to stubs
- replaced memcmp by IsEqualGUID
- implemented GetCapabilities for Mouse and Keyboard
diff --git a/windows/dinput.c b/windows/dinput.c
index d6e9a75..a69f5ff 100644
--- a/windows/dinput.c
+++ b/windows/dinput.c
@@ -179,6 +179,7 @@
FE(DISCL_EXCLUSIVE)
FE(DISCL_FOREGROUND)
FE(DISCL_NONEXCLUSIVE)
+#undef FE
};
for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
if (flags[i].mask & dwFlags)
@@ -186,6 +187,36 @@
DPRINTF("\n");
}
+static void _dump_EnumObjects_flags(DWORD dwFlags) {
+ int i;
+ const struct {
+ DWORD mask;
+ 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)
+ FE(DIDFT_OUTPUT)
+ FE(DIDFT_POV)
+ FE(DIDFT_PSHBUTTON)
+ FE(DIDFT_RELAXIS)
+ FE(DIDFT_TGLBUTTON)
+#undef FE
+ };
+ 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);
+}
+
struct IDirectInputAImpl
{
ICOM_VFIELD(IDirectInputA);
@@ -297,8 +328,8 @@
ICOM_THIS(IDirectInputAImpl,iface);
TRACE("(this=%p,%s,%p,%p)\n",This,debugstr_guid(rguid),pdev,punk);
- if ((!memcmp(&GUID_SysKeyboard,rguid,sizeof(GUID_SysKeyboard))) || /* Generic Keyboard */
- (!memcmp(&DInput_Wine_Keyboard_GUID,rguid,sizeof(GUID_SysKeyboard)))) { /* Wine Keyboard */
+ if ((IsEqualGUID(&GUID_SysKeyboard,rguid)) || /* Generic Keyboard */
+ (IsEqualGUID(&DInput_Wine_Keyboard_GUID,rguid))) { /* Wine Keyboard */
SysKeyboardAImpl* newDevice;
newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysKeyboardAImpl));
newDevice->ref = 1;
@@ -306,10 +337,12 @@
memcpy(&(newDevice->guid),rguid,sizeof(*rguid));
memset(newDevice->keystate,0,256);
*pdev=(IDirectInputDeviceA*)newDevice;
+
+ TRACE("Creating a Keyboard device (%p)\n", newDevice);
return DI_OK;
}
- if ((!memcmp(&GUID_SysMouse,rguid,sizeof(GUID_SysMouse))) || /* Generic Mouse */
- (!memcmp(&DInput_Wine_Mouse_GUID,rguid,sizeof(GUID_SysMouse)))) { /* Wine Mouse */
+ if ((IsEqualGUID(&GUID_SysMouse,rguid)) || /* Generic Mouse */
+ (IsEqualGUID(&DInput_Wine_Mouse_GUID,rguid))) { /* Wine Mouse */
SysMouseAImpl* newDevice;
newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysMouseAImpl));
newDevice->ref = 1;
@@ -318,11 +351,13 @@
MakeCriticalSectionGlobal(&(newDevice->crit));
memcpy(&(newDevice->guid),rguid,sizeof(*rguid));
*pdev=(IDirectInputDeviceA*)newDevice;
+
+ TRACE("Creating a Mouse device (%p)\n", newDevice);
return DI_OK;
}
#ifdef HAVE_LINUX_22_JOYSTICK_API
- if ((!memcmp(&GUID_Joystick,rguid,sizeof(GUID_Joystick))) ||
- (!memcmp(&DInput_Wine_Joystick_GUID,rguid,sizeof(GUID_Joystick)))) {
+ if ((IsEqualGUID(&GUID_Joystick,rguid)) ||
+ (IsEqualGUID(&DInput_Wine_Joystick_GUID,rguid))) {
JoystickAImpl* newDevice;
newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(JoystickAImpl));
newDevice->ref = 1;
@@ -330,6 +365,8 @@
newDevice->joyfd = -1;
memcpy(&(newDevice->guid),rguid,sizeof(*rguid));
*pdev=(IDirectInputDeviceA*)newDevice;
+
+ TRACE("Creating a Joystick device (%p)\n", newDevice);
return DI_OK;
}
#endif
@@ -342,12 +379,12 @@
ICOM_THIS(IDirectInputAImpl,iface);
TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
- if (!memcmp(&IID_IUnknown,riid,sizeof(*riid))) {
+ if (IsEqualGUID(&IID_IUnknown,riid)) {
IDirectInputA_AddRef(iface);
*ppobj = This;
return 0;
}
- if (!memcmp(&IID_IDirectInputA,riid,sizeof(*riid))) {
+ if (IsEqualGUID(&IID_IDirectInputA,riid)) {
IDirectInputA_AddRef(iface);
*ppobj = This;
return 0;
@@ -538,6 +575,36 @@
return DI_OK;
}
+/******************************************************************************
+ * GetCapabilities : get the device capablitites
+ */
+static HRESULT WINAPI SysKeyboardAImpl_GetCapabilities(
+ LPDIRECTINPUTDEVICE2A iface,
+ LPDIDEVCAPS lpDIDevCaps)
+{
+ ICOM_THIS(SysMouseAImpl,iface);
+
+ TRACE("(this=%p,%p)\n",This,lpDIDevCaps);
+
+ if (lpDIDevCaps->dwSize == sizeof(DIDEVCAPS)) {
+ lpDIDevCaps->dwFlags = DIDC_ATTACHED;
+ lpDIDevCaps->dwDevType = DIDEVTYPE_KEYBOARD;
+ lpDIDevCaps->dwAxes = 0;
+ lpDIDevCaps->dwButtons = 0;
+ lpDIDevCaps->dwPOVs = 0;
+ lpDIDevCaps->dwFFSamplePeriod = 0;
+ lpDIDevCaps->dwFFMinTimeResolution = 0;
+ lpDIDevCaps->dwFirmwareRevision = 100;
+ lpDIDevCaps->dwHardwareRevision = 100;
+ lpDIDevCaps->dwFFDriverVersion = 0;
+ } else {
+ /* DirectX 3.0 */
+ FIXME("DirectX 3.0 not supported....\n");
+ }
+
+ return DI_OK;
+}
+
static HRESULT WINAPI IDirectInputDevice2AImpl_QueryInterface(
LPDIRECTINPUTDEVICE2A iface,REFIID riid,LPVOID *ppobj
)
@@ -545,17 +612,17 @@
ICOM_THIS(IDirectInputDevice2AImpl,iface);
TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
- if (!memcmp(&IID_IUnknown,riid,sizeof(*riid))) {
+ if (IsEqualGUID(&IID_IUnknown,riid)) {
IDirectInputDevice2_AddRef(iface);
*ppobj = This;
return 0;
}
- if (!memcmp(&IID_IDirectInputDeviceA,riid,sizeof(*riid))) {
+ if (IsEqualGUID(&IID_IDirectInputDeviceA,riid)) {
IDirectInputDevice2_AddRef(iface);
*ppobj = This;
return 0;
}
- if (!memcmp(&IID_IDirectInputDevice2A,riid,sizeof(*riid))) {
+ if (IsEqualGUID(&IID_IDirectInputDevice2A,riid)) {
IDirectInputDevice2_AddRef(iface);
*ppobj = This;
return 0;
@@ -570,22 +637,16 @@
return ++This->ref;
}
-static HRESULT WINAPI IDirectInputDevice2AImpl_GetCapabilities(
- LPDIRECTINPUTDEVICE2A iface,
- LPDIDEVCAPS lpDIDevCaps)
-{
- lpDIDevCaps->dwFlags = DIDC_ATTACHED;
- FIXME("stub!\n");
- return DI_OK;
-}
-
static HRESULT WINAPI IDirectInputDevice2AImpl_EnumObjects(
LPDIRECTINPUTDEVICE2A iface,
LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback,
LPVOID lpvRef,
DWORD dwFlags)
{
- FIXME("stub!\n");
+ TRACE("(this=%p,%p,%p,%08lx): stub!\n", iface, lpCallback, lpvRef, dwFlags);
+ DPRINTF(" - flags = ");
+ _dump_EnumObjects_flags(dwFlags);
+
#if 0
if (lpCallback)
lpCallback(NULL, lpvRef);
@@ -598,7 +659,9 @@
REFGUID rguid,
LPDIPROPHEADER pdiph)
{
- FIXME("stub!\n");
+ FIXME("(this=%p,%s,%p): stub!\n",
+ iface, debugstr_guid(rguid), pdiph);
+
return DI_OK;
}
@@ -608,7 +671,9 @@
DWORD dwObj,
DWORD dwHow)
{
- FIXME("stub!\n");
+ FIXME("(this=%p,%p,%ld,0x%08lx): stub!\n",
+ iface, pdidoi, dwObj, dwHow);
+
return DI_OK;
}
@@ -616,7 +681,9 @@
LPDIRECTINPUTDEVICE2A iface,
LPDIDEVICEINSTANCEA pdidi)
{
- FIXME("stub!\n");
+ FIXME("(this=%p,%p): stub!\n",
+ iface, pdidi);
+
return DI_OK;
}
@@ -625,7 +692,9 @@
HWND hwndOwner,
DWORD dwFlags)
{
- FIXME("stub!\n");
+ FIXME("(this=%p,0x%08x,0x%08lx): stub!\n",
+ iface, hwndOwner, dwFlags);
+
return DI_OK;
}
@@ -635,7 +704,8 @@
DWORD dwVersion,
REFGUID rguid)
{
- FIXME("stub!\n");
+ FIXME("(this=%p,%d,%ld,%s): stub!\n",
+ iface, hinst, dwVersion, debugstr_guid(rguid));
return DI_OK;
}
@@ -650,7 +720,8 @@
LPDIRECTINPUTEFFECT *ppdef,
LPUNKNOWN pUnkOuter)
{
- FIXME("stub!\n");
+ FIXME("(this=%p,%s,%p,%p,%p): stub!\n",
+ iface, debugstr_guid(rguid), lpeff, ppdef, pUnkOuter);
return DI_OK;
}
@@ -660,7 +731,9 @@
LPVOID lpvRef,
DWORD dwFlags)
{
- FIXME("stub!\n");
+ FIXME("(this=%p,%p,%p,0x%08lx): stub!\n",
+ iface, lpCallback, lpvRef, dwFlags);
+
if (lpCallback)
lpCallback(NULL, lpvRef);
return DI_OK;
@@ -671,7 +744,8 @@
LPDIEFFECTINFOA lpdei,
REFGUID rguid)
{
- FIXME("stub!\n");
+ FIXME("(this=%p,%p,%s): stub!\n",
+ iface, lpdei, debugstr_guid(rguid));
return DI_OK;
}
@@ -679,7 +753,8 @@
LPDIRECTINPUTDEVICE2A iface,
LPDWORD pdwOut)
{
- FIXME("stub!\n");
+ FIXME("(this=%p,%p): stub!\n",
+ iface, pdwOut);
return DI_OK;
}
@@ -687,7 +762,8 @@
LPDIRECTINPUTDEVICE2A iface,
DWORD dwFlags)
{
- FIXME("stub!\n");
+ FIXME("(this=%p,0x%08lx): stub!\n",
+ iface, dwFlags);
return DI_OK;
}
@@ -697,7 +773,8 @@
LPVOID lpvRef,
DWORD dwFlags)
{
- FIXME("stub!\n");
+ FIXME("(this=%p,%p,%p,0x%08lx): stub!\n",
+ iface, lpCallback, lpvRef, dwFlags);
if (lpCallback)
lpCallback(NULL, lpvRef);
return DI_OK;
@@ -707,14 +784,16 @@
LPDIRECTINPUTDEVICE2A iface,
LPDIEFFESCAPE lpDIEEsc)
{
- FIXME("stub!\n");
+ FIXME("(this=%p,%p): stub!\n",
+ iface, lpDIEEsc);
return DI_OK;
}
static HRESULT WINAPI IDirectInputDevice2AImpl_Poll(
LPDIRECTINPUTDEVICE2A iface)
{
- FIXME("stub!\n");
+ FIXME("(this=%p): stub!\n",
+ iface);
return DI_OK;
}
@@ -725,7 +804,9 @@
LPDWORD pdwInOut,
DWORD dwFlags)
{
- FIXME("stub!\n");
+ FIXME("(this=%p,0x%08lx,%p,%p,0x%08lx): stub!\n",
+ iface, cbObjectData, rgdod, pdwInOut, dwFlags);
+
return DI_OK;
}
@@ -1199,6 +1280,38 @@
return DI_OK;
}
+/******************************************************************************
+ * GetCapabilities : get the device capablitites
+ */
+static HRESULT WINAPI SysMouseAImpl_GetCapabilities(
+ LPDIRECTINPUTDEVICE2A iface,
+ LPDIDEVCAPS lpDIDevCaps)
+{
+ ICOM_THIS(SysMouseAImpl,iface);
+
+ TRACE("(this=%p,%p)\n",This,lpDIDevCaps);
+
+ if (lpDIDevCaps->dwSize == sizeof(DIDEVCAPS)) {
+ lpDIDevCaps->dwFlags = DIDC_ATTACHED;
+ lpDIDevCaps->dwDevType = DIDEVTYPE_MOUSE;
+ lpDIDevCaps->dwAxes = 2;
+ lpDIDevCaps->dwButtons = 3;
+ lpDIDevCaps->dwPOVs = 0;
+ lpDIDevCaps->dwFFSamplePeriod = 0;
+ lpDIDevCaps->dwFFMinTimeResolution = 0;
+ lpDIDevCaps->dwFirmwareRevision = 100;
+ lpDIDevCaps->dwHardwareRevision = 100;
+ lpDIDevCaps->dwFFDriverVersion = 0;
+ } else {
+ /* DirectX 3.0 */
+ FIXME("DirectX 3.0 not supported....\n");
+ }
+
+ return DI_OK;
+}
+
+
+
#ifdef HAVE_LINUX_22_JOYSTICK_API
/******************************************************************************
* Joystick
@@ -1463,7 +1576,7 @@
IDirectInputDevice2AImpl_QueryInterface,
IDirectInputDevice2AImpl_AddRef,
IDirectInputDevice2AImpl_Release,
- IDirectInputDevice2AImpl_GetCapabilities,
+ SysKeyboardAImpl_GetCapabilities,
IDirectInputDevice2AImpl_EnumObjects,
IDirectInputDevice2AImpl_GetProperty,
SysKeyboardAImpl_SetProperty,
@@ -1495,7 +1608,7 @@
IDirectInputDevice2AImpl_QueryInterface,
IDirectInputDevice2AImpl_AddRef,
SysMouseAImpl_Release,
- IDirectInputDevice2AImpl_GetCapabilities,
+ SysMouseAImpl_GetCapabilities,
IDirectInputDevice2AImpl_EnumObjects,
IDirectInputDevice2AImpl_GetProperty,
SysMouseAImpl_SetProperty,