chore(desktop): use different mechanism for second instance

This commit is contained in:
Elian Doran 2025-09-16 18:22:32 +03:00
parent e12df98d12
commit 06254442c9
No known key found for this signature in database
3 changed files with 23 additions and 35 deletions

View File

@ -58,6 +58,27 @@ async function main() {
electron.globalShortcut.unregisterAll();
});
electron.app.on("second-instance", (event, commandLine) => {
const lastFocusedWindow = windowService.getLastFocusedWindow();
if (commandLine.includes("--new-window")) {
windowService.createExtraWindow("");
} else if (lastFocusedWindow) {
// Someone tried to run a second instance, we should focus our window.
// see www.ts "requestSingleInstanceLock" for the rest of this logic with explanation
if (lastFocusedWindow.isMinimized()) {
lastFocusedWindow.restore();
}
lastFocusedWindow.show();
lastFocusedWindow.focus();
}
});
const isPrimaryInstance = (await import("electron")).app.requestSingleInstanceLock();
if (!isPrimaryInstance) {
console.info("There's already an instance running, focusing that instance instead.");
process.exit(0);
}
// this is to disable electron warning spam in the dev console (local development only)
process.env["ELECTRON_DISABLE_SECURITY_WARNINGS"] = "true";

View File

@ -173,22 +173,6 @@ async function createMainWindow(app: App) {
mainWindow.on("closed", () => (mainWindow = null));
configureWebContents(mainWindow.webContents, spellcheckEnabled);
app.on("second-instance", (event, commandLine) => {
const lastFocusedWindow = getLastFocusedWindow();
if (commandLine.includes("--new-window")) {
createExtraWindow("");
} else if (lastFocusedWindow) {
// Someone tried to run a second instance, we should focus our window.
// see www.ts "requestSingleInstanceLock" for the rest of this logic with explanation
if (lastFocusedWindow.isMinimized()) {
lastFocusedWindow.restore();
}
lastFocusedWindow.show();
lastFocusedWindow.focus();
}
});
trackWindowFocus(mainWindow);
}
@ -345,6 +329,7 @@ function getAllWindows() {
export default {
createMainWindow,
createExtraWindow,
createSetupWindow,
closeSetupWindow,
registerGlobalShortcuts,

View File

@ -55,24 +55,6 @@ export default async function startTriliumServer() {
tmp.setGracefulCleanup();
const app = await buildApp();
/**
* The intended behavior is to detect when a second instance is running, in that case open the old instance
* instead of the new one. This is complicated by the fact that it is possible to run multiple instances of Trilium
* if port and data dir are configured separately. This complication is the source of the following weird usage.
*
* The line below makes sure that the "second-instance" (process in window.ts) is fired. Normally it returns a boolean
* indicating whether another instance is running or not, but we ignore that and kill the app only based on the port conflict.
*
* A bit weird is that "second-instance" is triggered also on the valid usecases (different port/data dir) and
* focuses the existing window. But the new process is start as well and will steal the focus too, it will win, because
* its startup is slower than focusing the existing process/window. So in the end, it works out without having
* to do a complex evaluation.
*/
if (utils.isElectron) {
(await import("electron")).app.requestSingleInstanceLock();
}
const httpServer = startHttpServer(app);
const sessionParser = (await import("./routes/session_parser.js")).default;