Looking for Testers: Game Controller Plugin for KWin 🎮

I’m working on a KWin plugin that enables game controller support in Plasma. I need testers to help validate it works across different hardware.

What Does This Plugin Do?

  • Allows game controllers to navigate the Plasma desktop (mouse/keyboard emulation)

  • Automatically disables emulation when a game is using the controller

  • Prevents system suspend while the controller is active

  • Supports hotplugging (connect/disconnect detection)

How to Test

1. Set Up Environment

2. Run Nested KWin Instance

Launch a nested KWin instance from your source build, then enable the plugin:

kwriteconfig6 --file kwinrc --group Plugins --key gamecontrollerEnabled true
qdbus6 org.kde.KWin /KWin reconfigure
qdbus6 org.kde.KWin /Plugins org.kde.KWin.Plugins.LoadedPlugins

Press Right Ctrl to have the nested KWin instance grab input.

3. Test These Behaviors

Test Expected Result
Hotplugging Connecting/disconnecting controller appears in logs
App detection Logs show “controller used by 1+ apps” → emulation disabled
Desktop mode Logs show “controller used by 0 apps” → emulation enabled
Idle prevention With emulation enabled, controller input prevents system suspend (set sleep to 1 min to test)
Steam Deck If you have one, verify built-in controls work as expected

Default Button Mappings

Currently using steamdeck-style layout. Other layouts coming later.

Analog Sticks
─────────────
Right Stick (ABS_RX/RY) → Mouse cursor movement

Face Buttons
────────────
A (BTN_SOUTH) → Enter
B (BTN_EAST) → Escape

Bumpers
───────
LB (BTN_TL) → Alt
RB (BTN_TR) → Ctrl

Triggers
────────
LT (ABS_Z) → Right Click
RT (ABS_RZ) → Left Click

D-Pad
─────
D-Pad → Arrow Keys

Center Buttons
──────────────
Select → On-Screen Keyboard (planned)
Start → Meta/Super

Report Your Results

Please comment with your results using this format:

Controller: [e.g., Xbox One Wireless, DualSense, 8BitDo Pro 2]
Connection: [USB / Bluetooth]
Result: [Pass / Fail]
Notes: [Any issues, unexpected behavior, or logs you feel worth including]

Known Limitations

  • modern game controller layout assumed (more layouts coming later)

  • On-screen keyboard binding not yet implemented

Thanks for helping test! :folded_hands:

2 Likes

Update: @yorisoft’s plugin has now been merged into Plasma proper, enabled by default for anyone who uses KWin as built on 2026-01-03 or later (UTC timezone, approximately). You can disable it with a new switch in System Settings → Game Controller if you find that anything isn’t working out for you.

If you are testing Plasma built from source, or the Plasma 6.6 beta that’s coming up in about two weeks, then you get this functionality. I figure testers are still appreciated :slight_smile:

3 Likes

6.5.90 arch kde-unstable

Controller: [DualSense, dualshock 4]
Connection: [USB / Bluetooth]
Result: Fail
Notes: currently the layout seems to be wrong with playstation controllers, mouse movement might be mapped to triggers . The toggle in settings doesn’t seem to do anything atm. Manually editing kwinrc and fresh login to disable plugin works fine.

We recently made a few updates to improve the enable/disable when toggled. Also there was some stick drift on the DualSense , that was also fixed. Lmk if you’re still experiencing issues.

Manjaro Unstable, Plasma 6.6 and KDE Neon latest stable release.

Controller: [Dualsense, Dualshock 4]
Connection: [USB / Bluetooth]
Result: Works but
Notes: App detection (emulation disabled) is not working. Tried both controllers on Steam and other standalone native games (Blue Revolver, Apotris, Cryptark), even fullscreen, but it nevers stops the keyboard emulation on the controller.

There’s a bug reported but only talks about Steam even when this affects all games.

Hey CansecoGPC. Thanks for letting us know and sorry you’re experiencing this issue. I’ll do my best to help resolve it.

Could you please share some info:
Provide logs from udevadm:
sudo udevadm info /dev/input/event*

