Skip to content

feat(devices): add MX Anywhere 3 family (3, 3 for Business, 3S, 3S for Business)#54

Merged
mmaher88 merged 13 commits into
masterfrom
add-mx-anywhere-3-family
Apr 17, 2026
Merged

feat(devices): add MX Anywhere 3 family (3, 3 for Business, 3S, 3S for Business)#54
mmaher88 merged 13 commits into
masterfrom
add-mx-anywhere-3-family

Conversation

@mmaher88

@mmaher88 mmaher88 commented Apr 17, 2026

Copy link
Copy Markdown
Owner

Closes #46.

Summary

Adds beta descriptors for four MX Anywhere variants:

Model PIDs DPI max Pointer speed
MX Anywhere 3 0xb025, 0x4090 4000 no
MX Anywhere 3 for Biz 0xb02d 4000 no
MX Anywhere 3S 0xb037 8000 yes
MX Anywhere 3S for Biz 0xb038 8000 yes

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:

  • Options+ extraction (jlevere/hidpp profiles.json)
  • Solaar device database
  • libratbag / logid references

Deliberate deviations from issue #46 draft:

  • DPI max 8000 on 3S/3S-Biz. Options+ profiles.json caps at 4000 on some
    builds, but the HID++ AdjustableDpi feature reports 8000 on firmware

    = 3.x. Solaar agrees.

  • Easy-Switch button (CID 0x00d7) is NOT exposed as a reprog control. It is
    managed by firmware via the ChangeHost feature. Added a note in
    docs/adding-a-device.md.

Other changes in this PR

  • fix(device-model): scrollHotspots now returns the kind field, so the
    Point & 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 not
    have 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.
  • 4 back.png assets (bottom view) plus position tuning from an in-app
    editor session.

Status: beta

Status is beta on all four descriptors. Flip to verified after a tester
with hardware confirms:

  • Device shows up in the carousel over Bolt and direct BT
  • Battery, DPI, SmartShift, scroll invert, hi-res scroll all round-trip
  • Button remap works for Middle/Back/Forward/SmartShift-toggle

Test plan

  • logitune-tests: 518 passing
  • --simulate-all render check for all four variants
  • --simulate-all --edit position tuning round-trips to descriptor
  • Smoke test on real MX Master 3S (no regressions)
  • Real hardware test on MX Anywhere 3S (waiting on reporter)

Known follow-ups (separate issues)

  • DescriptorWriter::commit() fails silently (no qCWarning) when the
    descriptor file is not writable. Surfaced during this work when descriptors
    loaded from /usr/local/share/logitune/devices/ (root-owned) and the
    editor's save looked like a no-op. Will file a tracking issue.

mmaher88 added 13 commits April 16, 2026 20:09
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.
@mmaher88 mmaher88 force-pushed the add-mx-anywhere-3-family branch from 5d85f24 to 88e016c Compare April 17, 2026 00:09
@mmaher88 mmaher88 marked this pull request as ready for review April 17, 2026 00:09
@mmaher88 mmaher88 merged commit 93c2e52 into master Apr 17, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add suport for MX Anywhere 3S

1 participant