[2/2] dinput: Handle DIPROP_AUTOCENTER set/get

Vincent Pelletier plr.vincent at gmail.com
Sun Jan 18 13:26:58 CST 2009


-- 
Vincent Pelletier
-------------- next part --------------
From c483d308a51f1738eb76211f71438b556e197798 Mon Sep 17 00:00:00 2001
From: Vincent Pelletier <plr.vincent at gmail.com>
Date: Sun, 18 Jan 2009 20:20:01 +0100
Subject: Add support for qurying and setting DIPROP_AUTOCENTER.

---
 dlls/dinput/joystick_linuxinput.c |   26 ++++++++++++++++++++++++--
 1 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/dlls/dinput/joystick_linuxinput.c b/dlls/dinput/joystick_linuxinput.c
index baa1b02..45fca0d 100644
--- a/dlls/dinput/joystick_linuxinput.c
+++ b/dlls/dinput/joystick_linuxinput.c
@@ -193,6 +193,7 @@ struct JoystickImpl
 	/* Force feedback variables */
         struct list                     ff_effects;
 	int				ff_state;
+	int				ff_autocenter;
 };
 
 static void fake_current_js_state(JoystickImpl *ji);
@@ -469,6 +470,10 @@ static JoystickImpl *alloc_device(REFGUID rguid, const void *jvt, IDirectInputIm
 #ifdef HAVE_STRUCT_FF_EFFECT_DIRECTION
     newDevice->ff_state    = FF_STATUS_STOPPED;
 #endif
+    /* There is no way in linux to query forece feedback autocenter status.
+       Instead, track it with ff_autocenter, and assume it's initialy
+       enabled. */
+    newDevice->ff_autocenter = 1;
     InitializeCriticalSection(&newDevice->base.crit);
     newDevice->base.crit.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": JoystickImpl*->base.crit");
 
@@ -895,8 +900,17 @@ static HRESULT WINAPI JoystickAImpl_SetProperty(LPDIRECTINPUTDEVICE8A iface,
     }
     case (DWORD_PTR)DIPROP_AUTOCENTER: {
       LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph;
-
-      FIXME("DIPROP_AUTOCENTER(%d)\n", pd->dwData);
+      struct input_event event;
+
+      TRACE("autocenter(%d)\n", pd->dwData);
+      This->ff_autocenter = pd->dwData == DIPROPAUTOCENTER_ON;
+      event.type = EV_FF;
+      event.code = FF_AUTOCENTER;
+      event.value = This->ff_autocenter ? 0xFFFFUL : 0;
+      if (write(This->joyfd, &event, sizeof(event)) == -1) {
+        ERR("DIPROP_AUTOCENTER(%d) failed: %d %s\n", pd->dwData, errno, strerror(errno));
+        return DIERR_UNSUPPORTED;
+      }
       break;
     }
     case (DWORD_PTR)DIPROP_SATURATION: {
@@ -1022,6 +1036,14 @@ static HRESULT WINAPI JoystickAImpl_GetProperty(LPDIRECTINPUTDEVICE8A iface,
         TRACE("saturation(%d) obj=%d\n", pd->dwData, obj);
         break;
     }
+    case (DWORD_PTR) DIPROP_AUTOCENTER:
+    {
+        LPDIPROPDWORD pd = (LPDIPROPDWORD)pdiph;
+
+        pd->dwData = This->ff_autocenter ? DIPROPAUTOCENTER_ON : DIPROPAUTOCENTER_OFF;
+        TRACE("autocenter(%d)\n", pd->dwData);
+        break;
+    }
 
     default:
         return IDirectInputDevice2AImpl_GetProperty(iface, rguid, pdiph);
-- 
1.5.6.5



More information about the wine-patches mailing list