diff --git a/README.md b/README.md index c81b69cc..439c9f07 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,7 @@ logitune | MX Anywhere 3S for Business | ๐Ÿงช Beta | โœ… | โœ… | โœ… | โ€” | โœ… | โ€” | โœ… | โœ… | | MX Vertical | ๐Ÿงช Beta | โœ… | โœ… | โ€” | โ€” | โœ… | โ€” | โœ… | โœ… | | MX Vertical for Business | ๐Ÿงช Beta | โœ… | โœ… | โ€” | โ€” | โœ… | โ€” | โœ… | โœ… | +| Signature M650 | ๐Ÿงช Beta | โœ… | โœ… | โ€” | โ€” | โœ… | โ€” | โœ… | โ€” | > **MX Master 4 smooth scrolling** is disabled in the shipped descriptor: the hardware does not respond correctly to the HID++ configuration used on MX Master 2S / 3S. Regular scroll wheel and SmartShift work normally; only sub-tick smoothing is unavailable. Re-enable yourself by setting `"smoothScroll": true` in `devices/mx-master-4/descriptor.json` if your unit behaves differently; if it works we will promote the default. diff --git a/devices/signature-m650/back.png b/devices/signature-m650/back.png new file mode 100644 index 00000000..8766c16d Binary files /dev/null and b/devices/signature-m650/back.png differ diff --git a/devices/signature-m650/descriptor.json b/devices/signature-m650/descriptor.json new file mode 100644 index 00000000..da40057f --- /dev/null +++ b/devices/signature-m650/descriptor.json @@ -0,0 +1,109 @@ +{ + "$schema": "../schema.json", + "name": "Signature M650", + "status": "beta", + "productIds": [ + "0xb02a" + ], + "features": { + "battery": true, + "adjustableDpi": true, + "extendedDpi": false, + "smartShift": false, + "hiResWheel": false, + "lowResWheel": true, + "smoothScroll": true, + "thumbWheel": false, + "reprogControls": true, + "gestureV2": false + }, + "dpi": { + "min": 400, + "max": 4000, + "step": 100 + }, + "controls": [ + { + "controlId": "0x0050", + "buttonIndex": 0, + "defaultName": "Left click", + "defaultActionType": "default", + "configurable": false + }, + { + "controlId": "0x0051", + "buttonIndex": 1, + "defaultName": "Right click", + "defaultActionType": "default", + "configurable": false + }, + { + "controlId": "0x0052", + "buttonIndex": 2, + "defaultName": "Middle click", + "defaultActionType": "default", + "configurable": true + }, + { + "controlId": "0x0053", + "buttonIndex": 3, + "defaultName": "Back", + "defaultActionType": "default", + "configurable": true + }, + { + "controlId": "0x0056", + "buttonIndex": 4, + "defaultName": "Forward", + "defaultActionType": "default", + "configurable": true + }, + { + "controlId": "0x0000", + "buttonIndex": 5, + "defaultName": "Scroll wheel", + "defaultActionType": "default", + "configurable": false + } + ], + "hotspots": { + "buttons": [ + { + "buttonIndex": 2, + "xPct": 0.65, + "yPct": 0.18, + "side": "right", + "labelOffsetYPct": 0.0 + }, + { + "buttonIndex": 4, + "xPct": 0.28, + "yPct": 0.40, + "side": "left", + "labelOffsetYPct": 0.0 + }, + { + "buttonIndex": 3, + "xPct": 0.38, + "yPct": 0.52, + "side": "left", + "labelOffsetYPct": 0.0 + } + ], + "scroll": [ + { + "buttonIndex": -1, + "xPct": 0.65, + "yPct": 0.15, + "side": "right", + "labelOffsetYPct": 0.0, + "kind": "scrollwheel" + } + ] + }, + "images": { + "front": "front.png", + "side": "side.png", + "back": "back.png" + } +} \ No newline at end of file diff --git a/devices/signature-m650/front.png b/devices/signature-m650/front.png new file mode 100644 index 00000000..d3f089a7 Binary files /dev/null and b/devices/signature-m650/front.png differ diff --git a/devices/signature-m650/side.png b/devices/signature-m650/side.png new file mode 100644 index 00000000..27e6b4ab Binary files /dev/null and b/devices/signature-m650/side.png differ diff --git a/tests/test_device_registry.cpp b/tests/test_device_registry.cpp index 5c8f974b..4a11ba7a 100644 --- a/tests/test_device_registry.cpp +++ b/tests/test_device_registry.cpp @@ -158,6 +158,21 @@ static const DeviceSpec kDevices[] = { .gestureDownPayload = nullptr, .gestureUpType = ButtonAction::Default, }, + { + .pid = 0xb02a, + .name = "Signature M650", + .minDpi = 400, .maxDpi = 4000, .dpiStep = 100, + .buttonHotspots = 3, .scrollHotspots = 1, + .minControls = 6, + .control0Cid = 0x0050, .control5Cid = 0x0000, + .control5ActionType = "default", + .control6ActionType = nullptr, + .battery = true, .adjustableDpi = true, .smartShift = false, + .reprogControls = true, .gestureV2 = false, + .gestureDownType = ButtonAction::Default, + .gestureDownPayload = nullptr, + .gestureUpType = ButtonAction::Default, + }, }; class DeviceRegistryTest : public testing::TestWithParam {