Gaze checks and calibration in a panel fixed to the headset

ft-gazepanel (gaze/panel) is a SteamVR overlay that stays put in your view and
shows dots at known head-relative directions; the gaze service runs it and
drives it (gaze/gazecheck.py):
- a one-dot quick check 3 s after the headset goes on, when our tracker asks
  for a click (reseat), at most every 2 minutes, and from Quick check on the
  Gaze page; five dots follow if the next 3 lessons are still over 2 degrees off
- the full calibration (the probe's three rounds, dark to bright) when gaze mode
  comes on without one, or from Calibrate; quitting it with still no calibration
  turns gaze mode off
Each dot takes the gaze once it has held still for 0.6 s; a left click or Meta+J
takes it at once, a right click or Meta+K closes the panel (the pointer helper
hides its dot and passes those presses on while "calpanel" lasts). Our tracker
gets clicks and its own calibration; SteamVR's gets lessons per eye, or a new
calibration.json.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
DeeJanuzandClaude Opus 5.5 committed 2026-09-30 22:12:26 -06:00
1 parent 6ea70f32bc
commit c4c10e6d92
11 files changed
+1119 -14

No files matched your search

+16 -2
View File
@@ -815,9 +815,23 @@ Kirigami.ApplicationWindow {
property var status: backend.gazeStatus
actions: [
Kirigami.Action {
text: "Calibrate…"
text: "Quick check"
icon.name: "crosshairs"
tooltip: "Open the gaze probe to calibrate (fullscreen on a Frametop screen)"
enabled: backend.gazeServiceRunning
tooltip: "One dot in front of you in the headset: look at it, and the gaze tracker relearns where it sits"
onTriggered: backend.gazeQuickCheck()
},
Kirigami.Action {
text: "Calibrate"
icon.name: "crosshairs"
enabled: backend.gazeServiceRunning
tooltip: "The full calibration in the headset: 21 dots in three rounds, dark to bright"
onTriggered: backend.gazeCalibrate()
},
Kirigami.Action {
text: "Gaze probe…"
icon.name: "crosshairs"
tooltip: "The lab tool: calibrate, test, and practise on a Frametop screen"
onTriggered: backend.openGazeProbe()
},
Kirigami.Action {