Skip to content

Export authoritative terminal grids for embedded clients - #119

Open
azooz2003-bit wants to merge 24 commits into
mainfrom
feat/ios-authoritative-grid
Open

Export authoritative terminal grids for embedded clients#119
azooz2003-bit wants to merge 24 commits into
mainfrom
feat/ios-authoritative-grid

Conversation

@azooz2003-bit

@azooz2003-bit azooz2003-bit commented Jul 15, 2026

Copy link
Copy Markdown

Summary

  • export a producer-owned terminal viewport grid through the embedded API
  • snapshot cursor, colors, cell attributes, and parser/update sequences on the terminal owner thread
  • keep the export visual-only so clients cannot mistake it for semantic terminal state

Verification

  • zig build -Demit-macos-app=false
  • GhosttyKit artifact workflow: 29392177968 passed

Parent experiment for manaflow-ai/cmux#7160.


View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.


Summary by cubic

Exports an authoritative, visual-only terminal render grid with a visual state watermark and exact presentation tickets so embedded clients stay pixel- and frame-accurate.

  • New Features

    • Atomic render‑grid JSON of viewport + bounded scrollback with an embedded state_seq; snapshot is gated and returns retryable_not_quiescent until output/parsing completes or synchronized‑output ends.
    • C API: added ghostty_render_presentation_cb; ticketed renders via ghostty_surface_render_now_with_ticket; ghostty_surface_invalidate_render_presentation_through to fence stale frames; tickets are forced through presentation even with no new damage; final statuses: presented, wrong_size_discarded, backend_failed.
    • JSON API update: ghostty_surface_render_grid_json(surface_id, id_len, scrollback_lines, out_state_seq*, out_status*).
    • PTY tee fires post‑parse with start_seq for each chunk; publication is serialized and reentrant‑safe; accessor ghostty_surface_pty_output_sequence exposed for synchronized coordination.
    • Visual fidelity: cursor JSON includes style, blinking, cell width, and opacity; cursor color blends with its cell background and is resolved from the underlying cell style; unfocused cursor is hollow and non‑blinking; faint is resolved into RGB with correct reverse‑color handling.
  • Migration

    • Set render_presentation_cb on ghostty_surface_config_s and use ticketed render on iOS; handle statuses presented, wrong_size_discarded, backend_failed; call invalidate to drop stale tickets.
    • Update tee callback to (userdata, bytes, len, start_seq); optionally clear with ghostty_surface_clear_pty_tee_cb_if_userdata.
    • Stop passing a state_seq to ghostty_surface_render_grid_json; read out_state_seq/out_status and retry on retryable_not_quiescent, or use ghostty_surface_pty_output_sequence when needed.

Written for commit 51d20b2. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features

    • Added ticket-based render presentation control and presentation completion reporting.
    • Exposed a synchronized “raw PTY output sequence” accessor for embedder-side coordination.
    • Added a parser-state quiescence check to define a clean synchronization boundary.
  • API Updates

    • PTY tee callbacks now include a per-chunk parser start sequence.
    • Render-grid JSON export now provides an atomic state sequence watermark plus updated status/retry outputs.
  • Tests

    • Added/extended unit coverage for render-grid gating, sequencing, callback ordering/clearing, and quiescence behavior.

@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The public API now exposes synchronized PTY output sequencing, ticketed render presentation callbacks, and quiescent render-grid snapshots with status and sequence outputs. Renderer backends propagate presentation tickets, while PTY publication and render-grid serialization gain concurrency and opacity handling.

Changes

PTY sequencing, render-grid export, and ticketed presentation

