From 6738051da17438397c35755eb1643d56e9c01b05 Mon Sep 17 00:00:00 2001 From: Gregor Lohaus Date: Mon, 1 Jun 2026 02:58:20 +0200 Subject: [PATCH] fix null pointer access --- .../com/gregor/jprototerm/GhosttyTerminalRenderer.java | 8 +++++--- .../java/com/gregor/jprototerm/KittyImageOverlay.java | 6 +++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gregor/jprototerm/GhosttyTerminalRenderer.java b/src/main/java/com/gregor/jprototerm/GhosttyTerminalRenderer.java index a9bf76f..cfaddcb 100644 --- a/src/main/java/com/gregor/jprototerm/GhosttyTerminalRenderer.java +++ b/src/main/java/com/gregor/jprototerm/GhosttyTerminalRenderer.java @@ -34,9 +34,11 @@ import java.util.List; import java.util.Map; /** - * The real terminal renderer: paints a pane's background, cell rows, cursor, border, padding - * and (when enabled) kitty graphics. One instance per pane, since it caches that pane's - * decoded kitty images. + * The real terminal renderer: rasterizes a pane's background, cell rows, cursor, border and + * padding into the {@link SoftwareBackbuffer} and blits it to the canvas. Kitty images are not + * drawn here — each paint collects their placements (see {@link #kittyImages()}) for the + * compositor to render as overlay nodes above the canvas. One instance per pane, since it caches + * that pane's decoded kitty images. */ final class GhosttyTerminalRenderer extends TerminalRenderer { // GhosttyRenderStateDirty values (stable C ABI; see ghostty/vt/render.h). diff --git a/src/main/java/com/gregor/jprototerm/KittyImageOverlay.java b/src/main/java/com/gregor/jprototerm/KittyImageOverlay.java index e1a7200..a5e1160 100644 --- a/src/main/java/com/gregor/jprototerm/KittyImageOverlay.java +++ b/src/main/java/com/gregor/jprototerm/KittyImageOverlay.java @@ -58,9 +58,13 @@ final class KittyImageOverlay { for (TerminalPane pane : panes) { updatePane(pane); } + // Only panes that actually have images get a group; order those to match pane z-order. List ordered = new ArrayList<>(panes.size()); for (TerminalPane pane : panes) { - ordered.add(overlays.get(pane).group); + PaneOverlay overlay = overlays.get(pane); + if (overlay != null) { + ordered.add(overlay.group); + } } if (!root.getChildren().equals(ordered)) { root.getChildren().setAll(ordered);