winAudio_->SetMute(mute);
}
+bool MuteControl::IsMuted()
+{
+ return winAudio_->AllEndpointsMuted();
+}
+
bool MuteControl::ToggleMute()
{
// A partially muted setup counts as "not muted", so the first toggle
// normalizes every managed endpoint to muted.
- const bool mute = !winAudio_->AllEndpointsMuted();
+ const bool mute = !IsMuted();
SetMute(mute);
return mute;
}
}
}
- if (!CHECK_MENU_ITEM(MUTEONLOCK, muteCtrl_.GetMuteOnWorkstationLock()) ||
+ if (!CHECK_MENU_ITEM(MUTE, muteCtrl_.IsMuted()) ||
+ !CHECK_MENU_ITEM(MUTEONLOCK, muteCtrl_.GetMuteOnWorkstationLock()) ||
!CHECK_MENU_ITEM(RESTOREAUDIO, muteCtrl_.GetRestoreVolume()) ||
!CHECK_MENU_ITEM(MUTEONSUSPEND, muteCtrl_.GetMuteOnSuspend()) ||
!CHECK_MENU_ITEM(MUTEONSHUTDOWN, muteCtrl_.GetMuteOnShutdown()) ||
}
}
-void WinMute::ToggleMute()
+void WinMute::UpdateMuteMenuCheck(bool muted) noexcept
{
- const bool muted = muteCtrl_.ToggleMute();
CheckMenuItem(hTrayMenu_, ID_TRAYMENU_MUTE,
muted ? MF_CHECKED : MF_UNCHECKED);
}
+void WinMute::ToggleMute()
+{
+ UpdateMuteMenuCheck(muteCtrl_.ToggleMute());
+}
+
void WinMute::LoadMainMenuText()
{
std::map<UINT, std::wstring> menuText;
event == NIN_KEYSELECT)
{
const POINT p{GET_X_LPARAM(wParam), GET_Y_LPARAM(wParam)};
+ // Anything else can have changed the mute status in the meantime
+ // (a mute event, quiet hours, or the Windows volume mixer), so
+ // refresh the check right before the menu becomes visible.
+ // TPM_NONOTIFY suppresses WM_INITMENUPOPUP, hence doing it here.
+ UpdateMuteMenuCheck(muteCtrl_.IsMuted());
SetForegroundWindow(hWnd);
TrackPopupMenuEx(GetSubMenu(hTrayMenu_, 0),
TPM_NONOTIFY | TPM_TOPALIGN | TPM_LEFTALIGN, p.x, p.y,