OpenRewind/src/electron/index.ts

102 lines
2.8 KiB
TypeScript

import { app, BrowserWindow, globalShortcut, ipcMain, Menu, nativeImage, screen, Tray } from "electron";
import contextMenu from "electron-context-menu";
import { join } from "path";
import initI18n from "./i18n.js";
import { createMainWindow, createSettingsWindow } from "./createWindow.js";
import { initDatabase } from "./backend/init.js";
import { Database } from "better-sqlite3";
import { startScreenshotLoop } from "./backend/screenshot.js";
import { __dirname } from "./dirname.js";
import { hideDock } from "./utils/electron.js";
import { checkFramesForEncoding, deleteEncodedScreenshots, processEncodingTasks } from "./backend/encoding.js";
const i18n = initI18n();
const t = i18n.t.bind(i18n);
const port = process.env.PORT || "5173";
const dev = !app.isPackaged;
let tray: null | Tray = null;
let dbConnection: null | Database = null;
let screenshotInterval: null | NodeJS.Timeout = null;
let mainWindow: BrowserWindow | null;
let settingsWindow: BrowserWindow | null;
function createTray() {
const pathRoot: string = dev ? "./src/electron/assets/" : join(__dirname, "./assets/");
const icon = nativeImage.createFromPath(pathRoot + "TrayIconTemplate@2x.png");
icon.resize({ width: 32, height: 32 });
tray = new Tray(pathRoot + "TrayIcon.png");
tray.setImage(icon);
const contextMenu = Menu.buildFromTemplate([
{
label: t("tray.showMainWindow"),
click: () => {
const display = screen.getPrimaryDisplay();
const { width, height } = display.bounds;
mainWindow!.show();
mainWindow!.setAlwaysOnTop(true, "screen-saver");
mainWindow!.setBounds({ x: 0, y: 0, width, height });
mainWindow!.focus();
}
},
{
label: t("tray.showSettingsWindow"),
click: () => {
settingsWindow!.show();
}
},
{ type: "separator" },
{
label: t("tray.quit"),
click: () => {
app.exit();
}
}
]);
tray.setContextMenu(contextMenu);
tray.setToolTip("OpenRewind");
}
contextMenu({
showLookUpSelection: true,
showSearchWithGoogle: true,
showCopyImage: true
});
app.once("ready", () => {
hideDock();
});
app.on("activate", () => {});
app.on("ready", () => {
createTray();
initDatabase().then((db) => {
screenshotInterval = startScreenshotLoop(db);
setInterval(checkFramesForEncoding, 5000, db);
setInterval(processEncodingTasks, 10000, db);
setInterval(deleteEncodedScreenshots, 5000, db)
dbConnection = db;
});
mainWindow = createMainWindow(port, () => (mainWindow = null));
settingsWindow = createSettingsWindow(port, () => (settingsWindow = null));
globalShortcut.register("Escape", () => {
if (!mainWindow || !mainWindow.isVisible()) return;
mainWindow.hide();
});
});
app.on("will-quit", ()=> {
dbConnection?.close();
});
// app.on("window-all-closed", () => {
// if (process.platform !== "darwin") app.quit();
// });
ipcMain.on('close-settings', () => {
settingsWindow?.hide();
});