Commit Graph

15810 Commits

Author SHA1 Message Date
Alessandro De Blasis
19bf63ab71 test/windows: update README for ghostty-internal.dll rename
Match the dll filename rename so the copy/run instructions stay
accurate.
2026-04-11 03:02:08 +02:00
Alessandro De Blasis
935b08acea test/windows: load ghostty-internal.dll in CRT init reproducer
The internal glue DLL was renamed from ghostty.dll to
ghostty-internal.dll. Update the LoadLibraryA call and the comment
block so this regression test still exercises the right artifact.
2026-04-11 03:01:12 +02:00
Alessandro De Blasis
1988ac94d4 build: point ghostty-internal pkg-config files at direct paths
Switch the shared ghostty-internal.pc Libs: line from -lghostty to a
direct ${libdir}/<file> path, matching what the -static module already
does. The name-per-OS helpers now emit:

  shared:  ghostty-internal.dll (Windows) / ghostty-internal.so (other)
  static:  ghostty-internal-static.lib (Windows) / ghostty-internal.a

Direct paths sidestep the GNU-ld -l<name> search template, which
expects libghostty-internal.so/.a on Unix - we drop the lib prefix to
match the ghostty-internal pkg-config module name.

Also update the LipoStep out_name for the macOS universal static
archive to ghostty-internal.a for consistency.
2026-04-11 03:00:39 +02:00
Alessandro De Blasis
4fd16ef9bc build: install ghostty-internal dll/static with new names
Rename the internal library's install names to match the new
ghostty-internal pkg-config module convention:

  ghostty.dll          -> ghostty-internal.dll
  ghostty-static.lib   -> ghostty-internal-static.lib
  libghostty.so        -> ghostty-internal.so
  libghostty.a         -> ghostty-internal.a

