Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion src/device/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -196,7 +197,7 @@ function activeAs<T>(...classes: ClientClass<T>[]): 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);
Expand Down
2 changes: 2 additions & 0 deletions src/supported-mice.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -151,6 +152,7 @@ const PID_UNIVERSE = new Set<number>([
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<Mouse & { pids: readonly number[] }> = MICE.filter(
Expand Down
8 changes: 8 additions & 0 deletions src/supported-mice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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],
Expand Down
6 changes: 6 additions & 0 deletions src/ui/device-images.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,9 @@ const DEVICE_IMAGES: ReadonlyMap<string, string> = 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 {
Expand Down Expand Up @@ -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";
Expand Down