Skip to content

Commit 55e0f24

Browse files
authored
Merge pull request #4 from nefarius/xbox-di-fixes
Fixed trigger axes response for Xbox Controllers in DI backend
2 parents 346dcbf + 072b0ed commit 55e0f24

1 file changed

Lines changed: 21 additions & 2 deletions

File tree

src/dinput_backend.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "dinput_backend.h"
22
#include "sony_layout.h"
33
#include "usb_names.h"
4+
#include "xbox_wireless_hid.h"
45
#include <algorithm>
56
#include <ranges>
67
#include <utility>
@@ -99,8 +100,26 @@ void DInputBackend::Poll()
99100
gs.leftStickY = -NormStick(js.lY);
100101
gs.rightStickX = NormStick(js.lRx);
101102
gs.rightStickY = -NormStick(js.lRy);
102-
gs.leftTrigger = NormTrigger(js.lZ);
103-
gs.rightTrigger = NormTrigger(js.lRz);
103+
if (XboxWireless_IsDevice(dev.vendorId, dev.productId))
104+
{
105+
// Xbox Wireless exposes a single combined axis on lZ: center=rest, upper half=LT, lower half=RT.
106+
const float lZ = static_cast<float>(js.lZ);
107+
if (lZ >= 32768.0f)
108+
{
109+
gs.leftTrigger = std::clamp((lZ - 32768.0f) / 32767.0f, 0.0f, 1.0f);
110+
gs.rightTrigger = 0.0f;
111+
}
112+
else
113+
{
114+
gs.leftTrigger = 0.0f;
115+
gs.rightTrigger = std::clamp((32768.0f - lZ) / 32768.0f, 0.0f, 1.0f);
116+
}
117+
}
118+
else
119+
{
120+
gs.leftTrigger = NormTrigger(js.lZ);
121+
gs.rightTrigger = NormTrigger(js.lRz);
122+
}
104123
}
105124

106125
uint16_t btns = 0;

0 commit comments

Comments
 (0)