diff --git a/Telegram/SourceFiles/core/application.cpp b/Telegram/SourceFiles/core/application.cpp index 2f45bbf5ab..f0d34537b3 100644 --- a/Telegram/SourceFiles/core/application.cpp +++ b/Telegram/SourceFiles/core/application.cpp @@ -65,6 +65,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "media/player/media_player_instance.h" #include "media/player/media_player_float.h" #include "media/clip/media_clip_reader.h" // For Media::Clip::Finish(). +#include "media/system_media_controls_manager.h" #include "window/notifications_manager.h" #include "window/themes/window_theme.h" #include "window/window_lock_widgets.h" @@ -147,6 +148,9 @@ Application::Application(not_null launcher) , _audio(std::make_unique()) , _fallbackProductionConfig( std::make_unique(MTP::Environment::Production)) +, _mediaControlsManager(MediaControlsManager::Supported() + ? std::make_unique() + : nullptr) , _downloadManager(std::make_unique()) , _domain(std::make_unique(cDataFile())) , _exportManager(std::make_unique()) @@ -484,27 +488,33 @@ void Application::startTray() { _tray->showFromTrayRequests( ) | rpl::start_with_next([=] { - const auto last = _lastActiveWindow; - const auto primary = _lastActivePrimaryWindow; - enumerateWindows([&](WindowRaw w) { - if (w != last && w != primary) { - w->widget()->showFromTray(); - } - }); - if (primary) { - primary->widget()->showFromTray(); - } - if (last && last != primary) { - last->widget()->showFromTray(); - } + activate(); }, _lifetime); _tray->hideToTrayRequests( ) | rpl::start_with_next([=] { - enumerateWindows([&](WindowRaw w) { w->widget()->minimizeToTray(); }); + enumerateWindows([&](WindowRaw w) { + w->widget()->minimizeToTray(); + }); }, _lifetime); } +void Application::activate() { + const auto last = _lastActiveWindow; + const auto primary = _lastActivePrimaryWindow; + enumerateWindows([&](not_null w) { + if (w != last && w != primary) { + w->widget()->showFromTray(); + } + }); + if (primary) { + primary->widget()->showFromTray(); + } + if (last && last != primary) { + last->widget()->showFromTray(); + } +} + auto Application::prepareEmojiSourceImages() -> std::shared_ptr { const auto &images = Ui::Emoji::SourceImages(); diff --git a/Telegram/SourceFiles/core/application.h b/Telegram/SourceFiles/core/application.h index 5898386b2b..9ee19e0d92 100644 --- a/Telegram/SourceFiles/core/application.h +++ b/Telegram/SourceFiles/core/application.h @@ -71,6 +71,7 @@ namespace Player { class FloatController; class FloatDelegate; } // namespace Player +class SystemMediaControlsManager; } // namespace Media namespace Lang { @@ -180,6 +181,7 @@ public: void checkSystemDarkMode(); [[nodiscard]] bool isActiveForTrayMenu() const; void closeChatFromWindows(not_null peer); + void activate(); // Media view interface. bool hideMediaView(); @@ -384,6 +386,8 @@ private: // Mutable because is created in run() after OpenSSL is inited. std::unique_ptr _notifications; + using MediaControlsManager = Media::SystemMediaControlsManager; + const std::unique_ptr _mediaControlsManager; const std::unique_ptr _downloadManager; const std::unique_ptr _domain; const std::unique_ptr _exportManager; diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 40b1dbef8b..2b9124ae67 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -287,6 +287,11 @@ MainWidget::MainWidget( _exportTopBar->finishAnimating(); } + Media::Player::instance()->closePlayerRequests( + ) | rpl::start_with_next([=] { + closeBothPlayers(); + }, lifetime()); + Media::Player::instance()->updatedNotifier( ) | rpl::start_with_next([=](const Media::Player::TrackState &state) { handleAudioUpdate(state); @@ -357,14 +362,16 @@ MainWidget::MainWidget( Media::Player::instance()->tracksFinished( ) | rpl::start_with_next([=](AudioMsgId::Type type) { if (type == AudioMsgId::Type::Voice) { - const auto songState = Media::Player::instance()->getState(AudioMsgId::Type::Song); + const auto songState = Media::Player::instance()->getState( + AudioMsgId::Type::Song); if (!songState.id || IsStoppedOrStopping(songState.state)) { - closeBothPlayers(); + Media::Player::instance()->stopAndClose(); } } else if (type == AudioMsgId::Type::Song) { - const auto songState = Media::Player::instance()->getState(AudioMsgId::Type::Song); + const auto songState = Media::Player::instance()->getState( + AudioMsgId::Type::Song); if (!songState.id) { - closeBothPlayers(); + Media::Player::instance()->stopAndClose(); } } }, lifetime()); @@ -767,7 +774,7 @@ void MainWidget::handleAudioUpdate(const Media::Player::TrackState &state) { if (!Media::Player::IsStoppedOrStopping(state.state)) { createPlayer(); } else if (state.state == State::StoppedAtStart) { - closeBothPlayers(); + Media::Player::instance()->stopAndClose(); } if (const auto item = session().data().message(state.id.contextId())) { @@ -788,12 +795,7 @@ void MainWidget::closeBothPlayers() { if (_player) { _player->hide(anim::type::normal); } - _playerPlaylist->hideIgnoringEnterEvents(); - Media::Player::instance()->stop(AudioMsgId::Type::Voice); - Media::Player::instance()->stop(AudioMsgId::Type::Song); - - Shortcuts::ToggleMediaShortcuts(false); } void MainWidget::stopAndClosePlayer() { @@ -814,7 +816,9 @@ void MainWidget::createPlayer() { ) | rpl::start_with_next( [this] { playerHeightUpdated(); }, _player->lifetime()); - _player->entity()->setCloseCallback([=] { closeBothPlayers(); }); + _player->entity()->setCloseCallback([=] { + Media::Player::instance()->stopAndClose(); + }); _player->entity()->setShowItemCallback([=]( not_null item) { _controller->showMessage(item); diff --git a/Telegram/SourceFiles/mainwidget.h b/Telegram/SourceFiles/mainwidget.h index a38172a697..69d85d8d8a 100644 --- a/Telegram/SourceFiles/mainwidget.h +++ b/Telegram/SourceFiles/mainwidget.h @@ -233,7 +233,6 @@ public: using FloatDelegate::floatPlayerAreaUpdated; - void closeBothPlayers(); void stopAndClosePlayer(); bool preventsCloseSection(Fn callback) const; @@ -302,6 +301,8 @@ private: void hiderLayer(base::unique_qptr h); void clearHider(not_null instance); + void closeBothPlayers(); + [[nodiscard]] auto floatPlayerDelegate() -> not_null; not_null floatPlayerWidget() override; diff --git a/Telegram/SourceFiles/mainwindow.cpp b/Telegram/SourceFiles/mainwindow.cpp index f5ef973f84..11c2459b28 100644 --- a/Telegram/SourceFiles/mainwindow.cpp +++ b/Telegram/SourceFiles/mainwindow.cpp @@ -31,7 +31,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_account.h" // Account::sessionValue. #include "main/main_domain.h" #include "mainwidget.h" -#include "media/system_media_controls_manager.h" #include "ui/boxes/confirm_box.h" #include "boxes/connection_box.h" #include "storage/storage_account.h" @@ -126,11 +125,6 @@ void MainWindow::initHook() { this, [=] { checkActivation(); }, Qt::QueuedConnection); - - if (Media::SystemMediaControlsManager::Supported()) { - using MediaManager = Media::SystemMediaControlsManager; - _mediaControlsManager = std::make_unique(&controller()); - } } void MainWindow::applyInitialWorkMode() { diff --git a/Telegram/SourceFiles/mainwindow.h b/Telegram/SourceFiles/mainwindow.h index ea65329c6f..4ddefd57f6 100644 --- a/Telegram/SourceFiles/mainwindow.h +++ b/Telegram/SourceFiles/mainwindow.h @@ -19,10 +19,6 @@ class Widget; enum class EnterPoint : uchar; } // namespace Intro -namespace Media { -class SystemMediaControlsManager; -} // namespace Media - namespace Window { class MediaPreviewWidget; class SectionMemento; @@ -136,8 +132,6 @@ private: void themeUpdated(const Window::Theme::BackgroundUpdate &data); - std::unique_ptr _mediaControlsManager; - QPoint _lastMousePosition; object_ptr _passcodeLock = { nullptr }; diff --git a/Telegram/SourceFiles/media/player/media_player_instance.cpp b/Telegram/SourceFiles/media/player/media_player_instance.cpp index 3313d28c22..eff518de77 100644 --- a/Telegram/SourceFiles/media/player/media_player_instance.cpp +++ b/Telegram/SourceFiles/media/player/media_player_instance.cpp @@ -1280,6 +1280,15 @@ bool Instance::pauseGifByRoundVideo() const { return _roundPlaying; } +void Instance::stopAndClose() { + _closePlayerRequests.fire({}); + + stop(AudioMsgId::Type::Voice); + stop(AudioMsgId::Type::Song); + + Shortcuts::ToggleMediaShortcuts(false); +} + void Instance::handleStreamingUpdate( not_null data, Streaming::Update &&update) { diff --git a/Telegram/SourceFiles/media/player/media_player_instance.h b/Telegram/SourceFiles/media/player/media_player_instance.h index e8b9f847cd..6e74b162cb 100644 --- a/Telegram/SourceFiles/media/player/media_player_instance.h +++ b/Telegram/SourceFiles/media/player/media_player_instance.h @@ -168,6 +168,11 @@ public: [[nodiscard]] bool pauseGifByRoundVideo() const; + [[nodiscard]] rpl::producer<> closePlayerRequests() const { + return _closePlayerRequests.events(); + } + void stopAndClose(); + private: using SharedMediaType = Storage::SharedMediaType; using SliceKey = SparseIdsMergedSlice::Key; @@ -312,6 +317,7 @@ private: rpl::event_stream _playerStartedPlay; rpl::event_stream _updatedNotifier; rpl::event_stream _seekingChanges; + rpl::event_stream<> _closePlayerRequests; rpl::lifetime _lifetime; }; diff --git a/Telegram/SourceFiles/media/system_media_controls_manager.cpp b/Telegram/SourceFiles/media/system_media_controls_manager.cpp index b4e45348a7..a09ad828fd 100644 --- a/Telegram/SourceFiles/media/system_media_controls_manager.cpp +++ b/Telegram/SourceFiles/media/system_media_controls_manager.cpp @@ -14,14 +14,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_document.h" #include "data/data_document_media.h" #include "data/data_file_origin.h" -#include "mainwidget.h" #include "main/main_account.h" #include "main/main_session.h" #include "media/audio/media_audio.h" #include "media/streaming/media_streaming_instance.h" #include "media/streaming/media_streaming_player.h" #include "ui/text/format_song_document_name.h" -#include "window/window_controller.h" #include @@ -45,8 +43,7 @@ bool SystemMediaControlsManager::Supported() { return base::Platform::SystemMediaControls::Supported(); } -SystemMediaControlsManager::SystemMediaControlsManager( - not_null controller) +SystemMediaControlsManager::SystemMediaControlsManager() : _controls(std::make_unique()) { using PlaybackStatus = @@ -58,7 +55,7 @@ SystemMediaControlsManager::SystemMediaControlsManager( _controls->setServiceName(u"tdesktop"_q); } _controls->setApplicationName(AppName.utf16()); - const auto inited = _controls->init(controller->widget()); + const auto inited = _controls->init(); if (!inited) { LOG(("SystemMediaControlsManager failed to init.")); return; @@ -227,7 +224,7 @@ SystemMediaControlsManager::SystemMediaControlsManager( case Command::Next: mediaPlayer->next(type); break; case Command::Previous: mediaPlayer->previous(type); break; case Command::Stop: mediaPlayer->stop(type); break; - case Command::Raise: controller->widget()->showFromTray(); break; + case Command::Raise: Core::App().activate(); break; case Command::LoopNone: { Core::App().settings().setPlayerRepeatMode(RepeatMode::None); Core::App().saveSettingsDelayed(); @@ -252,9 +249,7 @@ SystemMediaControlsManager::SystemMediaControlsManager( break; } case Command::Quit: { - if (const auto main = controller->widget()->sessionContent()) { - main->closeBothPlayers(); - } + Media::Player::instance()->stopAndClose(); break; } } diff --git a/Telegram/SourceFiles/media/system_media_controls_manager.h b/Telegram/SourceFiles/media/system_media_controls_manager.h index 5638edf33b..7b56d21a95 100644 --- a/Telegram/SourceFiles/media/system_media_controls_manager.h +++ b/Telegram/SourceFiles/media/system_media_controls_manager.h @@ -30,7 +30,7 @@ namespace Media { class SystemMediaControlsManager { public: - SystemMediaControlsManager(not_null controller); + SystemMediaControlsManager(); ~SystemMediaControlsManager(); static bool Supported(); diff --git a/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_manager.mm b/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_manager.mm index 3aa560faa5..f6b8da35a7 100644 --- a/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_manager.mm +++ b/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_manager.mm @@ -15,7 +15,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/stickers/data_stickers.h" // Stickers::setsRef() #include "main/main_domain.h" #include "main/main_session.h" -#include "mainwidget.h" // MainWidget::closeBothPlayers #include "media/audio/media_audio_capture.h" #include "media/player/media_player_instance.h" #include "platform/mac/touchbar/mac_touchbar_audio.h" @@ -171,9 +170,7 @@ const auto kAudioItemIdentifier = @"touchbarAudio"; autorelease]; item.groupTouchBar = touchBar; [touchBar closeRequests] | rpl::start_with_next([=] { - if (const auto session = _controller->sessionController()) { - session->content()->closeBothPlayers(); - } + Media::Player::instance()->stopAndClose(); }, [item lifetime]); return [item autorelease]; } diff --git a/Telegram/lib_base b/Telegram/lib_base index a21505416a..17cac57d9e 160000 --- a/Telegram/lib_base +++ b/Telegram/lib_base @@ -1 +1 @@ -Subproject commit a21505416a8e64368925e02f13de2d97f7b476b3 +Subproject commit 17cac57d9ed5bf8250861a4d11ddf2b4e4e5d641