From 5bbba354ab3cd26a595cb864b29430bc312aa726 Mon Sep 17 00:00:00 2001 From: Gregor Lohaus Date: Fri, 29 May 2026 19:40:30 +0200 Subject: [PATCH] finalize --- .../java/dev/jlibghostty/RenderState.java | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/java/dev/jlibghostty/RenderState.java b/src/main/java/dev/jlibghostty/RenderState.java index 1429d22..b577b66 100644 --- a/src/main/java/dev/jlibghostty/RenderState.java +++ b/src/main/java/dev/jlibghostty/RenderState.java @@ -22,24 +22,32 @@ public final class RenderState implements AutoCloseable { library.renderStateUpdate(handle, terminal.handleForPackage()); } + /** Snapshot with every row's cells fully populated. */ public RenderStateSnapshot snapshot() { + return buildSnapshot(false); + } + + /** + * Snapshot in which cells are marshalled only for rows ghostty flagged dirty; clean + * rows get an empty cell list. Intended for a render state reused across frames (paired + * with {@link #resetDirty}) so unchanged rows skip the per-cell marshalling cost. The + * global {@link RenderStateSnapshot#dirty()} still reports FALSE / PARTIAL / FULL. + */ + public RenderStateSnapshot snapshotIncremental() { + return buildSnapshot(true); + } + + private RenderStateSnapshot buildSnapshot(boolean dirtyRowsOnly) { ensureOpen(); boolean cursorViewportHasValue = library.renderStateGetBoolean( handle, GhosttyLibrary.RENDER_STATE_DATA_CURSOR_VIEWPORT_HAS_VALUE ); - // When only some rows changed (PARTIAL), skip marshalling cells for clean rows; - // FULL means the whole frame must be redrawn, so every row's cells are needed. A - // throwaway render state (a single update) always reports FULL, so callers that do - // not keep the state around keep getting fully-populated rows exactly as before. - int dirty = library.renderStateGetI32(handle, GhosttyLibrary.RENDER_STATE_DATA_DIRTY); - boolean dirtyRowsOnly = dirty != GhosttyLibrary.RENDER_STATE_DIRTY_FULL; - return new RenderStateSnapshot( library.renderStateGetU16(handle, GhosttyLibrary.RENDER_STATE_DATA_COLS), library.renderStateGetU16(handle, GhosttyLibrary.RENDER_STATE_DATA_ROWS), - dirty, + library.renderStateGetI32(handle, GhosttyLibrary.RENDER_STATE_DATA_DIRTY), RenderCursorStyle.fromNative( library.renderStateGetI32(handle, GhosttyLibrary.RENDER_STATE_DATA_CURSOR_VISUAL_STYLE) ),