---
title: "Controller not working in emulator? Fix it in 5 minutes"
description: "Controller not working in your browser emulator? This guide walks through Gamepad API debugging, browser flags, mode-switch quirks, and USB fallbacks to get you playing fast."
url: "https://retrogamespace.com/guides/emulator-controller-not-working-fix"
canonical_html: "https://retrogamespace.com/guides/emulator-controller-not-working-fix"
canonical_md: "https://retrogamespace.com/guides/emulator-controller-not-working-fix.md"
locale: "en"
slug: "emulator-controller-not-working-fix"
author: "RGS Editorial"
author_slug: "retro-editorial"
date_published: "2026-05-14"
date_modified: "2026-05-14"
last_reviewed: "2026-05-14"
keywords: ["controller not working emulator","gamepad not detected browser","browser emulator controller fix","gamepad api not working","8BitDo Pro 2 mode switch","chrome gamepad flags","bluetooth controller emulator","gamepadtester.net","USB controller emulator fallback","xinput browser gamepad"]
source: RetroGameSpace
source_url: "https://retrogamespace.com"
---

# Controller not working in emulator? Fix it in 5 minutes

Controller not working in your browser emulator? This guide walks through Gamepad API debugging, browser flags, mode-switch quirks, and USB fallbacks to get you playing fast.

## Why your controller stops working

When a controller is not working in an emulator running in your browser, the fault is almost never the emulator itself — it is usually one of three things: the OS has not finished pairing the device, the browser has not received a button-press to activate the Gamepad API, or the controller is broadcasting in a mode the browser does not recognise. Work through the steps below in order and most setups are fixed within five minutes.

The browser Gamepad API (standardised in the W3C Gamepad specification) requires an explicit user gesture — specifically a button press on the controller itself — before it reports any device to a web page. This single requirement catches out more users than any other issue, so the guide starts there.

## Step 1 — verify the controller is paired

Before touching browser settings, confirm the controller is recognised at the operating-system level. Open gamepadtester.net in any browser tab and press any button on your controller. If a gamepad card appears and axes or buttons respond, the OS has paired the device correctly and you can move to step 2. If nothing appears, the problem is not a browser emulator controller fix — it is a pairing problem that must be solved in your OS first.

On Windows 10 and 11, navigate to Settings → Bluetooth & devices → Devices and look for your controller under 'Other devices'. Bluetooth controllers that appear in this list but show 'Not connected' have lost their pairing session; remove the device and re-pair. On macOS 13 and later, use System Settings → Bluetooth. Linux users can run 'bluetoothctl devices' in a terminal to list paired hardware.

Wired USB controllers should appear immediately in gamepadtester.net without any pairing step. If a wired controller does not show up there, try a different USB port (preferably a port directly on the motherboard rather than a hub), then check Device Manager on Windows or 'lsusb' on Linux to confirm the device is enumerated at all. A controller that the OS cannot enumerate cannot be passed through to any browser.

## Step 2 — does the browser see it

Assuming gamepadtester.net confirms OS-level pairing, the next question is whether the browser is exposing the Gamepad API to the emulator page. Gamepad API not working in a specific site while gamepadtester.net works is a strong signal that either a browser flag is disabled, or the emulator page is served with a Permission-Policy header that blocks the 'gamepad' feature.

In Chrome and Chromium-based browsers (Edge, Brave, Opera), paste 'chrome://flags/#enable-gamepad' into the address bar. If the flag exists on your build and is set to 'Disabled', switch it to 'Enabled' and relaunch the browser. On current stable Chrome (version 124 and later), this flag is enabled by default, so its absence is normal — not a problem.

Firefox exposes a similar pref: open 'about:config', search for 'dom.gamepad.enabled', and confirm it is set to 'true'. Firefox also gates gamepad access on a secure context (HTTPS), so an emulator page served over plain HTTP will never see controllers in Firefox regardless of the pref value.

If the emulator is hosted on a site you control or can inspect, open DevTools (F12) and check the response headers of the main page. A header such as 'Permissions-Policy: gamepad=()' explicitly blocks all gamepad access for that origin. You cannot override a server-sent Permission-Policy header from the browser side; the site operator must remove or relax it. For self-hosted emulators running locally, this header is not usually present.

The single most-missed requirement in the Gamepad API is the first-input rule. The specification mandates that a gamepad is not surfaced to JavaScript until the user has pressed at least one button while the browser window is focused. Click inside the emulator's canvas area with your mouse first, then press a button on the controller. Without that focused click, the button press may be ignored entirely. This is not a bug — it is an intentional security boundary to prevent silent gamepad enumeration by third-party scripts.

## Step 3 — controller mode and xinput

Many modern controllers advertise themselves differently depending on which mode button was held at power-on. The 8BitDo Pro 2 is the clearest example: holding different buttons while turning it on puts it into Switch mode, Android mode, XInput mode, or macOS mode. Each mode presents a different USB or Bluetooth device descriptor to the host, and browsers map these descriptors to different internal gamepad profiles. If the controller is not working in the emulator but does appear in gamepadtester.net, check which mode it is in — the axes and button counts will differ between modes.

