From 2eb64e051ba2ae05d9177fd29b18c771df7916e4 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 29 Nov 2021 15:56:50 +0400 Subject: [PATCH] Don't start animations from QEvent::Enter. The enter/leave events may be sent from ~QWidget() and if we start animating something with grabbing of widgets it crashes sometimes. --- .../media/player/media_player_widget.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/Telegram/SourceFiles/media/player/media_player_widget.cpp b/Telegram/SourceFiles/media/player/media_player_widget.cpp index a96159f429..5371b85098 100644 --- a/Telegram/SourceFiles/media/player/media_player_widget.cpp +++ b/Telegram/SourceFiles/media/player/media_player_widget.cpp @@ -68,6 +68,7 @@ private: const Fn _menuOverCallback; base::unique_qptr _menu; bool _temporarilyHidden = false; + bool _overButton = false; }; @@ -120,9 +121,17 @@ WithDropdownController::WithDropdownController( , _menuOverCallback(std::move(menuOverCallback)) { button->events( ) | rpl::filter([=](not_null e) { - return (e->type() == QEvent::Enter); - }) | rpl::start_with_next([=] { - showMenu(); + return (e->type() == QEvent::Enter) + || (e->type() == QEvent::Leave); + }) | rpl::start_with_next([=](not_null e) { + _overButton = (e->type() == QEvent::Enter); + if (_overButton) { + InvokeQueued(button, [=] { + if (_overButton) { + showMenu(); + } + }); + } }, button->lifetime()); } @@ -740,7 +749,9 @@ void Widget::markOver(bool over) { if (over) { _over = true; _wontBeOver = false; - updateControlsWrapVisibility(); + InvokeQueued(this, [=] { + updateControlsWrapVisibility(); + }); } else { _wontBeOver = true; InvokeQueued(this, [=] {