From 7eaf8997962e40070aca97b05248aefd05db351e Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Mon, 17 Mar 2014 19:11:18 -0400 Subject: [PATCH] Fixed SDL_HapticOpenFromJoystick() with DirectInput devices. --- src/haptic/windows/SDL_syshaptic.c | 67 +++++++++++++++------------ src/joystick/windows/SDL_dxjoystick.c | 2 +- 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/src/haptic/windows/SDL_syshaptic.c b/src/haptic/windows/SDL_syshaptic.c index a4b5e42644a48..1a59e1c76e809 100644 --- a/src/haptic/windows/SDL_syshaptic.c +++ b/src/haptic/windows/SDL_syshaptic.c @@ -658,38 +658,47 @@ SDL_SYS_HapticOpenFromDevice8(SDL_Haptic * haptic, haptic->hwdata->device = device8; haptic->hwdata->is_joystick = is_joystick; - /* Grab it exclusively to use force feedback stuff. */ - ret = IDirectInputDevice8_SetCooperativeLevel(haptic->hwdata->device, - SDL_HelperWindow, - DISCL_EXCLUSIVE | - DISCL_BACKGROUND); - if (FAILED(ret)) { - DI_SetError("Setting cooperative level to exclusive", ret); - goto acquire_err; - } + /* !!! FIXME: opening a haptic device here first will make an attempt to + !!! FIXME: SDL_JoystickOpen() that same device fail later, since we + !!! FIXME: have it open in exclusive mode. But this will allow + !!! FIXME: SDL_JoystickOpen() followed by SDL_HapticOpenFromJoystick() + !!! FIXME: to work, and that's probably the common case. Still, + !!! FIXME: ideally, We need to unify the opening code. */ + + if (!is_joystick) { /* if is_joystick, we already set this up elsewhere. */ + /* Grab it exclusively to use force feedback stuff. */ + ret = IDirectInputDevice8_SetCooperativeLevel(haptic->hwdata->device, + SDL_HelperWindow, + DISCL_EXCLUSIVE | + DISCL_BACKGROUND); + if (FAILED(ret)) { + DI_SetError("Setting cooperative level to exclusive", ret); + goto acquire_err; + } - /* Set data format. */ - ret = IDirectInputDevice8_SetDataFormat(haptic->hwdata->device, - &c_dfDIJoystick2); - if (FAILED(ret)) { - DI_SetError("Setting data format", ret); - goto acquire_err; - } + /* Set data format. */ + ret = IDirectInputDevice8_SetDataFormat(haptic->hwdata->device, + &c_dfDIJoystick2); + if (FAILED(ret)) { + DI_SetError("Setting data format", ret); + goto acquire_err; + } - /* Get number of axes. */ - ret = IDirectInputDevice8_EnumObjects(haptic->hwdata->device, - DI_DeviceObjectCallback, - haptic, DIDFT_AXIS); - if (FAILED(ret)) { - DI_SetError("Getting device axes", ret); - goto acquire_err; - } + /* Get number of axes. */ + ret = IDirectInputDevice8_EnumObjects(haptic->hwdata->device, + DI_DeviceObjectCallback, + haptic, DIDFT_AXIS); + if (FAILED(ret)) { + DI_SetError("Getting device axes", ret); + goto acquire_err; + } - /* Acquire the device. */ - ret = IDirectInputDevice8_Acquire(haptic->hwdata->device); - if (FAILED(ret)) { - DI_SetError("Acquiring DirectInput device", ret); - goto acquire_err; + /* Acquire the device. */ + ret = IDirectInputDevice8_Acquire(haptic->hwdata->device); + if (FAILED(ret)) { + DI_SetError("Acquiring DirectInput device", ret); + goto acquire_err; + } } /* Reset all actuators - just in case. */ diff --git a/src/joystick/windows/SDL_dxjoystick.c b/src/joystick/windows/SDL_dxjoystick.c index 3c009746b6341..68291ff837f2c 100644 --- a/src/joystick/windows/SDL_dxjoystick.c +++ b/src/joystick/windows/SDL_dxjoystick.c @@ -1025,7 +1025,7 @@ SDL_SYS_JoystickOpen(SDL_Joystick * joystick, int device_index) result = IDirectInputDevice8_SetCooperativeLevel(joystick->hwdata-> InputDevice, SDL_HelperWindow, - DISCL_NONEXCLUSIVE | + DISCL_EXCLUSIVE | DISCL_BACKGROUND); if (FAILED(result)) { return SetDIerror("IDirectInputDevice8::SetCooperativeLevel", result);