host.controller_config.layout_coords
Fractional coordinates for Xbox controller inputs on the controller image.
All coordinates are normalized fractions (0.0 to 1.0) of the image dimensions. The canvas maps them to actual pixel positions based on the current rendered image size, so they work at any resolution or window size.
Each input defines:
- anchor: where the line starts on the controller image (fraction)
- label: where the binding box is drawn (fractions of image dimensions)
ButtonShape defines a clickable outline drawn on the controller image. Multiple inputs can share a single shape (e.g., stick X, Y, and button).
1"""Fractional coordinates for Xbox controller inputs on the controller image. 2 3All coordinates are normalized fractions (0.0 to 1.0) of the image 4dimensions. The canvas maps them to actual pixel positions based on 5the current rendered image size, so they work at any resolution or 6window size. 7 8Each input defines: 9 - anchor: where the line starts on the controller image (fraction) 10 - label: where the binding box is drawn (fractions of image dimensions) 11 12ButtonShape defines a clickable outline drawn on the controller image. 13Multiple inputs can share a single shape (e.g., stick X, Y, and button). 14""" 15 16from dataclasses import dataclass, field 17 18# Source image dimensions used to derive the fractions below. 19# Only used as documentation; the code uses fractions directly. 20_IMG_W = 1920 21_IMG_H = 1292 22 23 24def _fx(px: float) -> float: 25 """Convert pixel X to fraction.""" 26 return px / _IMG_W 27 28 29def _fy(py: float) -> float: 30 """Convert pixel Y to fraction.""" 31 return py / _IMG_H 32 33 34@dataclass(frozen=True) 35class InputCoord: 36 """Position data for a single controller input. 37 38 anchor_x/y are fractions (0-1) of the image. 39 label_x/y are fractions (0-1) of the image for binding box placement. 40 """ 41 name: str 42 display_name: str 43 input_type: str # "button", "axis", "pov" 44 anchor_x: float 45 anchor_y: float 46 label_x: float 47 label_y: float 48 49 50@dataclass(frozen=True) 51class ButtonShape: 52 """A clickable outline drawn on the controller image. 53 54 center_x/y and width/height are all fractions of image dimensions. 55 """ 56 name: str 57 shape: str # "circle", "rect", "pill" 58 center_x: float 59 center_y: float 60 width: float # fraction of image width 61 height: float # fraction of image height 62 inputs: list[str] = field(default_factory=list) 63 64 65# Coordinates calibrated against images/Xbox_Controller.svg.png (1920x1292), 66# then converted to fractions. 67 68XBOX_INPUTS: list[InputCoord] = [ 69 # --- Axes --- 70 # Left stick — labels in a vertical column, connector bar drawn separately 71 InputCoord("left_stick_x", "Left Stick X", "axis", 72 _fx(420), _fy(695), _fx(-382), _fy(287)), 73 InputCoord("left_stick_y", "Left Stick Y", "axis", 74 _fx(420), _fy(695), _fx(-382), _fy(416)), 75 # Right stick — labels in a vertical column, connector bar drawn separately 76 InputCoord("right_stick_x", "Right Stick X", "axis", 77 _fx(1210), _fy(965), _fx(1646), _fy(1026)), 78 InputCoord("right_stick_y", "Right Stick Y", "axis", 79 _fx(1210), _fy(965), _fx(1646), _fy(1156)), 80 # Triggers 81 InputCoord("left_trigger", "Left Trigger", "axis", 82 _fx(435), _fy(170), _fx(8), _fy(-2)), 83 InputCoord("right_trigger", "Right Trigger", "axis", 84 _fx(1490), _fy(170), _fx(1494), _fy(1)), 85 86 # --- Buttons --- 87 InputCoord("a_button", "A Button", "button", 88 _fx(1480), _fy(755), _fx(1723), _fy(686)), 89 InputCoord("b_button", "B Button", "button", 90 _fx(1629), _fy(633), _fx(1715), _fy(558)), 91 InputCoord("x_button", "X Button", "button", 92 _fx(1344), _fy(635), _fx(1644), _fy(809)), 93 InputCoord("y_button", "Y Button", "button", 94 _fx(1492), _fy(518), _fx(1654), _fy(438)), 95 InputCoord("left_bumper", "Left Bumper", "button", 96 _fx(455), _fy(290), _fx(-113), _fy(147)), 97 InputCoord("right_bumper", "Right Bumper", "button", 98 _fx(1465), _fy(290), _fx(1556), _fy(169)), 99 InputCoord("back_button", "Back", "button", 100 _fx(760), _fy(640), _fx(560), _fy(108)), 101 InputCoord("start_button", "Start", "button", 102 _fx(1160), _fy(640), _fx(965), _fy(112)), 103 InputCoord("left_stick_button", "Left Stick Press", "button", 104 _fx(420), _fy(695), _fx(-382), _fy(547)), 105 InputCoord("right_stick_button", "Right Stick Press", "button", 106 _fx(1210), _fy(965), _fx(1646), _fy(1286)), 107 108 # --- POV / D-pad (center ~683, 900) --- 109 # D-pad directions are treated as buttons; the factory converts 110 # the raw POV angle to individual boolean values at runtime. 111 # Labels in a vertical column (clockwise from Up), compact single-action, 112 # connected by a single leader line + bar (see _draw_connector_groups). 113 # Dragged as a group (see _draw_input, _on_drag). 114 InputCoord("pov_up", "D-Pad Up", "button", 115 _fx(683), _fy(840), _fx(-369), _fy(723)), 116 InputCoord("pov_up_right", "D-Pad Up-Right", "button", 117 _fx(740), _fy(840), _fx(-369), _fy(793)), 118 InputCoord("pov_right", "D-Pad Right", "button", 119 _fx(740), _fy(900), _fx(-369), _fy(862)), 120 InputCoord("pov_down_right", "D-Pad Down-Right", "button", 121 _fx(740), _fy(960), _fx(-369), _fy(931)), 122 InputCoord("pov_down", "D-Pad Down", "button", 123 _fx(683), _fy(960), _fx(-369), _fy(1001)), 124 InputCoord("pov_down_left", "D-Pad Down-Left", "button", 125 _fx(626), _fy(960), _fx(-369), _fy(1070)), 126 InputCoord("pov_left", "D-Pad Left", "button", 127 _fx(626), _fy(900), _fx(-369), _fy(1139)), 128 InputCoord("pov_up_left", "D-Pad Up-Left", "button", 129 _fx(626), _fy(840), _fx(-369), _fy(1208)), 130 131 # --- Outputs (rumble) --- 132 InputCoord("rumble_left", "Left Rumble", "output", 133 _fx(700), _fy(-70), _fx(254), _fy(-111)), 134 InputCoord("rumble_both", "Both Rumble", "output", 135 _fx(960), _fy(-70), _fx(770), _fy(-21)), 136 InputCoord("rumble_right", "Right Rumble", "output", 137 _fx(1220), _fy(-70), _fx(1275), _fy(-111)), 138] 139 140# Clickable outlines drawn on the controller image. 141XBOX_SHAPES: list[ButtonShape] = [ 142 # Face buttons (centers from color-centroid detection on PNG) 143 ButtonShape("a", "circle", _fx(1480), _fy(755), 144 _fx(140), _fy(140), ["a_button"]), 145 ButtonShape("b", "circle", _fx(1629), _fy(633), 146 _fx(140), _fy(140), ["b_button"]), 147 ButtonShape("x", "circle", _fx(1344), _fy(635), 148 _fx(140), _fy(140), ["x_button"]), 149 ButtonShape("y", "circle", _fx(1492), _fy(518), 150 _fx(140), _fy(140), ["y_button"]), 151 # Bumpers 152 ButtonShape("lb", "pill", _fx(455), _fy(318), 153 _fx(360), _fy(110), ["left_bumper"]), 154 ButtonShape("rb", "pill", _fx(1465), _fy(318), 155 _fx(360), _fy(110), ["right_bumper"]), 156 # Triggers 157 ButtonShape("lt", "rect", _fx(472), _fy(170), 158 _fx(115), _fy(155), ["left_trigger"]), 159 ButtonShape("rt", "rect", _fx(1443), _fy(170), 160 _fx(115), _fy(155), ["right_trigger"]), 161 # Sticks 162 ButtonShape("ls", "circle", _fx(420), _fy(695), 163 _fx(220), _fy(220), 164 ["left_stick_x", "left_stick_y", "left_stick_button"]), 165 ButtonShape("rs", "circle", _fx(1210), _fy(965), 166 _fx(220), _fy(220), 167 ["right_stick_x", "right_stick_y", "right_stick_button"]), 168 # Back / Start 169 ButtonShape("back", "circle", _fx(768), _fy(640), 170 _fx(99), _fy(86), ["back_button"]), 171 ButtonShape("start", "circle", _fx(1152), _fy(640), 172 _fx(99), _fy(86), ["start_button"]), 173 # D-pad — single circle around the whole pad; click opens direction menu 174 ButtonShape("dpad", "circle", _fx(683), _fy(900), 175 _fx(240), _fy(240), 176 ["pov_up", "pov_up_right", "pov_right", "pov_down_right", 177 "pov_down", "pov_down_left", "pov_left", "pov_up_left"]), 178 # Rumble — one rect per icon, each tied to a single channel 179 ButtonShape("rumble_l", "rect", _fx(700), _fy(-70), 180 _fx(80), _fy(80), ["rumble_left"]), 181 ButtonShape("rumble_b", "rect", _fx(960), _fy(-70), 182 _fx(80), _fy(80), ["rumble_both"]), 183 ButtonShape("rumble_r", "rect", _fx(1220), _fy(-70), 184 _fx(80), _fy(80), ["rumble_right"]), 185] 186 187# Quick lookup by input name 188XBOX_INPUT_MAP: dict[str, InputCoord] = {inp.name: inp for inp in XBOX_INPUTS} 189 190# Canonical list of all input names 191XBOX_INPUT_NAMES: list[str] = [inp.name for inp in XBOX_INPUTS]
@dataclass(frozen=True)
class
InputCoord:
35@dataclass(frozen=True) 36class InputCoord: 37 """Position data for a single controller input. 38 39 anchor_x/y are fractions (0-1) of the image. 40 label_x/y are fractions (0-1) of the image for binding box placement. 41 """ 42 name: str 43 display_name: str 44 input_type: str # "button", "axis", "pov" 45 anchor_x: float 46 anchor_y: float 47 label_x: float 48 label_y: float
Position data for a single controller input.
anchor_x/y are fractions (0-1) of the image. label_x/y are fractions (0-1) of the image for binding box placement.
@dataclass(frozen=True)
class
ButtonShape:
51@dataclass(frozen=True) 52class ButtonShape: 53 """A clickable outline drawn on the controller image. 54 55 center_x/y and width/height are all fractions of image dimensions. 56 """ 57 name: str 58 shape: str # "circle", "rect", "pill" 59 center_x: float 60 center_y: float 61 width: float # fraction of image width 62 height: float # fraction of image height 63 inputs: list[str] = field(default_factory=list)
A clickable outline drawn on the controller image.
center_x/y and width/height are all fractions of image dimensions.
XBOX_INPUTS: list[InputCoord] =
[InputCoord(name='left_stick_x', display_name='Left Stick X', input_type='axis', anchor_x=0.21875, anchor_y=0.5379256965944272, label_x=-0.19895833333333332, label_y=0.22213622291021673), InputCoord(name='left_stick_y', display_name='Left Stick Y', input_type='axis', anchor_x=0.21875, anchor_y=0.5379256965944272, label_x=-0.19895833333333332, label_y=0.3219814241486068), InputCoord(name='right_stick_x', display_name='Right Stick X', input_type='axis', anchor_x=0.6302083333333334, anchor_y=0.7469040247678018, label_x=0.8572916666666667, label_y=0.7941176470588235), InputCoord(name='right_stick_y', display_name='Right Stick Y', input_type='axis', anchor_x=0.6302083333333334, anchor_y=0.7469040247678018, label_x=0.8572916666666667, label_y=0.8947368421052632), InputCoord(name='left_trigger', display_name='Left Trigger', input_type='axis', anchor_x=0.2265625, anchor_y=0.13157894736842105, label_x=0.004166666666666667, label_y=-0.0015479876160990713), InputCoord(name='right_trigger', display_name='Right Trigger', input_type='axis', anchor_x=0.7760416666666666, anchor_y=0.13157894736842105, label_x=0.778125, label_y=0.0007739938080495357), InputCoord(name='a_button', display_name='A Button', input_type='button', anchor_x=0.7708333333333334, anchor_y=0.5843653250773994, label_x=0.8973958333333333, label_y=0.5309597523219814), InputCoord(name='b_button', display_name='B Button', input_type='button', anchor_x=0.8484375, anchor_y=0.48993808049535603, label_x=0.8932291666666666, label_y=0.43188854489164086), InputCoord(name='x_button', display_name='X Button', input_type='button', anchor_x=0.7, anchor_y=0.4914860681114551, label_x=0.85625, label_y=0.6261609907120743), InputCoord(name='y_button', display_name='Y Button', input_type='button', anchor_x=0.7770833333333333, anchor_y=0.40092879256965946, label_x=0.8614583333333333, label_y=0.33900928792569657), InputCoord(name='left_bumper', display_name='Left Bumper', input_type='button', anchor_x=0.23697916666666666, anchor_y=0.22445820433436534, label_x=-0.058854166666666666, label_y=0.11377708978328173), InputCoord(name='right_bumper', display_name='Right Bumper', input_type='button', anchor_x=0.7630208333333334, anchor_y=0.22445820433436534, label_x=0.8104166666666667, label_y=0.13080495356037153), InputCoord(name='back_button', display_name='Back', input_type='button', anchor_x=0.3958333333333333, anchor_y=0.4953560371517028, label_x=0.2916666666666667, label_y=0.08359133126934984), InputCoord(name='start_button', display_name='Start', input_type='button', anchor_x=0.6041666666666666, anchor_y=0.4953560371517028, label_x=0.5026041666666666, label_y=0.08668730650154799), InputCoord(name='left_stick_button', display_name='Left Stick Press', input_type='button', anchor_x=0.21875, anchor_y=0.5379256965944272, label_x=-0.19895833333333332, label_y=0.423374613003096), InputCoord(name='right_stick_button', display_name='Right Stick Press', input_type='button', anchor_x=0.6302083333333334, anchor_y=0.7469040247678018, label_x=0.8572916666666667, label_y=0.9953560371517027), InputCoord(name='pov_up', display_name='D-Pad Up', input_type='button', anchor_x=0.35572916666666665, anchor_y=0.6501547987616099, label_x=-0.1921875, label_y=0.5595975232198143), InputCoord(name='pov_up_right', display_name='D-Pad Up-Right', input_type='button', anchor_x=0.3854166666666667, anchor_y=0.6501547987616099, label_x=-0.1921875, label_y=0.6137770897832817), InputCoord(name='pov_right', display_name='D-Pad Right', input_type='button', anchor_x=0.3854166666666667, anchor_y=0.6965944272445821, label_x=-0.1921875, label_y=0.6671826625386997), InputCoord(name='pov_down_right', display_name='D-Pad Down-Right', input_type='button', anchor_x=0.3854166666666667, anchor_y=0.7430340557275542, label_x=-0.1921875, label_y=0.7205882352941176), InputCoord(name='pov_down', display_name='D-Pad Down', input_type='button', anchor_x=0.35572916666666665, anchor_y=0.7430340557275542, label_x=-0.1921875, label_y=0.7747678018575851), InputCoord(name='pov_down_left', display_name='D-Pad Down-Left', input_type='button', anchor_x=0.3260416666666667, anchor_y=0.7430340557275542, label_x=-0.1921875, label_y=0.8281733746130031), InputCoord(name='pov_left', display_name='D-Pad Left', input_type='button', anchor_x=0.3260416666666667, anchor_y=0.6965944272445821, label_x=-0.1921875, label_y=0.881578947368421), InputCoord(name='pov_up_left', display_name='D-Pad Up-Left', input_type='button', anchor_x=0.3260416666666667, anchor_y=0.6501547987616099, label_x=-0.1921875, label_y=0.934984520123839), InputCoord(name='rumble_left', display_name='Left Rumble', input_type='output', anchor_x=0.3645833333333333, anchor_y=-0.05417956656346749, label_x=0.13229166666666667, label_y=-0.08591331269349846), InputCoord(name='rumble_both', display_name='Both Rumble', input_type='output', anchor_x=0.5, anchor_y=-0.05417956656346749, label_x=0.4010416666666667, label_y=-0.016253869969040248), InputCoord(name='rumble_right', display_name='Right Rumble', input_type='output', anchor_x=0.6354166666666666, anchor_y=-0.05417956656346749, label_x=0.6640625, label_y=-0.08591331269349846)]
XBOX_SHAPES: list[ButtonShape] =
[ButtonShape(name='a', shape='circle', center_x=0.7708333333333334, center_y=0.5843653250773994, width=0.07291666666666667, height=0.10835913312693499, inputs=['a_button']), ButtonShape(name='b', shape='circle', center_x=0.8484375, center_y=0.48993808049535603, width=0.07291666666666667, height=0.10835913312693499, inputs=['b_button']), ButtonShape(name='x', shape='circle', center_x=0.7, center_y=0.4914860681114551, width=0.07291666666666667, height=0.10835913312693499, inputs=['x_button']), ButtonShape(name='y', shape='circle', center_x=0.7770833333333333, center_y=0.40092879256965946, width=0.07291666666666667, height=0.10835913312693499, inputs=['y_button']), ButtonShape(name='lb', shape='pill', center_x=0.23697916666666666, center_y=0.24613003095975233, width=0.1875, height=0.08513931888544891, inputs=['left_bumper']), ButtonShape(name='rb', shape='pill', center_x=0.7630208333333334, center_y=0.24613003095975233, width=0.1875, height=0.08513931888544891, inputs=['right_bumper']), ButtonShape(name='lt', shape='rect', center_x=0.24583333333333332, center_y=0.13157894736842105, width=0.059895833333333336, height=0.11996904024767802, inputs=['left_trigger']), ButtonShape(name='rt', shape='rect', center_x=0.7515625, center_y=0.13157894736842105, width=0.059895833333333336, height=0.11996904024767802, inputs=['right_trigger']), ButtonShape(name='ls', shape='circle', center_x=0.21875, center_y=0.5379256965944272, width=0.11458333333333333, height=0.17027863777089783, inputs=['left_stick_x', 'left_stick_y', 'left_stick_button']), ButtonShape(name='rs', shape='circle', center_x=0.6302083333333334, center_y=0.7469040247678018, width=0.11458333333333333, height=0.17027863777089783, inputs=['right_stick_x', 'right_stick_y', 'right_stick_button']), ButtonShape(name='back', shape='circle', center_x=0.4, center_y=0.4953560371517028, width=0.0515625, height=0.06656346749226007, inputs=['back_button']), ButtonShape(name='start', shape='circle', center_x=0.6, center_y=0.4953560371517028, width=0.0515625, height=0.06656346749226007, inputs=['start_button']), ButtonShape(name='dpad', shape='circle', center_x=0.35572916666666665, center_y=0.6965944272445821, width=0.125, height=0.18575851393188855, inputs=['pov_up', 'pov_up_right', 'pov_right', 'pov_down_right', 'pov_down', 'pov_down_left', 'pov_left', 'pov_up_left']), ButtonShape(name='rumble_l', shape='rect', center_x=0.3645833333333333, center_y=-0.05417956656346749, width=0.041666666666666664, height=0.06191950464396285, inputs=['rumble_left']), ButtonShape(name='rumble_b', shape='rect', center_x=0.5, center_y=-0.05417956656346749, width=0.041666666666666664, height=0.06191950464396285, inputs=['rumble_both']), ButtonShape(name='rumble_r', shape='rect', center_x=0.6354166666666666, center_y=-0.05417956656346749, width=0.041666666666666664, height=0.06191950464396285, inputs=['rumble_right'])]
XBOX_INPUT_MAP: dict[str, InputCoord] =
{'left_stick_x': InputCoord(name='left_stick_x', display_name='Left Stick X', input_type='axis', anchor_x=0.21875, anchor_y=0.5379256965944272, label_x=-0.19895833333333332, label_y=0.22213622291021673), 'left_stick_y': InputCoord(name='left_stick_y', display_name='Left Stick Y', input_type='axis', anchor_x=0.21875, anchor_y=0.5379256965944272, label_x=-0.19895833333333332, label_y=0.3219814241486068), 'right_stick_x': InputCoord(name='right_stick_x', display_name='Right Stick X', input_type='axis', anchor_x=0.6302083333333334, anchor_y=0.7469040247678018, label_x=0.8572916666666667, label_y=0.7941176470588235), 'right_stick_y': InputCoord(name='right_stick_y', display_name='Right Stick Y', input_type='axis', anchor_x=0.6302083333333334, anchor_y=0.7469040247678018, label_x=0.8572916666666667, label_y=0.8947368421052632), 'left_trigger': InputCoord(name='left_trigger', display_name='Left Trigger', input_type='axis', anchor_x=0.2265625, anchor_y=0.13157894736842105, label_x=0.004166666666666667, label_y=-0.0015479876160990713), 'right_trigger': InputCoord(name='right_trigger', display_name='Right Trigger', input_type='axis', anchor_x=0.7760416666666666, anchor_y=0.13157894736842105, label_x=0.778125, label_y=0.0007739938080495357), 'a_button': InputCoord(name='a_button', display_name='A Button', input_type='button', anchor_x=0.7708333333333334, anchor_y=0.5843653250773994, label_x=0.8973958333333333, label_y=0.5309597523219814), 'b_button': InputCoord(name='b_button', display_name='B Button', input_type='button', anchor_x=0.8484375, anchor_y=0.48993808049535603, label_x=0.8932291666666666, label_y=0.43188854489164086), 'x_button': InputCoord(name='x_button', display_name='X Button', input_type='button', anchor_x=0.7, anchor_y=0.4914860681114551, label_x=0.85625, label_y=0.6261609907120743), 'y_button': InputCoord(name='y_button', display_name='Y Button', input_type='button', anchor_x=0.7770833333333333, anchor_y=0.40092879256965946, label_x=0.8614583333333333, label_y=0.33900928792569657), 'left_bumper': InputCoord(name='left_bumper', display_name='Left Bumper', input_type='button', anchor_x=0.23697916666666666, anchor_y=0.22445820433436534, label_x=-0.058854166666666666, label_y=0.11377708978328173), 'right_bumper': InputCoord(name='right_bumper', display_name='Right Bumper', input_type='button', anchor_x=0.7630208333333334, anchor_y=0.22445820433436534, label_x=0.8104166666666667, label_y=0.13080495356037153), 'back_button': InputCoord(name='back_button', display_name='Back', input_type='button', anchor_x=0.3958333333333333, anchor_y=0.4953560371517028, label_x=0.2916666666666667, label_y=0.08359133126934984), 'start_button': InputCoord(name='start_button', display_name='Start', input_type='button', anchor_x=0.6041666666666666, anchor_y=0.4953560371517028, label_x=0.5026041666666666, label_y=0.08668730650154799), 'left_stick_button': InputCoord(name='left_stick_button', display_name='Left Stick Press', input_type='button', anchor_x=0.21875, anchor_y=0.5379256965944272, label_x=-0.19895833333333332, label_y=0.423374613003096), 'right_stick_button': InputCoord(name='right_stick_button', display_name='Right Stick Press', input_type='button', anchor_x=0.6302083333333334, anchor_y=0.7469040247678018, label_x=0.8572916666666667, label_y=0.9953560371517027), 'pov_up': InputCoord(name='pov_up', display_name='D-Pad Up', input_type='button', anchor_x=0.35572916666666665, anchor_y=0.6501547987616099, label_x=-0.1921875, label_y=0.5595975232198143), 'pov_up_right': InputCoord(name='pov_up_right', display_name='D-Pad Up-Right', input_type='button', anchor_x=0.3854166666666667, anchor_y=0.6501547987616099, label_x=-0.1921875, label_y=0.6137770897832817), 'pov_right': InputCoord(name='pov_right', display_name='D-Pad Right', input_type='button', anchor_x=0.3854166666666667, anchor_y=0.6965944272445821, label_x=-0.1921875, label_y=0.6671826625386997), 'pov_down_right': InputCoord(name='pov_down_right', display_name='D-Pad Down-Right', input_type='button', anchor_x=0.3854166666666667, anchor_y=0.7430340557275542, label_x=-0.1921875, label_y=0.7205882352941176), 'pov_down': InputCoord(name='pov_down', display_name='D-Pad Down', input_type='button', anchor_x=0.35572916666666665, anchor_y=0.7430340557275542, label_x=-0.1921875, label_y=0.7747678018575851), 'pov_down_left': InputCoord(name='pov_down_left', display_name='D-Pad Down-Left', input_type='button', anchor_x=0.3260416666666667, anchor_y=0.7430340557275542, label_x=-0.1921875, label_y=0.8281733746130031), 'pov_left': InputCoord(name='pov_left', display_name='D-Pad Left', input_type='button', anchor_x=0.3260416666666667, anchor_y=0.6965944272445821, label_x=-0.1921875, label_y=0.881578947368421), 'pov_up_left': InputCoord(name='pov_up_left', display_name='D-Pad Up-Left', input_type='button', anchor_x=0.3260416666666667, anchor_y=0.6501547987616099, label_x=-0.1921875, label_y=0.934984520123839), 'rumble_left': InputCoord(name='rumble_left', display_name='Left Rumble', input_type='output', anchor_x=0.3645833333333333, anchor_y=-0.05417956656346749, label_x=0.13229166666666667, label_y=-0.08591331269349846), 'rumble_both': InputCoord(name='rumble_both', display_name='Both Rumble', input_type='output', anchor_x=0.5, anchor_y=-0.05417956656346749, label_x=0.4010416666666667, label_y=-0.016253869969040248), 'rumble_right': InputCoord(name='rumble_right', display_name='Right Rumble', input_type='output', anchor_x=0.6354166666666666, anchor_y=-0.05417956656346749, label_x=0.6640625, label_y=-0.08591331269349846)}
XBOX_INPUT_NAMES: list[str] =
['left_stick_x', 'left_stick_y', 'right_stick_x', 'right_stick_y', 'left_trigger', 'right_trigger', 'a_button', 'b_button', 'x_button', 'y_button', 'left_bumper', 'right_bumper', 'back_button', 'start_button', 'left_stick_button', 'right_stick_button', 'pov_up', 'pov_up_right', 'pov_right', 'pov_down_right', 'pov_down', 'pov_down_left', 'pov_left', 'pov_up_left', 'rumble_left', 'rumble_both', 'rumble_right']