From 60cf9d989945bc59765f99e9053c3e9113628328 Mon Sep 17 00:00:00 2001 From: zebus3d Date: Fri, 9 Oct 2026 10:53:02 -0300 Subject: [PATCH 1/3] feat: change volume with the mouse wheel on the classic mini player The skinned mini players already turn the wheel into volume, but the classic capsule ignored it. Its only way to change volume was to switch the hover bar from song position to volume in Settings, which means giving up seeking. The wheel now controls volume on the classic skin too, with the same proportional step as the skins. The artist line briefly shows the new level, so a wheel turn has feedback even when the hover bar is the song position. --- src/ui/components/mini-player/MiniPlayer.tsx | 23 +++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/ui/components/mini-player/MiniPlayer.tsx b/src/ui/components/mini-player/MiniPlayer.tsx index 6a37f052..bf1c87ee 100644 --- a/src/ui/components/mini-player/MiniPlayer.tsx +++ b/src/ui/components/mini-player/MiniPlayer.tsx @@ -8,6 +8,7 @@ import { type KeyboardEvent, type MouseEvent, type PointerEvent, + type WheelEvent, } from "react"; import { cn } from "@/lib/utils"; import { emit } from "@tauri-apps/api/event"; @@ -782,6 +783,19 @@ export default function MiniPlayer() { ? (displayedTime / timeState.duration) * 100 : 0; + /* + * The wheel always controls volume, whatever the hover bar is set to, so the volume can be + * changed without giving up the song position slider. Same feel as the other skins: the + * step is proportional, so a trackpad fine-tunes and a wheel notch moves about 5%. + */ + const handleWheel = (event: WheelEvent) => { + const delta = Math.max(-0.1, Math.min(0.1, -event.deltaY / 2000)); + const next = Math.round(Math.min(1, Math.max(0, displayedVolume + delta)) * 100) / 100; + setVolumePreview(next); + void emit("mini-player:volume", { volume: next }); + keepVolumePreviewUntilSync(); + }; + // Playback progress is drawn as a ring around the artwork, so the collapsed pill // communicates position without spending any of its 100px budget on a progress bar. const trackProgress = timeState.duration > 0 @@ -823,6 +837,7 @@ export default function MiniPlayer() { if (event.button === RIGHT_MOUSE_BUTTON) void stopManualWindowDrag(); }} onContextMenu={(event) => event.preventDefault()} + onWheel={handleWheel} > {/* Album-reactive backdrop: the artwork itself, blown up and blurred past recognition, @@ -928,7 +943,13 @@ export default function MiniPlayer() { )} - {playerState.artist ? ( + {/* The artist line briefly shows the level while it changes, so a wheel turn + has feedback even when the hover bar is the song position. */} + {volumePreview !== null ? ( +

+ Volume {Math.round(volumePreview * 100)}% +

+ ) : playerState.artist ? (

{playerState.artist}

From 6b7d06efbad90e2618e7ab792a9ddc9df0e8008d Mon Sep 17 00:00:00 2001 From: zebus3d Date: Fri, 9 Oct 2026 10:55:05 -0300 Subject: [PATCH 2/3] feat: add a "don't show again" option to the mini player Closing the mini player only hides it until the main window is next backgrounded. That is right for "not now", but the only way to say "never" was the switch in Settings > Window, which is hard to find from the mini player. A right-click menu now offers both "Hide for now" and "Don't show again". On the classic skin it opens from the close button, because a right-click anywhere else on the capsule drags the window; the other skins open it from anywhere. "Don't show again" only flips the existing setting, and the main window reacts to that as it does when the switch is turned off in Settings. --- src/ui/components/mini-player/MiniPlayer.tsx | 10 ++++++++-- .../mini-player/SkinnedMiniPlayer.tsx | 7 +++++-- .../mini-player/useMiniPlayerBridge.ts | 19 +++++++++++++++++++ 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/ui/components/mini-player/MiniPlayer.tsx b/src/ui/components/mini-player/MiniPlayer.tsx index bf1c87ee..0b916666 100644 --- a/src/ui/components/mini-player/MiniPlayer.tsx +++ b/src/ui/components/mini-player/MiniPlayer.tsx @@ -26,7 +26,7 @@ import { saveMiniPlayerPosition, useMiniPlayerHoverAction } from "../../settings import { isLinux, isMacOS, isWindows } from "../../platform"; import { Marquee } from "@/components/motion/marquee"; import { TrackArtwork } from "../TrackArtwork"; -import { restoreMainWindow, useMiniPlayerBridge } from "./useMiniPlayerBridge"; +import { restoreMainWindow, showMiniPlayerCloseMenu, useMiniPlayerBridge } from "./useMiniPlayerBridge"; const win = getCurrentWindow(); @@ -965,8 +965,14 @@ export default function MiniPlayer() { type="button" onMouseDown={(event) => event.stopPropagation()} onClick={() => void handleClose()} + // Right-click on the capsule drags it, so the close options live on this button. + onContextMenu={(event) => { + event.preventDefault(); + event.stopPropagation(); + void showMiniPlayerCloseMenu(); + }} aria-label="Close mini player" - title="Close" + title="Close (right-click for more)" >