diff --git a/quickshell/Modules/DankDash/MediaPlayerTab.qml b/quickshell/Modules/DankDash/MediaPlayerTab.qml index 2070081e..7214d09f 100644 --- a/quickshell/Modules/DankDash/MediaPlayerTab.qml +++ b/quickshell/Modules/DankDash/MediaPlayerTab.qml @@ -65,8 +65,7 @@ Item { // Derived "no players" state: always correct, no timers. readonly property int _playerCount: allPlayers ? allPlayers.length : 0 readonly property bool _noneAvailable: _playerCount === 0 - readonly property bool _trulyIdle: activePlayer && activePlayer.playbackState === MprisPlaybackState.Stopped && !activePlayer.trackTitle && !activePlayer.trackArtist - readonly property bool showNoPlayerNow: (!_switchHold) && (_noneAvailable || _trulyIdle) + readonly property bool showNoPlayerNow: (!_switchHold) && (_noneAvailable || !activePlayer) property bool _switchHold: false Timer { diff --git a/quickshell/Services/MprisController.qml b/quickshell/Services/MprisController.qml index d7b29485..14db41b6 100644 --- a/quickshell/Services/MprisController.qml +++ b/quickshell/Services/MprisController.qml @@ -17,12 +17,22 @@ Singleton { target: root.activePlayer function onTrackTitleChanged() { root.activePlayerStableLength = (root.activePlayer && root.activePlayer.lengthSupported && root.activePlayer.length > 1) ? root.activePlayer.length : 0; + if (root.isIdle(root.activePlayer)) + root._resolveActivePlayer(); + } + function onTrackArtistChanged() { + if (root.isIdle(root.activePlayer)) + root._resolveActivePlayer(); } function onLengthChanged() { if (root.activePlayer && root.activePlayer.lengthSupported && root.activePlayer.length > 1) { root.activePlayerStableLength = root.activePlayer.length; } } + function onPlaybackStateChanged() { + if (root.isIdle(root.activePlayer)) + root._resolveActivePlayer(); + } } onActivePlayerChanged: { @@ -44,6 +54,13 @@ Singleton { } } + function isIdle(player: MprisPlayer): bool { + return player + && player.playbackState === MprisPlaybackState.Stopped + && !player.trackTitle + && !player.trackArtist; + } + function _resolveActivePlayer(): void { const playing = availablePlayers.find(p => p.isPlaying); if (playing) { @@ -51,17 +68,17 @@ Singleton { _persistIdentity(playing.identity); return; } - if (activePlayer && availablePlayers.indexOf(activePlayer) >= 0) + if (activePlayer && availablePlayers.indexOf(activePlayer) >= 0 && !isIdle(activePlayer)) return; const savedId = SessionData.lastPlayerIdentity; if (savedId) { const match = availablePlayers.find(p => p.identity === savedId); - if (match) { + if (match && !isIdle(match)) { activePlayer = match; return; } } - activePlayer = availablePlayers.find(p => p.canControl && p.canPlay) ?? null; + activePlayer = availablePlayers.find(p => p.canControl && !isIdle(p)) ?? null; if (activePlayer) _persistIdentity(activePlayer.identity); }