const path = require('path'); const { app, Menu, Tray } = require('electron'); let trayContextMenu = null; let tray = null; function createTrayIcon(getMainWindow, messages) { // A smaller icon is needed on macOS const iconSize = process.platform === 'darwin' ? '16' : '256'; const iconNoNewMessages = path.join( __dirname, '..', 'images', `icon_${iconSize}.png` ); tray = new Tray(iconNoNewMessages); tray.toggleWindowVisibility = () => { const mainWindow = getMainWindow(); if (mainWindow) { if (mainWindow.isVisible()) { mainWindow.hide(); } else { mainWindow.show(); // 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); } } tray.updateContextMenu(); }; tray.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() ? 'hide' : 'show'].message, click: tray.toggleWindowVisibility, }, { id: 'quit', label: messages.quit.message, click: app.quit.bind(app), }, ]); tray.setContextMenu(trayContextMenu); }; tray.updateIcon = unreadCount => { if (unreadCount > 0) { const filename = `${String(unreadCount >= 10 ? 10 : unreadCount)}.png`; tray.setImage( path.join(__dirname, '..', 'images', 'alert', iconSize, filename) ); } else { tray.setImage(iconNoNewMessages); } }; tray.on('click', tray.toggleWindowVisibility); tray.setToolTip(messages.trayTooltip.message); tray.updateContextMenu(); return tray; } module.exports = createTrayIcon;