39 lines · 1.4 KB · TypeScript
RawDownload
// @effect-diagnostics globalTimers:off -- A plain Node child; the poll runs outside any Effect fiber.// Windows modifier-pair listener. Runs in a forked Node-mode child so a stuck or// crashed FFI call cannot take the main process with it. Mirrors the macOS// poller: sample both physical keys at 20 Hz, fire on the rising edge.import { SNAP_SHOT_MODIFIERS, type SnapShotModifier } from "@t3tools/contracts"; import { loadWindowsForegroundApi } from "../electron/WindowsForeground.ts";import { WINDOWS_MODIFIER_PAIR_VIRTUAL_KEYS } from "./snapShot.ts"; const POLL_INTERVAL_MS = 50; const requested = process.argv[2];if (!(SNAP_SHOT_MODIFIERS as readonly string[]).includes(requested ?? "")) {  process.exit(1);}const [left, right] = WINDOWS_MODIFIER_PAIR_VIRTUAL_KEYS[requested as SnapShotModifier]; async function poll() {  const api = await loadWindowsForegroundApi();  let active = false;  process.send?.("ready");  const timer = setInterval(() => {    const pressed = api.isKeyDown(left) && api.isKeyDown(right);    if (pressed && !active) {      try {        process.send?.("trigger");      } catch {}    }    active = pressed;  }, POLL_INTERVAL_MS);  const shutdown = () => {    clearInterval(timer);    process.exit(0);  };  process.once("disconnect", shutdown);  process.once("SIGTERM", shutdown);} void poll().catch(() => process.exit(1));