From 1f94923ab4ea033e28ecbb48a6d712ecb937755f Mon Sep 17 00:00:00 2001 From: Mark Rapson Date: Tue, 11 Aug 2026 00:11:08 +0100 Subject: [PATCH] Fail if render screen never activates --- .../renameable/RenderCatalogClient.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/build/client-renderer/src/client/java/dev/github/copilot/renameable/RenderCatalogClient.java b/build/client-renderer/src/client/java/dev/github/copilot/renameable/RenderCatalogClient.java index f5e9017..c4ae364 100644 --- a/build/client-renderer/src/client/java/dev/github/copilot/renameable/RenderCatalogClient.java +++ b/build/client-renderer/src/client/java/dev/github/copilot/renameable/RenderCatalogClient.java @@ -28,6 +28,7 @@ import net.minecraft.world.item.ItemStack; public final class RenderCatalogClient implements ClientModInitializer { private static final Gson GSON = new Gson(); + private static final long SCREEN_ACTIVATION_TIMEOUT_MILLIS = 30_000L; private static final long CAPTURE_TIMEOUT_MILLIS = 120_000L; private final List jobs = new ArrayList<>(); @@ -62,6 +63,22 @@ public final class RenderCatalogClient implements ClientModInitializer { System.out.println("[renderer] opening render screen"); client.setScreenAndShow(renderScreen); }); + + Thread activationWatchdog = new Thread(() -> { + try { + Thread.sleep(SCREEN_ACTIVATION_TIMEOUT_MILLIS); + } catch (InterruptedException exception) { + Thread.currentThread().interrupt(); + return; + } + + if (!renderScreen.activated) { + System.err.println("[renderer] render screen never activated within " + SCREEN_ACTIVATION_TIMEOUT_MILLIS + "ms"); + Runtime.getRuntime().halt(1); + } + }, "renderer-activation-watchdog"); + activationWatchdog.setDaemon(true); + activationWatchdog.start(); } private void loadJobs(Path manifestPath) throws IOException { @@ -222,7 +239,7 @@ public final class RenderCatalogClient implements ClientModInitializer { private final class RenderScreen extends Screen { private boolean captureQueued; private long captureQueuedAtMillis; - private boolean activated; + private volatile boolean activated; private RenderScreen() { super(Component.literal("Rendering renameable items"));