mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-10 04:30:25 +02:00
feat: Add support for player controls in macOS dock menu (#1627)
* Added simple macOS dock menu similar to tray menu * Enhanced and moved dock menu to darwin folder and enabled mpris on macOS to support play/pause state * Added missing property sortName to silence TS error
This commit is contained in:
committed by
GitHub
parent
7613bc32c2
commit
b8228844df
@@ -0,0 +1,57 @@
|
|||||||
|
import { app, ipcMain, Menu } from 'electron';
|
||||||
|
|
||||||
|
import { getMainWindow } from '/@/main/index';
|
||||||
|
import { PlayerStatus } from '/@/shared/types/types';
|
||||||
|
|
||||||
|
let currentStatus: PlayerStatus = PlayerStatus.PAUSED;
|
||||||
|
|
||||||
|
const updateDockMenu = () => {
|
||||||
|
if (!app.dock) return;
|
||||||
|
|
||||||
|
const isPlaying = currentStatus === PlayerStatus.PLAYING;
|
||||||
|
|
||||||
|
const dockMenu = Menu.buildFromTemplate([
|
||||||
|
{
|
||||||
|
click: () => {
|
||||||
|
getMainWindow()?.webContents.send('renderer-player-play-pause');
|
||||||
|
},
|
||||||
|
label: isPlaying ? 'Pause' : 'Play',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'separator',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
click: () => {
|
||||||
|
getMainWindow()?.webContents.send('renderer-player-next');
|
||||||
|
},
|
||||||
|
label: 'Next',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
click: () => {
|
||||||
|
getMainWindow()?.webContents.send('renderer-player-previous');
|
||||||
|
},
|
||||||
|
label: 'Previous',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'separator',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
click: () => {
|
||||||
|
getMainWindow()?.webContents.send('renderer-player-stop');
|
||||||
|
},
|
||||||
|
label: 'Stop',
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
app.dock.setMenu(dockMenu);
|
||||||
|
};
|
||||||
|
|
||||||
|
ipcMain.on('update-playback', (_event, status: PlayerStatus) => {
|
||||||
|
currentStatus = status;
|
||||||
|
updateDockMenu();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Initialize dock menu after app is ready
|
||||||
|
app.whenReady().then(() => {
|
||||||
|
updateDockMenu();
|
||||||
|
});
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
import './dock-menu';
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import { PlayerShuffle, ServerType } from '/@/shared/types/types';
|
|||||||
|
|
||||||
const ipc = isElectron() ? window.api.ipc : null;
|
const ipc = isElectron() ? window.api.ipc : null;
|
||||||
const utils = isElectron() ? window.api.utils : null;
|
const utils = isElectron() ? window.api.utils : null;
|
||||||
const mpris = isElectron() && utils?.isLinux() ? window.api.mpris : null;
|
const mpris = isElectron() && (utils?.isLinux() || utils?.isMacOS()) ? window.api.mpris : null;
|
||||||
|
|
||||||
export const useMPRIS = () => {
|
export const useMPRIS = () => {
|
||||||
const player = usePlayerStore();
|
const player = usePlayerStore();
|
||||||
@@ -102,6 +102,7 @@ export const useMPRIS = () => {
|
|||||||
releaseYear: null,
|
releaseYear: null,
|
||||||
sampleRate: null,
|
sampleRate: null,
|
||||||
size: 0,
|
size: 0,
|
||||||
|
sortName: title,
|
||||||
tags: null,
|
tags: null,
|
||||||
trackNumber: 0,
|
trackNumber: 0,
|
||||||
trackSubtitle: null,
|
trackSubtitle: null,
|
||||||
@@ -221,7 +222,7 @@ const MPRISHookInner = () => {
|
|||||||
export const MPRISHook = () => {
|
export const MPRISHook = () => {
|
||||||
const isElectronEnv = isElectron();
|
const isElectronEnv = isElectron();
|
||||||
const utils = isElectronEnv ? window.api.utils : null;
|
const utils = isElectronEnv ? window.api.utils : null;
|
||||||
const mpris = isElectronEnv && utils?.isLinux() ? window.api.mpris : null;
|
const mpris = isElectronEnv && (utils?.isLinux() || utils?.isMacOS()) ? window.api.mpris : null;
|
||||||
|
|
||||||
if (mpris === null) {
|
if (mpris === null) {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
Reference in New Issue
Block a user