import { app, ipcMain, screen } from "electron"; import { Worker } from "worker_threads"; import settings from "../settings"; const kAutoswitchChannel = "autoswitch"; const kChangeDelayEvent = "change-delay"; const kGetDelayEvent = "get-delay"; const kInputEventChannel = "input-event"; const kFile = "openProgram"; export default async function initAutoswitchChannel(mainWindow) { const autoswitchCached = settings.get(kAutoswitchChannel); const autoswitchWorker = new Worker( `${app .getAppPath() .replace( "app.asar", "app.asar.unpacked" )}/dist/workers/autoswitchWorker.js` ); const inputEventCallback = (message) => { if (message.event === "key-down") { autoswitchWorker.postMessage({ event: "key-down", payload: message }); } }; autoswitchWorker.on("message", ({ event, data }) => { switch (event) { case "activateKhm": mainWindow.webContents.send(kAutoswitchChannel, { event: "activateKhm", data, }); break; case "remove-listener": ipcMain.removeListener(kInputEventChannel, inputEventCallback); break; case "add-listener": ipcMain.on(kInputEventChannel, inputEventCallback); break; case "winactivate": ipcMain.emit(kFile, { windowProcess: data }); break; default: break; } }); ipcMain.handle(kAutoswitchChannel, async (_e, { event, data }) => { if (event === kGetDelayEvent) return autoswitchCached; if (event === kChangeDelayEvent) { settings.set(kAutoswitchChannel, parseInt(data, 10)); autoswitchWorker.postMessage({ event: kChangeDelayEvent, payload: data }); } return true; }); // Terminate worker on app exit, prevent long awaiting on app.relaunch ipcMain.on("main", ({ event }) => { if (event === "app-exit") autoswitchWorker.terminate(); }); autoswitchWorker.postMessage({ event: "set-dpi", payload: screen.getPrimaryDisplay().scaleFactor, }); }