From 19017be6a1385e7b35266deef499d6558ded34bb Mon Sep 17 00:00:00 2001 From: ydw1904 Date: Wed, 7 Oct 2026 16:45:58 +0800 Subject: [PATCH 1/2] feat: wire the AJAZZ NJ07 and NJ08 driver into the connect flow Adds AjazzHidClient to NEEDS_OPEN so it opens its vendor collection on connect, and the ajazz family to the traits table so the sleep card shows. Marks the six NJ07/NJ08 models as having a driver PR in the supported mirror (only those rows; the rest of the mirror is left alone). Needs the mouse-protocol release that contains the driver before the @openmouse/protocol pin can be bumped. Requested in Discord ticket 0156. Co-Authored-By: Claude Sonnet 5.5 --- src/device/controller.ts | 3 ++- src/device/traits.ts | 3 +++ src/supported-devices-data.ts | 8 ++++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/device/controller.ts b/src/device/controller.ts index 1ae066c1..c82e93c2 100644 --- a/src/device/controller.ts +++ b/src/device/controller.ts @@ -191,6 +191,7 @@ import { BytechHidClient } from "@openmouse/protocol/drivers/bytech/hid"; import { FaterHidClient } from "@openmouse/protocol/drivers/fater/hid"; import { RapooHidClient } from "@openmouse/protocol/drivers/rapoo/hid"; import { CoolerMasterHidClient } from "@openmouse/protocol/drivers/coolermaster/hid"; +import { AjazzHidClient } from "@openmouse/protocol/drivers/ajazz/hid"; import { RedragonM690ProHidClient } from "@openmouse/protocol/drivers/redragon/m690-pro-hid"; import { parsePreviewMode, previewsEnabled, type PreviewMode } from "../preview-modes"; import { sleepLabel } from "./options"; @@ -267,7 +268,7 @@ function activeAs(...classes: ClientClass[]): T | null { const DM_CLASSES = [WLMouseHidClient, LamzuHidClient, LamzuAtlantisHidClient, AtkHidClient, AtkBitmouseHidClient, NinjutsoHidClient] as const; const RAZER_CLASSES = [RazerHidClient, RazerViperMiniHidClient, RazerViperHidClient, RazerCobraHidClient] as const; -const NEEDS_OPEN = [LamzuAtlantisHidClient, TeevolutionHidClient, VgnF2HidClient, KeychronNapeHidClient, Keychron8kNordicHidClient, WLMouseBeastX4kHidClient, ModdoHidClient, ZaunkoenigHidClient, CorsairHidClient, FantechHidClient, WallhackMouseHidClient, WallhackKeyboardHidClient, GloriousHidClient, GloriousClassicHidClient, MchoseHidClient, MchoseDockHidClient, MchoseA5ProMaxHidClient, MchoseV3HidClient, MicrosoftHidClient, DareuHidClient, IncottHidClient, BytechHidClient, RapooHidClient, FaterHidClient, CoolerMasterHidClient, RedragonM690ProHidClient] as const; +const NEEDS_OPEN = [LamzuAtlantisHidClient, TeevolutionHidClient, VgnF2HidClient, KeychronNapeHidClient, Keychron8kNordicHidClient, WLMouseBeastX4kHidClient, ModdoHidClient, ZaunkoenigHidClient, CorsairHidClient, FantechHidClient, WallhackMouseHidClient, WallhackKeyboardHidClient, GloriousHidClient, GloriousClassicHidClient, MchoseHidClient, MchoseDockHidClient, MchoseA5ProMaxHidClient, MchoseV3HidClient, MicrosoftHidClient, DareuHidClient, IncottHidClient, BytechHidClient, RapooHidClient, FaterHidClient, CoolerMasterHidClient, RedragonM690ProHidClient, AjazzHidClient] as const; const PULSAR_CLASSES = [PulsarHidClient, PulsarProHidClient, PulsarXs1HidClient] as const; const logitechClient = (): LogitechHidppClient | null => activeAs(LogitechHidppClient); diff --git a/src/device/traits.ts b/src/device/traits.ts index 66cedc10..35cc25a7 100644 --- a/src/device/traits.ts +++ b/src/device/traits.ts @@ -94,6 +94,9 @@ const BY_FAMILY: Readonly>> = { hyperx: {}, "cooler master": { advancedSection: true, debounce: true }, "coolermaster-mm711": { advancedSection: true, debounce: true }, + // The NJ07/NJ08 family keeps the sleep timer in its config block and has no + // debounce setting in the vendor panel, so only the sleep card. + ajazz: { advancedSection: true, sleep: true }, }; const BY_BRAND: Readonly> = { diff --git a/src/supported-devices-data.ts b/src/supported-devices-data.ts index 0c4fc0e3..48616f5f 100644 --- a/src/supported-devices-data.ts +++ b/src/supported-devices-data.ts @@ -92,6 +92,12 @@ export const SUPPORTED_DEVICES: readonly SupportedDeviceEntry[] = [ { brand: "Redragon", model: "M721 Pro", status: "driver" }, { brand: "Redragon", model: "M724 K1NG 1K", status: "supported", pids: [0xfc7a] }, { brand: "Redragon", model: "M690 PRO", status: "supported", pids: [0x2e, 0x2f] }, + { brand: "AJAZZ", model: "NJ07 MC", status: "pr", pids: [0x2167] }, + { brand: "AJAZZ", model: "NJ08 MC", status: "pr", pids: [0x2168] }, + { brand: "AJAZZ", model: "NJ07 MC PRO", status: "pr", pids: [0x2177] }, + { brand: "AJAZZ", model: "NJ08 MC PRO", status: "pr", pids: [0x2178] }, + { brand: "AJAZZ", model: "NJ07", status: "pr", pids: [0x2157] }, + { brand: "AJAZZ", model: "NJ08", status: "pr", pids: [0x2158] }, { brand: "Ryunix", model: "KYU Pro MX1", status: "supported", pids: [0x26e, 0x26f] }, { brand: "Delux", model: "M800 Mini", status: "supported", pids: [0xfa60, 0xfa55] }, { brand: "Dareu", model: "A950 PRO Mg", status: "supported", pids: [0x1114, 0x1117] }, @@ -374,9 +380,7 @@ export const SUPPORTED_DEVICES: readonly SupportedDeviceEntry[] = [ { brand: "AJAZZ", model: "AJ179 Pro", status: "pending" }, { brand: "AJAZZ", model: "AJ159P MC", status: "pending" }, { brand: "AJAZZ", model: "AM3 Max", status: "pending" }, - { brand: "AJAZZ", model: "NJ08", status: "pending" }, { brand: "AJAZZ", model: "AJ159 V2 MC", status: "pending" }, - { brand: "AJAZZ", model: "NJ07", status: "pending" }, { brand: "Alienware", model: "AW610M", status: "pending" }, { brand: "Amkette", model: "XS Series Flow Plus", status: "pending" }, { brand: "Andowl", model: "Q-144", status: "pending" }, From 3628f0380f3b3943de9d27a72ea61549310acdbd Mon Sep 17 00:00:00 2001 From: snekxs <26660858+snekxs@users.noreply.github.com> Date: Thu, 8 Oct 2026 15:41:13 -0600 Subject: [PATCH 2/2] chore: bump @openmouse/protocol to 0.29.0 for AJAZZ driver --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 38e968fe..7ab1367d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "2.0.0", "license": "AGPL-3.0-or-later", "dependencies": { - "@openmouse/protocol": "0.27.0", + "@openmouse/protocol": "0.29.0", "lucide-react": "^1.43.0", "preact": "^10.29.8" }, @@ -481,9 +481,9 @@ } }, "node_modules/@openmouse/protocol": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@openmouse/protocol/-/protocol-0.27.0.tgz", - "integrity": "sha512-pxl6KwZORt0QNGcLvZaaFk8D+6ranTxYbCKPdkQJpmYdUT8ytKGWWwVYnq0/LrE4PvrIgjbkj17iBtpkuFcr3Q==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@openmouse/protocol/-/protocol-0.29.0.tgz", + "integrity": "sha512-0YcCdBZigRZlfJgVWxe9iGUQChilgUX/9J3lwHACRJ9goGQVw16IRW7DnSQ5R93NaMxVTMaOCIiloCGDbGR1Kw==", "license": "AGPL-3.0-or-later", "engines": { "node": ">=20" diff --git a/package.json b/package.json index a95e13d4..9d30af44 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "preview": "vite preview" }, "dependencies": { - "@openmouse/protocol": "0.27.0", + "@openmouse/protocol": "0.29.0", "lucide-react": "^1.43.0", "preact": "^10.29.8" },