Skip to content

Volume Flyout feature#387

Merged
unchihugo merged 21 commits intomasterfrom
feat/volume-mixer
Apr 25, 2026
Merged

Volume Flyout feature#387
unchihugo merged 21 commits intomasterfrom
feat/volume-mixer

Conversation

@unchihugo
Copy link
Copy Markdown
Owner

@unchihugo unchihugo commented Feb 13, 2026

WIP volume control/mixer flyout, closes #26
"A standalone volume control flyout that expands into a volume mixer, replacing the default Windows volume flyout."

Other updates:

  • turning on volume flyout fully hides the native W11 volume flyout (code partially derived from gpkgpk/HideVolumeOSD), unhides when turned back off or program closes
  • updated how media players icons are cached, improving repeated media player data retrieval performance significantly
  • added WindowHelper.IsMouseOverWindow for better mouseOver detection for volume flyout because WPF native implementation was spotty (ignores empty space, idle mouse) and replaced media flyout to use this as well - implement to all flyouts later
  • Updated MainWindow.OpenAnimation to be able to place flyouts above each other & CloseAnimation to not necessarily need additional params anymore

Expanded flyout screenshots
image
Collapsed flyout
image

@github-actions github-actions Bot added MainWindow / Media Flyout Changes to MainWindow including the Media Flyout SettingsWindow Changes to SettingsWindow or settings pages not related to flyouts/widgets Next Up Flyout Changes to NextUpWindow.xaml or NextUpWindow.xaml.cs labels Feb 13, 2026
@github-actions github-actions Bot added Lock Keys Flyout Changes to LockWindow.xaml or LockWindow.xaml.cs Volume Flyout Changes to the Volume Flyout or Volume Mixer Taskbar Widget Changes to the Taskbar Media Widget labels Feb 26, 2026
@unchihugo unchihugo removed Next Up Flyout Changes to NextUpWindow.xaml or NextUpWindow.xaml.cs Taskbar Widget Changes to the Taskbar Media Widget labels Feb 26, 2026
@unchihugo unchihugo marked this pull request as ready for review April 21, 2026 14:46
@unchihugo unchihugo requested a review from Copilot April 21, 2026 14:55
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Implements a new Volume Flyout / Volume Mixer UI intended to replace the native Windows volume OSD, plus supporting settings, animations, and caching improvements.

Changes:

  • Added a new VolumeMixerWindow (WPF flyout) with a master volume slider and expandable per-app session mixer.
  • Integrated volume flyout triggering into the global keyboard hook and updated open/close animation plumbing to support stacking flyouts.
  • Expanded settings + localization strings and updated media player icon caching utilities.

Reviewed changes

Copilot reviewed 24 out of 25 changed files in this pull request and generated 11 comments.