To find out what the specific event device is use evtest:
sudo evtest

Thanks for the quick response. I did try with Dualsense now, Dualshock after charging.

sudo evtest:

/dev/input/event30: Wireless Controller
/dev/input/event31: Wireless Controller Motion Sensors
/dev/input/event256: Wireless Controller Touchpad

I guess event30 is the one to look at or all of them?

Select the device event number [0-256]: 30
Input driver version is 1.0.1
Input device ID: bus 0x5 vendor 0x54c product 0xce6 version 0x8100
Input device name: “Wireless Controller”
Supported events:
Event type 0 (EV_SYN)
Event type 1 (EV_KEY)
Event code 304 (BTN_SOUTH)
Event code 305 (BTN_EAST)
Event code 307 (BTN_NORTH)
Event code 308 (BTN_WEST)
Event code 310 (BTN_TL)
Event code 311 (BTN_TR)
Event code 312 (BTN_TL2)
Event code 313 (BTN_TR2)
Event code 314 (BTN_SELECT)
Event code 315 (BTN_START)
Event code 316 (BTN_MODE)
Event code 317 (BTN_THUMBL)
Event code 318 (BTN_THUMBR)
Event type 3 (EV_ABS)
Event code 0 (ABS_X)
Value 127
Min 0
Max 255
Event code 1 (ABS_Y)
Value 131
Min 0
Max 255
Event code 2 (ABS_Z)
Value 0
Min 0
Max 255
Event code 3 (ABS_RX)
Value 131
Min 0
Max 255
Event code 4 (ABS_RY)
Value 125
Min 0
Max 255
Event code 5 (ABS_RZ)
Value 0
Min 0
Max 255
Event code 16 (ABS_HAT0X)
Value 0
Min -1
Max 1
Event code 17 (ABS_HAT0Y)
Value 0
Min -1
Max 1
Event type 21 (EV_FF)
Event code 80 (FF_RUMBLE)
Event code 81 (FF_PERIODIC)
Event code 88 (FF_SQUARE)
Event code 89 (FF_TRIANGLE)
Event code 90 (FF_SINE)
Event code 96 (FF_GAIN)
Properties:
Testing … (interrupt to exit)

sudo udevadm info /dev/input/event30

P: /devices/virtual/misc/uhid/0005:054C:0CE6.0009/input/input32/event30
M: event30
R: 30
J: c13:94
U: input
D: c 13:94
N: input/event30
L: 0
E: DEVPATH=/devices/virtual/misc/uhid/0005:054C:0CE6.0009/input/input32/event30
E: DEVNAME=/dev/input/event30
E: MAJOR=13
E: MINOR=94
E: SUBSYSTEM=input
E: USEC_INITIALIZED=5197516261
E: ID_INPUT=1
E: ID_INPUT_JOYSTICK=1
E: ID_BUS=bluetooth
E: ID_INPUT_JOYSTICK_INTEGRATION=external
E: TAGS=:seat:uaccess:
E: CURRENT_TAGS=:seat:uaccess:

Hope it helpps

Something weird happened, if i run “sudo evtest” while the game is running it works fine and emulation is disabled but if i don’t it doesn’t and keeps showing the kicker launcher.

But if i run “sudo evtest”, emulation is disabled and i can’t use the controller as a keyboard or mouse.

That is very interesting..

First off thanks for sharing those logs! That helps.
Given that your system has all the required deps - evtest, SDL, and udev, we can rule out* missing deps as the cause.

I’m starting to suspect its as the bug report said:

steam captures raw input data in some way that happens to be undetected by KDE

I’m currently testing this in KDE Linux to run the latest changes. Tho not getting any miss behavior on my end. And there hasnt been much change to the game controller plugins in a way that would cause it to break. I doubt its the case but - wondering if this is changes from steam clients end.

Please give me some time to keep digging. In the meantime if you have any more interesting information to share please do. Thanks for bringing this to my attention.

Controller: 8BitDo Pro 3
Connection: Bluetooth
Result: Pass
Notes: It seems like the axis mapping is wrong. The triggers don't do anything, while the right analog stick axes are mapped to left/right click.