From cd56783c96160a80d1513c2fd89ba09534c74067 Mon Sep 17 00:00:00 2001 From: jeffvli Date: Mon, 7 Nov 2022 03:46:55 -0800 Subject: [PATCH] Add media keys --- src/main/features/core/player/index.ts | 1 + src/main/features/core/player/media-keys.ts | 27 +++++++++++++++++++++ src/main/main.ts | 22 ++++++++++++++++- src/main/preload.ts | 17 +++++++++++++ src/renderer/preload.d.ts | 12 +++++++++ 5 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 src/main/features/core/player/media-keys.ts diff --git a/src/main/features/core/player/index.ts b/src/main/features/core/player/index.ts index 7eaf17059..c70e5cdeb 100644 --- a/src/main/features/core/player/index.ts +++ b/src/main/features/core/player/index.ts @@ -3,6 +3,7 @@ import MpvAPI from 'node-mpv'; import { PlayerData } from '../../../../renderer/store'; import { getMainWindow } from '../../../main'; import { store } from '../settings/index'; +import './media-keys'; declare module 'node-mpv'; diff --git a/src/main/features/core/player/media-keys.ts b/src/main/features/core/player/media-keys.ts new file mode 100644 index 000000000..3a34be8b1 --- /dev/null +++ b/src/main/features/core/player/media-keys.ts @@ -0,0 +1,27 @@ +/* eslint-disable promise/always-return */ +import { BrowserWindow, globalShortcut } from 'electron'; + +export const enableMediaKeys = (window: BrowserWindow | null) => { + globalShortcut.register('MediaStop', () => { + window?.webContents.send('renderer-player-stop'); + }); + + globalShortcut.register('MediaPlayPause', () => { + window?.webContents.send('renderer-player-play-pause'); + }); + + globalShortcut.register('MediaNextTrack', () => { + window?.webContents.send('renderer-player-next'); + }); + + globalShortcut.register('MediaPreviousTrack', () => { + window?.webContents.send('renderer-player-previous'); + }); +}; + +export const disableMediaKeys = () => { + globalShortcut.unregister('MediaStop'); + globalShortcut.unregister('MediaPlayPause'); + globalShortcut.unregister('MediaNextTrack'); + globalShortcut.unregister('MediaPreviousTrack'); +}; diff --git a/src/main/main.ts b/src/main/main.ts index 92a22342a..74d1d84ea 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -9,9 +9,14 @@ * `./src/main.js` using webpack. This gives us some performance wins. */ import path from 'path'; -import { app, BrowserWindow, shell, ipcMain } from 'electron'; +import { app, BrowserWindow, shell, ipcMain, globalShortcut } from 'electron'; import log from 'electron-log'; import { autoUpdater } from 'electron-updater'; +import { + disableMediaKeys, + enableMediaKeys, +} from './features/core/player/media-keys'; +import { store } from './features/core/settings/index'; import MenuBuilder from './menu'; import { resolveHtmlPath } from './utils'; import './features'; @@ -105,6 +110,20 @@ const createWindow = async () => { app.exit(0); }); + ipcMain.on('global-media-keys-enable', () => { + enableMediaKeys(mainWindow); + }); + + ipcMain.on('global-media-keys-disable', () => { + disableMediaKeys(); + }); + + const globalMediaKeysEnabled = store.get('global_media_hotkeys') as boolean; + + if (globalMediaKeysEnabled) { + enableMediaKeys(mainWindow); + } + mainWindow.loadURL(resolveHtmlPath('index.html')); mainWindow.on('ready-to-show', () => { @@ -152,6 +171,7 @@ export const getMainWindow = () => { app.on('window-all-closed', () => { // Respect the OSX convention of having the application in memory even // after all windows have been closed + globalShortcut.unregisterAll(); if (process.platform !== 'darwin') { app.quit(); } diff --git a/src/main/preload.ts b/src/main/preload.ts index df35a11cb..b4777332f 100644 --- a/src/main/preload.ts +++ b/src/main/preload.ts @@ -12,6 +12,12 @@ contextBridge.exposeInMainWorld('electron', { PLAYER_CURRENT_TIME() { ipcRenderer.send('player-current-time'); }, + PLAYER_MEDIA_KEYS_DISABLE() { + ipcRenderer.send('global-media-keys-disable'); + }, + PLAYER_MEDIA_KEYS_ENABLE() { + ipcRenderer.send('global-media-keys-enable'); + }, PLAYER_MUTE() { ipcRenderer.send('player-mute'); }, @@ -55,12 +61,23 @@ contextBridge.exposeInMainWorld('electron', { ) { ipcRenderer.on('renderer-player-current-time', cb); }, + RENDERER_PLAYER_NEXT(cb: (event: IpcRendererEvent, data: any) => void) { + ipcRenderer.on('renderer-player-next', cb); + }, RENDERER_PLAYER_PAUSE(cb: (event: IpcRendererEvent, data: any) => void) { ipcRenderer.on('renderer-player-pause', cb); }, RENDERER_PLAYER_PLAY(cb: (event: IpcRendererEvent, data: any) => void) { ipcRenderer.on('renderer-player-play', cb); }, + RENDERER_PLAYER_PLAY_PAUSE( + cb: (event: IpcRendererEvent, data: any) => void + ) { + ipcRenderer.on('renderer-player-play-pause', cb); + }, + RENDERER_PLAYER_PREVIOUS(cb: (event: IpcRendererEvent, data: any) => void) { + ipcRenderer.on('renderer-player-previous', cb); + }, RENDERER_PLAYER_STOP(cb: (event: IpcRendererEvent, data: any) => void) { ipcRenderer.on('renderer-player-stop', cb); }, diff --git a/src/renderer/preload.d.ts b/src/renderer/preload.d.ts index 6b9ff31c6..4c6e26d98 100644 --- a/src/renderer/preload.d.ts +++ b/src/renderer/preload.d.ts @@ -5,8 +5,11 @@ declare global { interface Window { electron: { ipcRenderer: { + APP_RESTART(): void; PLAYER_AUTO_NEXT(data: PlayerData): void; PLAYER_CURRENT_TIME(): void; + PLAYER_MEDIA_KEYS_DISABLE(): void; + PLAYER_MEDIA_KEYS_ENABLE(): void; PLAYER_MUTE(): void; PLAYER_NEXT(): void; PLAYER_PAUSE(): void; @@ -24,12 +27,21 @@ declare global { RENDERER_PLAYER_CURRENT_TIME( cb: (event: IpcRendererEvent, data: any) => void ): void; + RENDERER_PLAYER_NEXT( + cb: (event: IpcRendererEvent, data: any) => void + ): void; RENDERER_PLAYER_PAUSE( cb: (event: IpcRendererEvent, data: any) => void ): void; RENDERER_PLAYER_PLAY( cb: (event: IpcRendererEvent, data: any) => void ): void; + RENDERER_PLAYER_PLAY_PAUSE( + cb: (event: IpcRendererEvent, data: any) => void + ): void; + RENDERER_PLAYER_PREVIOUS( + cb: (event: IpcRendererEvent, data: any) => void + ): void; RENDERER_PLAYER_STOP( cb: (event: IpcRendererEvent, data: any) => void ): void;