diff --git a/package-lock.json b/package-lock.json index 6baf2a25..94ab9aef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -481,7 +481,7 @@ }, "node_modules/@openmouse/protocol": { "version": "0.1.0", - "resolved": "git+ssh://git@github.com/OpenMouse-Project/mouse-protocol.git#9d85a0ed416b6b1a2013c80e6a5c4c1ab9b71e02", + "resolved": "git+ssh://git@github.com/OpenMouse-Project/mouse-protocol.git#badc8d35b00af881f6ebf9e9a812ffd903b97b76", "engines": { "node": ">=20" } diff --git a/src/device/controller.ts b/src/device/controller.ts index b83a179e..af8f51f5 100644 --- a/src/device/controller.ts +++ b/src/device/controller.ts @@ -145,6 +145,7 @@ import { } from "@openmouse/protocol/keychron"; import { SUPPORTED_HID_FILTERS } from "@openmouse/protocol/drivers/vendors"; import { WLMouseHidClient } from "@openmouse/protocol/drivers/wlmouse/hid"; +import { MicrosoftHidClient } from "@openmouse/protocol/drivers/microsoft/hid"; import { parsePreviewMode, previewsEnabled, type PreviewMode } from "../preview-modes"; import { sleepLabel } from "./options"; import { traitsFor } from "./traits"; @@ -196,7 +197,7 @@ function activeAs(...classes: ClientClass[]): T | null { const DM_CLASSES = [WLMouseHidClient, LamzuHidClient, AtkHidClient, AtkBitmouseHidClient, NinjutsoHidClient] as const; const RAZER_CLASSES = [RazerHidClient, RazerViperMiniHidClient, RazerViperHidClient, RazerCobraHidClient] as const; -const NEEDS_OPEN = [TeevolutionHidClient, VgnF2HidClient, KeychronNapeHidClient, KeychronM6HidClient, ModdoHidClient, ZaunkoenigHidClient, FantechHidClient, WallhackMouseHidClient, WallhackKeyboardHidClient, GloriousHidClient, GloriousClassicHidClient, MchoseHidClient, MchoseDockHidClient] as const; +const NEEDS_OPEN = [TeevolutionHidClient, VgnF2HidClient, KeychronNapeHidClient, KeychronM6HidClient, ModdoHidClient, ZaunkoenigHidClient, FantechHidClient, WallhackMouseHidClient, WallhackKeyboardHidClient, GloriousHidClient, GloriousClassicHidClient, MchoseHidClient, MchoseDockHidClient, MicrosoftHidClient] as const; const PULSAR_CLASSES = [PulsarHidClient, PulsarProHidClient, PulsarXs1HidClient] as const; const logitechClient = (): LogitechHidppClient | null => activeAs(LogitechHidppClient); diff --git a/src/supported-mice.test.ts b/src/supported-mice.test.ts index 934bd229..ed166761 100644 --- a/src/supported-mice.test.ts +++ b/src/supported-mice.test.ts @@ -8,6 +8,7 @@ import { BITMOUSE_PRODUCT_IDS } from "@openmouse/protocol/bitmouse"; import { EGG_DEVICE_PROFILES } from "@openmouse/protocol/endgame-gear-op1"; import { KEYCHRON_NAPE_PRODUCTS } from "@openmouse/protocol/keychron"; import { LAMZU_PRODUCTS } from "@openmouse/protocol/lamzu"; +import { MICROSOFT_PRODUCTS } from "@openmouse/protocol/microsoft"; import { LOGITECH_BOLT_PRODUCT_IDS, LOGITECH_DIRECT_PRODUCT_IDS, @@ -151,6 +152,7 @@ const PID_UNIVERSE = new Set([ MCHOSE_DOCK_PRODUCT_ID, ...GLORIOUS_PRODUCTS.keys(), ...GLORIOUS_CLASSIC_PRODUCTS.keys(), + ...MICROSOFT_PRODUCTS, ]); test("every pinned PID on a coverage claim exists in the protocol registry", () => { const withPids: Array = MICE.filter( diff --git a/src/supported-mice.ts b/src/supported-mice.ts index ea6b0863..3364c69a 100644 --- a/src/supported-mice.ts +++ b/src/supported-mice.ts @@ -527,6 +527,14 @@ export const MICE: Mouse[] = [ pids: [0x080c], note: "PID 0x080c in Orbital driver" }, + // MICROSOFT ─────────────────────────────────────────────────────────── + { brand: "Microsoft", model: "Pro Intellimouse", status: "supported", req: 0, + pids: [0x082a], + note: "For LOD, Low is 2mm, High is 3mm. Calibrated surface 1/2/3 is not supported yet." }, + { brand: "Microsoft", model: "Classic Intellimouse", status: "supported", req: 0, + pids: [0x0823], + note: "DPI, polling rate, LOD and RGB color are supported." }, + // KEYCHRON ──────────────────────────────────────────────────────────── { brand: "Keychron", model: "Nape Pro", status: "supported", req: 1, pids: [0x0440], diff --git a/src/ui/device-images.ts b/src/ui/device-images.ts index 70c27f3a..f5434ab8 100644 --- a/src/ui/device-images.ts +++ b/src/ui/device-images.ts @@ -145,6 +145,9 @@ const DEVICE_IMAGES: ReadonlyMap = new Map([ // K-snake X11 wired / 2.4 GHz dongle share the same shell. ["a8a4:2255", "ksnake-x11.png"], ["a8a5:2255", "ksnake-x11.png"], + // Microsoft Intellimouse + ["045e:0823", "microsoft-classic-intellimouse.png"], + ["045e:082a", "microsoft-pro-intellimouse.png"], ]); function deviceKey(device: HIDDevice): string { @@ -221,6 +224,9 @@ function resolveDeviceImageFilename(device: HIDDevice | null | undefined, displa if (/\b(finalmouse|starlight|ulx)\b/i.test(displayName)) return "finalmouse-ulx.png"; if (/\borbital\b/i.test(displayName)) return "unknown-device.png"; if (/\bmoddo/i.test(displayName)) return "unknown-device.png"; + if (/\bintellimouse\s*classic\b/i.test(displayName)) return "microsoft-classic-intellimouse.png"; + if (/\bpro\s*intellimouse\b/i.test(displayName)) return "microsoft-pro-intellimouse.png"; + if (/\bintellimouse\b/i.test(displayName)) return "microsoft-classic-intellimouse.png"; // Pulsar 4K Wireless Receiver ships with the X2 V2 4K dongle kit; the receiver // product id is not yet published, so match the name reported by WebHID. if (/pulsar/i.test(displayName)) return "pulsar-x2-v2.png";