Map the Frame controllers' buttons; make gaze clicks correctable

The Frame controllers aren't input devices on the host, so the pointer
helper reads them with SteamVR input (vrbuttons.h, actions/), one action
set per button, and sends presses to the relay, which does the mapped
action like for a mouse button. Only mapped buttons are taken, at an
overlay-global priority (SteamVR's experimental "Enable global input from
overlays"), and only outside games unless In games is on. Frametop Input
Settings gets a Controllers page to map them.

Gaze mode: a left press while the gaze has the pointer isn't sent at
once. The pointer stops, you drag it onto what you meant with the button
held, and the release clicks there; a press held still for
POINTER_GAZE_HOLD (0.5 s) becomes a real press, for drags. The dot shows
only while the mouse moves it (POINTER_GAZE_SHOW), while a press is held,
and as a pulse per click. Outside games the pointer stays on while gaze
mode is on. ft-gazed takes a third of each lesson's offset instead of all
of it: in the first live test one 6 degree lesson moved everything and put
the next target 7 degrees off. Frametop Input Settings gets a Gaze page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
DeeJanuzandClaude Opus 5.5 committed 2026-09-28 16:26:24 -06:00
1 parent 3070fd5776
commit 0d50efec45
13 files changed
+1426 -54

No files matched your search

@@ -0,0 +1,197 @@
{
"default_bindings": [
{
"controller_type": "frame_controller",
"binding_url": "bindings_frame_controller.json"
}
],
"action_sets": [
{
"name": "/actions/left_view",
"usage": "hidden"
},
{
"name": "/actions/left_dpad_up",
"usage": "hidden"
},
{
"name": "/actions/left_dpad_down",
"usage": "hidden"
},
{
"name": "/actions/left_dpad_left",
"usage": "hidden"
},
{
"name": "/actions/left_dpad_right",
"usage": "hidden"
},
{
"name": "/actions/left_bumper",
"usage": "hidden"
},
{
"name": "/actions/left_trigger",
"usage": "hidden"
},
{
"name": "/actions/left_grip",
"usage": "hidden"
},
{
"name": "/actions/left_thumbstick",
"usage": "hidden"
},
{
"name": "/actions/right_menu",
"usage": "hidden"
},
{
"name": "/actions/right_a",
"usage": "hidden"
},
{
"name": "/actions/right_b",
"usage": "hidden"
},
{
"name": "/actions/right_x",
"usage": "hidden"
},
{
"name": "/actions/right_y",
"usage": "hidden"
},
{
"name": "/actions/right_bumper",
"usage": "hidden"
},
{
"name": "/actions/right_trigger",
"usage": "hidden"
},
{
"name": "/actions/right_grip",
"usage": "hidden"
},
{
"name": "/actions/right_thumbstick",
"usage": "hidden"
}
],
"actions": [
{
"name": "/actions/left_view/in/press",
"type": "boolean"
},
{
"name": "/actions/left_dpad_up/in/press",
"type": "boolean"
},
{
"name": "/actions/left_dpad_down/in/press",
"type": "boolean"
},
{
"name": "/actions/left_dpad_left/in/press",
"type": "boolean"
},
{
"name": "/actions/left_dpad_right/in/press",
"type": "boolean"
},
{
"name": "/actions/left_bumper/in/press",
"type": "boolean"
},
{
"name": "/actions/left_trigger/in/press",
"type": "boolean"
},
{
"name": "/actions/left_grip/in/press",
"type": "boolean"
},
{
"name": "/actions/left_thumbstick/in/press",
"type": "boolean"
},
{
"name": "/actions/right_menu/in/press",
"type": "boolean"
},
{
"name": "/actions/right_a/in/press",
"type": "boolean"
},
{
"name": "/actions/right_b/in/press",
"type": "boolean"
},
{
"name": "/actions/right_x/in/press",
"type": "boolean"
},
{
"name": "/actions/right_y/in/press",
"type": "boolean"
},
{
"name": "/actions/right_bumper/in/press",
"type": "boolean"
},
{
"name": "/actions/right_trigger/in/press",
"type": "boolean"
},
{
"name": "/actions/right_grip/in/press",
"type": "boolean"
},
{
"name": "/actions/right_thumbstick/in/press",
"type": "boolean"
}
],
"localization": [
{
"language_tag": "en_US",
"/actions/left_view": "Frametop: left view",
"/actions/left_view/in/press": "Press",
"/actions/left_dpad_up": "Frametop: left dpad up",
"/actions/left_dpad_up/in/press": "Press",
"/actions/left_dpad_down": "Frametop: left dpad down",
"/actions/left_dpad_down/in/press": "Press",
"/actions/left_dpad_left": "Frametop: left dpad left",
"/actions/left_dpad_left/in/press": "Press",
"/actions/left_dpad_right": "Frametop: left dpad right",
"/actions/left_dpad_right/in/press": "Press",
"/actions/left_bumper": "Frametop: left bumper",
"/actions/left_bumper/in/press": "Press",
"/actions/left_trigger": "Frametop: left trigger",
"/actions/left_trigger/in/press": "Press",
"/actions/left_grip": "Frametop: left grip",
"/actions/left_grip/in/press": "Press",
"/actions/left_thumbstick": "Frametop: left thumbstick",
"/actions/left_thumbstick/in/press": "Press",
"/actions/right_menu": "Frametop: right menu",
"/actions/right_menu/in/press": "Press",
"/actions/right_a": "Frametop: right a",
"/actions/right_a/in/press": "Press",
"/actions/right_b": "Frametop: right b",
"/actions/right_b/in/press": "Press",
"/actions/right_x": "Frametop: right x",
"/actions/right_x/in/press": "Press",
"/actions/right_y": "Frametop: right y",
"/actions/right_y/in/press": "Press",
"/actions/right_bumper": "Frametop: right bumper",
"/actions/right_bumper/in/press": "Press",
"/actions/right_trigger": "Frametop: right trigger",
"/actions/right_trigger/in/press": "Press",
"/actions/right_grip": "Frametop: right grip",
"/actions/right_grip/in/press": "Press",
"/actions/right_thumbstick": "Frametop: right thumbstick",
"/actions/right_thumbstick/in/press": "Press"
}
]
}