production-taskbar-client / src / main / ipc / autoswitchChannel.js
autoswitchChannel.js
Raw
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,
  });
}