Frametop: a multi-screen desktop and universal 3D mouse for the Steam Frame

Several KDE Plasma screens floating in SteamVR, each a real monitor of any
resolution and shape, shown by our own compositor (ft-screens), with a
layout, wrist pinning, and visibility modes; a Bluetooth mouse that drives
all of SteamVR as a room-anchored 3D pointer (input relay, ft-pointer
helper, ft_pointer SteamVR driver); two settings apps; and Bluetooth LE
fixes. Installs on the headset with ./install.sh.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
DeeJanuzandClaude Opus 5.5 committed 2026-09-26 16:14:13 -06:00
commit d439bc3f25
61 files changed
+8785

No files matched your search

@@ -0,0 +1,51 @@
{
"jsonid": "input_profile",
"controller_type": "ft_pointer",
"device_class": "TrackedDeviceClass_Controller",
"resource_root": "ft_pointer",
"driver_name": "ft_pointer",
"input_bindingui_mode": "controller_handed",
"should_show_binding_errors": true,
"input_source": {
"/input/trigger": {
"type": "button",
"click": true
},
"/input/b": {
"type": "button",
"click": true
},
"/input/x": {
"type": "button",
"click": true
},
"/input/system": {
"type": "button",
"click": true
},
"/input/joystick": {
"type": "joystick",
"click": true
},
"/pose/raw": {
"type": "pose"
},
"/pose/tip": {
"type": "pose"
},
"/input/a": {
"type": "button",
"click": true
}
},
"default_bindings": [
{
"app_key": "openvr.component.vrcompositor",
"binding_url": "ft_pointer_vrcompositor.json"
},
{
"app_key": "steam.client",
"binding_url": "ft_pointer_steam.json"
}
]
}
@@ -0,0 +1,16 @@
{
"action_manifest_version": 0,
"alias_info": {},
"app_key": "steam.client",
"category": "steamvr_input",
"controller_type": "ft_pointer",
"description": "",
"name": "frametop pointer: Steam client (input comes through the dashboard laser mouse)",
"options": {},
"simulated_actions": [],
"bindings": {
"/actions/haptics": {
"sources": []
}
}
}
@@ -0,0 +1,205 @@
{
"action_manifest_version": 0,
"alias_info": {},
"app_key": "openvr.component.vrcompositor",
"category": "steamvr_input",
"controller_type": "ft_pointer",
"description": "",
"name": "frametop pointer: dashboard laser mouse",
"options": {},
"simulated_actions": [],
"bindings": {
"/actions/lasermouse": {
"sources": [
{
"path": "/user/hand/left/input/trigger",
"mode": "button",
"inputs": {
"click": {
"output": "/actions/lasermouse/in/leftclick"
}
}
},
{
"path": "/user/hand/left/input/b",
"mode": "button",
"inputs": {
"click": {
"output": "/actions/lasermouse/in/rightclick"
}
}
},
{
"path": "/user/hand/left/input/x",
"mode": "button",
"inputs": {
"click": {
"output": "/actions/lasermouse/in/middleclick"
}
}
},
{
"path": "/user/hand/left/input/joystick",
"mode": "button",
"inputs": {
"click": {
"output": "/actions/lasermouse/in/back"
}
}
},
{
"path": "/user/hand/right/input/trigger",
"mode": "button",
"inputs": {
"click": {
"output": "/actions/lasermouse/in/leftclick"
}
}
},
{
"path": "/user/hand/right/input/b",
"mode": "button",
"inputs": {
"click": {
"output": "/actions/lasermouse/in/rightclick"
}
}
},
{
"path": "/user/hand/right/input/x",
"mode": "button",
"inputs": {
"click": {
"output": "/actions/lasermouse/in/middleclick"
}
}
},
{
"path": "/user/hand/right/input/joystick",
"mode": "button",
"inputs": {
"click": {
"output": "/actions/lasermouse/in/back"
}
}
}
],
"poses": [
{
"output": "/actions/lasermouse/in/Pointer",
"path": "/user/hand/left/pose/raw"
},
{
"output": "/actions/lasermouse/in/Pointer",
"path": "/user/hand/right/pose/raw"
}
]
},
"/actions/scroll_discrete": {
"sources": [
{
"path": "/user/hand/left/input/joystick",
"mode": "scroll",
"inputs": {
"scroll": {
"output": "/actions/scroll_discrete/in/scroll"
}
}
},
{
"path": "/user/hand/right/input/joystick",
"mode": "scroll",
"inputs": {
"scroll": {
"output": "/actions/scroll_discrete/in/scroll"
}
}
}
]
},
"/actions/scroll_smooth": {
"sources": [
{
"path": "/user/hand/left/input/joystick",
"mode": "scroll",
"inputs": {
"scroll": {
"output": "/actions/scroll_smooth/in/scroll"
}
}
},
{
"path": "/user/hand/right/input/joystick",
"mode": "scroll",
"inputs": {
"scroll": {
"output": "/actions/scroll_smooth/in/scroll"
}
}
}
]
},
"/actions/system": {
"sources": [
{
"path": "/user/hand/left/input/system",
"mode": "button",
"inputs": {
"click": {
"output": "/actions/system/in/ToggleDashboard"
}
}
},
{
"path": "/user/hand/right/input/system",
"mode": "button",
"inputs": {
"click": {
"output": "/actions/system/in/ToggleDashboard"
}
}
}
]
},
"/actions/lasermouse_secondary": {
"sources": [
{
"path": "/user/hand/left/input/trigger",
"mode": "button",
"inputs": {
"click": {
"output": "/actions/lasermouse_secondary/in/switchlaserhand"
}
}
},
{
"path": "/user/hand/right/input/trigger",
"mode": "button",
"inputs": {
"click": {
"output": "/actions/lasermouse_secondary/in/switchlaserhand"
}
}
},
{
"path": "/user/hand/left/input/a",
"mode": "button",
"inputs": {
"click": {
"output": "/actions/lasermouse_secondary/in/switchlaserhand"
}
}
},
{
"path": "/user/hand/right/input/a",
"mode": "button",
"inputs": {
"click": {
"output": "/actions/lasermouse_secondary/in/switchlaserhand"
}
}
}
]
}
}
}