From 4075d42e01bd66202dca3e18c9a287d00e98dc41 Mon Sep 17 00:00:00 2001 From: downbtn Date: Sat, 5 Sep 2026 22:52:40 -0400 Subject: [PATCH] Fix recursive update when opening bridge image previews --- src/tel/eden/mod/chat/ImagePreviewManager.java | 15 +++++++++++---- src/tel/eden/mod/mixin/GuiGraphicsMixin.java | 11 +++++++++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/tel/eden/mod/chat/ImagePreviewManager.java b/src/tel/eden/mod/chat/ImagePreviewManager.java index cf2b98a..d0edba8 100644 --- a/src/tel/eden/mod/chat/ImagePreviewManager.java +++ b/src/tel/eden/mod/chat/ImagePreviewManager.java @@ -148,10 +148,17 @@ private static int[] renderSize(String url) { } public static void renderPreview(GuiGraphics guiGraphics, String url, int x, int y) { - PreviewState state = states.computeIfAbsent(url, k -> { - downloadImage(url); - return PreviewState.DOWNLOADING; - }); + PreviewState state = states.get(url); + if (state == null) { + PreviewState initial = isPreviewable(url) ? PreviewState.DOWNLOADING : PreviewState.ERROR; + PreviewState previous = states.putIfAbsent(url, initial); + state = previous != null ? previous : initial; + if (previous == null && initial == PreviewState.DOWNLOADING) { + downloadImage(url); + // downloadImage may fail synchronously during its defensive validation. + state = states.getOrDefault(url, PreviewState.DOWNLOADING); + } + } if (state == PreviewState.DOWNLOADING && pendingImages.containsKey(url)) { Frames frames = pendingImages.remove(url); diff --git a/src/tel/eden/mod/mixin/GuiGraphicsMixin.java b/src/tel/eden/mod/mixin/GuiGraphicsMixin.java index 2a27be7..603cadf 100644 --- a/src/tel/eden/mod/mixin/GuiGraphicsMixin.java +++ b/src/tel/eden/mod/mixin/GuiGraphicsMixin.java @@ -3,6 +3,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.Style; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -18,8 +19,14 @@ private void onRenderComponentHoverEffect(Font font, Style style, int mouseX, in if (style != null && style.getHoverEvent() instanceof net.minecraft.network.chat.HoverEvent.ShowText st) { String hoverStr = st.value().getString(); int idx = hoverStr.indexOf(ImagePreviewManager.HOVER_MARKER); - if (idx != -1) { - String url = hoverStr.substring(idx + ImagePreviewManager.HOVER_MARKER.length()); + if (idx != -1 && style.getClickEvent() instanceof ClickEvent.OpenUrl openUrl) { + // Other chat mods may append click hints to the visible hover text. Read + // the canonical target from the click event instead of treating everything + // after HOVER_MARKER as part of the URL. + String url = openUrl.uri().toString(); + if (!ImagePreviewManager.isPreviewable(url)) { + return; + } GuiGraphics guiGraphics = (GuiGraphics) (Object) this; Minecraft mc = Minecraft.getInstance(); int screenWidth = mc.getWindow().getGuiScaledWidth();