mirror of
https://github.com/games-on-whales/wolf.git
synced 2026-10-15 21:12:08 +00:00
[PR #473] [MERGED] fix(input): match the DualSense hidraw node by its HID name #488
Labels
No labels
🧠 1 - 🤖 999
AMD
bug
bug
cannot reproduce
documentation
duplicate
easy
enhancement
enhancement
enhancement
fixed?
fixed?
good first issue
hard
help wanted
Intel
invalid
LXC
medium
moonlight-protocol
Multi GPU
nixos
not a bug
nvidia
pull-request
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
games-on-whales/wolf#488
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Pull Request Information
Original PR: https://github.com/games-on-whales/wolf/pull/473
Author: @zerofltexx
Created: 8/9/2026
Status: ✅ Merged
Merged: 9/7/2026
Merged by: @ABeltramo
Base:
stable← Head:fix/hidraw-seat-isolation📝 Commits (1)
00e6c85fix(input): match the DualSense hidraw node by its HID name📊 Changes
1 file changed (+4 additions, -2 deletions)
View changed files
📝
85-wolf.rules(+4 -2)📄 Description
The rule for the hidraw node came in with the input ones and uses the same ATTRS{name}=="Wolf virtual" form. Before that there was no hidraw rule at all. A hidraw device has no name attribute in its parent chain though. name lives on the sibling input device, so ATTRS has nothing to walk up to and the rule does not reach the node.
/dev/hidraw* for the virtual DualSense stays on ID_SEAT=seat0, so logind grants the desktop user a uaccess ACL on it. Steam on the host then reads the streamed pad and shows it connected with a battery level. The three input nodes are covered, so this is the one device still reachable.
Match the parent's uevent instead. It carries the same string as HID_NAME, so the rule keeps using the "Wolf virtual" glob the input rules use.
The uhid devpath is the simpler match but it is far too broad. BlueZ creates every Bluetooth HID device through uhid. On the hidraw node a real DualSense looks like the virtual one: bus 0005, vendor 054C, product 0CE6, driver playstation, same modalias. Only HID_NAME differs. With both paired at once a devpath match takes the real controller as well and strips its ACL, which breaks gyro, touchpad, LEDs and battery reporting for a real pad on the host.
udev's * spans newlines, so the trailing glob can run past the end of the HID_NAME line. The next lines are HID_PHYS, HID_UNIQ and MODALIAS. None of them can contain "virtual".
Checked with a virtual and a real DualSense connected together. The virtual node ends up on seat9 with no user ACL, the real one keeps uaccess. scripts/wolf-input-diag.sh host reports the node as reachable by the desktop user before this and root-only after.
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.