Actuate the DS4 touchpad at the same force as everything else (#96)

The DS4 touchpad press was the last thing still reading the firmware's
click bit, which reports fewer than half of a thumb's presses and wants
more force the more heavily the pad is already being rested on. That is
what "having to press pretty hard to activate the trackpad" is, and why
it reproduces for one person and not another: the threshold is force
based, so thumb size and resting weight decide how hard is hard enough.

It now takes the same resolved press every other binding uses, so every
press in the app actuates at one threshold rather than the touchpad
keeping its own, much heavier one.

No sensitivity setting, which is what the report asked for. The pad
already actuates about as lightly as it can without a resting thumb
tripping it, so there would be nothing useful to turn down. If it still
reads heavy after this, that is evidence kPadPressArea itself is too high
for everyone rather than a reason to add a knob most people would never
find.

Also fixes a second reader of the same bit, found while checking for
others: TapState asked it whether a contact had become a press, so a
gentle press the firmware missed left the contact looking like a tap and
fired the tap binding on lift, on top of the direction the press had
already sent. With a tap bound to a mouse button that is a stray click on
every soft press.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Dylan DeverillandClaude Opus 5 committed 2026-09-06 21:26:09 -07:00
1 parent 10f3315877
commit 71a50df221
2 files changed
+19 -9

No files matched your search

+8 -4
View File
@@ -1112,12 +1112,16 @@ void ControllerManager::ReadLoop(Slot* slot) {
slot->rightPad.Directions(),
slot->leftPad.ClickInCentre(),
slot->rightPad.ClickInCentre(),
// A tap is a contact that never became a press, and "became a
// press" has to mean the same thing here as everywhere else. Asked
// of the firmware's click bit instead, a gentle press it failed to
// report would leave the contact looking like a tap, and firing
// the tap binding on lift on top of the direction the press had
// already sent.
slot->leftTap.Update((tb3 & SteamController::BTN_TP_LT) != 0,
(tb3 & SteamController::BTN_TP_LT_CLICK) != 0,
tlx, tly),
slot->leftPress.pressed, tlx, tly),
slot->rightTap.Update((tb2 & SteamController::BTN_TP_RT) != 0,
(tb2 & SteamController::BTN_TP_RT_CLICK) != 0,
trx, try_),
slot->rightPress.pressed, trx, try_),
slot->leftPress.pressed,
slot->rightPress.pressed,
};