diff --git a/jslib b/jslib index 3270d8bd..9de9c165 160000 --- a/jslib +++ b/jslib @@ -1 +1 @@ -Subproject commit 3270d8bd0ed46b62262575f5d59fca2414aaf8c7 +Subproject commit 9de9c1655c9a325443fdabfc74630f06e20f8d9a diff --git a/src/images/icon-highlight.png b/src/images/icon-highlight.png new file mode 100644 index 00000000..ffae9607 Binary files /dev/null and b/src/images/icon-highlight.png differ diff --git a/src/images/icon-highlight@2x.png b/src/images/icon-highlight@2x.png new file mode 100644 index 00000000..3b4c7966 Binary files /dev/null and b/src/images/icon-highlight@2x.png differ diff --git a/src/images/icon-template.png b/src/images/icon-template.png new file mode 100644 index 00000000..f2c07580 Binary files /dev/null and b/src/images/icon-template.png differ diff --git a/src/images/icon-template@2x.png b/src/images/icon-template@2x.png new file mode 100644 index 00000000..1affdbd1 Binary files /dev/null and b/src/images/icon-template@2x.png differ diff --git a/src/images/icon.ico b/src/images/icon.ico new file mode 100644 index 00000000..08e36282 Binary files /dev/null and b/src/images/icon.ico differ diff --git a/src/images/icon.png b/src/images/icon.png index 54fd8903..c5228af7 100644 Binary files a/src/images/icon.png and b/src/images/icon.png differ diff --git a/src/images/logo.png b/src/images/logo.png deleted file mode 100644 index 33ced5b1..00000000 Binary files a/src/images/logo.png and /dev/null differ diff --git a/src/images/logo@2x.png b/src/images/logo@2x.png deleted file mode 100644 index 2a0ba60b..00000000 Binary files a/src/images/logo@2x.png and /dev/null differ diff --git a/src/images/logo@3x.png b/src/images/logo@3x.png deleted file mode 100644 index 90473167..00000000 Binary files a/src/images/logo@3x.png and /dev/null differ diff --git a/src/locales/en/messages.json b/src/locales/en/messages.json index 29b205e1..dbb02027 100644 --- a/src/locales/en/messages.json +++ b/src/locales/en/messages.json @@ -540,5 +540,15 @@ }, "usernamePasswordNotConfigured": { "message": "Username/password are not configured." + }, + "exit": { + "message": "Exit" + }, + "showHide": { + "message": "Show / Hide", + "description": "Text for a button that toggles the visibility of the window. Shows the window when it is hidden or hides the window if it is currently open." + }, + "hideToTray": { + "message": "Hide to Tray" } } diff --git a/src/main.ts b/src/main.ts index 6cedc668..57cfcb89 100644 --- a/src/main.ts +++ b/src/main.ts @@ -9,6 +9,7 @@ import { KeytarStorageListener } from 'jslib/electron/keytarStorageListener'; import { ElectronLogService } from 'jslib/electron/services/electronLog.service'; import { ElectronMainMessagingService } from 'jslib/electron/services/electronMainMessaging.service'; import { ElectronStorageService } from 'jslib/electron/services/electronStorage.service'; +import { TrayMain } from 'jslib/electron/tray.main'; import { UpdaterMain } from 'jslib/electron/updater.main'; import { WindowMain } from 'jslib/electron/window.main'; @@ -23,6 +24,7 @@ export class Main { messagingMain: MessagingMain; menuMain: MenuMain; updaterMain: UpdaterMain; + trayMain: TrayMain; constructor() { // Set paths for portable builds @@ -57,7 +59,8 @@ export class Main { }, null, () => { this.messagingService.send('doneCheckingForUpdate'); }); - this.messagingMain = new MessagingMain(this.windowMain, this.menuMain, this.updaterMain); + this.trayMain = new TrayMain(this.windowMain, this.i18nService, this.storageService,); + this.messagingMain = new MessagingMain(this.windowMain, this.menuMain, this.updaterMain, this.trayMain); this.messagingService = new ElectronMainMessagingService(this.windowMain, (message) => { this.messagingMain.onMessage(message); }); @@ -72,6 +75,7 @@ export class Main { this.menuMain.init(); this.messagingMain.init(); await this.updaterMain.init(); + await this.trayMain.init(this.i18nService.t('bitwardenDirectoryConnector')); }, (e: any) => { // tslint:disable-next-line console.error(e); diff --git a/src/main/menu.main.ts b/src/main/menu.main.ts index ad01fd57..814d3676 100644 --- a/src/main/menu.main.ts +++ b/src/main/menu.main.ts @@ -48,6 +48,12 @@ export class MenuMain extends BaseMenu { template[template.length - 1].submenu = this.macWindowSubmenuOptions; } + (template[template.length - 1].submenu as MenuItemConstructorOptions[]).splice(1, 0, { + label: this.main.i18nService.t('hideToTray'), + click: () => this.main.messagingService.send('hideToTray'), + accelerator: 'CmdOrCtrl+Shift+M', + }); + this.menu = Menu.buildFromTemplate(template); Menu.setApplicationMenu(this.menu); } diff --git a/src/main/messaging.main.ts b/src/main/messaging.main.ts index 39dda6e7..92f0f5e7 100644 --- a/src/main/messaging.main.ts +++ b/src/main/messaging.main.ts @@ -3,6 +3,7 @@ import { ipcMain, } from 'electron'; +import { TrayMain } from 'jslib/electron/tray.main'; import { UpdaterMain } from 'jslib/electron/updater.main'; import { WindowMain } from 'jslib/electron/window.main'; @@ -14,7 +15,7 @@ export class MessagingMain { private syncTimeout: NodeJS.Timer; constructor(private windowMain: WindowMain, private menuMain: MenuMain, - private updaterMain: UpdaterMain) { } + private updaterMain: UpdaterMain, private trayMain: TrayMain) { } init() { ipcMain.on('messagingService', async (event: any, message: any) => this.onMessage(message)); @@ -36,6 +37,9 @@ export class MessagingMain { global.clearTimeout(this.syncTimeout); } break; + case 'hideToTray': + this.trayMain.hideToTray(); + break; default: break; }