Ignore HUD and webcam clicks when generating auto-zooms

This commit is contained in:
AntimonyBullets committed 2026-11-09 17:29:58 +05:30
1 parent 0ea5bd7530
commit 83f25e321f
5 files changed
+108

No files matched your search

+3
View File
@@ -253,6 +253,9 @@ interface Window {
onEditorModeChanged: (callback: (inEditor: boolean) => void) => () => void;
hudOverlayRendererReady: () => void;
hudOverlaySetWebcamPreviewVisible: (visible: boolean) => void;
hudOverlaySetInteractiveBounds: (
bounds: Array<{ left: number; top: number; right: number; bottom: number }> | null,
) => void;
getHudOverlayCaptureProtection: () => Promise<{ success: boolean; enabled: boolean }>;
getHudOverlayMousePassthroughSupported: () => Promise<{
success: boolean;
+18
View File
@@ -11,6 +11,8 @@ import {
setLastLeftClick,
setLinuxCursorScreenPoint,
} from "../state";
import { getScreen } from "../utils";
import { getHudOverlayInteractiveBounds, getHudOverlayWindow } from "../../windows";
import type {
CursorInteractionType,
HookMouseEvent,
@@ -192,6 +194,22 @@ export function recordCursorMouseDown(button: 1 | 2 | 3) {
return;
}
const hudBounds = getHudOverlayInteractiveBounds();
const hud = getHudOverlayWindow();
if (hud?.isVisible() && !hud.isMinimized() && hudBounds) {
const cursor = getScreen().getCursorScreenPoint();
const isInsideHudInteractiveElement = hudBounds.some(
(bounds) =>
cursor.x >= bounds.left &&
cursor.x <= bounds.right &&
cursor.y >= bounds.top &&
cursor.y <= bounds.bottom,
);
if (isInsideHudInteractiveElement) {
return;
}
}
const point = getNormalizedCursorPoint();
if (!point) {
return;
+5
View File
@@ -228,6 +228,11 @@ contextBridge.exposeInMainWorld("electronAPI", {
hudOverlaySetWebcamPreviewVisible: (visible: boolean) => {
ipcRenderer.send("hud-overlay-set-webcam-preview-visible", visible);
},
hudOverlaySetInteractiveBounds: (
bounds: Array<{ left: number; top: number; right: number; bottom: number }> | null,
) => {
ipcRenderer.send("hud-overlay-set-interactive-bounds", bounds);
},
getHudOverlayCaptureProtection: () => {
return ipcRenderer.invoke("get-hud-overlay-capture-protection");
},
+37
View File
@@ -55,6 +55,12 @@ let hudOverlayMouseReassertTimer: NodeJS.Timeout | null = null;
let hudOverlayRecordingActive = false;
let hudCaptureStarting = false;
let hudOverlayWebcamPreviewVisible = false;
let hudOverlayInteractiveBounds: Array<{
left: number;
top: number;
right: number;
bottom: number;
}> | null = null;
let countdownWindow: BrowserWindow | null = null;
let capturePickerWindows: BrowserWindow[] = [];
let areaRecordingBorderWindow: BrowserWindow | null = null;
@@ -487,6 +493,36 @@ ipcMain.on("hud-overlay-set-webcam-preview-visible", (_event, visible: boolean)
}
});
ipcMain.on(
"hud-overlay-set-interactive-bounds",
(
_event,
bounds:
| Array<{ left: number; top: number; right: number; bottom: number }>
| null
| undefined,
) => {
if (
!bounds ||
bounds.some(
(rect) =>
![rect.left, rect.top, rect.right, rect.bottom].every(Number.isFinite) ||
rect.right < rect.left ||
rect.bottom < rect.top,
)
) {
hudOverlayInteractiveBounds = null;
return;
}
hudOverlayInteractiveBounds = bounds;
},
);
export function getHudOverlayInteractiveBounds() {
return hudOverlayInteractiveBounds;
}
let hudCaptureProtectionUpdates = Promise.resolve();
ipcMain.handle("set-hud-overlay-capture-protection", (_event, enabled: boolean) => {
// Settings can be open in more than one window. Match each helper acknowledgement
@@ -730,6 +766,7 @@ export function createHudOverlayWindow(): BrowserWindow {
screen.removeListener("display-metrics-changed", handleDisplayMetricsChanged);
if (hudOverlayWindow === win) {
hudOverlayWindow = null;
hudOverlayInteractiveBounds = null;
recordingPreparationActive = false;
hudCaptureStarting = false;
hudOverlayRecordingActive = false;
+45
View File
@@ -156,6 +156,51 @@ function LaunchWindowContent() {
docked: showRecordingWebcamPreview,
});
useEffect(() => {
const reportInteractiveBounds = () => {
const elements = [hudBarRef.current, recordingWebcamPreviewContainerRef.current].filter(
(element): element is HTMLDivElement => element !== null,
);
if (elements.length === 0) {
window.electronAPI?.hudOverlaySetInteractiveBounds?.(null);
return;
}
window.electronAPI?.hudOverlaySetInteractiveBounds?.(
elements.map((element) => {
const rect = element.getBoundingClientRect();
return {
left: window.screenX + rect.left,
top: window.screenY + rect.top,
right: window.screenX + rect.right,
bottom: window.screenY + rect.bottom,
};
}),
);
};
reportInteractiveBounds();
const resizeObserver = new ResizeObserver(reportInteractiveBounds);
if (hudBarRef.current) resizeObserver.observe(hudBarRef.current);
if (recordingWebcamPreviewContainerRef.current) {
resizeObserver.observe(recordingWebcamPreviewContainerRef.current);
}
window.addEventListener("mousemove", reportInteractiveBounds);
window.addEventListener("resize", reportInteractiveBounds);
return () => {
resizeObserver.disconnect();
window.removeEventListener("mousemove", reportInteractiveBounds);
window.removeEventListener("resize", reportInteractiveBounds);
window.electronAPI?.hudOverlaySetInteractiveBounds?.(null);
};
}, [
recordingHudOffset,
recordingWebcamPreviewContainerRef,
showRecordingWebcamPreview,
]);
const { handleHudMouseEnter, handleHudMouseLeave, beginInteractiveHudAction } =
useLaunchHudInteractionState({
openId,