From 33f59dd3ecc7d6de195d5de7d50c1cde0c951abe Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 1 May 2017 11:29:02 +0300 Subject: [PATCH] Fix an infinite recursion in Emoji panel/section. HistoryWidget::resizeEvent() can start taking TabbedSelector from TabbedPanel which will call QWidget::render() which can call again HistoryWidget::resizeEvent() from sendPendingMoveAndResizeEvents(). Use a separate flag for _tabbedSection to prevent recursion there. --- Telegram/SourceFiles/historywidget.cpp | 12 ++++++++---- Telegram/SourceFiles/historywidget.h | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Telegram/SourceFiles/historywidget.cpp b/Telegram/SourceFiles/historywidget.cpp index 1b9ff4afbd..820bd6f209 100644 --- a/Telegram/SourceFiles/historywidget.cpp +++ b/Telegram/SourceFiles/historywidget.cpp @@ -3699,13 +3699,17 @@ void HistoryWidget::topBarClick() { void HistoryWidget::updateTabbedSelectorSectionShown() { auto tabbedSelectorSectionEnabled = AuthSession::Current().data().tabbedSelectorSectionEnabled(); - auto shown = tabbedSelectorSectionEnabled && (width() >= minimalWidthForTabbedSelectorSection()); - auto shownNow = (_tabbedSection != nullptr); - if (shown == shownNow) { + auto useTabbedSection = tabbedSelectorSectionEnabled && (width() >= minimalWidthForTabbedSelectorSection()); + if (_tabbedSectionUsed == useTabbedSection) { return; } + _tabbedSectionUsed = useTabbedSection; - if (shown) { + // Use a separate bool flag instead of just (_tabbedSection != nullptr), because + // _tabbedPanel->takeSelector() calls QWidget::render(), which calls + // sendPendingMoveAndResizeEvents() for all widgets in the window, which can lead + // to a new HistoryWidget::resizeEvent() call and an infinite recursion here. + if (_tabbedSectionUsed) { _tabbedSection.create(this, _controller, _tabbedPanel->takeSelector()); _tabbedSection->setCancelledCallback([this] { setInnerFocus(); }); _rightShadow.create(this, st::shadowFg); diff --git a/Telegram/SourceFiles/historywidget.h b/Telegram/SourceFiles/historywidget.h index 9f1dbbb37b..e8141307bd 100644 --- a/Telegram/SourceFiles/historywidget.h +++ b/Telegram/SourceFiles/historywidget.h @@ -790,6 +790,7 @@ private: object_ptr _tabbedPanel; object_ptr _tabbedSection = { nullptr }; QPointer _tabbedSelector; + bool _tabbedSectionUsed = false; DragState _attachDrag = DragStateNone; object_ptr _attachDragDocument, _attachDragPhoto;