From 0537c5f2739eaa0aef9492f426bb977e68afa47b Mon Sep 17 00:00:00 2001 From: John Preston Date: Sat, 8 Mar 2025 07:05:45 +0400 Subject: [PATCH] Fix crashes in empty repaint callbacks. --- .../view/media/history_view_sticker_player.cpp | 12 ++++++++++-- .../userpic/info_userpic_emoji_builder_preview.cpp | 2 +- .../SourceFiles/window/window_slide_animation.cpp | 8 ++++++-- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Telegram/SourceFiles/history/view/media/history_view_sticker_player.cpp b/Telegram/SourceFiles/history/view/media/history_view_sticker_player.cpp index 64f6a883b..da9587057 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_sticker_player.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_sticker_player.cpp @@ -21,6 +21,10 @@ LottiePlayer::LottiePlayer(std::unique_ptr lottie) } void LottiePlayer::setRepaintCallback(Fn callback) { + if (!callback) { + _repaintLifetime.destroy(); + return; + } _repaintLifetime = _lottie->updates( ) | rpl::start_with_next([=](Lottie::Update update) { v::match(update.data, [&](const Lottie::Information &) { @@ -82,7 +86,9 @@ void WebmPlayer::clipCallback(ClipNotification notification) { case ClipNotification::Repaint: break; } - _repaintCallback(); + if (const auto onstack = _repaintCallback) { + onstack(); + } } void WebmPlayer::setRepaintCallback(Fn callback) { @@ -133,7 +139,9 @@ StaticStickerPlayer::StaticStickerPlayer( } void StaticStickerPlayer::setRepaintCallback(Fn callback) { - callback(); + if (callback) { + callback(); + } } bool StaticStickerPlayer::ready() { diff --git a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_preview.cpp b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_preview.cpp index 280b5c1b6..572809145 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_preview.cpp +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_preview.cpp @@ -104,7 +104,7 @@ void PreviewPainter::setDocument( } if (_player) { _player->setRepaintCallback(updateCallback); - } else { + } else if (updateCallback) { updateCallback(); } }, _lifetime); diff --git a/Telegram/SourceFiles/window/window_slide_animation.cpp b/Telegram/SourceFiles/window/window_slide_animation.cpp index 54a843559..fced2ba81 100644 --- a/Telegram/SourceFiles/window/window_slide_animation.cpp +++ b/Telegram/SourceFiles/window/window_slide_animation.cpp @@ -194,11 +194,15 @@ void SlideAnimation::start() { fromLeft ? 0. : 1., st::slideDuration, transition()); - _repaintCallback(); + if (const auto onstack = _repaintCallback) { + onstack(); + } } void SlideAnimation::animationCallback() { - _repaintCallback(); + if (const auto onstack = _repaintCallback) { + onstack(); + } if (!_animation.animating()) { if (const auto onstack = _finishedCallback) { onstack();