diff --git a/main.ts b/main.ts index c76f58da7..24706128f 100644 --- a/main.ts +++ b/main.ts @@ -138,6 +138,17 @@ function getTrayIcon(): string { } } +function createTaskbarButtonIcon(name: 'play' | 'pause' | 'next' | 'previous') { + const iconFileName: Record<'play' | 'pause' | 'next' | 'previous', string> = { + play: 'taskbar_play.ico', + pause: 'taskbar_pause.ico', + next: 'taskbar_next.ico', + previous: 'taskbar_previous.ico', + }; + + return nativeImage.createFromPath(path.join(globalAny.__static, `icons/${iconFileName[name]}`)); +} + function setInitialWindowState(mainWindow: BrowserWindow): void { try { let windowPositionSizeMaximizedAsString: string = settings.get('fullPlayerPositionSizeMaximized'); @@ -612,6 +623,40 @@ try { }); ipcMain.on('update-dock-menu', (event: any, arg: any) => { + if (isWindows() && mainWindow) { + mainWindow.setThumbarButtons([ + { + tooltip: arg.previousLabel, + icon: createTaskbarButtonIcon('previous'), + click(): void { + if (mainWindow) { + mainWindow.webContents.send('dock-previous'); + } + }, + }, + { + tooltip: arg.playPauseLabel, + icon: createTaskbarButtonIcon(arg.isPlaying ? 'pause' : 'play'), + click(): void { + if (mainWindow) { + mainWindow.webContents.send('dock-play-pause'); + } + }, + }, + { + tooltip: arg.nextLabel, + icon: createTaskbarButtonIcon('next'), + click(): void { + if (mainWindow) { + mainWindow.webContents.send('dock-next'); + } + }, + }, + ]); + + return; + } + if (!isMacOS() || !app.dock) { return; } diff --git a/src/app/services/dock/dock.service.ts b/src/app/services/dock/dock.service.ts index a47bd7e5c..900b49a9d 100644 --- a/src/app/services/dock/dock.service.ts +++ b/src/app/services/dock/dock.service.ts @@ -30,6 +30,10 @@ export class DockService { return process.platform === 'darwin'; } + public get isWindows(): boolean { + return process.platform === 'win32'; + } + public get showAlbumArtOnDockIcon(): boolean { return this.settings.showAlbumArtOnDockIcon; } @@ -40,19 +44,19 @@ export class DockService { } public initialize(): void { - if (!this.isMacOS) { + if (!this.isMacOS && !this.isWindows) { return; } this.removeSubscriptions(); - if (this.settings.showAlbumArtOnDockIcon) { + if (this.isMacOS && this.settings.showAlbumArtOnDockIcon) { this.addSubscriptions(); if (this.playbackService.currentTrack != undefined) { this.updateDockIconAsync(this.playbackService.currentTrack); } - } else { + } else if (this.isMacOS) { this.resetDockIcon(); } @@ -194,12 +198,11 @@ export class DockService { } private updateDockMenu(): void { - const playPauseLabel = this.playbackService.canPause - ? this.translatorService.get('pause') - : this.translatorService.get('play'); + const playPauseLabel = this.playbackService.canPause ? this.translatorService.get('pause') : this.translatorService.get('play'); const arg = { playPauseLabel: playPauseLabel, + isPlaying: this.playbackService.canPause, nextLabel: this.translatorService.get('next'), previousLabel: this.translatorService.get('previous'), }; diff --git a/static/icons/taskbar_next.ico b/static/icons/taskbar_next.ico new file mode 100644 index 000000000..ff7e222e0 Binary files /dev/null and b/static/icons/taskbar_next.ico differ diff --git a/static/icons/taskbar_pause.ico b/static/icons/taskbar_pause.ico new file mode 100644 index 000000000..0c8a2c2b7 Binary files /dev/null and b/static/icons/taskbar_pause.ico differ diff --git a/static/icons/taskbar_play.ico b/static/icons/taskbar_play.ico new file mode 100644 index 000000000..65283f471 Binary files /dev/null and b/static/icons/taskbar_play.ico differ diff --git a/static/icons/taskbar_previous.ico b/static/icons/taskbar_previous.ico new file mode 100644 index 000000000..57dd9850a Binary files /dev/null and b/static/icons/taskbar_previous.ico differ