From 23a268d8a01c2f1d70d26e63e7a99e0635af4262 Mon Sep 17 00:00:00 2001 From: hmtheboy154 Date: Sun, 6 Sep 2026 01:01:35 +0700 Subject: [PATCH 1/2] ui: Add Microsoft Intellimouse Classic & Pro integration Integrate the newly added Microsoft Intellimouse client into the Openmouse control panel. Adds device discovery hooks, registers the models in the support catalog, and configures image resolution maps for both models. Assisted-by: Antigravity:gemini-3.1-pro --- src/device/controller.ts | 3 ++- src/supported-mice.ts | 8 ++++++++ src/ui/device-images.ts | 6 ++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/device/controller.ts b/src/device/controller.ts index 690f427f..30e98dd2 100644 --- a/src/device/controller.ts +++ b/src/device/controller.ts @@ -142,6 +142,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"; @@ -193,7 +194,7 @@ function activeAs(...classes: ClientClass[]): T | null { const DM_CLASSES = [WLMouseHidClient, LamzuHidClient, AtkHidClient, 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.ts b/src/supported-mice.ts index a2bbeb73..d0e005c6 100644 --- a/src/supported-mice.ts +++ b/src/supported-mice.ts @@ -523,6 +523,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: "" }, + // 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 34eb4bd1..988d5199 100644 --- a/src/ui/device-images.ts +++ b/src/ui/device-images.ts @@ -142,6 +142,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 { @@ -218,6 +221,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"; From c89e6e1b3c781c995dcc8162ae857185b2ba124a Mon Sep 17 00:00:00 2001 From: snekxs <26660858+snekxs@users.noreply.github.com> Date: Sun, 6 Sep 2026 15:49:17 -0600 Subject: [PATCH 2/2] fix: register Microsoft PIDs in the coverage-check universe, fill empty note Also bumps @openmouse/protocol to pick up the Microsoft Intellimouse driver. --- package-lock.json | 2 +- src/supported-mice.test.ts | 2 ++ src/supported-mice.ts | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) 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/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 16092c09..3364c69a 100644 --- a/src/supported-mice.ts +++ b/src/supported-mice.ts @@ -533,7 +533,7 @@ export const MICE: Mouse[] = [ 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: "" }, + note: "DPI, polling rate, LOD and RGB color are supported." }, // KEYCHRON ──────────────────────────────────────────────────────────── { brand: "Keychron", model: "Nape Pro", status: "supported", req: 1,