From e1826ac922462d19405307fb9153562149b7590a Mon Sep 17 00:00:00 2001 From: bill Date: Thu, 30 Apr 2026 18:53:47 +0200 Subject: [PATCH 1/2] feat(input): add mouse input event in input library --- packages/input/src/input-handler.ts | 16 ++++++- packages/input/src/input.enum.ts | 13 +++++ packages/input/test/input.library.spec.ts | 58 +++++++++++++++++++++-- 3 files changed, 82 insertions(+), 5 deletions(-) diff --git a/packages/input/src/input-handler.ts b/packages/input/src/input-handler.ts index 1a842a5a..7873ce16 100644 --- a/packages/input/src/input-handler.ts +++ b/packages/input/src/input-handler.ts @@ -1,4 +1,4 @@ -import { InputEnum } from "./input.enum"; +import { InputEnum, MouseEnum } from "./input.enum"; export class InputHandler { public inputs: Record = {}; @@ -12,6 +12,20 @@ export class InputHandler { this.inputs[e.code] = false; }); + window.addEventListener("mousedown", (e: MouseEvent) => { + const mouseButton = MouseEnum[e.button]; + if (!mouseButton) return; + + this.inputs[mouseButton] = true; + }); + + window.addEventListener("mouseup", (e: MouseEvent) => { + const mouseButton = MouseEnum[e.button]; + if (!mouseButton) return; + + this.inputs[mouseButton] = false; + }); + for (const key in InputEnum) { this.inputs[key] = false; } diff --git a/packages/input/src/input.enum.ts b/packages/input/src/input.enum.ts index cb1899c7..0d10a2bf 100644 --- a/packages/input/src/input.enum.ts +++ b/packages/input/src/input.enum.ts @@ -141,4 +141,17 @@ export enum InputEnum { BrowserBack = "BrowserBack", LaunchApp1 = "LaunchApp1", LaunchMail = "LaunchMail", + MouseLeft = "MouseLeft", + MouseMiddle = "MouseMiddle", + MouseRight = "MouseRight", + Back = "BackButton", + Forward = "Forward", +} + +export enum MouseEnum { + MouseLeft, + MouseMiddle, + MouseRight, + Back, + Forward, } diff --git a/packages/input/test/input.library.spec.ts b/packages/input/test/input.library.spec.ts index f126f0d5..0936f1b7 100644 --- a/packages/input/test/input.library.spec.ts +++ b/packages/input/test/input.library.spec.ts @@ -2,15 +2,20 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { InputEnum, InputLibrary } from "../src"; +type MockInputEvent = { + code?: string; + button?: number; +}; + const makeWindowMock = () => { - const listeners: Record void)[]> = {}; + const listeners: Record void)[]> = {}; return { - addEventListener: vi.fn((event: string, handler: (e: KeyboardEvent) => void) => { + addEventListener: vi.fn((event: string, handler: (e: MockInputEvent) => void) => { if (!listeners[event]) listeners[event] = []; listeners[event].push(handler); }), - dispatch: (event: string, e: Partial) => { - listeners[event]?.forEach((h) => h(e as KeyboardEvent)); + dispatch: (event: string, e: Partial) => { + listeners[event]?.forEach((h) => h(e as MockInputEvent)); }, }; }; @@ -96,5 +101,50 @@ describe("InputLibrary", () => { expect(pressed).not.toContain(InputEnum.KeyA); expect(pressed).toContain(InputEnum.Space); }); + + it("should return true for left mouse after mousedown", () => { + windowMock.dispatch("mousedown", { button: 0 }); + expect(library.isKeyPressed(InputEnum.MouseLeft)).toBe(true); + }); + + it("should return false for left mouse after mousedown then mouseup", () => { + windowMock.dispatch("mousedown", { button: 0 }); + windowMock.dispatch("mouseup", { button: 0 }); + expect(library.isKeyPressed(InputEnum.MouseLeft)).toBe(false); + }); + + it("should track right mouse independently", () => { + windowMock.dispatch("mousedown", { button: 2 }); + + expect(library.isKeyPressed(InputEnum.MouseRight)).toBe(true); + expect(library.isKeyPressed(InputEnum.MouseLeft)).toBe(false); + }); + + it("should include mouse input in pressed keys when mouse is held", () => { + windowMock.dispatch("mousedown", { button: 0 }); + + const pressed = library.getPressedKeys(); + + expect(pressed).toContain(InputEnum.MouseLeft); + }); + + it("should remove mouse input from pressed keys after mouseup", () => { + windowMock.dispatch("mousedown", { button: 0 }); + windowMock.dispatch("mouseup", { button: 0 }); + + const pressed = library.getPressedKeys(); + + expect(pressed).not.toContain(InputEnum.MouseLeft); + }); + + it("should handle unknown mouse input", () => { + windowMock.dispatch("mousedown", { button: -2 }); + windowMock.dispatch("mousedown", { button: 999 }); + windowMock.dispatch("mouseup", { button: 999 }); + + const pressed = library.getPressedKeys(); + + expect(pressed).toHaveLength(0); + }); }); }); From be602273f2c0f177bfc2e7936e55f5272bc4f8f2 Mon Sep 17 00:00:00 2001 From: bill Date: Thu, 30 Apr 2026 19:01:49 +0200 Subject: [PATCH 2/2] fix(input): delete useless tests --- packages/input/test/input.library.spec.ts | 24 ----------------------- 1 file changed, 24 deletions(-) diff --git a/packages/input/test/input.library.spec.ts b/packages/input/test/input.library.spec.ts index 0936f1b7..69529878 100644 --- a/packages/input/test/input.library.spec.ts +++ b/packages/input/test/input.library.spec.ts @@ -113,30 +113,6 @@ describe("InputLibrary", () => { expect(library.isKeyPressed(InputEnum.MouseLeft)).toBe(false); }); - it("should track right mouse independently", () => { - windowMock.dispatch("mousedown", { button: 2 }); - - expect(library.isKeyPressed(InputEnum.MouseRight)).toBe(true); - expect(library.isKeyPressed(InputEnum.MouseLeft)).toBe(false); - }); - - it("should include mouse input in pressed keys when mouse is held", () => { - windowMock.dispatch("mousedown", { button: 0 }); - - const pressed = library.getPressedKeys(); - - expect(pressed).toContain(InputEnum.MouseLeft); - }); - - it("should remove mouse input from pressed keys after mouseup", () => { - windowMock.dispatch("mousedown", { button: 0 }); - windowMock.dispatch("mouseup", { button: 0 }); - - const pressed = library.getPressedKeys(); - - expect(pressed).not.toContain(InputEnum.MouseLeft); - }); - it("should handle unknown mouse input", () => { windowMock.dispatch("mousedown", { button: -2 }); windowMock.dispatch("mousedown", { button: 999 });