This is the glue library between Ghostty's app shells and the GUI
core, historically (mis)named "libghostty". It is not the public
libghostty-vt API.
2026-04-11 02:59:50 +02:00
Alessandro De Blasis
dd04856482 build: add ghostty-internal pkg-config modules (shared + static) 2026-04-10 16:12:23 +02:00
Mitchell Hashimoto
19b0ed2bdf macOS: double click title to enlarge window (#12219)
Previously with `macos-titlebar-style = tabs`, double clicking title
would do nothing
2026-04-10 06:18:11 -07:00
Mitchell Hashimoto
d51e94f7eb macOS: fix tab title editor frame update during winding resizing (#12220)
https://github.com/user-attachments/assets/69bee4f9-e3e1-4dc7-8e9c-c395572d2dbf
2026-04-10 06:17:35 -07:00
Lukas
41c872c1f4 macOS: fix tab title editor frame update during winding resizing 2026-04-10 13:57:09 +02:00
Lukas
e7f58ad72e macOS: double click title to enlarge window
Previously with `macos-titlebar-style	= tabs`, double clicking title will do nothing
2026-04-10 13:41:53 +02:00
ghostty-vouch[bot]
1348e04626 Update VOUCHED list (#12216)
Triggered by [discussion
comment](https://github.com/ghostty-org/ghostty/discussions/12213#discussioncomment-16512677)
from @pluiedev.

Vouch: @otomn

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-04-10 06:52:01 +00:00
Mitchell Hashimoto
48a01b8bd5 build: add libghostty-vt-static pkg-config module (#12210)
Keep libghostty-vt.pc as the shared/default pkg-config module so
`pkg-config --static libghostty-vt` continues to emit the historical
`-lghostty-vt` flags. This preserves the old behavior for consumers that
still want it, even though that form remains ambiguous on macOS when
both the dylib and archive are installed in the same directory.

Add a separate libghostty-vt-static.pc module for consumers that need an
unambiguous static link. Its `Libs:` entry points directly at the
installed archive so macOS does not resolve the request to the dylib.

Update the Nix packaging to rewrite the new static module into the `dev`
output, use it in the static-link smoke test, and add a compatibility
check that covers both pkg-config entry points.
2026-04-09 20:38:03 -07:00
Mitchell Hashimoto
a82e156925 build: add libghostty-vt-static pkg-config module
Keep libghostty-vt.pc as the shared/default pkg-config module so
`pkg-config --static libghostty-vt` continues to emit the historical
`-lghostty-vt` flags. This preserves the old behavior for consumers
that still want it, even though that form remains ambiguous on macOS
when both the dylib and archive are installed in the same directory.

Add a separate libghostty-vt-static.pc module for consumers that need
an unambiguous static link. Its `Libs:` entry points directly at the
installed archive so macOS does not resolve the request to the dylib.

Update the Nix packaging to rewrite the new static module into the `dev`
output, use it in the static-link smoke test, and add a compatibility
check that covers both pkg-config entry points.
2026-04-09 20:27:30 -07:00
Mitchell Hashimoto
1a5bfbd87c build: sanitize all invalid chars in branch name for version (#12206)
Fixes #11990

Previously only slashes were replaced with hyphens in the branch name
used as the semver pre-release identifier. Branch names containing dots
(e.g. dependabot branches like
"cachix/install-nix-action-31.10.4") would cause an InvalidVersion error
because std.SemanticVersion only allows alphanumeric characters and
hyphens in pre-release identifiers.

Replace all non-alphanumeric, non-hyphen characters instead of only
slashes.
2026-04-09 13:15:14 -07:00
Mitchell Hashimoto
ad9225a4ca build: sanitize all invalid chars in branch name for version
Fixes #11990

Previously only slashes were replaced with hyphens in the branch
name used as the semver pre-release identifier. Branch names
containing dots (e.g. dependabot branches like
"cachix/install-nix-action-31.10.4") would cause an InvalidVersion
error because std.SemanticVersion only allows alphanumeric
characters and hyphens in pre-release identifiers.

Replace all non-alphanumeric, non-hyphen characters instead of
only slashes.
2026-04-09 13:09:01 -07:00
Mitchell Hashimoto
4cfbdaf8aa build(deps): bump cachix/install-nix-action from 31.10.3 to 31.10.4 (#12196)
Bumps
[cachix/install-nix-action](https://github.com/cachix/install-nix-action)
from 31.10.3 to 31.10.4.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/cachix/install-nix-action/releases">cachix/install-nix-action's
releases</a>.</em></p>
<blockquote>
<h2>v31.10.4</h2>
<h2>What's Changed</h2>
<ul>
<li>nix: 2.34.4 -&gt; 2.34.5 by <a
href="https://github.com/github-actions"><code>@​github-actions</code></a>[bot]
in <a
href="https://redirect.github.com/cachix/install-nix-action/pull/273">cachix/install-nix-action#273</a>
<strong>[SECURITY]</strong> Fixes a root privilege escalation
vulnerability via sandbox escape <a
href="https://github.com/NixOS/nix/security/advisories/GHSA-g3g9-5vj6-r3gj">https://github.com/NixOS/nix/security/advisories/GHSA-g3g9-5vj6-r3gj</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/cachix/install-nix-action/compare/v31.10.3...v31.10.4">https://github.com/cachix/install-nix-action/compare/v31.10.3...v31.10.4</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="616559265b"><code>6165592</code></a>
Merge pull request <a
href="https://redirect.github.com/cachix/install-nix-action/issues/273">#273</a>
from cachix/create-pull-request/patch</li>
<li><a
href="b9f700df68"><code>b9f700d</code></a>
nix: 2.34.4 -&gt; 2.34.5</li>
<li>See full diff in <a
href="96951a368b...616559265b">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=cachix/install-nix-action&package-manager=github_actions&previous-version=31.10.3&new-version=31.10.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>
2026-04-09 13:01:53 -07:00
dependabot[bot]
1855b3efcc build(deps): bump cachix/install-nix-action from 31.10.3 to 31.10.4
Bumps [cachix/install-nix-action](https://github.com/cachix/install-nix-action) from 31.10.3 to 31.10.4.
- [Release notes](https://github.com/cachix/install-nix-action/releases)
- [Changelog](https://github.com/cachix/install-nix-action/blob/master/RELEASE.md)
- [Commits](96951a368b...616559265b)

---
updated-dependencies:
- dependency-name: cachix/install-nix-action
  dependency-version: 31.10.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-09 00:15:52 +00:00
Mitchell Hashimoto
28972454c0 libghostty-vt: nix package updates and more nix tests (#12152) 2026-04-08 11:00:49 -07:00
Mitchell Hashimoto
e740f6fc11 macOS: fix icon style not updating properly on Tahoe (#12180)
This is a regression from #9983. When resetting to default, we shouldn't
use the representation of the icon, which will prevent the icon from
updating after system settings change.

1. Delete `macos-icon` config if it exists and reload.
2. Go to **System Settings -> Appearance** and change **Icon & widget
style** to any one other than Default, and observe the app icon.


<img width="228" height="179" alt="image"
src="https://github.com/user-attachments/assets/e53274f8-b679-4d6f-8e0b-edfd7d17811d"
/>

> A temporary workaround to this issue is to reload the config.

This pr resets the `NSDockTile.contentView`, which will let AppKit
revert back to `Ghostty.icon`.



https://github.com/user-attachments/assets/06ab0519-225b-45e1-85a5-a22832a36177
2026-04-08 10:59:57 -07:00
Mitchell Hashimoto
a1c6f800c5 libghostty: add MAX_VALUE sentinels to all C enums for 32-bit sizing (#12189)
Pre-C23, the C standard allows compilers to choose any integer type
that can represent all enum values, so small enums could be backed
by char or short. This breaks ABI compatibility with the Zig side,
which backs these enums with c_int.

Define GHOSTTY_ENUM_MAX_VALUE as INT_MAX in types.h and add it as
the last entry in every enum in include/ghostty/vt/. This forces
the compiler to use int as the backing type, matching c_int on all
targets. INT_MAX is used rather than a fixed constant because enum
constants must be representable as int; values above INT_MAX are a
constraint violation in standard C.

Document this convention in AGENTS.md.
2026-04-08 10:56:52 -07:00
Mitchell Hashimoto
f282f13a21 libghostty: add GHOSTTY_ENUM_TYPED and GHOSTTY_ENUM_MAX_VALUE to all C enums
GHOSTTY_ENUM_TYPED: expands to `: int` on C23 (where explicit enum
underlying types are supported), empty on older standards.
2026-04-08 10:43:15 -07:00
Mitchell Hashimoto
9897d6caba libghostty: add GHOSTTY_ENUM_MAX_VALUE sentinel to all C enums
Pre-C23, the C standard allows compilers to choose any integer type
that can represent all enum values, so small enums could be backed
by char or short. This breaks ABI compatibility with the Zig side,
which backs these enums with c_int.

Define GHOSTTY_ENUM_MAX_VALUE as INT_MAX in types.h and add it as
the last entry in every enum in include/ghostty/vt/. This forces
the compiler to use int as the backing type, matching c_int on all
targets. INT_MAX is used rather than a fixed constant because enum
constants must be representable as int; values above INT_MAX are a
constraint violation in standard C.

Document this convention in AGENTS.md.
2026-04-08 10:34:52 -07:00
Lukas
363cb9560e macOS: fix icon style not updating on Tahoe 2026-04-08 13:12:37 +02:00
ghostty-vouch[bot]
853183e911 Update VOUCHED list (#12165)
Triggered by [discussion
comment](https://github.com/ghostty-org/ghostty/discussions/12164#discussioncomment-16477806)
from @jcollie.

Vouch: @MoonMao42

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-04-07 14:58:24 +00:00
Mitchell Hashimoto
0043e665f5 macos: cancel deferred tab presentation on close (#12119)
The 👻 Ghost Tab Issue


https://github.com/user-attachments/assets/cb91cd85-4a08-4c16-9efb-1a9ab30fc2bc

Previous failure scenario (User perspective):

1. Open a new tab
2. Instantly trigger close other tabs (eg. through custom user keyboard
shortcut)
3. Now you will see an empty Ghost Tab (Only a window bar with empty
content)

The previous failure mode is:

1. Create a tab or window now in `newTab(...)` / `newWindow(...)`.
2. Queue its initial show/focus work with `DispatchQueue.main.async`.
3. Close that tab or window with `closeTabImmediately()` /
`closeWindowImmediately()` before the queued callback runs.
4. The queued callback still runs anyway and calls `showWindow(...)` /
`makeKeyAndOrderFront(...)` on stale state.
5. The tab can be resurrected as a half-closed blank ghost tab.

The fix:

- Store deferred presentation work in a cancellable DispatchWorkItem and
cancel it from the close paths before AppKit finishes tearing down the
tab or window.
- This prevents the stale show/focus callback from running after close.

## AI Usage

I used GPT 5.4 to find the initial issue and fix it. I cleaned up and
narrowed down the commit afterwards.

-----

Additional Notes:

I use `cmd+o` to `close_tab:other`

https://github.com/jamylak/dotfiles/blob/main/ghostty/config#L106C1-L106C34

Try it for your self if you want to reproduce, just do a quick `cmd+t`
`cmd+o` and you will see
2026-04-07 05:41:23 -07:00
Mitchell Hashimoto
2b62e3c82a libghostty-vt: add semver pre info to build info (#12150) 2026-04-07 05:40:52 -07:00
Mitchell Hashimoto
140ddd9770 build(deps): bump flatpak/flatpak-github-actions from 6.6 to 6.7 (#12154)
Bumps
[flatpak/flatpak-github-actions](https://github.com/flatpak/flatpak-github-actions)
from 6.6 to 6.7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/flatpak/flatpak-github-actions/releases">flatpak/flatpak-github-actions's
releases</a>.</em></p>
<blockquote>
<h2>v6.7</h2>
<ul>
<li>Bump action to node 24</li>
<li>Add the git commit as the ostree commit subject</li>
<li>Allow configurable build/repo/state dirs</li>
<li>Add keep-build-dirs flag</li>
<li>Update action dependencies</li>
<li>Improvements to contributing docs</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="401fe28a83"><code>401fe28</code></a>
flatpak-builder: Add keepBuildDirs flag (<a
href="https://redirect.github.com/flatpak/flatpak-github-actions/issues/229">#229</a>)</li>
<li><a
href="fc05c5ecc1"><code>fc05c5e</code></a>
action: Bump to node 24 (<a
href="https://redirect.github.com/flatpak/flatpak-github-actions/issues/243">#243</a>)</li>
<li><a
href="ce5753fa41"><code>ce5753f</code></a>
Some doc improvements (<a
href="https://redirect.github.com/flatpak/flatpak-github-actions/issues/245">#245</a>)</li>
<li><a
href="fef33cbb5c"><code>fef33cb</code></a>
Update dependencies (<a
href="https://redirect.github.com/flatpak/flatpak-github-actions/issues/244">#244</a>)</li>
<li><a
href="0a63139699"><code>0a63139</code></a>
feat(flatpak-builder): Allow configurable build/repo/state dirs (<a
href="https://redirect.github.com/flatpak/flatpak-github-actions/issues/237">#237</a>)</li>
<li><a
href="ad1b66ed72"><code>ad1b66e</code></a>
flatpak-builder: Add the git commit as the ostree commit subject</li>
<li>See full diff in <a
href="92ae9851ad...401fe28a83">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=flatpak/flatpak-github-actions&package-manager=github_actions&previous-version=6.6&new-version=6.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>
2026-04-07 05:39:32 -07:00
Jeffrey C. Ollie
ee236e9a73 chore: removed superfluous word (#12160)
I noticed a likely unintentional "actually" in the README. Nothing
fancy, just updating the documentation.
2026-04-06 23:57:23 -05:00
Jeffrey C. Ollie
c2e2a3b7f9 flake: make building package list more flexible 2026-04-06 23:41:24 -05:00
Jeffrey C. Ollie
28c75e2c61 libghostty-vt: fix nix package name 2026-04-06 23:41:04 -05:00
Jeffrey C. Ollie
1d61e27351 libghostty-vt: disable macOS CI nix build 2026-04-06 23:40:45 -05:00
Jeffrey C. Ollie
4ae155be59 flake: ensure that packages don't get lost 2026-04-06 23:22:56 -05:00
tbrundige
95fb39ae0c chore: removed superfluous word 2026-04-06 22:10:12 -06:00
Jeffrey C. Ollie
dedc3fce86 libghostty-vt: build nix package on all platforms 2026-04-06 22:51:56 -05:00
Jeffrey C. Ollie
93a4470458 libghostty-vt: require build-nix-macos 2026-04-06 22:51:41 -05:00
Jeffrey C. Ollie
1322d64534 libghostty-vt: nix package updates and more nix tests 2026-04-06 22:41:57 -05:00
ghostty-vouch[bot]
a1e75daef8 Update VOUCHED list (#12158)
Triggered by [discussion
comment](https://github.com/ghostty-org/ghostty/discussions/12157#discussioncomment-16470907)
from @jcollie.

Vouch: @tbrundige

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-04-07 03:31:48 +00:00
ghostty-vouch[bot]
8f376d84b4 Update VOUCHED list (#12156)
Triggered by [discussion
comment](https://github.com/ghostty-org/ghostty/discussions/12155#discussioncomment-16470483)
from @jcollie.

Vouch: @KieranCanter

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-04-07 02:38:42 +00:00
dependabot[bot]
5c45484a71 build(deps): bump flatpak/flatpak-github-actions from 6.6 to 6.7
Bumps [flatpak/flatpak-github-actions](https://github.com/flatpak/flatpak-github-actions) from 6.6 to 6.7.
- [Release notes](https://github.com/flatpak/flatpak-github-actions/releases)
- [Commits](92ae9851ad...401fe28a83)

---
updated-dependencies:
- dependency-name: flatpak/flatpak-github-actions
  dependency-version: '6.7'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-07 00:15:26 +00:00
Jeffrey C. Ollie
06340cd3f0 libghostty-vt: add semver pre info to build info 2026-04-06 17:17:30 -05:00
Mitchell Hashimoto
da835757b0 prettier: ignore swift outputs 2026-04-06 14:54:23 -07:00
Mitchell Hashimoto
c12a0e395d libghostty: build universal xcframework and release it on tip (#12149)
This produces a `ghostty-vt.xcframework` for `zig build -Demit-lib-vt`
when the host is macOS and the target is Apple platforms. Our CI has
been updated to release this via tip channels (GH releases and our blob
storage), too.

The xcframework contains binaries for macOS Universal (x86_64 +
aarch64), iOS, and iOS simulator.

I've added a Swift example we run in CI to verify this works. Users can
also drag and drop the XCFramework directly into Xcode.

## Example

```swift
// swift-tools-version: 5.9
import PackageDescription

let package = Package(
    name: "swift-vt-xcframework",
    platforms: [.macOS(.v13)],
    targets: [
        .executableTarget(
            name: "swift-vt-xcframework",
            dependencies: ["GhosttyVt"],
            path: "Sources",
            linkerSettings: [
                .linkedLibrary("c++"),
            ]
        ),
        .binaryTarget(
            name: "GhosttyVt",
            path: "../../zig-out/lib/ghostty-vt.xcframework"
        ),
    ]
)
```

```swift
import GhosttyVt

// Create a terminal with a small grid
var terminal: GhosttyTerminal?
var opts = GhosttyTerminalOptions(
    cols: 80,
    rows: 24,
    max_scrollback: 0
)
let result = ghostty_terminal_new(nil, &terminal, opts)
guard result == GHOSTTY_SUCCESS, let terminal else {
    fatalError("Failed to create terminal")
}

// Write some VT-encoded content
let text = "Hello from \u{1b}[1mSwift\u{1b}[0m via xcframework!\r\n"
text.withCString { ptr in
    ghostty_terminal_vt_write(terminal, ptr, strlen(ptr))
}

// Format the terminal contents as plain text
var fmtOpts = GhosttyFormatterTerminalOptions()
fmtOpts.size = MemoryLayout<GhosttyFormatterTerminalOptions>.size
fmtOpts.emit = GHOSTTY_FORMATTER_FORMAT_PLAIN
fmtOpts.trim = true

var formatter: GhosttyFormatter?
let fmtResult = ghostty_formatter_terminal_new(nil, &formatter, terminal, fmtOpts)
guard fmtResult == GHOSTTY_SUCCESS, let formatter else {
    fatalError("Failed to create formatter")
}

var buf: UnsafeMutablePointer<UInt8>?
var len: Int = 0
let allocResult = ghostty_formatter_format_alloc(formatter, nil, &buf, &len)
guard allocResult == GHOSTTY_SUCCESS, let buf else {
    fatalError("Failed to format")
}

print("Plain text (\(len) bytes):")
print(String(cString: buf))

ghostty_free(nil, buf, len)
ghostty_formatter_free(formatter)
ghostty_terminal_free(terminal)
```
2026-04-06 14:53:39 -07:00
Mitchell Hashimoto
445e1945da ci: upload lib-vt source tarball to R2
Add R2 upload steps to the source-tarball-lib-vt job in the tip
release workflow, matching the pattern used by the xcframework
job. The tarball is uploaded to the ghostty-tip R2 bucket keyed
by commit hash, making it available at
tip.files.ghostty.org/<commit>/libghostty-vt-source.tar.gz.
2026-04-06 14:53:24 -07:00
Mitchell Hashimoto
249aee7010 example/swift-vt-xcframework: fix buffer overflow 2026-04-06 14:50:36 -07:00
Mitchell Hashimoto
9b281cde43 build: add iOS slices to lib-vt xcframework
Add iOS device and simulator slices to the xcframework, gated on
SDK availability via std.zig.LibCInstallation.findNative. Refactor
AppleLibs from a struct with named fields to an EnumMap keyed by
ApplePlatform so that adding new platforms only requires extending
the enum and its sdk_platforms table.

tvOS, watchOS, and visionOS are listed as not yet supported due to
Zig stdlib limitations (missing PATH_MAX, mcontext fields).
2026-04-06 14:41:11 -07:00
Mitchell Hashimoto
e1a0e40ec4 build: skip xcframework when cross-compiling
Gate the xcframework build on the host being macOS in addition to
the target, since xcodebuild is only available on macOS.
2026-04-06 14:25:04 -07:00
Mitchell Hashimoto
90b706b977 ci: publish lib-vt xcframework in tip releases
Add a build-lib-vt-xcframework job to the release-tip workflow that
builds the universal xcframework with ReleaseFast, zips it, signs
it with minisign, and uploads it to both the GitHub Release and R2
blob storage. Consumers can pull the xcframework zip from the tip
release or by commit hash from tip.files.ghostty.org.
2026-04-06 14:22:57 -07:00
Mitchell Hashimoto
764ff18b8e ci: add Swift example builds on macOS
Auto-discover Swift examples via example/*/Package.swift alongside
the existing zig and cmake discovery. The new build-examples-swift
job runs on macOS, builds the xcframework with zig build -Demit-lib-vt,
then runs swift run in each example directory to verify the
xcframework links and functions correctly end-to-end.
2026-04-06 14:17:34 -07:00
Mitchell Hashimoto
f567f7f46d build: add GhosttyVt module map to xcframework and Swift example
The xcframework now generates its own headers directory with a
GhosttyVt module map instead of reusing include/ directly, which
contains the GhosttyKit module map for the macOS app. The generated
directory copies the ghostty headers and adds a module.modulemap
that exposes ghostty/vt.h as the umbrella header.

A new swift-vt-xcframework example demonstrates consuming the
xcframework from a Swift Package. It creates a terminal, writes
VT sequences, and formats the output as plain text, verifying
the full round-trip works with swift build and swift run.
2026-04-06 14:14:52 -07:00
Mitchell Hashimoto
05fb57dd40 build: emit xcframework for libghostty-vt on macOS
On Darwin targets, the build now automatically produces a universal
(arm64 + x86_64) XCFramework at lib/ghostty-vt.xcframework under
the install prefix. This bundles the fat static library with headers
so consumers using Xcode or Swift PM can link libghostty-vt directly.
2026-04-06 14:07:19 -07:00
Mitchell Hashimoto
f7a9e313cd libghostty-vt: allow version to be customized from the Zig build command (#12104) 2026-04-06 13:45:31 -07:00