From 302676bb7707818de553a3288996e0aa43da5de4 Mon Sep 17 00:00:00 2001 From: TARO-gh <131171129+TARO-gh@users.noreply.github.com> Date: Fri, 3 Apr 2026 15:35:29 +0900 Subject: [PATCH 1/2] fix(hud-overlay): ignore duplicate drag mousemove events to stop hold-drift --- electron/windows.ts | 8 ++++++++ src/components/launch/LaunchWindow.tsx | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/electron/windows.ts b/electron/windows.ts index 1c027ed7..056541cb 100644 --- a/electron/windows.ts +++ b/electron/windows.ts @@ -183,6 +183,7 @@ ipcMain.on("hud-overlay-set-ignore-mouse", (_event, ignore: boolean) => { }); let hudDragOffset: { x: number; y: number } | null = null; +let hudDragLastCursor: { x: number; y: number } | null = null; ipcMain.on("hud-overlay-drag", (_event, phase: string, screenX: number, screenY: number) => { if (!hudOverlayWindow || hudOverlayWindow.isDestroyed()) return; @@ -190,13 +191,20 @@ ipcMain.on("hud-overlay-drag", (_event, phase: string, screenX: number, screenY: if (phase === "start") { const bounds = hudOverlayWindow.getBounds(); hudDragOffset = { x: screenX - bounds.x, y: screenY - bounds.y }; + hudDragLastCursor = { x: screenX, y: screenY }; } else if (phase === "move" && hudDragOffset) { + if (hudDragLastCursor && hudDragLastCursor.x === screenX && hudDragLastCursor.y === screenY) { + return; + } + + hudDragLastCursor = { x: screenX, y: screenY }; hudOverlayWindow.setPosition( Math.round(screenX - hudDragOffset.x), Math.round(screenY - hudDragOffset.y), ); } else if (phase === "end") { hudDragOffset = null; + hudDragLastCursor = null; } }); diff --git a/src/components/launch/LaunchWindow.tsx b/src/components/launch/LaunchWindow.tsx index 46bef471..9ed4daad 100644 --- a/src/components/launch/LaunchWindow.tsx +++ b/src/components/launch/LaunchWindow.tsx @@ -1178,7 +1178,14 @@ export function LaunchWindow() { e.preventDefault(); isDraggingRef.current = true; window.electronAPI?.hudOverlayDrag?.("start", e.screenX, e.screenY); + let lastScreenX = e.screenX; + let lastScreenY = e.screenY; const handleMove = (ev: MouseEvent) => { + if (ev.screenX === lastScreenX && ev.screenY === lastScreenY) { + return; + } + lastScreenX = ev.screenX; + lastScreenY = ev.screenY; window.electronAPI?.hudOverlayDrag?.("move", ev.screenX, ev.screenY); }; const handleUp = () => { From 79c03f903924ca1381a837755e41443a9d3366ca Mon Sep 17 00:00:00 2001 From: TARO-gh <131171129+TARO-gh@users.noreply.github.com> Date: Fri, 3 Apr 2026 16:45:31 +0900 Subject: [PATCH 2/2] fix(hud-overlay): keep drag bounds size fixed to prevent cursor drift on Windows --- electron/windows.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/electron/windows.ts b/electron/windows.ts index 056541cb..d3f64897 100644 --- a/electron/windows.ts +++ b/electron/windows.ts @@ -184,6 +184,7 @@ ipcMain.on("hud-overlay-set-ignore-mouse", (_event, ignore: boolean) => { let hudDragOffset: { x: number; y: number } | null = null; let hudDragLastCursor: { x: number; y: number } | null = null; +let hudDragFixedSize: { width: number; height: number } | null = null; ipcMain.on("hud-overlay-drag", (_event, phase: string, screenX: number, screenY: number) => { if (!hudOverlayWindow || hudOverlayWindow.isDestroyed()) return; @@ -192,19 +193,30 @@ ipcMain.on("hud-overlay-drag", (_event, phase: string, screenX: number, screenY: const bounds = hudOverlayWindow.getBounds(); hudDragOffset = { x: screenX - bounds.x, y: screenY - bounds.y }; hudDragLastCursor = { x: screenX, y: screenY }; + hudDragFixedSize = { width: bounds.width, height: bounds.height }; } else if (phase === "move" && hudDragOffset) { if (hudDragLastCursor && hudDragLastCursor.x === screenX && hudDragLastCursor.y === screenY) { return; } hudDragLastCursor = { x: screenX, y: screenY }; - hudOverlayWindow.setPosition( - Math.round(screenX - hudDragOffset.x), - Math.round(screenY - hudDragOffset.y), + const targetX = Math.round(screenX - hudDragOffset.x); + const targetY = Math.round(screenY - hudDragOffset.y); + const fixedWidth = hudDragFixedSize?.width ?? hudOverlayWindow.getBounds().width; + const fixedHeight = hudDragFixedSize?.height ?? hudOverlayWindow.getBounds().height; + hudOverlayWindow.setBounds( + { + x: targetX, + y: targetY, + width: fixedWidth, + height: fixedHeight, + }, + false, ); } else if (phase === "end") { hudDragOffset = null; hudDragLastCursor = null; + hudDragFixedSize = null; } });