From c06d06ee02ff0f8faaa2dbae01eaf6a4d9603509 Mon Sep 17 00:00:00 2001 From: retrozinndev Date: Sun, 11 May 2025 20:54:38 -0300 Subject: [PATCH] :zap: ags(runner/plugins/media): drop variables `onClose` --- ags/runner/plugins/media.ts | 121 +++++++++++++++++++++--------------- 1 file changed, 72 insertions(+), 49 deletions(-) diff --git a/ags/runner/plugins/media.ts b/ags/runner/plugins/media.ts index 38e2864..54ef694 100644 --- a/ags/runner/plugins/media.ts +++ b/ags/runner/plugins/media.ts @@ -3,54 +3,77 @@ import { ResultWidget, ResultWidgetProps } from "../../widget/runner/ResultWidge import { Runner } from "../Runner"; import AstalMpris from "gi://AstalMpris"; -export const PluginMedia = { - prefix: ":", - handle() { - const player = AstalMpris.get_default().players[0]; +export const PluginMedia = (() => { + let playTitle: Variable|null; + let previousTitle: Variable|null; + let nextTitle: Variable|null; - if(!player) return new ResultWidget({ - icon: "folder-music-symbolic", - title: "Couldn't find any players", - closeOnClick: false, - description: "No media / player found with mpris" - } as ResultWidgetProps); - return [ - new ResultWidget({ - icon: bind(player, "playbackStatus").as((status) => status === AstalMpris.PlaybackStatus.PLAYING ? - "media-playback-pause-symbolic" - : "media-playback-start-symbolic"), + return { + prefix: ":", + + onClose: () => { + playTitle?.drop(); + previousTitle?.drop(); + nextTitle?.drop(); + + previousTitle = null; + playTitle = null; + nextTitle = null; + }, + + handle() { + const player = AstalMpris.get_default().players[0]; + + playTitle = Variable.derive([ + bind(player, "title"), + bind(player, "artist"), + bind(player, "playbackStatus") + ], (title, artist, status) => `${ status === AstalMpris.PlaybackStatus.PLAYING ? + "Pause" : "Play" + } ${title} | ${artist}`); + + previousTitle = Variable.derive([ + bind(player, "title"), + bind(player, "artist") + ], (title, artist) => + `Go Previous ${ title ? title : player.busName }${ artist ? ` | ${artist}` : "" }` + ); + + nextTitle = Variable.derive([ + bind(player, "title"), + bind(player, "artist") + ], (title, artist) => + `Go Next ${ title ? title : player.busName }${ artist ? ` | ${artist}` : "" }` + ); + + if(!player) return new ResultWidget({ + icon: "folder-music-symbolic", + title: "Couldn't find any players", closeOnClick: false, - title: Variable.derive([ - bind(player, "title"), - bind(player, "artist"), - bind(player, "playbackStatus") - ], (title, artist, status) => `${ status === AstalMpris.PlaybackStatus.PLAYING ? - "Pause" : "Play" - } ${title} | ${artist}`)(), - onClick: () => player && player.play_pause() - } as ResultWidgetProps), - new ResultWidget({ - icon: "media-skip-backward-symbolic", - closeOnClick: false, - title: Variable.derive([ - bind(player, "title"), - bind(player, "artist") - ], (title, artist) => - `Go Previous ${ title ? title : player.busName }${ artist ? ` | ${artist}` : "" }` - )(), - onClick: () => player && player.canGoPrevious && player.previous() - } as ResultWidgetProps), - new ResultWidget({ - icon: "media-skip-forward-symbolic", - closeOnClick: false, - title: Variable.derive([ - bind(player, "title"), - bind(player, "artist") - ], (title, artist) => - `Go Next ${ title ? title : player.busName }${ artist ? ` | ${artist}` : "" }` - )(), - onClick: () => player && player.canGoNext && player.next() - } as ResultWidgetProps) - ] - }, -} as Runner.Plugin; + description: "No media / player found with mpris" + } as ResultWidgetProps); + return [ + new ResultWidget({ + icon: bind(player, "playbackStatus").as((status) => status === AstalMpris.PlaybackStatus.PLAYING ? + "media-playback-pause-symbolic" + : "media-playback-start-symbolic"), + closeOnClick: false, + title: playTitle(), + onClick: () => player && player.play_pause() + } as ResultWidgetProps), + new ResultWidget({ + icon: "media-skip-backward-symbolic", + closeOnClick: false, + title: previousTitle(), + onClick: () => player && player.canGoPrevious && player.previous() + } as ResultWidgetProps), + new ResultWidget({ + icon: "media-skip-forward-symbolic", + closeOnClick: false, + title: nextTitle(), + onClick: () => player && player.canGoNext && player.next() + } as ResultWidgetProps) + ] + }, + } as Runner.Plugin +})();