Skip to content

Commit

Permalink
Fixed SDL_HapticOpenFromJoystick() with DirectInput devices.
Browse files Browse the repository at this point in the history
  • Loading branch information
icculus committed Mar 17, 2014
1 parent cf3ff16 commit 7eaf899
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 30 deletions.
67 changes: 38 additions & 29 deletions src/haptic/windows/SDL_syshaptic.c
Expand Up @@ -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. */
Expand Down
2 changes: 1 addition & 1 deletion src/joystick/windows/SDL_dxjoystick.c
Expand Up @@ -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);
Expand Down

0 comments on commit 7eaf899

Please sign in to comment.