feat(devices): add MX Anywhere 3 family (3, 3 for Business, 3S, 3S for Business)#54
Merged
Conversation
Four descriptors in one PR (3, 3 for Business, 3S, 3S for Business). Logical data sourced from Logitech Options+ extraction via jlevere/hidpp, cross-checked against libratbag and the mx-anywhere-3 reference descriptor. Ships as beta pending hardware confirmation by the issue #46 tester. Visual polish (hotspot positions, Easy-Switch slot coords, back.png) handled post-merge via --edit. Closes #46 on merge.
Seven tasks (one infra + four descriptors + README + optional wiki note). Each descriptor task ships JSON + images + test-fixture entry in a single atomic commit. Every JSON is literal, every command is exact, and each task has build + test verification before commit.
…elds Make control6ActionType=nullptr and gestureDownPayload=nullptr signal that a device has no 7th control or default gestures, respectively. Prepares the fixture for the MX Anywhere family which has six controls and no gesture button.
Bundled descriptor for the MX Anywhere 3S (Bluetooth PID 0xb037). Logical data from Logitech Options+ extraction (jlevere/hidpp), cross-checked against libratbag. Six controls: Left, Right, Middle, Back, Forward, SmartShift toggle. No gesture button, no thumb wheel. DPI 200-8000 step 50 per Logi spec sheet. Hotspot positions and Easy-Switch slot coordinates ship as stubs at (0.5, 0.5); maintainer polishes via 'logitune --edit' after merge. Status: beta; pending hardware confirmation by the issue #46 tester. Test fixture updated with one new DeviceSpec entry. Closes #46
Same capabilities as MX Anywhere 3S. Bluetooth PID 0xb038.
PIDs 0xb025 (Bolt) and 0x4090 (Unifying). DPI 200-4000. Same 6-control layout as the 3S, without the extended DPI range or pointerSpeed feature.
Same capabilities as MX Anywhere 3. Bolt PID 0xb02d. Uses its own front/side images from the reference repo (different branding from the consumer variant).
Four rows for MX Anywhere 3, 3 for Business, 3S, 3S for Business. All marked beta pending hardware confirmation tracked in #46.
… CIDs Prevents contributors from adding 0x00d7 as a control when the device has a top-side connection switch button. Firmware handles the button via the multi-host mechanism already.
QML consumers match hotspots by kind ("scrollwheel", "thumbwheel",
"pointer"). The field was populated on the C++ side but dropped when
converting to QVariantMap, causing callouts and markers to fall back to
hardcoded percentages and drift away from the descriptor hotspot.
Add DeviceModel::thumbWheelSupported (reads descriptor feature flag, default true for safety). PointScrollPage now hides the thumb-wheel callout on mice that do not have one, so mice like the MX Anywhere family render only the scroll wheel and pointer speed callouts.
…n mode Three related improvements to the Easy-Switch page: - Device back image aspect is now read from the loaded PNG instead of being hard-coded to the MX Master ratio (0.676). Landscape shots such as the MX Anywhere bottom view no longer shrink to portrait size. - Slot circles scale with the rendered image height so they stay the same visual size across mice and window sizes. - In run mode, only the active slot's circle is drawn. Inactive slots are marked by the device's own printed labels. Edit mode still shows all circles with numbered labels so positions can be tuned.
…tions Back-view PNG for each MX Anywhere variant so the Easy-Switch page renders the correct bottom shot with the three channel indicators. Slot and scroll/pointer hotspot percentages updated from an in-app editor session so the overlays line up on the new back image and the existing side image.
5d85f24 to
88e016c
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #46.
Summary
Adds beta descriptors for four MX Anywhere variants:
All four ship 6 controls (Left, Right, Middle, Back, Forward, SmartShift toggle),
3 Easy-Switch slots, SmartShift, hi-res smooth scrolling. No thumb wheel, no
gestures.
Verification sources
Logical content cross-checked against:
profiles.json)Deliberate deviations from issue #46 draft:
profiles.jsoncaps at 4000 on somebuilds, but the HID++
AdjustableDpifeature reports 8000 on firmwaremanaged by firmware via the
ChangeHostfeature. Added a note indocs/adding-a-device.md.Other changes in this PR
fix(device-model):scrollHotspotsnow returns thekindfield, so thePoint & Scroll callouts and markers bind to the right descriptor hotspot
instead of falling back to hardcoded coordinates.
feat(point-scroll): thumb-wheel callout is hidden on mice that do nothave one (new
DeviceModel.thumbWheelSupported).feat(easy-switch): back-image aspect is derived from the loaded PNG(landscape shots no longer shrink to portrait), circles scale with image
height, and only the active slot's circle is drawn in run mode.
back.pngassets (bottom view) plus position tuning from an in-appeditor session.
Status: beta
Status is
betaon all four descriptors. Flip toverifiedafter a testerwith hardware confirms:
Test plan
logitune-tests: 518 passing--simulate-allrender check for all four variants--simulate-all --editposition tuning round-trips to descriptorKnown follow-ups (separate issues)
DescriptorWriter::commit()fails silently (noqCWarning) when thedescriptor file is not writable. Surfaced during this work when descriptors
loaded from
/usr/local/share/logitune/devices/(root-owned) and theeditor's save looked like a no-op. Will file a tracking issue.