Show a summary per file
File Description
FluentFlyoutWPF/Windows/VolumeMixerWindow.xaml.cs Implements volume flyout show/hide behavior, OSD hide/restore, and expand/collapse animations.
FluentFlyoutWPF/Windows/VolumeMixerWindow.xaml Defines the volume flyout UI (master volume + expandable session list).
FluentFlyoutWPF/Windows/LockWindow.xaml.cs Updates calls to OpenAnimation/CloseAnimation after signature changes.
FluentFlyoutWPF/ViewModels/VolumeMixerViewModel.cs Adds view model for master volume + enumerating per-app audio sessions.
FluentFlyoutWPF/ViewModels/UserSettings.cs Adds settings for volume flyout/mixer and premium-gated highlight option.
FluentFlyoutWPF/SettingsWindow.xaml Adds navigation entry for the new Volume Flyout settings page and adjusts ordering.
FluentFlyoutWPF/Resources/Localization/Dictionary-en-US.xaml Adds English strings for Volume Flyout/Mixer UI and premium perk text.
FluentFlyoutWPF/Pages/VolumeMixerPage.xaml.cs Adds settings page code-behind and premium unlock handler.
FluentFlyoutWPF/Pages/VolumeMixerPage.xaml Adds Volume Flyout/Mixer settings UI (toggles + duration).
FluentFlyoutWPF/Pages/HomePage.xaml.cs Adds navigation handler to Volume Flyout page.
FluentFlyoutWPF/Pages/HomePage.xaml Adds Volume Flyout card to the home dashboard and reflows grid layout.
FluentFlyoutWPF/Models/AudioSessionModel.cs Introduces model for a single audio session (volume/mute/state/icon).
FluentFlyoutWPF/MainWindow.xaml.cs Hooks volume flyout into keyboard events, syncs mouse-over across flyouts, updates media icon caching call, and updates animation helpers.
FluentFlyoutWPF/FluentFlyout.csproj Adds the volume flyout demo image as content.
FluentFlyoutWPF/Classes/WindowHelper.cs Adds IsMouseOverWindow Win32-based hit testing helper.
FluentFlyoutWPF/Classes/WindowBlurHelper.cs Adds acrylic blur settings mapping for VolumeMixerWindow.
FluentFlyoutWPF/Classes/Utils/VolumeToSpeakerSymbolConverter.cs Adds converter to choose speaker icon based on volume.
FluentFlyoutWPF/Classes/Utils/NullToVisibilityConverter.cs Adds converter to toggle visibility based on null values (icons).
FluentFlyoutWPF/Classes/Utils/MediaPlayerData.cs Refactors caching and adds PID-based icon caching for better performance.
FluentFlyoutWPF/Classes/Utils/DecimalPercentageToFullConverter.cs Adds converter to display volume scalar as percentage.
FluentFlyoutWPF/Classes/Utils/BoolToAccentBrushConverter.cs Adds converter to highlight active sessions using accent brush (premium setting).
FluentFlyoutWPF/Classes/NativeMethods.cs Adds Win32 constants and ShowWindow P/Invoke for hiding/restoring native OSD.
FluentFlyoutWPF/Classes/AudioDeviceMonitor.cs Modifies audio device monitoring implementation (currently removes notifications wiring).
FluentFlyoutWPF/App.xaml Adds a new app-wide converter resource for opacity behavior.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread FluentFlyoutWPF/MainWindow.xaml.cs Outdated
Comment thread FluentFlyoutWPF/MainWindow.xaml.cs
Comment thread FluentFlyoutWPF/MainWindow.xaml.cs Outdated
Comment thread FluentFlyoutWPF/Pages/VolumeMixerPage.xaml.cs Outdated
Comment on lines +68 to +72
public void SyncFromDevice()
{
var vol = _sessionControl.SimpleAudioVolume.Volume;
var mute = _sessionControl.SimpleAudioVolume.Mute;

Copy link

Copilot AI Apr 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SyncFromDevice() doesn't update the session State, so IsActive (and the active-app highlight) becomes stale after initial enumeration. Consider syncing _sessionControl.State into the State property here, and ensure IsActive raises change notifications when State changes.

Copilot uses AI. Check for mistakes.
Comment thread FluentFlyoutWPF/Pages/VolumeMixerPage.xaml Outdated
Comment thread FluentFlyoutWPF/Windows/VolumeMixerWindow.xaml.cs
Comment thread FluentFlyoutWPF/Pages/VolumeMixerPage.xaml.cs
Comment thread FluentFlyoutWPF/Classes/AudioDeviceMonitor.cs
Comment thread FluentFlyoutWPF/Classes/AudioDeviceMonitor.cs
@unchihugo unchihugo merged commit 8e9cf7e into master Apr 25, 2026
4 checks passed
@unchihugo unchihugo deleted the feat/volume-mixer branch April 25, 2026 14:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Lock Keys Flyout Changes to LockWindow.xaml or LockWindow.xaml.cs MainWindow / Media Flyout Changes to MainWindow including the Media Flyout SettingsWindow Changes to SettingsWindow or settings pages not related to flyouts/widgets Volume Flyout Changes to the Volume Flyout or Volume Mixer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE REQUEST] Volume Slider

2 participants