diff --git a/Source/DiabloUI/diabloui.cpp b/Source/DiabloUI/diabloui.cpp index 253c5c804..f0199bbcb 100644 --- a/Source/DiabloUI/diabloui.cpp +++ b/Source/DiabloUI/diabloui.cpp @@ -401,6 +401,10 @@ void UiHandleEvents(SDL_Event *event) gbActive = false; else if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) ReinitializeHardwareCursor(); + else if (event->window.event == SDL_WINDOWEVENT_FOCUS_LOST) + music_mute(); + else if (event->window.event == SDL_WINDOWEVENT_FOCUS_GAINED) + music_unmute(); } #endif } diff --git a/Source/diablo.cpp b/Source/diablo.cpp index df7eae051..237c04120 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -1739,10 +1739,41 @@ void diablo_pause_game() sound_stop(); track_repeat_walk(false); } + force_redraw = 255; } } +bool GameWasAlreadyPaused = false; +bool MinimizePaused = false; + +void diablo_focus_pause() +{ + if (gbIsMultiplayer) { + return; + } + + if (!MinimizePaused) { + GameWasAlreadyPaused = PauseMode != 0; + + if (!GameWasAlreadyPaused) { + PauseMode = 2; + sound_stop(); + track_repeat_walk(false); + } + + music_mute(); + } else { + if (!GameWasAlreadyPaused) { + PauseMode = 0; + } + + music_unmute(); + } + + MinimizePaused = !MinimizePaused; +} + bool PressEscKey() { bool rv = false; diff --git a/Source/diablo.h b/Source/diablo.h index 8d12a13c5..6b590003b 100644 --- a/Source/diablo.h +++ b/Source/diablo.h @@ -75,6 +75,7 @@ bool StartGame(bool bNewGame, bool bSinglePlayer); int DiabloMain(int argc, char **argv); bool TryIconCurs(); void diablo_pause_game(); +void diablo_focus_pause(); bool PressEscKey(); void DisableInputWndProc(uint32_t uMsg, int32_t wParam, int32_t lParam); void LoadGameLevel(bool firstflag, lvl_entry lvldir); diff --git a/Source/miniwin/misc_msg.cpp b/Source/miniwin/misc_msg.cpp index c115fc3fc..08b0820f1 100644 --- a/Source/miniwin/misc_msg.cpp +++ b/Source/miniwin/misc_msg.cpp @@ -549,8 +549,6 @@ bool FetchMessage(tagMSG *lpMsg) case SDL_WINDOWEVENT_MINIMIZED: case SDL_WINDOWEVENT_MAXIMIZED: case SDL_WINDOWEVENT_RESTORED: - case SDL_WINDOWEVENT_FOCUS_GAINED: - case SDL_WINDOWEVENT_FOCUS_LOST: #if SDL_VERSION_ATLEAST(2, 0, 5) case SDL_WINDOWEVENT_TAKE_FOCUS: #endif @@ -567,6 +565,14 @@ bool FetchMessage(tagMSG *lpMsg) case SDL_WINDOWEVENT_CLOSE: lpMsg->message = DVL_WM_QUERYENDSESSION; break; + + case SDL_WINDOWEVENT_FOCUS_LOST: + case SDL_WINDOWEVENT_FOCUS_GAINED: + if (gbRunGameResult) { + diablo_focus_pause(); + } + break; + default: return FalseAvail("SDL_WINDOWEVENT", e.window.event); } diff --git a/Source/sound.cpp b/Source/sound.cpp index 2303b245e..3fd3e5c02 100644 --- a/Source/sound.cpp +++ b/Source/sound.cpp @@ -306,4 +306,16 @@ int sound_get_or_set_sound_volume(int volume) return sgOptions.Audio.nSoundVolume; } +void music_mute() +{ + if (music) + music->setVolume(VolumeLogToLinear(VOLUME_MIN, VOLUME_MIN, VOLUME_MAX)); +} + +void music_unmute() +{ + if (music) + music->setVolume(VolumeLogToLinear(sgOptions.Audio.nMusicVolume, VOLUME_MIN, VOLUME_MAX)); +} + } // namespace devilution diff --git a/Source/sound.h b/Source/sound.h index 2f66e3251..edb6212a4 100644 --- a/Source/sound.h +++ b/Source/sound.h @@ -65,6 +65,8 @@ void music_start(uint8_t nTrack); void sound_disable_music(bool disable); int sound_get_or_set_music_volume(int volume); int sound_get_or_set_sound_volume(int volume); +void music_mute(); +void music_unmute(); /* data */