From b640e544ce54f254cefd6edf99ab2318f415ff38 Mon Sep 17 00:00:00 2001 From: Emre Demir <274893088+EmreO33@users.noreply.github.com> Date: Tue, 15 Sep 2026 20:16:40 +0300 Subject: [PATCH 1/2] device-images: resolve the DeathAdder V3 Pro to the V3 render The V3 Pro was deliberately excluded from the DeathAdder V3 rule while it was test-needed, so it fell to the generic placeholder. It has since been verified on hardware (mouse-protocol 0x00b7, firmware 2.1). The V3 and V3 Pro are one shell (the Pro drops the cable), so it shares razer-deathadder-v3.png the way the V2 family already shares one render. Note in the artwork README that razer-deathadder-v3.png is currently missing from the img.openmouse.app bucket (404), so both V3 models, and the showcase entry that lists it, need a maintainer upload before the art actually shows. --- public/devices/README.md | 6 +++++- src/ui/device-images.test.ts | 11 +++++++---- src/ui/device-images.ts | 7 ++++++- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/public/devices/README.md b/public/devices/README.md index c1c452d..9e81eed 100644 --- a/public/devices/README.md +++ b/public/devices/README.md @@ -187,7 +187,11 @@ package: - `logitech-mx-anywhere-3.png` — Logitech MX Anywhere 3 top-view render - `logitech-mx-ergo-s.png` — Logitech MX Ergo S top-view render - `razer-deathadder-v2.png` — Razer DeathAdder V2 (V2 / V2 Pro / Essential share the shell) -- `razer-deathadder-v3.png` — Razer DeathAdder V3 render +- `razer-deathadder-v3.png` — Razer DeathAdder V3 render. The DeathAdder V3 Pro + shares the shell and resolves to this file too (a dedicated cable-free V3 Pro + render would be an improvement). **Not in the bucket as of September 2026**: + `img.openmouse.app/razer-deathadder-v3.png` returns 404, so both models show + the placeholder (and the showcase entry 404s) until a maintainer uploads it. - `razer-deathadder-v4-pro.png` — Razer DeathAdder V4 Pro (Carbon Fiber SKU shares the shell) - `razer-viper-v3-hyperspeed.png` — Razer Viper V3 HyperSpeed render - `razer-viper-v4-pro.png` — Razer Viper V4 Pro render diff --git a/src/ui/device-images.test.ts b/src/ui/device-images.test.ts index 1d3f243..2b5ecec 100644 --- a/src/ui/device-images.test.ts +++ b/src/ui/device-images.test.ts @@ -1,7 +1,7 @@ import assert from "node:assert/strict"; import test from "node:test"; -import { deviceImage } from "./device-images.ts"; +import { deviceImage, isUnknownDevice } from "./device-images.ts"; const CDN = "https://img.openmouse.app/"; @@ -141,13 +141,16 @@ test("DeathAdder V2 family shares the V2 render; V4 Pro gets its own", () => { assert.equal(deviceImage(null, "DeathAdder Essential"), CDN + "razer-deathadder-v2.png"); assert.equal(deviceImage(null, "DeathAdder V4 Pro"), CDN + "razer-deathadder-v4-pro.png"); assert.equal(deviceImage(null, "DeathAdder V4 Pro Carbon Fiber Edition"), CDN + "razer-deathadder-v4-pro.png"); - // Test-needed V3 Pro and V2 X HyperSpeed must NOT pick up V3/V2 artwork. - assert.equal(deviceImage(null, "DeathAdder V3 Pro"), CDN + "unknown-device.png"); + // Test-needed V2 X HyperSpeed must NOT pick up V2 artwork. assert.equal(deviceImage(null, "DeathAdder V2 X HyperSpeed"), CDN + "unknown-device.png"); }); -test("DeathAdder V3 wired and HyperSpeed resolve to their own renders", () => { +test("DeathAdder V3 and V3 Pro share the V3 render; HyperSpeed has its own", () => { assert.equal(deviceImage(null, "DeathAdder V3"), CDN + "razer-deathadder-v3.png"); + // The names the Razer driver reports for the verified 0x00b7 / 0x00b6 transports. + assert.equal(deviceImage(null, "Razer DeathAdder V3 Pro"), CDN + "razer-deathadder-v3.png"); + assert.equal(deviceImage(null, "DeathAdder V3 Pro (Wired)"), CDN + "razer-deathadder-v3.png"); + assert.equal(isUnknownDevice(null, "DeathAdder V3 Pro"), false); assert.equal( deviceImage(null, "Razer DeathAdder V3 HyperSpeed"), CDN + "razer-deathadder-v3-hyperspeed.png", diff --git a/src/ui/device-images.ts b/src/ui/device-images.ts index c07ce44..db76a1b 100644 --- a/src/ui/device-images.ts +++ b/src/ui/device-images.ts @@ -80,7 +80,12 @@ function resolveDeviceImageFilename(_device: HIDDevice | null | undefined, displ if (/\bmx\s*ergo\b/i.test(displayName)) return "logitech-mx-ergo-s.png"; if (/\bdeathadder\s*v4\b/i.test(displayName)) return "razer-deathadder-v4-pro.png"; if (/\bdeathadder\s*v3\s*hyperspeed\b/i.test(displayName)) return "razer-deathadder-v3-hyperspeed.png"; - if (/\bdeathadder\s*v3\b(?!\s*pro\b)/i.test(displayName)) return "razer-deathadder-v3.png"; + // V3 and V3 Pro are one shell (the Pro drops the cable), so the Pro shares + // the V3 render the same way the V2 family shares one below. The Pro used + // to be excluded here while it was still test-needed; it has since been + // verified on hardware (mouse-protocol `0x00b7`). HyperSpeed is a different + // shell and is matched above. + if (/\bdeathadder\s*v3\b/i.test(displayName)) return "razer-deathadder-v3.png"; if (/\bdeathadder\s*v2\b(?!\s*x\s*hyperspeed\b)/i.test(displayName)) return "razer-deathadder-v2.png"; if (/\bdeathadder\s*essential\b/i.test(displayName)) return "razer-deathadder-v2.png"; if (/\bviper\s*v3\s*hyperspeed\b/i.test(displayName)) return "razer-viper-v3-hyperspeed.png"; From 21ffb18ce55d85bfaeeab5e6979a7bd6ce49a5dd Mon Sep 17 00:00:00 2001 From: snekxs <26660858+snekxs@users.noreply.github.com> Date: Sat, 19 Sep 2026 01:17:35 -0600 Subject: [PATCH 2/2] docs: mark DeathAdder V3 artwork available --- public/devices/README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/public/devices/README.md b/public/devices/README.md index 9e81eed..1b29942 100644 --- a/public/devices/README.md +++ b/public/devices/README.md @@ -187,11 +187,7 @@ package: - `logitech-mx-anywhere-3.png` — Logitech MX Anywhere 3 top-view render - `logitech-mx-ergo-s.png` — Logitech MX Ergo S top-view render - `razer-deathadder-v2.png` — Razer DeathAdder V2 (V2 / V2 Pro / Essential share the shell) -- `razer-deathadder-v3.png` — Razer DeathAdder V3 render. The DeathAdder V3 Pro - shares the shell and resolves to this file too (a dedicated cable-free V3 Pro - render would be an improvement). **Not in the bucket as of September 2026**: - `img.openmouse.app/razer-deathadder-v3.png` returns 404, so both models show - the placeholder (and the showcase entry 404s) until a maintainer uploads it. +- `razer-deathadder-v3.png` — Razer DeathAdder V3 render (V3 Pro shares the shell) - `razer-deathadder-v4-pro.png` — Razer DeathAdder V4 Pro (Carbon Fiber SKU shares the shell) - `razer-viper-v3-hyperspeed.png` — Razer Viper V3 HyperSpeed render - `razer-viper-v4-pro.png` — Razer Viper V4 Pro render