For the 8BitDo Pro 2 specifically, XInput mode (hold 'X' while powering on with a USB cable connected) produces the most consistent results across Chromium-based browsers on Windows, because XInput devices are mapped through a well-established driver stack. Android mode (hold 'B' at power-on) is usually the best choice for Bluetooth on Linux. Switch mode is designed for Nintendo Switch consoles and can confuse browser gamepad mapping on desktop operating systems, sometimes causing axes to appear where buttons are expected.

Other controllers with mode switches include the Sony DualSense and DualShock 4, which present differently over USB versus Bluetooth, and the Xbox Core Controller, which requires the Xbox Accessories app on Windows to apply firmware updates that affect USB descriptor behaviour. If the emulator uses a pre-built button mapping (common in RetroArch-based web builds), an unexpected device descriptor can cause every input to be mis-mapped even when the controller is technically detected.

- 8BitDo Pro 2: hold 'X' at USB power-on for XInput mode on Windows; hold 'B' at Bluetooth power-on for Android mode on Linux/macOS.
- Sony DualSense: USB connection is more reliable for browser emulators than Bluetooth; DS4Windows is not required on Windows 11 22H2 or later.
- Xbox Core Controller: Bluetooth mode requires the Xbox controller firmware to be current; check via the Xbox Accessories app on Windows.
- Generic third-party pads: if the controller exposes a DirectInput (HID) interface only, Chromium may present it with a non-standard button layout — check gamepadtester.net button indices against the emulator's expected mapping.
- Nintendo Switch Pro Controller: works over USB on all major browsers; Bluetooth support on Windows is inconsistent because Windows does not natively support the Switch HID protocol without third-party drivers.

## Bluetooth-specific fixes

Bluetooth controllers introduce a layer of radio and stack complexity that wired connections avoid entirely. The three most common Bluetooth-specific failure modes in browser emulator scenarios are: the controller entering sleep mode mid-session and the browser not re-detecting it on wake; interference from other 2.4 GHz devices (Wi-Fi on the same band, USB 3.0 peripherals radiating noise near the receiver); and operating-system Bluetooth stack quirks that disconnect the HID profile silently.

If the controller disconnects during a session, the Gamepad API will fire a 'gamepaddisconnected' event. Some browser-based emulators listen for this and pause; others do not. Either way, pressing any button on the controller after reconnection should re-trigger the 'gamepadconnected' event and resume detection — but you must click inside the emulator window first to re-establish browser focus, for the same first-input reason described in step 2.

USB Bluetooth adapters that use Bluetooth 4.0 or earlier sometimes have trouble with controllers that advertise Bluetooth 5.0 features. If your PC has a built-in Bluetooth 5.0 adapter but you are also using a USB dongle, Windows may route the controller to the dongle instead of the built-in adapter. Disable the dongle in Device Manager and re-pair to the built-in adapter to test.

On macOS, granting Bluetooth permission to the browser is required since macOS 10.15 (Catalina). Go to System Settings → Privacy & Security → Bluetooth and confirm your browser (Chrome, Firefox, Safari) is listed and enabled. Without this permission, the browser cannot read HID data from a Bluetooth controller even if the OS shows it as connected.

- Keep the controller within 3 metres of the Bluetooth receiver to reduce retransmission latency.
- If possible, pair Bluetooth controllers to a USB Bluetooth dongle positioned in front of the PC rather than a built-in adapter routed through a crowded internal RF environment.
- Disable Bluetooth power management on Windows: Device Manager → Bluetooth adapter → Properties → Power Management → uncheck 'Allow the computer to turn off this device to save power'.
- On Linux with BlueZ, check that the controller is trusted ('trust <MAC>' in bluetoothctl) so it reconnects automatically without a confirmation prompt that could stall the HID handshake.

## When all else fails, use USB

If none of the above resolves the gamepad not detected browser problem, a wired USB connection is the most reliable fallback available. USB HID controllers enumerate synchronously, do not have radio interference, do not sleep, and do not require any pairing state. Every browser that implements the Gamepad API supports USB HID controllers without additional configuration.

The trade-off with wired USB is physical: you are tethened to the machine, cable length is limited (standard USB cables run up to 5 metres before signal degradation, though active extension cables can extend this), and frequent connection and disconnection of USB connectors causes mechanical wear on both the cable's micro-USB or USB-C plug and the port on the controller over time.

If your preferred controller does not have a USB cable option — some Bluetooth-only pads do not — a wired alternative that covers NES through PS2 era gaming is the Raphnet USB adapter range, which passes original controllers through to USB HID without input lag introduced by microcontroller polling. These adapters present as standard HID joysticks and are detected by every browser Gamepad API implementation without driver installation on Windows, macOS, or Linux.

