Skip to content

Commit d2f38c2

Browse files
authored
fix: stackoverflow on image fallback chain (#1028)
1 parent a572eb1 commit d2f38c2

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

vicinae/src/ui/image/image.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,9 @@ void ImageWidget::setObjectFit(ObjectFit fit) {
9494
update();
9595
}
9696

97-
void ImageWidget::setUrl(const ImageURL &url) {
97+
void ImageWidget::setUrl(ImageURL url) {
9898
if (url == m_source) { return; }
99+
m_isFallback = false;
99100
m_source = url;
100101
setUrlImpl(url);
101102
}
@@ -115,7 +116,7 @@ const ImageURL &ImageWidget::url() const { return m_source; }
115116

116117
void ImageWidget::refreshTheme(const ThemeFile &theme) { setUrlImpl(m_source); }
117118

118-
void ImageWidget::setUrlImpl(const ImageURL &url) {
119+
void ImageWidget::setUrlImpl(ImageURL url) {
119120
auto &theme = ThemeService::instance().theme();
120121
auto type = url.type();
121122

@@ -174,7 +175,7 @@ void ImageWidget::setUrlImpl(const ImageURL &url) {
174175
m_loader.reset(new EmojiImageLoader(url.name()));
175176
}
176177

177-
if (!m_loader) { return handleLoadingError("No loader"); }
178+
if (!m_loader) { handleLoadingError("No loader"); }
178179

179180
if (m_loader) {
180181
connect(m_loader.get(), &AbstractImageLoader::dataUpdated, this,
@@ -192,8 +193,15 @@ QSize ImageWidget::sizeHint() const {
192193
}
193194

194195
void ImageWidget::handleLoadingError(const QString &reason) {
195-
if (auto fallback = m_source.fallback()) { return setUrlImpl(*fallback); }
196-
return setUrlImpl(ImageURL::builtin("question-mark-circle"));
196+
if (!m_isFallback) {
197+
if (auto fallback = m_source.fallback()) {
198+
m_isFallback = true;
199+
setUrlImpl(*fallback);
200+
return;
201+
}
202+
}
203+
204+
setUrlImpl(ImageURL::builtin("question-mark-circle"));
197205
}
198206

199207
void ImageWidget::resizeEvent(QResizeEvent *event) {

vicinae/src/ui/image/image.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class ImageWidget : public QWidget {
5353
void setAlignment(Qt::Alignment alignment);
5454
void setObjectFit(ObjectFit fit);
5555
const ImageURL &url() const;
56-
void setUrl(const ImageURL &url);
56+
void setUrl(ImageURL url);
5757
void setData(const QPixmap &pixmap);
5858
ImageWidget(QWidget *parent = nullptr);
5959
~ImageWidget();
@@ -65,18 +65,18 @@ class ImageWidget : public QWidget {
6565
void showEvent(QShowEvent *event) override;
6666
void handleDataUpdated(const QPixmap &data, bool cachable);
6767
QSize sizeHint() const override;
68-
void setUrlImpl(const ImageURL &url);
68+
void setUrlImpl(ImageURL url);
6969
void refreshTheme(const ThemeFile &theme);
7070
QString sizedCacheKey(const QString &key, const QSize &size) const;
7171

7272
QObjectUniquePtr<AbstractImageLoader> m_loader;
7373
QPixmap m_data;
7474
ImageURL m_source;
75-
QString m_fallback;
7675
int m_renderCount = 0;
7776
uint8_t m_token = 0;
7877
ObjectFit m_fit = ObjectFit::Contain;
7978
QFlags<Qt::AlignmentFlag> m_alignment = Qt::AlignCenter;
8079
std::optional<ColorLike> m_backgroundColor;
8180
int m_borderRadius = 4;
81+
bool m_isFallback = false;
8282
};

0 commit comments

Comments
 (0)