[2/5] dinput: Common implementation for joystick, keyboard and mouse SetActionMap
Lucas Fialho Zawacki
lfzawacki at gmail.com
Tue Aug 23 21:42:50 CDT 2011
From: Lucas Fialho Zawacki <lfzawacki at gmail.com>
---
dlls/dinput/device.c | 106 +++++++++++++++++++++++++++++++++---------
dlls/dinput/device_private.h | 1 +
dlls/dinput/joystick.c | 58 +----------------------
dlls/dinput/keyboard.c | 48 +------------------
dlls/dinput/mouse.c | 52 +--------------------
5 files changed, 90 insertions(+), 175 deletions(-)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index e3dfd03..a2412b8 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -640,6 +640,87 @@ HRESULT _build_action_map(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf,
return IDirectInputDevice8WImpl_BuildActionMap(iface, lpdiaf, lpszUserName, dwFlags);
}
+HRESULT _set_action_map(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags, LPCDIDATAFORMAT df)
+{
+ IDirectInputDeviceImpl *This = impl_from_IDirectInputDevice8W(iface);
+ DIDATAFORMAT data_format;
+ DIOBJECTDATAFORMAT *obj_df = NULL;
+ DIPROPDWORD dp;
+ DIPROPRANGE dpr;
+ int i, action = 0, num_actions = 0;
+ unsigned int offset = 0;
+
+ if (This->acquired) return DIERR_ACQUIRED;
+
+ data_format.dwSize = sizeof(data_format);
+ data_format.dwObjSize = sizeof(DIOBJECTDATAFORMAT);
+ data_format.dwFlags = DIDF_RELAXIS;
+ data_format.dwDataSize = lpdiaf->dwDataSize;
+
+ /* Count the actions */
+ for (i=0; i < lpdiaf->dwNumActions; i++)
+ if (IsEqualGUID(&This->guid, &lpdiaf->rgoAction[i].guidInstance))
+ num_actions++;
+
+ if (num_actions == 0) return DI_NOEFFECT;
+
+ This->num_actions = num_actions;
+
+ /* Construct the dataformat and actionmap */
+ obj_df = HeapAlloc(GetProcessHeap(), 0, sizeof(DIOBJECTDATAFORMAT)*num_actions);
+ data_format.rgodf = (LPDIOBJECTDATAFORMAT)obj_df;
+ data_format.dwNumObjs = num_actions;
+
+ This->action_map = HeapAlloc(GetProcessHeap(), 0, sizeof(ActionMap)*num_actions);
+
+ for (i = 0; i < lpdiaf->dwNumActions; i++)
+ {
+ if (IsEqualGUID(&This->guid, &lpdiaf->rgoAction[i].guidInstance))
+ {
+ DWORD inst = DIDFT_GETINSTANCE(lpdiaf->rgoAction[i].dwObjID);
+ DWORD type = DIDFT_GETTYPE(lpdiaf->rgoAction[i].dwObjID);
+ LPDIOBJECTDATAFORMAT obj;
+
+ if (type == DIDFT_PSHBUTTON) type = DIDFT_BUTTON;
+ if (type == DIDFT_RELAXIS) type = DIDFT_AXIS;
+
+ obj = dataformat_to_odf_by_type(df, inst, type);
+
+ memcpy(&obj_df[action], obj, df->dwObjSize);
+
+ This->action_map[action].uAppData = lpdiaf->rgoAction[i].uAppData;
+ This->action_map[action].offset = offset;
+ obj_df[action].dwOfs = offset;
+ offset += (type & DIDFT_BUTTON) ? 1 : 4;
+
+ action++;
+ }
+ }
+
+ IDirectInputDevice8_SetDataFormat(iface, &data_format);
+
+ HeapFree(GetProcessHeap(), 0, obj_df);
+
+ /* Set the device properties according to the action format */
+ dpr.diph.dwSize = sizeof(DIPROPRANGE);
+ dpr.lMin = lpdiaf->lAxisMin;
+ dpr.lMax = lpdiaf->lAxisMax;
+ dpr.diph.dwHeaderSize = sizeof(DIPROPHEADER);
+ dpr.diph.dwHow = DIPH_DEVICE;
+ IDirectInputDevice8_SetProperty(iface, DIPROP_RANGE, &dpr.diph);
+
+ if (lpdiaf->dwBufferSize > 0)
+ {
+ dp.diph.dwSize = sizeof(DIPROPDWORD);
+ dp.dwData = lpdiaf->dwBufferSize;
+ dp.diph.dwHeaderSize = sizeof(DIPROPHEADER);
+ dp.diph.dwHow = DIPH_DEVICE;
+ IDirectInputDevice8_SetProperty(iface, DIPROP_BUFFERSIZE, &dp.diph);
+ }
+
+ return IDirectInputDevice8WImpl_SetActionMap(iface, lpdiaf, lpszUserName, dwFlags);
+}
+
/******************************************************************************
* queue_event - add new event to the ring queue
*/
@@ -1483,31 +1564,12 @@ HRESULT WINAPI IDirectInputDevice8WImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W ifa
}
HRESULT WINAPI IDirectInputDevice8WImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface,
- LPDIACTIONFORMATW lpdiaf,
- LPCWSTR lpszUserName,
- DWORD dwFlags)
+ LPDIACTIONFORMATW lpdiaf,
+ LPCWSTR lpszUserName,
+ DWORD dwFlags)
{
- DIPROPDWORD dp;
- DIPROPRANGE dpr;
-
FIXME("(%p)->(%p,%s,%08x): semi-stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags);
- dpr.diph.dwSize = sizeof(DIPROPRANGE);
- dpr.lMin = lpdiaf->lAxisMin;
- dpr.lMax = lpdiaf->lAxisMax;
- dpr.diph.dwHeaderSize = sizeof(DIPROPHEADER);
- dpr.diph.dwHow = DIPH_DEVICE;
- IDirectInputDevice8_SetProperty(iface, DIPROP_RANGE, &dpr.diph);
-
- if (lpdiaf->dwBufferSize > 0)
- {
- dp.diph.dwSize = sizeof(DIPROPDWORD);
- dp.dwData = lpdiaf->dwBufferSize;
- dp.diph.dwHeaderSize = sizeof(DIPROPHEADER);
- dp.diph.dwHow = DIPH_DEVICE;
- IDirectInputDevice8_SetProperty(iface, DIPROP_BUFFERSIZE, &dp.diph);
- }
-
return DI_OK;
}
diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h
index 9b7b370..347c642 100644
--- a/dlls/dinput/device_private.h
+++ b/dlls/dinput/device_private.h
@@ -128,6 +128,7 @@ extern DWORD semantic_to_obj_id(IDirectInputDeviceImpl* This, DWORD dwSemantic)
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;
+extern HRESULT _set_action_map(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags, LPCDIDATAFORMAT df) DECLSPEC_HIDDEN;
/* And the stubs */
extern HRESULT WINAPI IDirectInputDevice2AImpl_Acquire(LPDIRECTINPUTDEVICE8A iface) DECLSPEC_HIDDEN;
diff --git a/dlls/dinput/joystick.c b/dlls/dinput/joystick.c
index 2d8a818..c6bae98 100644
--- a/dlls/dinput/joystick.c
+++ b/dlls/dinput/joystick.c
@@ -501,66 +501,10 @@ HRESULT WINAPI JoystickWGenericImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface,
DWORD dwFlags)
{
JoystickGenericImpl *This = impl_from_IDirectInputDevice8W(iface);
- DIDATAFORMAT data_format;
- DIOBJECTDATAFORMAT *obj_df = NULL;
- int i, action = 0, num_actions = 0;
- unsigned int offset = 0;
FIXME("(%p)->(%p,%s,%08x): semi-stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags);
- if (This->base.acquired) return DIERR_ACQUIRED;
-
- data_format.dwSize = sizeof(data_format);
- data_format.dwObjSize = sizeof(DIOBJECTDATAFORMAT);
- data_format.dwFlags = DIDF_RELAXIS;
- data_format.dwDataSize = lpdiaf->dwDataSize;
-
- /* count the actions */
- for (i=0; i < lpdiaf->dwNumActions; i++)
- if (IsEqualGUID(&This->base.guid, &lpdiaf->rgoAction[i].guidInstance))
- num_actions++;
-
- if (num_actions == 0) return DI_NOEFFECT;
-
- This->base.num_actions = num_actions;
-
- /* Construct the dataformat and actionmap */
- obj_df = HeapAlloc(GetProcessHeap(), 0, sizeof(DIOBJECTDATAFORMAT)*num_actions);
- data_format.rgodf = (LPDIOBJECTDATAFORMAT)obj_df;
- data_format.dwNumObjs = num_actions;
-
- This->base.action_map = HeapAlloc(GetProcessHeap(), 0, sizeof(ActionMap)*num_actions);
-
- for (i = 0; i < lpdiaf->dwNumActions; i++)
- {
- if (IsEqualGUID(&This->base.guid, &lpdiaf->rgoAction[i].guidInstance))
- {
- LPDIDATAFORMAT df = This->base.data_format.wine_df;
- DWORD inst = DIDFT_GETINSTANCE(lpdiaf->rgoAction[i].dwObjID);
- DWORD type = DIDFT_GETTYPE(lpdiaf->rgoAction[i].dwObjID);
- LPDIOBJECTDATAFORMAT obj;
-
- if (type == DIDFT_PSHBUTTON) type = DIDFT_BUTTON;
- if (type == DIDFT_RELAXIS) type = DIDFT_AXIS;
-
- obj = dataformat_to_odf_by_type(df, inst, type);
-
- memcpy(&obj_df[action], obj, df->dwObjSize);
-
- This->base.action_map[action].uAppData = lpdiaf->rgoAction[i].uAppData;
- This->base.action_map[action].offset = offset;
- obj_df[action].dwOfs = offset;
- offset += (type & DIDFT_BUTTON) ? 1 : 4;
-
- action++;
- }
- }
-
- IDirectInputDevice8_SetDataFormat(iface, &data_format);
-
- HeapFree(GetProcessHeap(), 0, obj_df);
-
- return IDirectInputDevice8WImpl_SetActionMap(iface, lpdiaf, lpszUserName, dwFlags);
+ return _set_action_map(iface, lpdiaf, lpszUserName, dwFlags, This->base.data_format.wine_df);
}
HRESULT WINAPI JoystickAGenericImpl_SetActionMap(LPDIRECTINPUTDEVICE8A iface,
diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c
index 1f766fc..cade73f 100644
--- a/dlls/dinput/keyboard.c
+++ b/dlls/dinput/keyboard.c
@@ -559,53 +559,9 @@ static HRESULT WINAPI SysKeyboardWImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface,
LPCWSTR lpszUserName,
DWORD dwFlags)
{
- SysKeyboardImpl *This = impl_from_IDirectInputDevice8W(iface);
- DIDATAFORMAT data_format;
- DIOBJECTDATAFORMAT *obj_df = NULL;
- int i, action = 0, num_actions = 0;
-
- if (This->base.acquired) return DIERR_ACQUIRED;
-
- data_format.dwSize = sizeof(data_format);
- data_format.dwObjSize = sizeof(DIOBJECTDATAFORMAT);
- data_format.dwFlags = DIDF_ABSAXIS;
- data_format.dwDataSize = lpdiaf->dwDataSize;
-
- /* count the actions */
- for (i=0; i < lpdiaf->dwNumActions; i++)
- if (IsEqualGUID(&This->base.guid, &lpdiaf->rgoAction[i].guidInstance))
- num_actions++;
-
- if (num_actions == 0) return DI_NOEFFECT;
-
- This->base.num_actions = num_actions;
-
- /* Construct the dataformat and actionmap */
- obj_df = HeapAlloc(GetProcessHeap(), 0, sizeof(DIOBJECTDATAFORMAT)*num_actions);
- data_format.rgodf = (LPDIOBJECTDATAFORMAT)obj_df;
- data_format.dwNumObjs = num_actions;
-
- This->base.action_map = HeapAlloc(GetProcessHeap(), 0, sizeof(ActionMap)*num_actions);
-
- for (i = 0; i < lpdiaf->dwNumActions; i++)
- {
- if (IsEqualGUID(&This->base.guid, &lpdiaf->rgoAction[i].guidInstance))
- {
- int instance = DIDFT_GETINSTANCE(lpdiaf->rgoAction[i].dwObjID);
- memcpy(&obj_df[action], &c_dfDIKeyboard.rgodf[instance], c_dfDIKeyboard.dwObjSize);
-
- This->base.action_map[action].uAppData = lpdiaf->rgoAction[i].uAppData;
- This->base.action_map[action].offset = action;
- obj_df[action].dwOfs = action;
- action++;
- }
- }
-
- IDirectInputDevice8_SetDataFormat(iface, &data_format);
-
- HeapFree(GetProcessHeap(), 0, obj_df);
+ FIXME("(%p)->(%p,%s,%08x): semi-stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags);
- return IDirectInputDevice8WImpl_SetActionMap(iface, lpdiaf, lpszUserName, dwFlags);
+ return _set_action_map(iface, lpdiaf, lpszUserName, dwFlags, &c_dfDIKeyboard);
}
static HRESULT WINAPI SysKeyboardAImpl_SetActionMap(LPDIRECTINPUTDEVICE8A iface,
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index f42cdb5..c362c3d 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -808,57 +808,9 @@ static HRESULT WINAPI SysMouseWImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface,
LPCWSTR lpszUserName,
DWORD dwFlags)
{
- SysMouseImpl *This = impl_from_IDirectInputDevice8W(iface);
- DIDATAFORMAT data_format;
- DIOBJECTDATAFORMAT *obj_df = NULL;
- int i, action = 0, num_actions = 0;
- unsigned int offset = 0;
-
- if (This->base.acquired) return DIERR_ACQUIRED;
-
- /* count the actions */
- for (i=0; i < lpdiaf->dwNumActions; i++)
- if (IsEqualGUID(&This->base.guid, &lpdiaf->rgoAction[i].guidInstance))
- num_actions++;
-
- if (num_actions == 0) return DI_NOEFFECT;
-
- data_format.dwSize = sizeof(data_format);
- data_format.dwObjSize = sizeof(DIOBJECTDATAFORMAT);
- data_format.dwFlags = DIDF_ABSAXIS;
- data_format.dwDataSize = lpdiaf->dwDataSize;
-
- This->base.num_actions = num_actions;
-
- /* Constructing the dataformat and actionmap */
- obj_df = HeapAlloc(GetProcessHeap(), 0, sizeof(DIOBJECTDATAFORMAT)*num_actions);
- data_format.rgodf = (LPDIOBJECTDATAFORMAT)obj_df;
- data_format.dwNumObjs = num_actions;
-
- This->base.action_map = HeapAlloc(GetProcessHeap(), 0, sizeof(ActionMap)*num_actions);
-
- for (i = 0; i < lpdiaf->dwNumActions; i++)
- {
-
- if (IsEqualGUID(&This->base.guid, &lpdiaf->rgoAction[i].guidInstance))
- {
- int instance = DIDFT_GETINSTANCE(lpdiaf->rgoAction[i].dwObjID);
- memcpy(&obj_df[action], &c_dfDIMouse.rgodf[instance], c_dfDIMouse.dwObjSize);
-
- This->base.action_map[action].uAppData = lpdiaf->rgoAction[i].uAppData;
- This->base.action_map[action].offset = offset;
- obj_df[action].dwOfs = offset;
- offset += (obj_df[action].dwType & DIDFT_BUTTON) ? 1 : 4;
-
- action++;
- }
- }
-
- IDirectInputDevice8_SetDataFormat(iface, &data_format);
-
- HeapFree(GetProcessHeap(), 0, obj_df);
+ FIXME("(%p)->(%p,%s,%08x): semi-stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags);
- return IDirectInputDevice8WImpl_SetActionMap(iface, lpdiaf, lpszUserName, dwFlags);
+ return _set_action_map(iface, lpdiaf, lpszUserName, dwFlags, &c_dfDIMouse2);
}
static HRESULT WINAPI SysMouseAImpl_SetActionMap(LPDIRECTINPUTDEVICE8A iface,
--
1.7.0.4
More information about the wine-patches
mailing list