For users on Chromebook or ChromeOS, note that the Gamepad API is available but USB device access is gated through the ChromeOS permission system. Plug in the USB controller, then navigate to Settings → Devices and confirm the controller is listed. If you are using a Linux (Crostini) container for emulation rather than a web-based emulator, USB passthrough to the container must be enabled explicitly in ChromeOS Settings → Linux → USB devices.

## How-to: Fix a controller not working in a browser emulator

Follow these steps in order to diagnose and resolve gamepad detection failures in browser-based emulators.

1. **Test the controller on gamepadtester.net** — Navigate to gamepadtester.net and press any button on your controller. If a gamepad card appears and responds to input, the OS has paired the device correctly. If nothing appears, resolve the OS-level pairing issue first before proceeding to browser-specific steps.
2. **Trigger the Gamepad API first-input requirement** — Click inside the emulator's game canvas with your mouse to give the browser window focus, then press a face button on the controller. The Gamepad API will not surface any device to the page until this sequence occurs. If the controller is still not detected, check 'chrome://flags/#enable-gamepad' in Chromium or 'dom.gamepad.enabled' in Firefox's about:config.
3. **Check and change the controller's mode** — Controllers like the 8BitDo Pro 2 present different device descriptors depending on which button is held at power-on. For Windows browser emulators, use XInput mode (hold 'X' while connecting via USB). For Linux and macOS over Bluetooth, use Android mode (hold 'B' at power-on). Verify the new mode in gamepadtester.net by confirming the button count and axis layout look correct.
4. **Apply Bluetooth-specific fixes if needed** — If using Bluetooth, disable Bluetooth power management in Device Manager on Windows, and confirm the browser has Bluetooth permission in macOS System Settings → Privacy & Security → Bluetooth. Re-pair the controller and click the emulator canvas before pressing a controller button to satisfy the first-input rule again after reconnection.
5. **Fall back to a wired USB connection** — Connect the controller directly via USB to a port on the motherboard rather than a hub, then reload the emulator page. USB HID controllers require no pairing and are detected synchronously by every browser Gamepad API implementation. If the controller now works over USB but not Bluetooth, the remaining issue is radio or stack related rather than a browser emulator controller fix.

## FAQ

Q: Why does my controller work on gamepadtester.net but not in the emulator?
A: The emulator page may be blocking Gamepad API access via a Permissions-Policy HTTP header, or it may require you to click inside the game canvas before pressing a controller button. Try clicking the emulator screen with your mouse, then press a button on the controller. If the emulator still ignores input, inspect the page's response headers in DevTools for a 'Permissions-Policy: gamepad=()' entry.

Q: What does 'press any button to activate the controller' actually mean?
A: The W3C Gamepad API specification requires a physical button press on the controller after the browser window has focus before any gamepad data is exposed to the page's JavaScript. This prevents sites from silently fingerprinting visitors through connected hardware. Click inside the browser tab or emulator canvas first, then press a face button on the controller — that sequence satisfies the requirement.

Q: My 8BitDo controller is detected but all the buttons are wrong — how do I fix it?
A: The 8BitDo Pro 2 presents different button layouts depending on its startup mode. Switch mode is intended for Nintendo Switch hardware and maps buttons differently from what most browser emulators expect. Power the controller off, hold 'X' while connecting via USB to enter XInput mode on Windows, or hold 'B' while powering on via Bluetooth for Android mode on Linux and macOS. Recheck gamepadtester.net after changing modes to confirm the new button indices.

Q: Does the browser emulator controller fix work on Firefox differently than Chrome?
A: Yes, there are two notable differences. Firefox requires the emulator page to be served over HTTPS; a controller will not be detected on an HTTP page regardless of other settings. Firefox also uses 'about:config' rather than 'chrome://flags' to enable or inspect gamepad support — the relevant preference is 'dom.gamepad.enabled'. Chrome's Gamepad API implementation is otherwise broadly compatible with Firefox's, but Chrome has historically updated its controller mapping database more frequently.

Q: Can I use a PS4 or PS5 controller in a browser emulator without extra software?
A: Over USB, both the DualShock 4 and DualSense are detected as standard HID gamepads by Chromium and Firefox without any additional software on Windows 10 and 11, macOS 12 and later, and most Linux distributions. Over Bluetooth, results are more variable — Chrome has native DualShock 4 support via its internal HID descriptor mapping, but some emulator pages may still mis-map the touchpad click or the L3/R3 axes. DS4Windows is a Windows-only third-party tool that re-presents the controller as XInput, which can resolve mapping issues at the cost of adding a background process.

Q: Is there a way to test Gamepad API support without visiting an external site?
A: Yes. Open the browser's developer console (F12 → Console tab) and type 'navigator.getGamepads()'. Press a button on your controller first, then run the command again. If the Gamepad API is working, you will see an array containing a Gamepad object with non-null values; if the array contains only nulls or is empty after a button press, the browser is not surfacing the device to the page context. This test works on any page served over HTTPS.

---

Source: [Controller not working in emulator? Fix it in 5 minutes](https://retrogamespace.com/guides/emulator-controller-not-working-fix) — RGS Editorial • Last reviewed 2026-05-14 • RetroGameSpace
