From 2e17757e278cf2a0faf14e1d40d61fc2532ff429 Mon Sep 17 00:00:00 2001 From: Gabriel Pastori <58153955+gabrielpastori1@users.noreply.github.com> Date: Sat, 22 Nov 2025 17:42:06 -0300 Subject: [PATCH 01/12] plugin: global keybinds --- assets/icon.png | Bin 0 -> 59986 bytes assets/tray-paused.png | Bin 0 -> 1589 bytes assets/tray.png | Bin 0 -> 1478 bytes package.json | 2 +- src/i18n/resources/en.json | 23 ++- src/i18n/resources/pt-BR.json | 23 ++- src/plugins/global-keybinds/index.ts | 235 ++++++++++++++++++++++++ src/plugins/global-keybinds/renderer.ts | 69 +++++++ src/plugins/global-keybinds/utils.ts | 19 ++ 9 files changed, 368 insertions(+), 3 deletions(-) create mode 100644 assets/icon.png create mode 100644 assets/tray-paused.png create mode 100644 assets/tray.png create mode 100644 src/plugins/global-keybinds/index.ts create mode 100644 src/plugins/global-keybinds/renderer.ts create mode 100644 src/plugins/global-keybinds/utils.ts diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..871036c9c24433e58ad84d92e96fa2c3f5dd92a0 GIT binary patch literal 59986 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 literal 0 HcmV?d00001 diff --git a/assets/tray-paused.png b/assets/tray-paused.png new file mode 100644 index 0000000000000000000000000000000000000000..70e10c079a5698518242cf7841f235d1b9d5ea55 GIT binary patch literal 1589 zcmb7^e>~F(7{_N=ejH}V3ANPe$ZsX(*Eda;q77%q<=Tkr*I4r_i)<}Ti47r}+_tcs z-}2+NG))&-$dHz`vvK7|B$ab<>U-}WPP=craDV+BCe^SkrW!}uQ4uh$Wk}DBy?mF1fp;9)fy0X`M2s}EapgffSTa{ z4I~l-0FXoisZ@}~0>xqwj|bs!aA^rtOQiyvnm`v95Q71^Tu>^#aK|r1eP(NNXh;|Y z4&bRxVkxL{VIeU~B<|OZ|H>pR?t^5z|BooVmD zWZB`uy!t0a=%`|?+OO%G`mSqI*)CFKOCax;yU8V7^!wo%H>X8RJ| zD}*keWPE~#yp&LpP*O5kd|A_4RWY_L``j*j9w6w?jJ&b%Wxp?qy7I$Gd%Q^nn=`on z)LWR96rDZR>nqbS6)*|d&@z6d?rgVryp5)mK9Ft?8-1?nLwk&>)TZb$Y3L2h+c*0Z zz-A{`ys!1P$bh4-hK=i~AH?s&xu|{}p_V+5nLD(P@Rn~L2_d+=Vysw`b4|Kt91Y+->jiDxe>BQM3xwDHOXM7mj^L_9N z?DbPd&8>*vTL)sB!*>U5{OQU;4E@5N#2sazR-dT5#mKO|xAu|QDfvkg?z402RoylJ zY^m*T_X>3{@q`8pyq(P4N1VPlxO&n#UGDF;YC5G<=s7aJ5FEUdHaS1&jrB>sof3RH zBPQ$&^Ryu7(nr0%`lFfS`Hj~GlwbN7l&S1dE4j4)XBvJ6vtMxH&iL}E#ppt>gJ$TQ z8y#luyCDd1dl5PQUVd!YE8jgZNS_g3J8uEET5tlRju#IlxR*H}@ewK;{{rEDDQ@s$Iz0%cg2fl!PxQ^=S40c~7Yg3vBnf75ilNMKP}HII3k zgJVhD6mEBak6#G*N&g=K%gDz6;jf+;WjsF7b&ik=OzBoWyg4{}&qMRf1NOT|jR7ea zpf&filN1e|n>W^BvCmiB8djlpkDDrOqR%c+Q}5)ra>sBVVTESIyZpl&PDrY<5PvA% zaMCqv*a=H*`7PSHy0>1r2&3CYeylqFnu%U`nycxS&sIHx`HJB!=*VG;n)4{8Io`96fV<`T{`HLok=PDmHSa)CL+LvG#epr zmq-F5kGj6Ht?LV(8|Ex;-{W{BVX9m)0u}X`%U;(!N))D;Dqq`?_0KPtcuE|hML*dJ zItr+Y2z?3%+eegb?ciOVC~+opre=wjl^xB6isxYzPLhOpyt<>CGqLeJnV~gneVdym zy*z=nA~T9-t!MaYs=SE;fWokyv));iwp21Pe1gL0n6pk4q-lt+D9m&%DWzy>XMF5| zMVmqcQEimRE2q12*)LN3M4OuR3n&3mxP!X9l$sKFj4WSWxN=ORa5B5CDMIDa!nOv# ab)&h51`&w0CsyjW3po@Jf@<)`U-}no4+--C literal 0 HcmV?d00001 diff --git a/assets/tray.png b/assets/tray.png new file mode 100644 index 0000000000000000000000000000000000000000..bd53e7dc72317d00d64e302c93027f8c131e7e3c GIT binary patch literal 1478 zcmb7ESx}P)5dI-t4F*Cu)u-1i>H{(xfB?2q6K3f`tH91cYF?Q3HsIP%cLZ zmdkJ{H-ZSk{vwyqMhFxtpmNlJ5X8pFsMO$4{r|u=qS+q7^av}Yof(Y~VVv-<*0l@!rG#YYuhvMQO9uF!kg!=oTkPrxogk-WW z)0UQ?_I3z^fqZ?T>S{v-GkJb9Xs)CYgVYNQHiQukbe5s}@^Pcb zbo4bOKegvm9&2l%g4-6bDrpX$&?dYlgf6AMnh&(2MNJe8p-JG~<4Dnnriy#U-9VK` z`%xIulQQfkSNs&ac_OP*`+|<@hXZ1l)8={B@i8Wq&xhHl;YxopqvwsJ*sUr|X)xC45E0ZFoNTrw{HLMroZ)CalcAs^ zqQmw^W-&x{tgGp$?BwpFDg|nSY+3*1pbo>{@MJX6q{GVEO=5rCz_tfpkS_|(5I9y87n%R#Un1 zF$Ar_=zzn!#dXrz2&SED`MXc$F$wIKKHIW6y$M}u14g^=4h6 zfl@Embt^(%#Jgsk8hrE221nnfZJw16;Qdv{1wk#u=QA{{q0tI8VY05>z~a|bE9GdA z4rCV3?`Z!ROOxbLqg~31g#Mv9=HKTN8XN|Hu=w`3l+nQwc#GLYeL)uLgUVJ*2co(l zdrzmC^X=2KDWjm);K|{uTO&hB`%Ii~7rkU?Z5?DLme`8E@%@nR1rwjlT9$_EKiJEp zy3Hs%qP%P8b+c{J9jNO(wWu*Y^6vps_keYnG1<$w->G$43F{0v7V-h>(P&<3&Df%{ zl;ZW-SnSF6gVbx=Ki}669Iu;x!*{C)b3~YKUJzqF<6`PnjtIB1>^(Zm2Q05LSWT33 zaP#e*q+;3;wK*F-S~r{|^t;|R7jnZCmhg5dQ6#xIGZ{a4rM2$ib$=rg5H7(iue3x~tjP?AnZF`hB_|8&a9w90C(kp`Q;xz{$ zm6QHhZQDLzD%fqMubi56w(PG==SBTw;cg`m3kN-PLHaIXs0GNe2Q!?(B6six1?=zx z9~=WG!@=bk@O2`n3Z&bjG)l>`mbs;4L_$wvc5E49S@`upHaXq4Mx*o;w$*fRkZ7bw zn9u25Y~Ij@l>YQS8nQ~PiC4TB3oePp4G-l;;KSl06ae5bIGi2E(GG`WVqNe~SiBR? m7K6cKFlGy%%>E^ai4BiDk@DYy*esGjApj^OA7U#ZB=a9p`juJ$ literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 7d2a014a69..5895778abe 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "pear-music", "desktopName": "com.github.th_ch.pear_music", "productName": "Pear Desktop", - "version": "3.11.0", + "version": "3.12.0", "description": "Pear Desktop App - including custom plugins", "main": "./dist/main/index.js", "type": "module", diff --git a/src/i18n/resources/en.json b/src/i18n/resources/en.json index 4cf482aa3b..1220e96581 100644 --- a/src/i18n/resources/en.json +++ b/src/i18n/resources/en.json @@ -564,6 +564,27 @@ "description": "Makes the volume slider exponential so it's easier to select lower volumes.", "name": "Exponential Volume" }, + "global-keybinds": { + "name": "Global Keybinds", + "description": "Set global keybinds to control playback even when the app is not focused", + "management": "Manage Global Keybinds", + "dubleTapToogleWindowVisibility": { + "label": "Enable double tap on Play/Pause to toggle window visibility", + "tooltip": "When enabled, double tapping the Play/Pause keybind will show/hide the app window" + }, + "prompt": { + "title": "Global Keybinds", + "label": "Choose Global Keybinds:", + "volume-up": "Volume Up", + "volume-down": "Volume Down", + "next-track": "Next Track", + "previous-track": "Previous Track", + "like-track": "Like Track", + "dislike-track": "Dislike Track", + "toogle-play": "Play / Pause", + "toogle-window-visibility": "Show/Hide Window (Double Click)" + } + }, "in-app-menu": { "description": "Gives menu-bars a fancy, dark or album-color look", "menu": { @@ -947,4 +968,4 @@ "name": "Visualizer" } } -} +} \ No newline at end of file diff --git a/src/i18n/resources/pt-BR.json b/src/i18n/resources/pt-BR.json index d890e1c88d..65d00ca2bd 100644 --- a/src/i18n/resources/pt-BR.json +++ b/src/i18n/resources/pt-BR.json @@ -564,6 +564,27 @@ "description": "Torna o controle deslizante de volume exponencial para que seja mais fácil selecionar volumes mais baixos.", "name": "Volume Exponencial" }, + "global-keybinds": { + "name": "Teclas de atalho globais", + "description": "Defina teclas de atalho globais para controlar a reprodução mesmo quando o aplicativo não estiver em foco", + "management": "Gerenciar teclas de atalho globais", + "dubleTapToogleWindowVisibility": { + "label": "Ativar toque duplo em Play/Pause para alternar a visibilidade da janela", + "tooltip": "Quando ativado, tocar duas vezes na tecla Play/Pause mostrará/ocultará a janela do aplicativo" + }, + "prompt": { + "title": "Teclas de atalho globais", + "label": "Escolha as teclas de atalho globais:", + "volume-up": "Aumentar volume", + "volume-down": "Diminuir volume", + "next-track": "Próxima faixa", + "previous-track": "Faixa anterior", + "like-track": "Curtir faixa", + "dislike-track": "Não curtir faixa", + "toogle-play": "Reproduzir / Pausar", + "toogle-window-visibility": "Mostrar/Ocultar janela (Toque duplo)" + } + }, "in-app-menu": { "description": "Dá às barras de menu uma aparência elegante, escura ou com a cor do álbum", "menu": { @@ -947,4 +968,4 @@ "name": "Visualizador" } } -} +} \ No newline at end of file diff --git a/src/plugins/global-keybinds/index.ts b/src/plugins/global-keybinds/index.ts new file mode 100644 index 0000000000..b3785724a1 --- /dev/null +++ b/src/plugins/global-keybinds/index.ts @@ -0,0 +1,235 @@ +import { globalShortcut, ipcMain, type MenuItem } from 'electron'; +import prompt, { type KeybindOptions } from 'custom-electron-prompt'; +import { eventRace } from './utils'; + +import { createPlugin } from '@/utils'; + +import promptOptions from '@/providers/prompt-options'; +import { onPlayerApiReady } from './renderer'; +import { t } from '@/i18n'; +import { restart } from '@/providers/app-controls'; + +export type GlobalKeybindsPluginConfig = { + enabled: boolean; + dubleTapToogleWindowVisibility: boolean; + volumeUp: KeybindsOptions; + volumeDown: KeybindsOptions; + tooglePlay: KeybindsOptions; + nextTrack: KeybindsOptions; + previousTrack: KeybindsOptions; + likeTrack: KeybindsOptions; + dislikeTrack: KeybindsOptions; +}; + +export type KeybindsOptions = { + value: string; + dobleTap?: boolean; +}; + +const KeybindsOptionsFactory = (value = ''): KeybindsOptions => ({ + value: value, + dobleTap: false, +}); + +const defaultConfig: GlobalKeybindsPluginConfig = { + enabled: false, + dubleTapToogleWindowVisibility: true, + volumeUp: KeybindsOptionsFactory('Shift+Ctrl+Up'), + volumeDown: KeybindsOptionsFactory('Shift+Ctrl+Down'), + tooglePlay: KeybindsOptionsFactory('Shift+Ctrl+Space'), + nextTrack: KeybindsOptionsFactory('Shift+Ctrl+Right'), + previousTrack: KeybindsOptionsFactory('Shift+Ctrl+Left'), + likeTrack: KeybindsOptionsFactory('Shift+Ctrl+='), + dislikeTrack: KeybindsOptionsFactory('Shift+Ctrl+-'), +}; + +const fields: Record = { + volumeUp: 'volume-up', + volumeDown: 'volume-down', + tooglePlay: 'toogle-play', + nextTrack: 'next-track', + previousTrack: 'previous-track', + likeTrack: 'like-track', + dislikeTrack: 'dislike-track', +}; + +export default createPlugin({ + name: () => t('plugins.global-keybinds.name'), + description: () => t('plugins.global-keybinds.description'), + addedVersion: '3.12.x', + restartNeeded: false, + config: Object.assign({}, defaultConfig), + menu: async ({ setConfig, getConfig, window, refresh }) => { + const config = await getConfig(); + + function changeOptions( + changedOptions: Partial, + options: GlobalKeybindsPluginConfig, + ) { + for (const option in changedOptions) { + // HACK: Weird TypeScript error + (options as Record)[option] = ( + changedOptions as Record + )[option]; + } + + setConfig(options); + } + + // Helper function for globalShortcuts prompt + const kb = ( + label_: string, + value_: string, + default_: string, + ): KeybindOptions => ({ + value: value_, + label: label_, + default: default_ || undefined, + }); + + async function promptGlobalShortcuts(options: GlobalKeybindsPluginConfig) { + ipcMain.emit('global-keybinds:disable-all'); + const output = await prompt( + { + width: 500, + title: t('plugins.global-keybinds.prompt.title'), + label: t('plugins.global-keybinds.prompt.label'), + type: 'keybind', + keybindOptions: Object.entries(fields).map(([key, field]) => + kb( + t(`plugins.global-keybinds.prompt.${field}`), + key, + ( + options[ + key as keyof GlobalKeybindsPluginConfig + ] as KeybindsOptions + )?.value || '', + ), + ), + ...promptOptions(), + }, + window, + ); + + if (output) { + const newGlobalShortcuts: Partial = + Object.assign({}, defaultConfig, options); + for (const { value, accelerator } of output) { + if (!value) continue; + const key = value as keyof GlobalKeybindsPluginConfig; + if (key !== 'enabled') { + (newGlobalShortcuts[key] as KeybindsOptions).value = accelerator; + } + } + changeOptions({ ...newGlobalShortcuts }, options); + } + if (config.enabled) { + console.log('Global Keybinds Plugin: Re-registering shortcuts'); + ipcMain.emit('global-keybinds:refresh'); + } + } + + return [ + { + label: t( + 'plugins.global-keybinds.dubleTapToogleWindowVisibility.label', + ), + toolTip: t( + 'plugins.global-keybinds.dubleTapToogleWindowVisibility.tooltip', + ), + checked: config.dubleTapToogleWindowVisibility, + type: 'checkbox', + click: (item) => { + setConfig({ + dubleTapToogleWindowVisibility: item.checked, + }); + ipcMain.emit('global-keybinds:refresh'); + }, + }, + { + label: t('plugins.global-keybinds.management'), + click: () => promptGlobalShortcuts(config), + }, + ]; + }, + + backend: { + async start({ ipc, getConfig, window }) { + async function registerShortcuts({ + getConfig, + ipc, + window, + }: { + getConfig: () => + | Promise + | GlobalKeybindsPluginConfig; + ipc: any; + window: Electron.BrowserWindow; + }) { + globalShortcut.unregisterAll(); + const config = await getConfig(); + + if (!config.enabled) { + console.log( + 'Global Keybinds Plugin: Plugin is disabled, skipping shortcut registration', + ); + return; + } + + function parseAcelerator(accelerator: string) { + return accelerator.replace(/'(.)'/g, '$1'); + } + + Object.entries(config).forEach(([key, value]: [string, any]) => { + try { + if (key === 'enabled') return; + if (!value?.value) return; + if (key === 'tooglePlay' && config.dubleTapToogleWindowVisibility) { + globalShortcut.register( + parseAcelerator(value.value), + eventRace({ + single: () => { + ipc.send(key, true); + }, + double: () => { + if (window.isVisible()) window.hide(); + else window.show(); + }, + }), + ); + return; + } + + globalShortcut.register(parseAcelerator(value.value), () => { + console.log( + `Global Keybinds Plugin: Triggered shortcut for ${key}`, + ); + ipc.send(key, true); + }); + } catch (error) { + console.error( + `Global Keybinds Plugin: Error registering shortcut ${value.value}: ${error}`, + ); + } + }); + } + + ipcMain.on('global-keybinds:disable-all', () => { + globalShortcut.unregisterAll(); + }); + + ipcMain.on('global-keybinds:refresh', async () => { + registerShortcuts({ getConfig, ipc, window }); + }); + + await registerShortcuts({ getConfig, ipc, window }); + }, + stop() { + globalShortcut.unregisterAll(); + }, + }, + + renderer: { + onPlayerApiReady, + }, +}); diff --git a/src/plugins/global-keybinds/renderer.ts b/src/plugins/global-keybinds/renderer.ts new file mode 100644 index 0000000000..a974750f11 --- /dev/null +++ b/src/plugins/global-keybinds/renderer.ts @@ -0,0 +1,69 @@ +import { type GlobalKeybindsPluginConfig } from './index'; + +import type { RendererContext } from '@/types/contexts'; +import type { MusicPlayer } from '@/types/music-player'; + +function $(selector: string) { + return document.querySelector(selector); +} + +let api: MusicPlayer; + +export const onPlayerApiReady = async ( + playerApi: MusicPlayer, + context: RendererContext, +) => { + console.log('Global Keybinds Plugin: onPlayerApiReady called'); + api = playerApi; + + function updateVolumeSlider(volume: number) { + // Slider value automatically rounds to multiples of 5 + for (const slider of ['#volume-slider', '#expand-volume-slider']) { + const silderElement = $(slider); + if (silderElement) { + silderElement.value = String(volume > 0 && volume < 5 ? 5 : volume); + } + } + } + + context.ipc.on('volumeUp', () => { + const volume = Math.min(api.getVolume()); + api.setVolume(Math.min(volume + 5, 100)); + if (api.isMuted()) api.unMute(); + updateVolumeSlider(volume); + }); + context.ipc.on('volumeDown', () => { + const volume = Math.max(api.getVolume() - 5, 0); + api.setVolume(volume); + updateVolumeSlider(volume); + }); + context.ipc.on('nextTrack', () => { + api.nextVideo(); + }); + context.ipc.on('previousTrack', () => { + api.previousVideo(); + }); + context.ipc.on('likeTrack', () => { + const button = document.querySelector('#button-shape-like button'); + if (button) + button.dispatchEvent(new MouseEvent('click', { bubbles: true })); + }); + context.ipc.on('dislikeTrack', () => { + const button = document.querySelector('#button-shape-dislike button'); + if (button) + button.dispatchEvent(new MouseEvent('click', { bubbles: true })); + }); + + context.ipc.on('tooglePlay', () => { + switch (api.getPlayerState()) { + case 1: // Playing + api.pauseVideo(); + break; + case 2: // Paused + api.playVideo(); + break; + default: + break; + } + }); +}; diff --git a/src/plugins/global-keybinds/utils.ts b/src/plugins/global-keybinds/utils.ts new file mode 100644 index 0000000000..af9514e495 --- /dev/null +++ b/src/plugins/global-keybinds/utils.ts @@ -0,0 +1,19 @@ +export function eventRace( + { single, double }: { single: Function; double: Function }, + time = 200, +) { + let timeout: NodeJS.Timeout | null = null; + + return () => { + if (timeout) { + if (timeout) clearTimeout(timeout); + timeout = null; + double(); + } else { + timeout = setTimeout(() => { + single(); + timeout = null; + }, time); + } + }; +} From 3c37f46f99e870c58653bb3e2e39f35dd6bf361c Mon Sep 17 00:00:00 2001 From: Gabriel Pastori <58153955+gabrielpastori1@users.noreply.github.com> Date: Sat, 22 Nov 2025 17:50:36 -0300 Subject: [PATCH 02/12] add readme to global-keybinds plugin --- src/plugins/global-keybinds/readme.md | 50 +++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/plugins/global-keybinds/readme.md diff --git a/src/plugins/global-keybinds/readme.md b/src/plugins/global-keybinds/readme.md new file mode 100644 index 0000000000..89050f43bc --- /dev/null +++ b/src/plugins/global-keybinds/readme.md @@ -0,0 +1,50 @@ +# Global Keybinds Plugin + +This plugin enables system-wide **global keyboard shortcuts** for the music player. It allows you to control media playback, volume, and track ratings (like/dislike) from anywhere in your operating system, even when the application is minimized or not in focus. + +## 🚀 Features + +* **Global Control:** Control your music while working in other applications. +* **Customizable:** Remap any action to your preferred key combination via the plugin settings. +* **Smart Double-Tap:** A unique feature that allows you to toggle the player window's visibility by double-pressing the Play/Pause shortcut. + +## 🎹 Default Shortcuts + +By default, the plugin is configured with the following key combinations (using `Shift` + `Ctrl` to avoid conflicts with common system shortcuts): + +| Action | Default Shortcut | +| :--- | :--- | +| **Play / Pause** | `Shift` + `Ctrl` + `Space` | +| **Next Track** | `Shift` + `Ctrl` + `Right Arrow` | +| **Previous Track** | `Shift` + `Ctrl` + `Left Arrow` | +| **Volume Up** | `Shift` + `Ctrl` + `Up Arrow` | +| **Volume Down** | `Shift` + `Ctrl` + `Down Arrow` | +| **Like Track** | `Shift` + `Ctrl` + `=` | +| **Dislike Track** | `Shift` + `Ctrl` + `-` | + +## ⚙️ Configuration & Options + +You can customize the behavior and key assignments through the plugin menu. + +### Remapping Keys +Click on the **"Keybinds Management"** option in the plugin menu. A prompt will appear allowing you to press the new key combination you wish to assign to each action. + +### Window Visibility Toggle (Double Tap) +* **Option:** `Double Tap to Toggle Window Visibility` +* **Default:** `Enabled` +* **How it works:** + * **Single Press** on the Play/Pause shortcut: Toggles media playback. + * **Double Press** (quickly): Shows or Hides the application window. + +> **Note:** If you disable this option, the Play/Pause shortcut will only control playback, regardless of how fast you press it. + +## 👨‍💻 Author + +**Gabriel Pastori** +* 🇧🇷 Brazilian Developer +* GitHub: [gabrielpastori1](https://github.com/gabrielpastori1) + + +## 🤝 Credits + +This plugin was developed using the **precise-volume** plugin as a base and reference. \ No newline at end of file From 50bab7ae837e79d2521f4593a2fb62996dbd64c5 Mon Sep 17 00:00:00 2001 From: Gabriel Pastori <58153955+gabrielpastori1@users.noreply.github.com> Date: Sat, 22 Nov 2025 17:59:17 -0300 Subject: [PATCH 03/12] Update src/plugins/global-keybinds/index.ts Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/plugins/global-keybinds/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/global-keybinds/index.ts b/src/plugins/global-keybinds/index.ts index b3785724a1..da606ea1c1 100644 --- a/src/plugins/global-keybinds/index.ts +++ b/src/plugins/global-keybinds/index.ts @@ -1,5 +1,6 @@ import { globalShortcut, ipcMain, type MenuItem } from 'electron'; import prompt, { type KeybindOptions } from 'custom-electron-prompt'; + import { eventRace } from './utils'; import { createPlugin } from '@/utils'; From 3d142fdbb5160250458b25be39f8aab93200494e Mon Sep 17 00:00:00 2001 From: Gabriel Pastori <58153955+gabrielpastori1@users.noreply.github.com> Date: Sat, 22 Nov 2025 18:03:28 -0300 Subject: [PATCH 04/12] refactor: remove unused imports and improve type definitions in global keybinds --- src/plugins/global-keybinds/index.ts | 3 +-- src/plugins/global-keybinds/renderer.ts | 2 +- src/plugins/global-keybinds/utils.ts | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/plugins/global-keybinds/index.ts b/src/plugins/global-keybinds/index.ts index b3785724a1..cfe55315e1 100644 --- a/src/plugins/global-keybinds/index.ts +++ b/src/plugins/global-keybinds/index.ts @@ -1,4 +1,4 @@ -import { globalShortcut, ipcMain, type MenuItem } from 'electron'; +import { globalShortcut, ipcMain } from 'electron'; import prompt, { type KeybindOptions } from 'custom-electron-prompt'; import { eventRace } from './utils'; @@ -7,7 +7,6 @@ import { createPlugin } from '@/utils'; import promptOptions from '@/providers/prompt-options'; import { onPlayerApiReady } from './renderer'; import { t } from '@/i18n'; -import { restart } from '@/providers/app-controls'; export type GlobalKeybindsPluginConfig = { enabled: boolean; diff --git a/src/plugins/global-keybinds/renderer.ts b/src/plugins/global-keybinds/renderer.ts index a974750f11..0b20c9b5ef 100644 --- a/src/plugins/global-keybinds/renderer.ts +++ b/src/plugins/global-keybinds/renderer.ts @@ -9,7 +9,7 @@ function $(selector: string) { let api: MusicPlayer; -export const onPlayerApiReady = async ( +export const onPlayerApiReady = ( playerApi: MusicPlayer, context: RendererContext, ) => { diff --git a/src/plugins/global-keybinds/utils.ts b/src/plugins/global-keybinds/utils.ts index af9514e495..aed8d4f63a 100644 --- a/src/plugins/global-keybinds/utils.ts +++ b/src/plugins/global-keybinds/utils.ts @@ -1,5 +1,5 @@ export function eventRace( - { single, double }: { single: Function; double: Function }, + { single, double }: { single: () => void; double: () => void }, time = 200, ) { let timeout: NodeJS.Timeout | null = null; From 4d239eb8ed80f47d50b3ad0c2c741d7111637c87 Mon Sep 17 00:00:00 2001 From: Gabriel Pastori <58153955+gabrielpastori1@users.noreply.github.com> Date: Sat, 22 Nov 2025 18:13:04 -0300 Subject: [PATCH 05/12] refactor: improve type definitions and clean up menu function in global keybinds --- src/plugins/global-keybinds/index.ts | 39 ++++++++++++++++------------ 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/src/plugins/global-keybinds/index.ts b/src/plugins/global-keybinds/index.ts index dd228bc071..255dd5db93 100644 --- a/src/plugins/global-keybinds/index.ts +++ b/src/plugins/global-keybinds/index.ts @@ -2,7 +2,7 @@ import { globalShortcut, ipcMain } from 'electron'; import prompt, { type KeybindOptions } from 'custom-electron-prompt'; import { eventRace } from './utils'; - +import type { BackendContext } from '@/types/contexts'; import { createPlugin } from '@/utils'; import promptOptions from '@/providers/prompt-options'; @@ -59,7 +59,7 @@ export default createPlugin({ addedVersion: '3.12.x', restartNeeded: false, config: Object.assign({}, defaultConfig), - menu: async ({ setConfig, getConfig, window, refresh }) => { + menu: async ({ setConfig, getConfig, window }) => { const config = await getConfig(); function changeOptions( @@ -159,13 +159,7 @@ export default createPlugin({ getConfig, ipc, window, - }: { - getConfig: () => - | Promise - | GlobalKeybindsPluginConfig; - ipc: any; - window: Electron.BrowserWindow; - }) { + }: BackendContext) { globalShortcut.unregisterAll(); const config = await getConfig(); @@ -180,13 +174,16 @@ export default createPlugin({ return accelerator.replace(/'(.)'/g, '$1'); } - Object.entries(config).forEach(([key, value]: [string, any]) => { + Object.entries(config).forEach(([key, value]) => { + if (key === 'enabled' || key === 'dubleTapToogleWindowVisibility') + return; + const keybind = value as KeybindsOptions; + try { - if (key === 'enabled') return; - if (!value?.value) return; + if (!keybind?.value) return; if (key === 'tooglePlay' && config.dubleTapToogleWindowVisibility) { globalShortcut.register( - parseAcelerator(value.value), + parseAcelerator(keybind.value), eventRace({ single: () => { ipc.send(key, true); @@ -200,7 +197,7 @@ export default createPlugin({ return; } - globalShortcut.register(parseAcelerator(value.value), () => { + globalShortcut.register(parseAcelerator(keybind.value), () => { console.log( `Global Keybinds Plugin: Triggered shortcut for ${key}`, ); @@ -208,7 +205,7 @@ export default createPlugin({ }); } catch (error) { console.error( - `Global Keybinds Plugin: Error registering shortcut ${value.value}: ${error}`, + `Global Keybinds Plugin: Error registering shortcut ${keybind.value}: ${error}`, ); } }); @@ -219,10 +216,18 @@ export default createPlugin({ }); ipcMain.on('global-keybinds:refresh', async () => { - registerShortcuts({ getConfig, ipc, window }); + registerShortcuts({ + getConfig, + ipc, + window, + } as BackendContext); }); - await registerShortcuts({ getConfig, ipc, window }); + await registerShortcuts({ + getConfig, + ipc, + window, + } as BackendContext); }, stop() { globalShortcut.unregisterAll(); From 808effbfb035b936f99ebcd210117b475c5f3e78 Mon Sep 17 00:00:00 2001 From: Gabriel Pastori <58153955+gabrielpastori1@users.noreply.github.com> Date: Sat, 22 Nov 2025 18:13:57 -0300 Subject: [PATCH 06/12] fix: remove async from global-keybinds refresh event handler --- src/plugins/global-keybinds/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/global-keybinds/index.ts b/src/plugins/global-keybinds/index.ts index 255dd5db93..0b55ba1898 100644 --- a/src/plugins/global-keybinds/index.ts +++ b/src/plugins/global-keybinds/index.ts @@ -215,7 +215,7 @@ export default createPlugin({ globalShortcut.unregisterAll(); }); - ipcMain.on('global-keybinds:refresh', async () => { + ipcMain.on('global-keybinds:refresh', () => { registerShortcuts({ getConfig, ipc, From 40e3001ef920efbeafd01dd723838d517e56f007 Mon Sep 17 00:00:00 2001 From: Gabriel Pastori <58153955+gabrielpastori1@users.noreply.github.com> Date: Sat, 22 Nov 2025 18:15:32 -0300 Subject: [PATCH 07/12] =?UTF-8?q?fix:=20corrigir=20a=20ordem=20de=20import?= =?UTF-8?q?a=C3=A7=C3=A3o=20do=20BackendContext=20no=20plugin=20de=20keybi?= =?UTF-8?q?nds?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/global-keybinds/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/global-keybinds/index.ts b/src/plugins/global-keybinds/index.ts index 0b55ba1898..7d80458593 100644 --- a/src/plugins/global-keybinds/index.ts +++ b/src/plugins/global-keybinds/index.ts @@ -1,8 +1,8 @@ import { globalShortcut, ipcMain } from 'electron'; import prompt, { type KeybindOptions } from 'custom-electron-prompt'; +import type { BackendContext } from '@/types/contexts'; import { eventRace } from './utils'; -import type { BackendContext } from '@/types/contexts'; import { createPlugin } from '@/utils'; import promptOptions from '@/providers/prompt-options'; From 57329a90b6ad90888463b54ad5cd22e83a635e68 Mon Sep 17 00:00:00 2001 From: Gabriel Pastori <58153955+gabrielpastori1@users.noreply.github.com> Date: Sat, 22 Nov 2025 18:16:58 -0300 Subject: [PATCH 08/12] Update src/plugins/global-keybinds/index.ts Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/plugins/global-keybinds/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/global-keybinds/index.ts b/src/plugins/global-keybinds/index.ts index 7d80458593..b2e955e185 100644 --- a/src/plugins/global-keybinds/index.ts +++ b/src/plugins/global-keybinds/index.ts @@ -1,5 +1,6 @@ import { globalShortcut, ipcMain } from 'electron'; import prompt, { type KeybindOptions } from 'custom-electron-prompt'; + import type { BackendContext } from '@/types/contexts'; import { eventRace } from './utils'; From fbd1cf0ec52b3ba3f0c3495e0c85e0fe8ed42bf5 Mon Sep 17 00:00:00 2001 From: Gabriel Pastori <58153955+gabrielpastori1@users.noreply.github.com> Date: Sat, 22 Nov 2025 18:19:20 -0300 Subject: [PATCH 09/12] fix: melhorar a mensagem de erro no registro de atalhos do plugin de keybinds --- src/plugins/global-keybinds/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/global-keybinds/index.ts b/src/plugins/global-keybinds/index.ts index 7d80458593..dcaecea279 100644 --- a/src/plugins/global-keybinds/index.ts +++ b/src/plugins/global-keybinds/index.ts @@ -205,7 +205,8 @@ export default createPlugin({ }); } catch (error) { console.error( - `Global Keybinds Plugin: Error registering shortcut ${keybind.value}: ${error}`, + `Global Keybinds Plugin: Error registering shortcut ${keybind.value}:`, + error, ); } }); From 95a4bf483b4e9d125ba03f59db15a34361386008 Mon Sep 17 00:00:00 2001 From: Gabriel Pastori <58153955+gabrielpastori1@users.noreply.github.com> Date: Sat, 22 Nov 2025 18:21:30 -0300 Subject: [PATCH 10/12] force github actions run From 4032872b9ff585dd48d2d2a607fba85f9a5d0297 Mon Sep 17 00:00:00 2001 From: Gabriel Pastori <58153955+gabrielpastori1@users.noreply.github.com> Date: Sat, 22 Nov 2025 18:24:42 -0300 Subject: [PATCH 11/12] =?UTF-8?q?fix:=20corrigir=20a=20ordem=20de=20import?= =?UTF-8?q?a=C3=A7=C3=A3o=20do=20BackendContext=20no=20plugin=20de=20keybi?= =?UTF-8?q?nds?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/global-keybinds/index.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/global-keybinds/index.ts b/src/plugins/global-keybinds/index.ts index 8867097c98..7e8b091f5a 100644 --- a/src/plugins/global-keybinds/index.ts +++ b/src/plugins/global-keybinds/index.ts @@ -1,14 +1,13 @@ import { globalShortcut, ipcMain } from 'electron'; import prompt, { type KeybindOptions } from 'custom-electron-prompt'; -import type { BackendContext } from '@/types/contexts'; - import { eventRace } from './utils'; import { createPlugin } from '@/utils'; import promptOptions from '@/providers/prompt-options'; import { onPlayerApiReady } from './renderer'; import { t } from '@/i18n'; +import type { BackendContext } from '@/types/contexts'; export type GlobalKeybindsPluginConfig = { enabled: boolean; From 7c9ca928a7d59398950c218f44a70faf0bf41ef0 Mon Sep 17 00:00:00 2001 From: Gabriel Pastori <58153955+gabrielpastori1@users.noreply.github.com> Date: Sat, 22 Nov 2025 18:27:20 -0300 Subject: [PATCH 12/12] Update src/plugins/global-keybinds/index.ts Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/plugins/global-keybinds/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/global-keybinds/index.ts b/src/plugins/global-keybinds/index.ts index 7e8b091f5a..b69d244e3f 100644 --- a/src/plugins/global-keybinds/index.ts +++ b/src/plugins/global-keybinds/index.ts @@ -7,6 +7,7 @@ import { createPlugin } from '@/utils'; import promptOptions from '@/providers/prompt-options'; import { onPlayerApiReady } from './renderer'; import { t } from '@/i18n'; + import type { BackendContext } from '@/types/contexts'; export type GlobalKeybindsPluginConfig = {