Bind Frame right X to normal-priority hold-to-talk

This commit is contained in:
baketnk committed 2026-09-24 13:40:27 -04:00
1 parent b5499eccdf
commit 6b1d20858a
10 files changed
+85 -23

No files matched your search

+3 -2
View File
@@ -24,8 +24,9 @@ void help() {
"Mount: world (first-launch default), left-wrist, right-wrist, head.\n"
"Settings save the mount; --mount overrides it for this launch. --head is an alias.\n"
"Font defaults to bundled Inconsolata in the assets directory.\n"
"Right grip: double-tap, hold second squeeze to speak, release to review.\n"
"Left grip: double-tap for explicit Enter. Bindings are remappable.\n"
"Right X: hold to speak, release to review (default Frame binding).\n"
"Grip gestures are remappable but may be unavailable in the dashboard.\n"
"Left grip: double-tap for explicit Enter when active.\n"
"Review first: Insert approves current focus; never automatic Enter.\n"
"No device access unless an explicit runtime/check/registration mode is used.\n";
#ifndef FRAMEYAP_NATIVE
+9
View File
@@ -341,6 +341,15 @@ std::string Overlay::controls_status() {
" origin=" + (origin_ok ? "Y" : "N") +
" raw=" + (raw_ok ? ((raw.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_Grip)) ? "down" : "up") : "n/a");
}
// The default Frame binding maps right X to the named hold-to-talk action.
// Report the action's own activity separately from the stricter pose gate;
// remapped bindings may intentionally have a different origin.
vr::InputDigitalActionData_t ptt{};
const auto ptt_error = impl_->input->GetDigitalActionData(impl_->actions[2], &ptt, sizeof(ptt), vr::k_ulInvalidInputValueHandle);
const auto [accepted, down] = impl_->digital(2);
result += "\nPTT (default right X): err=" + std::to_string(int(ptt_error)) +
" active=" + (ptt.bActive ? "Y" : "N") + " down=" + (ptt.bState ? "Y" : "N") +
" accepted=" + (accepted ? "Y" : "N") + " gated-down=" + (down ? "Y" : "N");
return result;
}
std::string Overlay::pointer_status() const {
+2 -2
View File
@@ -24,7 +24,7 @@ void signal_stop(int) { interrupted = 1; }
std::string state_label(State state) {
switch (state) {
case State::Warming: return "Warming - on-device Redux CPU";
case State::Ready: return "Ready - double-tap + hold right grip";
case State::Ready: return "Ready - hold X or click Record";
case State::Recording: return "RECORDING";
case State::Transcribing: return "Transcribing - on device";
case State::Review: return "Review - Insert approves CURRENT focus";
@@ -66,7 +66,7 @@ int run(const Options& options) {
if (session.state() == State::Error) session.cancel();
if (!session.record()) return;
audio.start();
detail = "Release grip to finish. Cancel discards. Maximum 20 seconds.";
detail = "Release to finish. Cancel discards. Maximum 20 seconds.";
};
try { warm(); }
catch (const std::exception& e) { session.fail(); detail = e.what(); }