docs/install/release-notes/1-1-0.mdx
Ghostty 1.1.0 features 1 month of work with changes from 84 contributors over 564 commits. The focus of this release remains on critical bug fixes and quality of life improvements based on feedback from the initial 1.0 release.
On Linux in particular, window decorations have a wide variety of styles and behaviors. Ghostty's previous behavior was to always use client-side decorations (CSD), which made Ghostty look and feel too much like a "GNOME" application. In particular, Ghostty looked out of place on popular desktop environments like KDE Plasma.
Ghostty 1.1 on Linux now supports server-side decorations (SSD) for compositors that support it. This allows Ghostty to look and feel more like a native application on a wider variety of desktop environments. This can be disabled if you prefer CSD or no decorations at all.
<p align="center"> <a href="/images/1-1-0/csd.png" target="_blank"> </a> <a href="/images/1-1-0/ssd.png" target="_blank"> </a> </p>(Left/Top: Old Client-Side Decorations, Right/Bottom: New Server-Side Decorations)
The window-decoration configuration option now has a new value auto
which will use SSD if the compositor supports it and prefers it. A value
of server will force SSD (if available). A value of client will force
client-side decorations. And a value of none will disable decorations
entirely.
SSD is only supported on Wayland. Ghostty uses the KDE Server Decoration protocol. Despite the name, this protocol is supported on almost every major Wayland compositor, not just KDE. For X11, we could not find a well-supported protocol for SSD, so we continue to use CSD.
Future versions of Ghostty will continue to improve the native look and feel across different desktop environments in Linux to the best of our ability and protocol availability. For example, we're looking into native menu bars, currently.
Future versions of Ghostty will remove the gtk-adwaita option
and force a dependency on libadwaita. This is relevant to this change
because we found the vast majority of users who wanted SSD were using
gtk-adwaita = false to achieve this (which only worked in some cases).
With the new SSD support, this workaround is no longer necessary.
See the dedication section for more
details.
PR: #3567, #4332, #4539, #4854, #4933, #4999
For both macOS and Linux, we've tested IME with the following paradigms: CJK (Chinese, Japanese, Korean), dead keys (such as accented characters), emoji, Unicode hex input, and more and have massively improved the reliability and consistency of IME input.
On Linux, we've tested both fcitx and ibus under both X11 and
Wayland. We also tested multiple versions of each (in particular
versions that are common in LTS distributions). We found a bug in
ibus 1.5.29 that caused deadkey input to become "stuck" and worked
around it.
On macOS, we've ensured in particular that the AquaSKK and macSKK Japanese language input methods work out of the box, although we've also tested other IMEs and found them to work well as well.
PR: #4328
Keybinds support a new performable: prefix. This prefix indicates that
the keybind should only consume the input if the action is performed.
For example, the keybind below will only consume ctrl+c if there is
text able to be copied. Otherwise, ctrl+c will be passed to the shell
(typically causing an interrupt signal).
keybind = performable:ctrl+c=copy_to_clipboard
Alpha blending is the process of determining the result when a semi-transparent foreground color is placed in front of a background color. This affects the edges of text, and any images (displayed with Kitty Graphic Protocol) which have transparency in them.
Before, this was performed by blending colors in the sRGB color space, which causes darkening around the edges of text when the foreground and background colors are different highly saturated colors. With Ghostty 1.1 on macOS, alpha blending is now performed in the P3 color space by default, which reduces the darkening issue thanks to the wider gamut and matches the appearance of native macOS applications like Terminal.app and TextEdit.
Additionally, a configuration, alpha-blending, has been added to control this.
The default is native, which has been described, but two more options are
available:
linear performs blending in a linear color space, which is technically
correct but has downsides like dark text seeming too thin and light text
seeming too thick.linear-corrected is like linear but applies a correction step to text
which makes it appear extremely close to native, but without any darkening
problems.Below you can compare (from left to right) the old blending, the new native
blending, linear blending, and linear-corrected blending. You may have to
zoom in to see the differences correctly.
This is currently only available on macOS, but work is underway which should bring it to Linux as well in the future.
PR: #4049, #4501, #4999, #5361
The quick terminal now works with native fullscreen windows, space changes while the quick terminal is open, IME widgets, left/right docks, and more.
A new configuration quick-terminal-space-behavior has been added to
control how the quick terminal reacts to changing macOS spaces while it
is open. The default behavior is to follow the active space (move).
You can also set it to remain to stay on the space it was opened on.
Full list of closed issues on GitHub.
In each section, we try to sort improvements before bug fixes.
performable: prefix to keybindings to only consume
the input if the action is performed. See
"Performable" Keybindings.
#4328shell-integration-features now sets the proper environment variables
even when shell-integration is disabled. This is useful for environments
that manually source shell integration.
#5046copy_url_to_clipboard is available to copy
the URL (if any) under the cursor to the clipboard.
#4633close_tab can be used to close the tab and
all splits within the tab. This works on both macOS and GTK builds.
#4331ctrl+shift+j/ctrl+shift+alt+j keybindings to capture full
screen contents.
#5285file:// protocol can now be clicked
like any other hyperlink.
#4713split-divider-color to explicitly set the divider
color for splits. If this is not set, the previous default behavior of
automatically determining the color based on your terminal background
color is used.
#4236palette configuration option now allows binary, octal, and hexadecimal
keys.
#4298goto_split keybind parameter top and bottom have been renamed to
up and down, respectively. The old names are still supported for
backwards compatibility.
#3427\w instead of $PWD for abbreviated titles.
#4656sed, which significantly reduces
per-prompt overhead
#5141,
#5142wait-after-command was enabled.
#4884super+triple-click properly selects command output if the command line
wrapped.
#5373cursor-invert-fg-bg option now works well with the invert VT sequence.
#4777VTE_VERSION from environment prior to executing shell. This
fixes issues where VTE's shell integration would mistakenly think Ghostty
was libvte-based.
#4710640x480
#46889;4 parsing better matches ConEmu logic, fixing an
issue with some versions of systemd.
#4727unbind keybind action now also unbinds any matching physical
mapping.
#4703config-file now properly shows an error when theme
is also set.
#45099;1, 9;2, 9;3, 9;5 are now parsed and ignored so they
don't conflict with OSC 9 desktop notifications.
#4644,
#4327,
#4948,
#4447ctrl+c) encoding in legacy mode for
various keyboard layouts such as Russian.
#4518RLIMIT_NOFILE) is restored for the executed
shell or command.
#4241font-feature values can be comma-separated. Previously,
you had to repeat font-feature multiple times. This is still supported.
#3128clear_screen keybinding.
#3414~) in filepaths now expands to the user's home directory
in path-typed configuration values.
#3328XDG_CACHE_HOME.
#3458quick-terminal-space-behavior to configure
how the quick terminal reacts to changing macOS spaces while it is open.
The default behavior is to follow the active space (remain open).
#4049copy-on-select option
now defaults to true for macOS. A new "Paste Selection" menu item is
available on macOS. This behavior matches Terminal.app.
#4733font-thicken now accepts an optional numeric value to adjust
the thickening factor.
#4531cmd+h can now be bound).
#4591font-feature values such as cv02 = 2 are now
supported.
#3128~/Library/Caches).
#3458macos-titlebar-style = hidden, the titlebar area
can no longer be used to drag the window. You must now use option+drag
(standard macOS bindings) in the resize area.
#2523window-padding is set.
#4933toggle_visibility no longer separates tabs from their parent
window.
#4329ctrl+h now work as expected for
input method editors (IME).
#4854window-step-resize was used in conjunction with
an overly large initial window size.
#4801new_tab keybinding without any windows creates a new window.
#4691NSWindow from being
released when closed.
#4689command+<key> release events are now properly encoded for
the Kitty keyboard protocol.
#4591cmd+period and other keybinds can now be bound.
#4591auto-update option
can still be used to configure this.
#4433window-position-x and window-position-y
can be used to set the initial window position.
#3929macos-titlebar-style = hidden restores properly after exiting
non-native fullscreen.
#3535GTK: Support for server-side decorations (SSD) has been added.
This utilizes the existing window-decoration configuration option.
The new value is auto which will use SSD if the compositor supports
it and prefers it. A value of server will force SSD (if available).
A value of client will force client-side decorations. And a value
of none will disable decorations entirely.
See Server Side Decorations (SSD) on Linux.
#4630
GTK(X11): background-blur is now supported for any window manager
that respects the _KDE_NET_WM_BLUR_BEHIND_REGION atom.
#4403
GTK(Wayland): background-blur is now supported for any compositor
supporting the org_kde_kwin_blur_manager protocol (namely, KDE).
#4403
GTK: Add new configuration app-notifications to control what toasts
are shown.
#4460
GTK: Multiple custom-shader values are now supported (matching macOS)
#5037
GTK: A new configuration option gtk-titlebar-hide-when-maximized
(default false) added to hide the titlebar when the window is maximized
(not fullscreen).
#3381
GTK: Ghostty can now be pinned in the dock or task manager for supported desktop environments. #4930
GTK: Dropping files and selected text now works and matches macOS. #4211
"Open in Ghostty" shortcut for Nautilus is now available #4816
GTK: Fix adwaita tab bars appearing above the titlebar in some older versions of libadwaita. #5410
GTK: Fix slow startup times when XDG desktop portal is not available. #5064
GTK: fcitx and ibus under both X11 and Wayland work.
#4332
GTK: Workaround bug in ibus 1.5.29 that caused deadkey input to
become "stuck."
#3567
GTK(X11): When a new window is initially maximized, the _NET_WM_STATE
atom is properly set so the titlebar properly reflects the maximized
state.
#4646
GTK: last_tab keybind action works
#5004
GTK: The titlebar is automatically hidden when the window is fullscreen (and restored when the window exits fullscreen). #5008
GTK: Mouse no longer appears when the title changes and
mouse-hide-while-typing is set.
#3345
GTK: Fix segfault that would happen with older libadwaita versions
when ctrl+d was used to exit a window.
#4971
GTK: Ensure close confirmation appears in more scenarios such as pressing the "X" in the tab bar. #4234
GTK: OpenGL debug logging is now disabled by default for release builds but can be configured to be turned back on. #4662
GTK: Windows with libadwaita enabled can now be sized smaller than 482x322. #4836
GTK: Fix a handful of cases where compile-time version checks were done instead of runtime, disabling behavior when we shouldn't have. #4783
GTK: window-title-font-family now works (previously this was macOS-only)
#4560
GTK: Menu separator colors now match the system theme. #4421
GTK: Fix issues with fractional scaling. The terminal should now appear crisp on GTK displays with fractional scaling. #4255
GTK: A new configuration gtk-custom-css allows loading custom CSS
to theme GTK elements.
#4200
GTK: focus-follows-mouse works properly with goto_split keybindings.
#3229
GTK: Use gtk-xft-dpi for font scaling on Wayland (previously
we only used the value for X11). This allows the GNOME "Large Text"
setting to work properly.
#4424
GTK: ctrl+insert and shift+insert bindings have been added as
secondary defaults for copy and paste, respectively.
#2870
GTK: Paste preview text is now monospace. #4227
-Dstrip can be used to control binary stripping. Previously,
we automatically stripped release binaries. This can now be configured.
#3945-Dsentry can be used to explicitly enable or disable Sentry.
Linux builds by default have Sentry disabled. macOS builds by default
have Sentry enabled. Sentry only collects crash logs locally, it does
not transmit them via the network.
#3934-Demit-terminfo and -Demit-termcap can be
used to emit the source files.
#5311We plan to release a version 1.1.1 to address some additional bugs that didn't quite make the 1.1.0 release. We don't expect this release to happen quickly unless any critical issues or regressions are raised. Therefore, we recommend all package managers to upgrade to 1.1.0 as quickly as possible.
The focus for the next release will be to continue to resolve some issues
with certain keyboard layouts along with some fundamental issues with
window-step-resize on macOS. Additional unplanned functionality may
be introduced if unexpected contributors appear (thank you!).
We're reaching general wide-scale stability since our initial 1.0 release. I expect soon we'll move to even longer release cycles (months long) to allow the development team to focus on larger, more impactful features.
Starting with Ghostty 1.2, we plan to remove the gtk-adwaita option
and force a dependency on libadwaita. libadwaita is defaulted to on
already so unless you've explicitly disabled it, this change should
not affect you.
I expect for some this will be a controversial decision, so please read this section carefully to understand our motivation and the diligence we've done in making this decision. If you still have concerns, please reach out to us on GitHub or Discord.
The primary use case for gtk-adwaita = false in earlier versions of Ghostty
was to use it in concert with window-decoration = none to force some
compositors to use server-side decorations (SSD). Note this didn't work
in all cases and was never an explicit configuration goal; it just happened
to work in some cases. With the introduction of
explicit SSD support
in Ghostty 1.1, this workaround is no longer necessary.
Another use case for gtk-adwaita = false was in relation to theming.
Ghostty 1.1 introduces a
gtk-custom-css option
to easily inject custom CSS to theme GTK elements. We also introduced
more easily targetable class names across our GTK widgets. You could always
use system-wide CSS to theme Ghostty, but this new option makes it easier
to test and apply custom CSS specific to Ghostty.
For Ghostty maintainers, maintaining "classic GTK" and "libadwaita" code
paths is a significant burden, especially in addition to differences in
behavior across GTK and Adwaita versions and the complex interactions
of various Ghostty configurations (all the gtk- and adw- prefixed
options). This has led to a number of bugs and regressions that are
difficult to fix and test without expensive and complex CI setups.
With the SSD support in Ghostty 1.1 and the primary use case for
gtk-adwaita = false no longer necessary, we believe now is a good
time to make this change. We believe this will result in a more stable,
more maintainable, and more feature-rich Ghostty in the future (the last
point because we can go all-in on libadwaita features).
To better feel confident in this decision, we've also reached out directly to non-GNOME users of Ghostty as well as non-Ghostty users who complained about the look and feel of Ghostty (namely: bloggers, streamers, and YouTubers). The feedback was unanimously supportive of this change, understanding the reasoning and the benefits it would bring and acknowledging that explicit SSD support addresses the major concerns.
If you have strong opinions on this change, please reach out to us on Discord or GitHub. Please justify your argument with specific use cases and scenarios where this change would negatively impact you. Please do not just say "I don't like it" without providing a reason; it's not helpful. We are open to feedback and will consider it carefully. Thank you!