fix(hid): add StreamDeck+ udev rule + correct HID migration default#3493
Conversation
…-enables on upgrade (aethersdr#3257) Two root causes for StreamDeck+ going dark after the v26.6 opt-in gate (aethersdr#3258): 1. packaging/linux/60-hid-encoders.rules was missing the StreamDeck+ entry (0fd9:0084). Without it hidraw is root-only on Linux, so hid_open() fails silently and the device never initialises. 2. The v1 migration in MainWindow read HidEncoderAutoDetect with default "False", but the old code treated the key's *absence* as True (implicit default on line 8029). Users who never touched that setting had HID implicitly on, yet the migration wrote HidEncoderEnabled=False for them. V2 migration detects and corrects installs that were already written with the wrong default. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Thanks for the tight, well-diagnosed fix @motoham88. The two changes hang together cleanly and the root-cause analysis matches what's in the tree:
- udev rule:
0fd9:0084for the StreamDeck+ follows the existing pattern in60-hid-encoders.rules— looks good. - V1 default flip: The new
"True"fallback atMainWindow.cpp:4485matches the implicit default used elsewhere —MainWindow.cpp:8029also readsHidEncoderAutoDetectwith a"True"fallback, so this aligns the migration with the historical truth. Comment is helpful. - V2 one-shot: Gated on
HidEncoderEnabledMigrationV2and only flips when bothHidEncoderEnabled == "False"ANDHidEncoderAutoDetectis absent — narrow enough to target only the buggy-migration cohort.
One non-blocking thing to consider
The V2 migration cannot distinguish "this user was bitten by the buggy V1" from "this user explicitly turned HID off in Preferences after the broken migration ran". Both states look identical: HidEncoderEnabled=False, HidEncoderAutoDetect absent. Users in the second bucket will silently get HID flipped back on once and have to toggle it off again.
Probably acceptable given (a) it's a one-shot, (b) the Preferences toggle is right there, and (c) the alternative — leaving affected users dark — is worse. Worth a sentence in the release notes if any of those silent-flip users are likely.
Other checks
- AppSettings (not QSettings) ✓
- No null/leak risk, conventional C++20 ✓
- macOS unaffected as you noted (no udev), migration is platform-agnostic ✓
- All CI green on
18a96e0
Nice catch on tying the StreamDeck+ symptom to two distinct root causes — the udev miss would have left the device dark on Linux even after fixing the migration.
🤖 aethersdr-agent · cost: $8.2160 · model: claude-opus-4-7
jensenpat
left a comment
There was a problem hiding this comment.
LGTM — clean two-part root-cause fix. CI green, aethersdr-agent review positive. Approving as maintainer.
…-enables on upgrade (aethersdr#3493) Two root causes for StreamDeck+ going dark after the v26.6 opt-in gate (aethersdr#3258): 1. packaging/linux/60-hid-encoders.rules was missing the StreamDeck+ entry (0fd9:0084). Without it hidraw is root-only on Linux, so hid_open() fails silently and the device never initialises. 2. The v1 migration in MainWindow read HidEncoderAutoDetect with default "False", but the old code treated the key's *absence* as True (implicit default on line 8029). Users who never touched that setting had HID implicitly on, yet the migration wrote HidEncoderEnabled=False for them. V2 migration detects and corrects installs that were already written with the wrong default. Squashed-from: aethersdr#3493 Co-authored-by: Tony KX3H <276457091+motoham88@users.noreply.github.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Signed-off-by: jensenpat <patjensen@gmail.com>
Summary
Two root causes for the StreamDeck+ going dark after the v26.6 opt-in gate (#3258):
60-hid-encoders.ruleshad no entry for the StreamDeck+ (0fd9:0084). Without it hidraw is root-only on Linux, sohid_open()fails silently — the device appears in the Serial panel but never powers up.HidEncoderAutoDetectwith a fallback of"False", but the old code treated the key's absence as"True"(implicit default, line 8029). Users who never explicitly set that key had HID working via the old always-on path, but the migration silently wroteHidEncoderEnabled=Falsefor them. A V2 one-shot migration now detects and corrects those installs.Test plan
HidEncoderEnabledflips toTrueon startup (Preferences → Serial checkbox)Fixes regression introduced by #3258.
🤖 Generated with Claude Code