macOS: option to draw our own tabs instead of native window tabs #14214
Unanswered
pedronaugusto
asked this question in
Feature Requests, Ideas
Replies: 1 comment 3 replies
|
@pedronaugusto Why? OmniWM already solved this, no need for such changes in Ghostty.
If sending PR to Aerospace based on OmniWM fix make sure to give credit. |
3 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment


Uh oh!
There was an error while loading. Please reload this page.
On macOS every native tab is its own NSWindow. Open three tabs and the accessibility API sees three windows, so tiling window managers that read it (AeroSpace, yabai) tile the tabs instead of the window. Today the only way to use Ghostty with a tiler is to not use tabs. #10711 asked for this, it was closed because users can't open issues here, so, discussion.
My proposal is a macos-non-native-tabs option, off by default. When on, one NSWindow holds all its sessions and Ghostty draws the tab bar itself, in the titlebar or in its own row depending on macos-titlebar-style. Turn it off and nothing changes.
In #5880 pluiedev wrote: "That's a limitation of native macOS tabs... We intend to switch to a custom tabbing solution later on, due to all the bugs native tabbing has."
I have it implemented and running as my daily driver: https://github.com/pedronaugusto/ghostty/tree/custom-tabs-split. Tab bar, drag to reorder, tear off, merge, undo/redo, per-tab colors and titles, session restoration. Swift unit tests, four XCUITests, and a scripted suite that drives the real app through a bunch of end-to-end scenarios.
Caveats: built and tested on macOS 26 only. There's a separate rendering path for pre-26 and it runs, but I have no 13-15 machine to actually try it on. I haven't tried it with VoiceOver. One thing I noticed and didn't fix: with macos-titlebar-style = tabs and non-native fullscreen the window frame drifts a few points per round trip. It does that on main too.
Also, full disclosure, the code was written with Claude Code, heavily. I set the goal and constraints, reviewed everything and tested, plenty of rounds. I'll open the PR once vouched, after this has an issue.
All reactions