///////////////////////////////////////////////////////
| 1077 | |
| 1078 | //////////////////////////////////////////////////////////// |
| 1079 | BOOL CALLBACK JoystickImpl::deviceObjectEnumerationCallback(const DIDEVICEOBJECTINSTANCE* deviceObjectInstance, void* userData) |
| 1080 | { |
| 1081 | JoystickImpl& joystick = *reinterpret_cast<JoystickImpl*>(userData); |
| 1082 | |
| 1083 | if (DIDFT_GETTYPE(deviceObjectInstance->dwType) & DIDFT_AXIS) |
| 1084 | { |
| 1085 | // Axes |
| 1086 | if (deviceObjectInstance->guidType == guids::GUID_XAxis) |
| 1087 | joystick.m_axes[Joystick::Axis::X] = DIJOFS_X; |
| 1088 | else if (deviceObjectInstance->guidType == guids::GUID_YAxis) |
| 1089 | joystick.m_axes[Joystick::Axis::Y] = DIJOFS_Y; |
| 1090 | else if (deviceObjectInstance->guidType == guids::GUID_ZAxis) |
| 1091 | joystick.m_axes[Joystick::Axis::Z] = DIJOFS_Z; |
| 1092 | else if (deviceObjectInstance->guidType == guids::GUID_RzAxis) |
| 1093 | joystick.m_axes[Joystick::Axis::R] = DIJOFS_RZ; |
| 1094 | else if (deviceObjectInstance->guidType == guids::GUID_RxAxis) |
| 1095 | joystick.m_axes[Joystick::Axis::U] = DIJOFS_RX; |
| 1096 | else if (deviceObjectInstance->guidType == guids::GUID_RyAxis) |
| 1097 | joystick.m_axes[Joystick::Axis::V] = DIJOFS_RY; |
| 1098 | else if (deviceObjectInstance->guidType == guids::GUID_Slider) |
| 1099 | { |
| 1100 | if (joystick.m_axes[Joystick::Axis::U] == -1) |
| 1101 | joystick.m_axes[Joystick::Axis::U] = DIJOFS_SLIDER(0); |
| 1102 | else |
| 1103 | joystick.m_axes[Joystick::Axis::V] = DIJOFS_SLIDER(1); |
| 1104 | } |
| 1105 | else |
| 1106 | return DIENUM_CONTINUE; |
| 1107 | |
| 1108 | // Set the axis' value range to that of a signed short: [-32768, 32767] |
| 1109 | auto propertyRange = DIPROPRANGE(); |
| 1110 | propertyRange.diph.dwSize = sizeof(propertyRange); |
| 1111 | propertyRange.diph.dwHeaderSize = sizeof(propertyRange.diph); |
| 1112 | propertyRange.diph.dwObj = deviceObjectInstance->dwType; |
| 1113 | propertyRange.diph.dwHow = DIPH_BYID; |
| 1114 | propertyRange.lMin = -32768; |
| 1115 | propertyRange.lMax = 32767; |
| 1116 | |
| 1117 | const HRESULT result = joystick.m_device->SetProperty(DIPROP_RANGE, &propertyRange.diph); |
| 1118 | |
| 1119 | if (result != DI_OK) |
| 1120 | err() << "Failed to set DirectInput device axis property range: " << result << std::endl; |
| 1121 | |
| 1122 | return DIENUM_CONTINUE; |
| 1123 | } |
| 1124 | if (DIDFT_GETTYPE(deviceObjectInstance->dwType) & DIDFT_POV) |
| 1125 | { |
| 1126 | // POVs |
| 1127 | if (deviceObjectInstance->guidType == guids::GUID_POV) |
| 1128 | { |
| 1129 | if (joystick.m_axes[Joystick::Axis::PovX] == -1) |
| 1130 | { |
| 1131 | joystick.m_axes[Joystick::Axis::PovX] = DIJOFS_POV(0); |
| 1132 | joystick.m_axes[Joystick::Axis::PovY] = DIJOFS_POV(0); |
| 1133 | } |
| 1134 | } |
| 1135 | |
| 1136 | return DIENUM_CONTINUE; |
nothing calls this directly
no test coverage detected