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.

InputCoord( name: str, display_name: str, input_type: str, anchor_x: float, anchor_y: float, label_x: float, label_y: float)
name: str
display_name: str
input_type: str
anchor_x: float
anchor_y: float
label_x: float
label_y: float
@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.

ButtonShape( name: str, shape: str, center_x: float, center_y: float, width: float, height: float, inputs: list[str] = <factory>)
name: str
shape: str
center_x: float
center_y: float
width: float
height: float
inputs: list[str]
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']