[PATCH 4/6] dinput: Keyboard and mouse implementation of BuildActionMap
Lucas Fialho Zawacki
lfzawacki at gmail.com
Mon Jun 20 17:07:04 CDT 2011
---
dlls/dinput/device.c | 4 +-
dlls/dinput/keyboard.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++-
dlls/dinput/mouse.c | 58 ++++++++++++++++++++++++++++++++++++++++-
3 files changed, 122 insertions(+), 6 deletions(-)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index ef02f3d..011ab19 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -1359,7 +1359,7 @@ HRESULT WINAPI IDirectInputDevice8AImpl_BuildActionMap(LPDIRECTINPUTDEVICE8A ifa
LPCSTR lpszUserName,
DWORD dwFlags)
{
- FIXME("(%p)->(%p,%s,%08x): stub !\n", iface, lpdiaf, lpszUserName, dwFlags);
+ FIXME("(%p)->(%p,%s,%08x): semi-stub !\n", iface, lpdiaf, lpszUserName, dwFlags);
#define X(x) if (dwFlags & x) FIXME("\tdwFlags =|"#x"\n");
X(DIDBAM_DEFAULT)
X(DIDBAM_PRESERVE)
@@ -1375,7 +1375,7 @@ HRESULT WINAPI IDirectInputDevice8WImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W ifa
LPCWSTR lpszUserName,
DWORD dwFlags)
{
- FIXME("(%p)->(%p,%s,%08x): stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags);
+ FIXME("(%p)->(%p,%s,%08x): semi-stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags);
#define X(x) if (dwFlags & x) FIXME("\tdwFlags =|"#x"\n");
X(DIDBAM_DEFAULT)
X(DIDBAM_PRESERVE)
diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c
index c697cfd..51939a0 100644
--- a/dlls/dinput/keyboard.c
+++ b/dlls/dinput/keyboard.c
@@ -91,6 +91,13 @@ static BYTE map_dik_code(DWORD scanCode, DWORD vkCode)
return out_code;
}
+/* This is used for the action mapping of constants such as DIKEYBOARD_SPACE */
+static DWORD keyboard_semantic_to_obj_id(DWORD dwSemantic)
+{
+ /* dwSemantic=810004df is dwObjID=0xdf04 */
+ return ( 0x0000ff00 & (dwSemantic << 8) ) | ( 0x000000ff & dwSemantic >> 8) ;
+}
+
static int KeyboardCallback( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM lparam )
{
SysKeyboardImpl *This = impl_from_IDirectInputDevice8A(iface);
@@ -524,6 +531,61 @@ static HRESULT WINAPI SysKeyboardAImpl_GetProperty(LPDIRECTINPUTDEVICE8A iface,
return SysKeyboardWImpl_GetProperty(IDirectInputDevice8W_from_impl(This), rguid, pdiph);
}
+HRESULT WINAPI SysKeyboardAImpl_BuildActionMap(LPDIRECTINPUTDEVICE8A iface,
+ LPDIACTIONFORMATA lpdiaf,
+ LPCSTR lpszUserName,
+ DWORD dwFlags)
+{
+ SysKeyboardImpl *This = impl_from_IDirectInputDevice8A(iface);
+ DIACTIONFORMATW diafW;
+ HRESULT hr;
+
+ diafW.rgoAction = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
+ sizeof(DIACTIONW)*lpdiaf->dwNumActions);
+ _copy_diactionformatAtoW( &diafW, lpdiaf);
+
+ hr = IDirectInputDevice8_BuildActionMap( &This->base.IDirectInputDevice8W_iface,
+ &diafW, NULL, dwFlags);
+
+ _copy_diactionformatWtoA( lpdiaf, &diafW);
+
+ HeapFree( GetProcessHeap(), 0, diafW.rgoAction);
+
+ return hr;
+}
+
+HRESULT WINAPI SysKeyboardWImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W iface,
+ LPDIACTIONFORMATW lpdiaf,
+ LPCWSTR lpszUserName,
+ DWORD dwFlags)
+{
+ SysKeyboardImpl *This = impl_from_IDirectInputDevice8W(iface);
+ int i, has_actions = 0;
+
+ FIXME("(%p)->(%p,%s,%08x): semi-stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags);
+
+ for (i=0; i < lpdiaf->dwNumActions; i++)
+ {
+ if ( (lpdiaf->rgoAction[i].dwSemantic & DIKEYBOARD_MASK) == DIKEYBOARD_MASK )
+ {
+ lpdiaf->rgoAction[i].dwObjID = keyboard_semantic_to_obj_id(lpdiaf->rgoAction[i].dwSemantic);
+ lpdiaf->rgoAction[i].guidInstance = This->base.guid;
+ lpdiaf->rgoAction[i].dwHow = DIAH_DEFAULT;
+ has_actions = 1;
+ }
+ else if ( !(dwFlags & DIDBAM_PRESERVE) )
+ {
+ /* we must clear action data belonging to other devices */
+ memset(&lpdiaf->rgoAction[i].guidInstance, 0 , sizeof(GUID));
+ lpdiaf->rgoAction[i].dwHow = DIAH_UNMAPPED;
+ }
+ }
+
+ if (!has_actions) return DI_NOEFFECT;
+
+ return IDirectInputDevice8WImpl_BuildActionMap(iface, lpdiaf, lpszUserName, dwFlags);
+}
+
static const IDirectInputDevice8AVtbl SysKeyboardAvt =
{
IDirectInputDevice2AImpl_QueryInterface,
@@ -555,7 +617,7 @@ static const IDirectInputDevice8AVtbl SysKeyboardAvt =
IDirectInputDevice2AImpl_SendDeviceData,
IDirectInputDevice7AImpl_EnumEffectsInFile,
IDirectInputDevice7AImpl_WriteEffectToFile,
- IDirectInputDevice8AImpl_BuildActionMap,
+ SysKeyboardAImpl_BuildActionMap,
IDirectInputDevice8AImpl_SetActionMap,
IDirectInputDevice8AImpl_GetImageInfo
};
@@ -591,7 +653,7 @@ static const IDirectInputDevice8WVtbl SysKeyboardWvt =
IDirectInputDevice2WImpl_SendDeviceData,
IDirectInputDevice7WImpl_EnumEffectsInFile,
IDirectInputDevice7WImpl_WriteEffectToFile,
- IDirectInputDevice8WImpl_BuildActionMap,
+ SysKeyboardWImpl_BuildActionMap,
IDirectInputDevice8WImpl_SetActionMap,
IDirectInputDevice8WImpl_GetImageInfo
};
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index 02813ff..0f92f03 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -773,6 +773,60 @@ static HRESULT WINAPI SysMouseWImpl_GetDeviceInfo(LPDIRECTINPUTDEVICE8W iface, L
return DI_OK;
}
+HRESULT WINAPI SysMouseAImpl_BuildActionMap(LPDIRECTINPUTDEVICE8A iface,
+ LPDIACTIONFORMATA lpdiaf,
+ LPCSTR lpszUserName,
+ DWORD dwFlags)
+{
+ SysMouseImpl *This = impl_from_IDirectInputDevice8A(iface);
+ DIACTIONFORMATW diafW;
+ HRESULT hr;
+
+ diafW.rgoAction = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
+ sizeof(DIACTIONW)*lpdiaf->dwNumActions);
+ _copy_diactionformatAtoW( &diafW, lpdiaf);
+
+ hr = IDirectInputDevice8_BuildActionMap( &This->base.IDirectInputDevice8W_iface,
+ &diafW, NULL, dwFlags);
+
+ _copy_diactionformatWtoA( lpdiaf, &diafW);
+
+ HeapFree( GetProcessHeap(), 0, diafW.rgoAction);
+
+ return hr;
+}
+
+HRESULT WINAPI SysMouseWImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W iface,
+ LPDIACTIONFORMATW lpdiaf,
+ LPCWSTR lpszUserName,
+ DWORD dwFlags)
+{
+ SysMouseImpl *This = impl_from_IDirectInputDevice8W(iface);
+ int i, has_actions = 0;
+
+ FIXME("(%p)->(%p,%s,%08x): semi-stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags);
+
+ for (i=0; i < lpdiaf->dwNumActions; i++)
+ {
+ if ( (lpdiaf->rgoAction[i].dwSemantic & DIMOUSE_MASK) == DIMOUSE_MASK )
+ {
+ /* dwObjID mapping is not ready for now */
+ lpdiaf->rgoAction[i].guidInstance = This->base.guid;
+ lpdiaf->rgoAction[i].dwHow = DIAH_DEFAULT;
+ has_actions = 1;
+ }
+ else if ( !(dwFlags & DIDBAM_PRESERVE) )
+ {
+ /* we must clear action data belonging to other devices */
+ memset(&lpdiaf->rgoAction[i].guidInstance, 0 , sizeof(GUID));
+ lpdiaf->rgoAction[i].dwHow = DIAH_UNMAPPED;
+ }
+ }
+
+ if (!has_actions) return DI_NOEFFECT;
+
+ return IDirectInputDevice8WImpl_BuildActionMap(iface, lpdiaf, lpszUserName, dwFlags);
+}
static const IDirectInputDevice8AVtbl SysMouseAvt =
{
@@ -805,7 +859,7 @@ static const IDirectInputDevice8AVtbl SysMouseAvt =
IDirectInputDevice2AImpl_SendDeviceData,
IDirectInputDevice7AImpl_EnumEffectsInFile,
IDirectInputDevice7AImpl_WriteEffectToFile,
- IDirectInputDevice8AImpl_BuildActionMap,
+ SysMouseAImpl_BuildActionMap,
IDirectInputDevice8AImpl_SetActionMap,
IDirectInputDevice8AImpl_GetImageInfo
};
@@ -841,7 +895,7 @@ static const IDirectInputDevice8WVtbl SysMouseWvt =
IDirectInputDevice2WImpl_SendDeviceData,
IDirectInputDevice7WImpl_EnumEffectsInFile,
IDirectInputDevice7WImpl_WriteEffectToFile,
- IDirectInputDevice8WImpl_BuildActionMap,
+ SysMouseWImpl_BuildActionMap,
IDirectInputDevice8WImpl_SetActionMap,
IDirectInputDevice8WImpl_GetImageInfo
};
--
1.7.0.4
More information about the wine-patches
mailing list