a73x

07d3d200

main: use explicit viewportEql instead of std.meta.eql

a73x   2026-04-19 07:13

std.meta.eql does structural equality including any padding or
pointer fields. Replace with a named-field comparison so future
Viewport churn in ghostty_vt surfaces as a compile error rather
than silent correctness drift.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

diff --git a/src/main.zig b/src/main.zig
index 5c1e818..687c775 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -515,7 +515,7 @@ fn runTerminal(alloc: std.mem.Allocator) !void {
            and keyboard.has_focus;

        const cursor_identity_changed =
            !std.meta.eql(current_cursor.viewport, previous_cursor.viewport)
            !viewportEql(current_cursor.viewport, previous_cursor.viewport)
            or current_cursor.visual_style != previous_cursor.visual_style
            or current_cursor.visible != previous_cursor.visible
            or current_cursor.blinking != previous_cursor.blinking;
@@ -903,6 +903,17 @@ fn reconfigureBlink(
    return .{ .state = state, .cursor_rebuild = false };
}

// Field-wise equality for ?Viewport. Explicit (vs std.meta.eql) so that
// adding a new Viewport field in ghostty_vt becomes a compile error here
// instead of a silent correctness drift.
fn viewportEql(a: anytype, b: anytype) bool {
    if (a == null and b == null) return true;
    if (a == null or b == null) return false;
    return a.?.x == b.?.x
        and a.?.y == b.?.y
        and a.?.wide_tail == b.?.wide_tail;
}

fn shouldDrawCursor(
    visible: bool,
    viewport_present: bool,