From fd759d90484378c5f030a89c70bd04f61743c2d3 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 30 Jun 2026 16:40:44 +0400 Subject: [PATCH] Fix rich message re-layout. Fixes #30906. --- Telegram/SourceFiles/history/view/history_view_element.h | 2 +- Telegram/SourceFiles/history/view/history_view_message.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/history/view/history_view_element.h b/Telegram/SourceFiles/history/view/history_view_element.h index ecfa07ba02..83d882860c 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.h +++ b/Telegram/SourceFiles/history/view/history_view_element.h @@ -764,6 +764,7 @@ protected: [[nodiscard]] int textHeightFor(int textWidth) const; [[nodiscard]] int textRealWidth() const { return _textRealWidth; } void validateText(); + void invalidateTextSizeCache(); void validateTextSkipBlock(bool has, int width, int height); void validateInlineKeyboard(HistoryMessageReplyMarkup *markup); @@ -802,7 +803,6 @@ private: } void refreshMedia(Element *replacing); - void invalidateTextSizeCache(); void setTextWithLinks( const TextWithEntities &text, const std::vector &links = {}); diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index 400c55f00f..fd7f9f3e67 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -586,6 +586,12 @@ void Message::requestRichPageRelayout(QRect articleRect) { if (const auto rich = const_cast(this)->richpage()) { rich->article.invalidateLayout(); } + // The article layout was just invalidated, but textHeightFor() caches by + // _textWidth and would short-circuit when re-queried at the same (constant) + // max width, leaving the bubble sized from a stale, now-zeroed + // lastLayoutWidth(). Drop the text-size cache too so the article is really + // laid out again, the same way blockquoteExpandChanged() does for quotes. + invalidateTextSizeCache(); setPendingResize(); history()->owner().requestViewResize(this); }