> ## Content Index
> Fetch the complete content index at: https://dees.co/llms.txt
> Use this file to discover other available public pages before exploring further.

# Prevent a Keychron keyboard from showing up as a game controller system-wide
- URL: https://dees.co/prevent-a-keychron-keyboard-from-showing-up-as-a-game-controller-system-wide/
- Published: 2026-09-13T19:15:31.000Z
- Updated: 2026-10-05T22:15:36.000Z
- Description: Stop SDL from detecting a Keychron (or any QMK/VIA) keyboard as a game controller in Prism Launcher with one environment variable.
- Author: Garrett Dees
- Tags: Keychron, Minecraft

I set up Prism Launcher and Fabulously Optimized for Minecraft, but my Keychron Q2 Max kept being detected as a game controller by the Controlify mod. This is a known quirk of QMK/VIA-based keyboards: they expose several HID interfaces over USB, and SDL sometimes mistakes one of them for a gamepad.

I originally fixed this with an environment variable inside Prism Launcher, but that only patches one app. The better fix is a udev rule that tells the whole system the device isn't a joystick, which covers Prism, Steam, and every native game at once.

## Step 1: Find the device ID

Open a terminal and run:

```bash
lsusb

```

Look for your Keychron (or QMK) device and note the ID. It looks something like this:

```bash
Bus 003 Device 003: ID 3434:0810 Keychron Keychron Q1 Max

```

Here, `3434` is the **vendor ID** and `0810` is the **product ID**.

## Step 2: Add the environment variable in Prism Launcher

Create the file `/etc/udev/rules.d/80-keychron-nojoystick.rules` (as root):

```bash
SUBSYSTEM=="input", ATTRS{idVendor}=="3434", ATTRS{idProduct}=="0810", ENV{ID_INPUT_JOYSTICK}=""

```

Substitute your own IDs. The rule matches the keyboard's input device and clears the `ID_INPUT_JOYSTICK` property that udev sets on it, so nothing downstream treats it as a controller.

If you have multiple Keychron devices (keyboard, mouse, dongle), you can leave out `ATTRS{idProduct}==...` entirely and the rule will cover everything from that vendor.

## Step 3: Reload the rules

```bash
sudo udevadm control --reload-rules && sudo udevadm trigger
```

Then unplug and replug the keyboard (or reboot). Verify it worked with:

```bash
udevadm info /dev/input/event* | grep -B20 ID_INPUT_JOYSTICK

```

Your keyboard's entry should no longer carry `ID_INPUT_JOYSTICK=1`.

## Alternative: per-application (SDL only)

If you'd rather scope the fix to a single SDL-based app, you can set an environment variable instead of touching udev. In Prism Launcher, under **Settings > Minecraft > Environment Variables**, add:

- **Name:** `SDL_GAMECONTROLLER_IGNORE_DEVICES`
- **Value:** `0x3434/0x0810` (substitute your IDs)

This only affects apps that use SDL for controller input, which is why I prefer the udev rule.

## Notes

- The connection method matters. Over Bluetooth the keyboard may report a different device ID than over USB, and Bluetooth devices won't appear in `lsusb` at all. Check the IDs while connected the way you actually play. `udevadm info --export-db` will show the properties of whichever interface udev is currently flagging as a joystick.
- Games that were already misbehaving may cache controller state; restart the game (not just the mod) after applying the rule.
- Some Hall-effect Keychron models have a separate issue where the `xpad` kernel driver claims the board as an Xbox controller. If the udev rule doesn't take on your model, check `dmesg | grep -i xpad`. That's a different bug with a different fix.