refactor: systemTray window logic. Window reference is now dynamic and guarded against destroyed states. Minimize can now put window in the systemTray if option is active

This commit is contained in:
MasterAcnolo
2026-09-10 10:27:11 +02:00
parent e4243a01ae
commit 311bff6df5
4 changed files with 29 additions and 12 deletions

View File

@@ -13,7 +13,7 @@
const { ipcMain, dialog, shell } = require("electron"); const { ipcMain, dialog, shell } = require("electron");
const fs = require("fs"); const fs = require("fs");
const { logger, logDir } = require("../server/logger"); const { logger, logDir } = require("../server/logger");
const { configFeatures, featuresPath } = require("../config"); const {configFeatures, featuresPath, devMode} = require("../config");
const { getThemes, reloadThemes } = require("./themeManager"); const { getThemes, reloadThemes } = require("./themeManager");
const config = require("../config"); const config = require("../config");
const { validateDownloadPath, getDefaultDownloadPath } = require("./pathValidator"); const { validateDownloadPath, getDefaultDownloadPath } = require("./pathValidator");
@@ -114,7 +114,16 @@ function registerIpcHandlers(getMainWindow) {
/** /**
* Window minimize request from renderer. * Window minimize request from renderer.
*/ */
ipcMain.on("window-minimize", () => getMainWindow()?.minimize()); ipcMain.on("window-minimize", () => {
// Minimize to tray
if (configFeatures.systemTray) {
getMainWindow()?.hide()
} else {
// Native minimize
getMainWindow()?.minimize()
}
}
);
/** /**
* Toggles maximize/unmaximize state of main window. * Toggles maximize/unmaximize state of main window.
@@ -223,7 +232,7 @@ function registerIpcHandlers(getMainWindow) {
if (key === "systemTray") { if (key === "systemTray") {
if (value === true) { if (value === true) {
logger.info("System Tray enabled dynamically."); logger.info("System Tray enabled dynamically.");
createSystemTray(getMainWindow(), config.devMode); createSystemTray(devMode);
} else { } else {
logger.info("System Tray disabled dynamically."); logger.info("System Tray disabled dynamically.");
destroyTray(); destroyTray();

View File

@@ -2,6 +2,7 @@ const {app, Menu, Tray, nativeImage} = require("electron");
const path = require("path"); const path = require("path");
const {logger} = require("../server/logger"); // Ajuste le chemin si besoin const {logger} = require("../server/logger"); // Ajuste le chemin si besoin
const fs = require("fs"); const fs = require("fs");
const {getMainWindow} = require("./windowManager");
/** /**
* Global reference to the Tray instance to prevent garbage collection. * Global reference to the Tray instance to prevent garbage collection.
@@ -17,11 +18,10 @@ let tray = null;
* - Builds the right-click context menu. * - Builds the right-click context menu.
* - Handles left-click behavior to toggle main window visibility. * - Handles left-click behavior to toggle main window visibility.
* *
* @param {import('electron').BrowserWindow} mainWindow - The main application window.
* @param {boolean} devMode - Indicates whether the application is running in development mode. * @param {boolean} devMode - Indicates whether the application is running in development mode.
* @returns {Tray} The created Tray instance. * @returns {Tray} The created Tray instance.
*/ */
function createSystemTray(mainWindow, devMode) { function createSystemTray(devMode) {
// Prevent creating multiple tray instances // Prevent creating multiple tray instances
if (tray) return tray; if (tray) return tray;
@@ -58,7 +58,11 @@ function createSystemTray(mainWindow, devMode) {
{ {
label: "Show Freedom Loader", label: "Show Freedom Loader",
click: () => { click: () => {
mainWindow.show(); const window = getMainWindow();
if (window && !window.isDestroyed()) {
window.show();
window.focus();
}
}, },
}, },
{ type: "separator" }, { type: "separator" },
@@ -82,11 +86,14 @@ function createSystemTray(mainWindow, devMode) {
* but it remains standard practice for Windows and Linux environments. * but it remains standard practice for Windows and Linux environments.
*/ */
tray.on("click", () => { tray.on("click", () => {
if (mainWindow.isVisible()) { const window = getMainWindow();
mainWindow.hide(); if (!window || window.isDestroyed()) return;
if (window.isVisible()) {
window.hide();
} else { } else {
mainWindow.show(); window.show();
mainWindow.focus(); window.focus();
} }
}); });

View File

@@ -87,7 +87,8 @@ async function createMainWindow() {
* cancels the destruction and hides the window instead. * cancels the destruction and hides the window instead.
*/ */
mainWindow.on('close', (event) => { mainWindow.on('close', (event) => {
if (!app.isQuitting && config.systemTray ) {
if (!app.isQuitting && config.configFeatures.systemTray) {
event.preventDefault(); event.preventDefault();
mainWindow.hide(); mainWindow.hide();
return false; return false;

View File

@@ -161,7 +161,7 @@ app.whenReady().then(async () => {
getMainWindow().show(); getMainWindow().show();
if (configFeatures.systemTray) { if (configFeatures.systemTray) {
createSystemTray(getMainWindow(), configFeatures.devMode); createSystemTray(devMode);
} }
if (configFeatures.discordRPC) startRPC(); if (configFeatures.discordRPC) startRPC();