From eb6a18d19e5d2eaa0a76993fe09832aa35b71cb4 Mon Sep 17 00:00:00 2001 From: lbgos <285507185+lbgos@users.noreply.github.com> Date: Tue, 13 Oct 2026 00:00:03 +0300 Subject: [PATCH] steamvr_drv: serialize passthrough toggle edge detection NotifyButton runs on each controller's RunFrame thread and shared the rising-edge state unlocked, so simultaneous presses could double-toggle or tear the menu double-press timestamp. Hold the camera mutex. --- src/xrt/state_trackers/steamvr_drv/ovrd_camera.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/xrt/state_trackers/steamvr_drv/ovrd_camera.cpp b/src/xrt/state_trackers/steamvr_drv/ovrd_camera.cpp index 69dea71e7..94614bc0f 100644 --- a/src/xrt/state_trackers/steamvr_drv/ovrd_camera.cpp +++ b/src/xrt/state_trackers/steamvr_drv/ovrd_camera.cpp @@ -96,6 +96,8 @@ MonadoCamera::NotifyButton(enum xrt_input_name name, bool pressed) MonadoCamera *self = s_instance.load(); if (!self || !self->shm || (name != XRT_INPUT_TOUCH_SYSTEM_CLICK && name != XRT_INPUT_TOUCH_MENU_CLICK)) return; + // Called from every controller's RunFrame; edge state is shared. + std::lock_guard lock(self->mutex); // RunFrame reports the held state repeatedly. Toggle only on rising edges. bool &previous = name == XRT_INPUT_TOUCH_SYSTEM_CLICK ? self->system_pressed : self->menu_pressed; if (pressed == previous)