Layer / File(s) Summary
Public API and presentation contracts
include/ghostty.h, src/apprt/embedded.zig, src/apprt/render_grid_json.zig, src/renderer.zig, src/renderer/presentation.zig
Adds render-grid and presentation statuses, callback/configuration fields, ticketed rendering APIs, synchronized PTY sequence access, cursor JSON helpers, and sequenced PTY tee callback parameters.
PTY output publication and sequencing
src/termio/Termio.zig, src/terminal/stream.zig
Serializes parser updates and tee callback publication, assigns chunk start sequences, fences callback clearing, exposes synchronized sequence snapshots, and adds parser quiescence tests.
Quiescent render-grid capture and serialization
src/apprt/embedded.zig, src/apprt/render_grid_json.zig, include/ghostty.h, src/terminal/PageList.zig
Captures PTY state sequences under lock, returns retryable non-quiescent status, blends faint colors, centralizes scrollback and viewport row construction, and serializes cursor width, opacity, and text color.
Ticketed renderer presentation flow
src/renderer/Thread.zig, src/renderer/generic.zig, src/renderer/Metal.zig, src/renderer/OpenGL.zig, src/renderer/metal/*
Carries presentation tickets through render-now, frame creation, backend submission, Metal layer lifecycle handling, invalidation, completion, and ticket-tracker tests.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly reflects the main change: exporting authoritative terminal grid data for embedded clients.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/ios-authoritative-grid

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@greptile-apps

greptile-apps Bot commented Jul 15, 2026

Copy link
Copy Markdown

Greptile Summary

This PR exports an authoritative, visual-only terminal grid for embedded clients by introducing a pty_output_seq counter — advanced under the renderer_state mutex — that lets snapshots and tee callbacks describe the same atomic terminal state. The tee callback is moved to fire after parsing (with the chunk's start sequence), and ghostty_surface_output_sequence is added so clients can verify which chunks a snapshot covers.

  • src/termio/Termio.zig: pty_output_seq replaces the old pre-parse tee, the callback now fires post-parse with chunk_seq, and the sequence is advanced atomically with terminal mutation under the renderer-state lock.
  • src/apprt/embedded.zig: The render-grid JSON gains cursor_cell_width, cursor_opacity (focus-aware), cursor_text_color, and per-style foreground_opacity for faint cells; state_seq is now captured internally rather than passed by the caller; row rendering is extracted into appendRenderGridRow.
  • include/ghostty.h: ghostty_surface_output_sequence is added, ghostty_surface_render_grid_json drops its external state_seq param, and ghostty_pty_tee_cb gains a start_seq: uint64_t argument (all intentional ABI breaks for the cmux fork).

Confidence Score: 3/5

Safe to merge for non-visual uses, but clients rendering the cursor on an unfocused surface will draw the wrong cursor shape until the style export is made focus-aware.

The sequence ordering and mutex discipline are solid — pty_output_seq is always advanced under the same lock that guards terminal mutation, and the tee callback fires only after that lock is released, so the invariant holds. The new cursor fields (cursor_opacity, cursor_cell_width, cursor_text_color) correctly account for focus state and renderer config. The gap is cursor_style: the renderer unconditionally overrides the cursor to block_hollow when unfocused (renderer/cursor.zig:60), but the export still emits s.cursor.cursor_style (the raw terminal mode). A client faithfully rendering the JSON will show a bar or underline cursor on an unfocused window instead of a hollow block.

src/apprt/embedded.zig — specifically the cursor field capture block where cursor_style is set without the focus-based override that cursor_opacity already applies.

Important Files Changed

Filename Overview
src/termio/Termio.zig Adds pty_output_seq counter advanced under the renderer-state mutex, and moves the tee callback to fire after parsing (with the chunk's start sequence). The sequence ordering and lock discipline are correct; the @intCast widening cast is a minor style nit.
src/apprt/embedded.zig Extends the render-grid JSON with cursor cell width, opacity, text color, and faint foreground opacity. Adds ghostty_surface_output_sequence and refactors row rendering into appendRenderGridRow. Cursor opacity correctly accounts for focus state, but cursor_style still exports the raw terminal mode value and ignores the renderer's focus-based override to block_hollow.
include/ghostty.h Adds ghostty_surface_output_sequence, removes the state_seq parameter from ghostty_surface_render_grid_json (now captured internally), and extends ghostty_pty_tee_cb with a start_seq argument. All intentional breaking changes for the cmux fork.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant IO as IO Read Thread
    participant Termio as Termio.processOutput
    participant Lock as renderer_state.mutex
    participant Term as VT Parser / Terminal State
    participant CB as pty_tee_cb (embedder)
    participant Client as Embedded Client

    IO->>Termio: processOutput(buf)
    Termio->>Lock: lock()
    Termio->>Term: processOutputLocked(buf)
    Note over Term: Terminal state mutated,<br/>pty_output_seq advanced<br/>(chunk_seq → chunk_seq + len)
    Termio->>Lock: unlock()
    Termio->>CB: cb(userdata, buf, len, chunk_seq)
    Note over CB: chunk_seq = start of this chunk

    Client->>Lock: lockDemand() [ghostty_surface_output_sequence]
    Lock-->>Client: pty_output_seq (≥ chunk_seq + len)
    Client->>Lock: unlock()

    Client->>Lock: lock() [ghostty_surface_render_grid_json]
    Lock-->>Client: grid snapshot + state_seq
    Client->>Lock: unlock()
    Note over Client: state_seq ≥ chunk_seq + len<br/>means snapshot covers the chunk
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant IO as IO Read Thread
    participant Termio as Termio.processOutput
    participant Lock as renderer_state.mutex
    participant Term as VT Parser / Terminal State
    participant CB as pty_tee_cb (embedder)
    participant Client as Embedded Client

    IO->>Termio: processOutput(buf)
    Termio->>Lock: lock()
    Termio->>Term: processOutputLocked(buf)
    Note over Term: Terminal state mutated,<br/>pty_output_seq advanced<br/>(chunk_seq → chunk_seq + len)
    Termio->>Lock: unlock()
    Termio->>CB: cb(userdata, buf, len, chunk_seq)
    Note over CB: chunk_seq = start of this chunk

    Client->>Lock: lockDemand() [ghostty_surface_output_sequence]
    Lock-->>Client: pty_output_seq (≥ chunk_seq + len)
    Client->>Lock: unlock()

    Client->>Lock: lock() [ghostty_surface_render_grid_json]
    Lock-->>Client: grid snapshot + state_seq
    Client->>Lock: unlock()
    Note over Client: state_seq ≥ chunk_seq + len<br/>means snapshot covers the chunk
Loading

Reviews (1): Last reviewed commit: "Merge commit 'b4b6d69c82033e16137266a04b..." | Re-trigger Greptile

Comment thread src/apprt/embedded.zig Outdated
Comment on lines 2474 to 2476
cursor_visible = t.modes.get(.cursor_visible);
cursor_blinking = t.modes.get(.cursor_blinking);
cursor_style = s.cursor.cursor_style;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 cursor_style ignores focus-based override to block_hollow

The PR correctly uses core_surface.focused to export cursor_opacity, mirroring the renderer's alpha logic in generic.zig. However, cursor_style = s.cursor.cursor_style still returns the terminal-mode style even when unfocused — but renderer/cursor.zig line 60 unconditionally overrides the style to .block_hollow for any unfocused surface (if (!opts.focused) return .block_hollow). A client consuming the JSON of an unfocused terminal with a bar or underline cursor will render the wrong shape, because the export says "style": "bar" while the renderer is actually showing a hollow block. The same core_surface.focused check used for opacity should also gate the style field.

Comment thread src/termio/Termio.zig
defer self.renderer_state.mutex.unlock();
self.processOutputLocked(buf);
const chunk_seq = self.pty_output_seq;
self.pty_output_seq +%= @intCast(buf.len);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Using @intCast for a widening usizeu64 cast is unconventional; Zig's @intCast is typically reserved for potentially-truncating casts. @as(u64, buf.len) is the idiomatic way to perform a safe widening conversion.

Suggested change
self.pty_output_seq +%= @intCast(buf.len);
self.pty_output_seq +%= @as(u64, buf.len);

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Comment thread src/apprt/embedded.zig
Comment on lines +2375 to +2377
try builder.close();
return;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 The explicit return; at the end of the function body is redundant — the function already falls off the end of the scope after try builder.close(). Removing it keeps the code consistent with normal Zig style.

Suggested change
try builder.close();
return;
}
try builder.close();
}

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/apprt/embedded.zig (1)

2480-2538: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicate cursor-color resolution logic.

cursor_color_override and cursor_text_color both independently compute cell_foreground/cell_background via cursor_cell_style.fg(...)/.bg(...) and both repeat the identical inverse-aware switch (cell-foreground/cell-background). Any future fix to cursor color resolution (e.g. an inverse-handling bug) has to be applied in two places or they'll silently diverge.

♻️ Suggested extraction (illustrative, adapt types as needed)
+fn cursorCellColors(
+    style: terminal.Style,
+    cell: *const terminal.Cell,
+    foreground: terminal.color.RGB,
+    background: terminal.color.RGB,
+    palette: *const terminal.color.Palette,
+    bold_color: ?terminal.Style.BoldColor,
+) struct { fg: terminal.color.RGB, bg: terminal.color.RGB } {
+    return .{
+        .fg = style.fg(.{ .default = foreground, .palette = palette, .bold = bold_color }),
+        .bg = style.bg(cell, palette) orelse background,
+    };
+}

Then both blocks call cursorCellColors(s.cursor.style, s.cursor.page_cell, foreground, background, palette, bold_color) instead of re-deriving cell_foreground/cell_background inline.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/apprt/embedded.zig` around lines 2480 - 2538, Extract the shared cell
foreground/background and inverse-aware cursor color selection from the
cursor_color_override and cursor_text_color blocks into a helper such as
cursorCellColors. Update both blocks to reuse that helper while preserving their
existing configured .color overrides and fallback values.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/termio/Termio.zig`:
- Around line 68-78: Make updates to pty_tee_cb and pty_tee_userdata in
ghostty_surface_set_pty_tee_cb safe against concurrent reads by processOutput
after renderer_state.mutex is released. Either synchronize access to both fields
as one pair or enforce and document that the setter is init-only and cannot be
called after output begins; preserve consistent callback/userdata pairing.

---

Nitpick comments:
In `@src/apprt/embedded.zig`:
- Around line 2480-2538: Extract the shared cell foreground/background and
inverse-aware cursor color selection from the cursor_color_override and
cursor_text_color blocks into a helper such as cursorCellColors. Update both
blocks to reuse that helper while preserving their existing configured .color
overrides and fallback values.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 5de04da5-e9d7-4df1-a334-a3b4db27f43f

📥 Commits

Reviewing files that changed from the base of the PR and between 366c801 and 539ed7a.

📒 Files selected for processing (3)
  • include/ghostty.h
  • src/apprt/embedded.zig
  • src/termio/Termio.zig

Comment thread src/termio/Termio.zig Outdated
@azooz2003-bit

Copy link
Copy Markdown
Author

Reconciled this feature with current fork main at 6983c73. The exact GhosttyKit archive is published at https://github.com/manaflow-ai/ghostty/releases/tag/xcframework-6983c7363721e846104e8da76a4bd8a4b58ad6d7-crashsubdir-cmux-crash-v1 and its downloaded SHA-256 is 57baf462bdc03b2da0438b959e7164d3716d38a26c22b2c7a6010268ab77c75c. Local GhosttyKit build and exact cmux tagged rebuild passed.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/apprt/embedded.zig (1)

2564-2625: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Serialize the promised cursor width, opacity, and text color.

The snapshot adjusts wide-cell positioning and bakes opacity into terminal_cursor_color, but the JSON cursor object still exports only row, column, visibility, style, and blinking. This omits the cursor width, explicit opacity, and cursor text color required by the PR objective, preventing faithful replay—especially on wide cells.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/apprt/embedded.zig` around lines 2564 - 2625, Update the cursor JSON
serialization in the surrounding snapshot/export logic to include the promised
cursor width, explicit opacity, and cursor text color alongside the existing
row, column, visibility, style, and blinking fields. Reuse the computed cursor
positioning, cursor_alpha, and resolved cursor color values from this flow so
wide-cell placement and opacity are preserved for faithful replay.
🧹 Nitpick comments (1)
src/apprt/embedded.zig (1)

431-445: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add C-header parity coverage for RenderGridStatus.

The adjacent presentation enum is checked, but this new public enum is not. Add the equivalent ABI test to prevent silent name/value drift.

Proposed test
 pub const RenderGridStatus = enum(c_int) {
     success = 0,
     retryable_not_quiescent = 1,
     failure = 2,
 };
+
+test "ghostty.h render grid status" {
+    try renderer.lib.checkGhosttyHEnum(
+        RenderGridStatus,
+        "GHOSTTY_RENDER_GRID_",
+    );
+}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/apprt/embedded.zig` around lines 431 - 445, Add a C-header parity test
for the public RenderGridStatus enum, alongside the existing “ghostty.h render
presentation status” test. Use renderer.lib.checkGhosttyHEnum with
RenderGridStatus and the appropriate “GHOSTTY_RENDER_GRID_” prefix, preserving
the enum’s declared names and values.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@include/ghostty.h`:
- Around line 504-509: Update the documentation for
ghostty_render_presentation_cb to describe the callback as reporting completion
of the render ticket’s terminal outcome, not necessarily host-layer
presentation. Clarify that only ghostty_render_presentation_status_e.PRESENTED
confirms presentation, while WRONG_SIZE_DISCARDED and BACKEND_FAILED represent
terminal outcomes that do not reach the presentation boundary.
- Around line 1279-1283: Define a separate, unique non-null ownership token for
conditional PTY tee clearing instead of using nullable callback userdata. Update
the declaration in include/ghostty.h#1279-1283 and the exported implementation
signature in src/apprt/embedded.zig#3051-3055 to accept and document that token,
then update Termio’s ownership comparison in src/termio/Termio.zig#82-94 to
compare the token directly while preserving support for nullable callback
userdata.

In `@src/renderer/generic.zig`:
- Around line 1547-1552: Update drawFrameWithPresentationTicket and its
renderNowWithTicket call path so any non-null presentation_ticket is forced
through the completion/synchronized path, even when sync is false or
needs_redraw is false. Ensure the ticket is completed when rebuilding is
skipped, while retaining the existing normal behavior for null tickets.

In `@src/renderer/Metal.zig`:
- Around line 111-114: Update Metal renderer teardown in prepareDeinit to
synchronously clear the presentation callback and userdata on the macOS path as
well as iOS, while keeping host detachment iOS-specific. Ensure clearing
completes on the main queue before teardown returns so retained layers or queued
blocks cannot invoke stale embedder userdata.

In `@src/termio/Termio.zig`:
- Around line 44-52: Update PtyOutputPublication.finish so it does not invoke
the PTY callback while self.mutex is held: under the lock, capture the callback,
userdata, and callback arguments while preserving the publication lifetime
fence, then unlock before invoking embedder code and complete the corresponding
in-flight handoff afterward. Ensure re-entry through processOutput,
setPtyTeeCallback, clearPtyTeeCallbackIfUserdata, or ptyOutputSequence cannot
deadlock.

---

Outside diff comments:
In `@src/apprt/embedded.zig`:
- Around line 2564-2625: Update the cursor JSON serialization in the surrounding
snapshot/export logic to include the promised cursor width, explicit opacity,
and cursor text color alongside the existing row, column, visibility, style, and
blinking fields. Reuse the computed cursor positioning, cursor_alpha, and
resolved cursor color values from this flow so wide-cell placement and opacity
are preserved for faithful replay.

---

Nitpick comments:
In `@src/apprt/embedded.zig`:
- Around line 431-445: Add a C-header parity test for the public
RenderGridStatus enum, alongside the existing “ghostty.h render presentation
status” test. Use renderer.lib.checkGhosttyHEnum with RenderGridStatus and the
appropriate “GHOSTTY_RENDER_GRID_” prefix, preserving the enum’s declared names
and values.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 9c657c17-f301-4963-bc09-462f3822d192

📥 Commits

Reviewing files that changed from the base of the PR and between 539ed7a and 3d70592.

📒 Files selected for processing (12)
  • include/ghostty.h
  • src/apprt/embedded.zig
  • src/renderer.zig
  • src/renderer/Metal.zig
  • src/renderer/OpenGL.zig
  • src/renderer/Thread.zig
  • src/renderer/generic.zig
  • src/renderer/metal/Frame.zig
  • src/renderer/metal/IOSurfaceLayer.zig
  • src/renderer/presentation.zig
  • src/terminal/stream.zig
  • src/termio/Termio.zig

Comment thread include/ghostty.h Outdated
Comment thread include/ghostty.h
Comment thread src/renderer/generic.zig
Comment thread src/renderer/Metal.zig
Comment thread src/termio/Termio.zig
@azooz2003-bit

Copy link
Copy Markdown
Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

To use Codex here, create a Codex account and connect to github.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant