import path from 'path'; import { app, BrowserWindow, Menu, Tray } from 'electron'; import { LocaleMessagesType } from './locale'; import { getAppRootPath } from './getRootPath'; let trayContextMenu = null; let tray: Tray | null = null; let trayAny: any; export function createTrayIcon( getMainWindow: () => BrowserWindow | null, messages: LocaleMessagesType ) { // keep the duplicated part to allow for search and find const iconFile = process.platform === 'darwin' ? 'session_icon_16.png' : 'session_icon_32.png'; const iconNoNewMessages = path.join(getAppRootPath(), 'images', 'session', iconFile); tray = new Tray(iconNoNewMessages); trayAny = tray; trayAny.forceOnTop = (mainWindow: BrowserWindow) => { if (mainWindow) { // On some versions of GNOME the window may not be on top when restored. // This trick should fix it. // Thanks to: https://github.com/Enrico204/Whatsapp-Desktop/commit/6b0dc86b64e481b455f8fce9b4d797e86d000dc1 mainWindow.setAlwaysOnTop(true); mainWindow.focus(); mainWindow.setAlwaysOnTop(false); } }; trayAny.toggleWindowVisibility = () => { const mainWindow = getMainWindow(); if (mainWindow) { if (mainWindow.isVisible()) { mainWindow.hide(); } else { mainWindow.show(); trayAny.forceOnTop(mainWindow); } } trayAny.updateContextMenu(); }; trayAny.showWindow = () => { const mainWindow = getMainWindow(); if (mainWindow) { if (!mainWindow.isVisible()) { mainWindow.show(); } trayAny.forceOnTop(mainWindow); } trayAny.updateContextMenu(); }; trayAny.updateContextMenu = () => { const mainWindow = getMainWindow(); // NOTE: we want to have the show/hide entry available in the tray icon // context menu, since the 'click' event may not work on all platforms. // For details please refer to: // https://github.com/electron/electron/blob/master/docs/api/tray.md. trayContextMenu = Menu.buildFromTemplate([ { id: 'toggleWindowVisibility', label: messages[mainWindow?.isVisible() ? 'appMenuHide' : 'show'], click: trayAny.toggleWindowVisibility, }, { id: 'quit', label: messages.appMenuQuit, click: app.quit.bind(app), }, ]); trayAny.setContextMenu(trayContextMenu); }; tray.on('click', trayAny.showWindow); tray.setToolTip(messages.sessionMessenger); trayAny.updateContextMenu(); return tray; }