[1/5] dinput: Common implementation of BuildActionMap for keyboard and mouse
lfzawacki at gmail.com
lfzawacki at gmail.com
Sun Aug 21 19:37:18 CDT 2011
From: Lucas Fialho Zawacki <lfzawacki at gmail.com>
---
dlls/dinput/device.c | 42 ++++++++++++++++++++++++++++++++++++++++++
dlls/dinput/device_private.h | 2 ++
dlls/dinput/keyboard.c | 26 +-------------------------
dlls/dinput/mouse.c | 26 ++------------------------
4 files changed, 47 insertions(+), 49 deletions(-)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index 8719066..e3dfd03 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -598,6 +598,48 @@ DWORD semantic_to_obj_id(IDirectInputDeviceImpl* This, DWORD dwSemantic)
return type | (0x0000ff00 & (obj_instance << 8));
}
+HRESULT _build_action_map(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags, DWORD devMask, LPCDIDATAFORMAT df)
+{
+ IDirectInputDeviceImpl *This = impl_from_IDirectInputDevice8W(iface);
+ int i, has_actions = 0;
+
+ for (i=0; i < lpdiaf->dwNumActions; i++)
+ {
+ if ((lpdiaf->rgoAction[i].dwSemantic & devMask) == devMask)
+ {
+ DWORD obj_id = semantic_to_obj_id(This, lpdiaf->rgoAction[i].dwSemantic);
+ DWORD type = DIDFT_GETTYPE(obj_id);
+ DWORD inst = DIDFT_GETINSTANCE(obj_id);
+
+ LPDIOBJECTDATAFORMAT odf;
+
+ if (type == DIDFT_PSHBUTTON) type = DIDFT_BUTTON;
+ if (type == DIDFT_RELAXIS) type = DIDFT_AXIS;
+
+ /* Assure that the object exists */
+ odf = dataformat_to_odf_by_type(df, inst, type);
+
+ if (odf != NULL)
+ {
+ lpdiaf->rgoAction[i].dwObjID = obj_id;
+ lpdiaf->rgoAction[i].guidInstance = This->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);
+}
+
/******************************************************************************
* queue_event - add new event to the ring queue
*/
diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h
index e8fe00a..9b7b370 100644
--- a/dlls/dinput/device_private.h
+++ b/dlls/dinput/device_private.h
@@ -127,6 +127,8 @@ extern const char *_dump_dinput_GUID(const GUID *guid) DECLSPEC_HIDDEN;
extern DWORD semantic_to_obj_id(IDirectInputDeviceImpl* This, DWORD dwSemantic) DECLSPEC_HIDDEN;
extern LPDIOBJECTDATAFORMAT dataformat_to_odf_by_type(LPCDIDATAFORMAT df, int n, DWORD type) DECLSPEC_HIDDEN;
+extern HRESULT _build_action_map(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags, DWORD devMask, LPCDIDATAFORMAT df) DECLSPEC_HIDDEN;
+
/* And the stubs */
extern HRESULT WINAPI IDirectInputDevice2AImpl_Acquire(LPDIRECTINPUTDEVICE8A iface) DECLSPEC_HIDDEN;
extern HRESULT WINAPI IDirectInputDevice2WImpl_Acquire(LPDIRECTINPUTDEVICE8W iface) DECLSPEC_HIDDEN;
diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c
index 3c93bcd..1f766fc 100644
--- a/dlls/dinput/keyboard.c
+++ b/dlls/dinput/keyboard.c
@@ -529,33 +529,9 @@ static HRESULT WINAPI SysKeyboardWImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W ifac
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)
- {
- DWORD obj_id = semantic_to_obj_id(&This->base, lpdiaf->rgoAction[i].dwSemantic);
-
- lpdiaf->rgoAction[i].dwObjID = obj_id;
- 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);
+ return _build_action_map(iface, lpdiaf, lpszUserName, dwFlags, DIKEYBOARD_MASK, &c_dfDIKeyboard);
}
static HRESULT WINAPI SysKeyboardAImpl_BuildActionMap(LPDIRECTINPUTDEVICE8A iface,
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index 8da35f4..f42cdb5 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -778,31 +778,9 @@ static HRESULT WINAPI SysMouseWImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W iface,
LPCWSTR lpszUserName,
DWORD dwFlags)
{
- SysMouseImpl *This = impl_from_IDirectInputDevice8W(iface);
- int i, has_actions = 0;
-
- for (i=0; i < lpdiaf->dwNumActions; i++)
- {
- if ((lpdiaf->rgoAction[i].dwSemantic & DIMOUSE_MASK) == DIMOUSE_MASK)
- {
- DWORD obj_id = semantic_to_obj_id(&This->base, lpdiaf->rgoAction[i].dwSemantic);
-
- lpdiaf->rgoAction[i].dwObjID = obj_id;
- 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;
+ FIXME("(%p)->(%p,%s,%08x): semi-stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags);
- return IDirectInputDevice8WImpl_BuildActionMap(iface, lpdiaf, lpszUserName, dwFlags);
+ return _build_action_map(iface, lpdiaf, lpszUserName, dwFlags, DIMOUSE_MASK, &c_dfDIMouse2);
}
static HRESULT WINAPI SysMouseAImpl_BuildActionMap(LPDIRECTINPUTDEVICE8A iface,
--
1.7.0.4
More information about the wine-patches
mailing list