Couch Controls
Native gamepad support for Minecraft Java: analog movement, stick camera, and menu navigation that steps between real slots and buttons instead of shoving a pointer at them.
Client-side only. The server neither needs it nor knows about it.
Layout
Positional names (SDL calls them SOUTH/EAST/WEST/NORTH, not A/B/X/Y), so this comes out right on an Xbox pad, a PlayStation pad, and the 8BitDo alike.
In the world
| Control | Action |
|---|---|
| Left stick | Move (analog) |
| Right stick | Look |
| Right trigger | Attack / break |
| Left trigger | Use / place |
| South (A) | Jump |
| East (B) | Sneak |
| West (X) | Drop item |
| North (Y) | Open inventory |
| Shoulders | Cycle hotbar |
| Left stick click | Sprint (latches until the stick recentres) |
| Right stick click | Swap hands |
| Start | Pause menu (press again to close) |
| Back | Player list |
| D-pad | Pandorical keybinds 1-4 (down = slot 1, poopsmith's poop key) |
In menus
| Control | Action |
|---|---|
| Left stick / D-pad | Step between slots and buttons |
| Right stick | Move the pointer freely |
| South (A) | Click |
| West (X) | Right click |
| North (Y) | Shift-click (quick move) |
| East (B) | Close |
| Start | Close |
| Shoulders | Scroll (bundle contents, long lists) |
Known gaps
- Text entry. Chat, signs, anvils and command blocks still need a keyboard. Landing on a text field focuses it; typing into it is a separate problem that wants an on-screen keyboard.
- No rumble yet. SDL exposes it and
Gamepad.rumbleis wired, but nothing calls it. - No dead zone, sensitivity or binding configuration. All tuning constants are in the source, each with a note on what moving it costs.
- Creative inventory tabs are widgets and so are reachable, but the tab strip navigates awkwardly.
- First pad only.
SDL_GetGamepadsreturns a list and this opens index 0.

