Commit Graph

13807 Commits

Author SHA1 Message Date
Mitchell Hashimoto
6da5f72c45 Lower unimplemented OSC from warning to debug (#10184)
The "unimplemented OSC command" warning is a frequent source of red
herrings as there are many OSCs that we parse but deliberately do not
implement. It's also a small drag on performance due to the function
call overhead and the overhead of formatting and outputting the message.
This PR lowers the message from warning to debug. Debug logs are
compiled out of release builds so there should be less confusion from
general users who will no longer see the message.
2026-01-06 08:52:54 -08:00
Aaron Ruan
9b6a3be993 macOS: Selection for Find feature
Adds the `selection_for_search` action, with Cmd+E keybind by default.
This action inputs the currently selected text into the search
field without changing focus, matching standard macOS behavior.
2026-01-06 22:21:55 +08:00
Kat
b4a44bc47e i18n: Add missing German translation (#10164) 2026-01-06 13:01:39 +00:00
Jan Klass
1c7ba3dbe0 Update rev date and last translator 2026-01-06 10:26:40 +01:00
Peter Guy
93f33bc0d6 clarify config documentation around previously focused windows/tabs/splits 2026-01-05 16:47:04 -08:00
Peter Guy
55285fee28 preserve multi-line formatting 2026-01-05 16:47:04 -08:00
Peter Guy
b119bc6089 consolidated enums 2026-01-05 16:47:04 -08:00
Peter Guy
d660799723 Consolidate the several ghostty_surface_inherited_config
functions back into a single function with a second parameter for the source context.
2026-01-05 16:47:04 -08:00
Peter Guy
c035fb5385 Add an enum type for the C API 2026-01-05 16:47:04 -08:00
Peter Guy
0af2a3f693 Enable distinguishing between a new tab in a new window
(which should inherit based on the window setting),
and a new tab in an existing window
(which should inherit base on tab setting)
2026-01-05 16:47:04 -08:00
Peter Guy
82614511ab Use the new GTK Surface::setParent from the tab and split 2026-01-05 16:47:04 -08:00
Peter Guy
05229502bf Add the surface context to the Surface's setParent
In order to set the private context variable so that initiSurface can use it.
2026-01-05 16:47:04 -08:00
Peter Guy
496f5b3ed7 Add the context to the Swift layer.
- Define NewSurfaceContext to match the Zig enum name and avoid magic numbers.
2026-01-05 16:47:04 -08:00
Peter Guy
dba0ff5339 Add C API function to handle new surfaces of different types 2026-01-05 16:47:04 -08:00
Peter Guy
7cf4c8dc53 Add context field to C config struct 2026-01-05 16:47:04 -08:00
Peter Guy
02e1a68263 Use config to determine cwd inheritance for windows, tabs, and splits
- Define NewSurfaceContext enum (window, tab, split)
- Add shouldInheritWorkingDirectory helper function
- Thread surface context through newConfig and newSurfaceOptions
- Replace window-inherit-working-directory checks with context-aware logic
- Add context to embedded CAPI and GTK Surface structs
2026-01-05 16:47:04 -08:00
Peter Guy
87fc5357eb Add config entries for tab and split inheritance 2026-01-05 16:47:04 -08:00
Jeffrey C. Ollie
f3e90e23d9 Lower unimplemented OSC from warning to debug 2026-01-05 15:47:49 -06:00
Mitchell Hashimoto
c5bc6bb2ce fix: use flush instead of end on stdout in code generators for Windows compatibility (#10150)
This fixes the Windows build failure discussed in
https://github.com/ghostty-org/ghostty/discussions/10148

When building on Windows, `symbols-unigen` and `props-unigen` crash with
`error.FileTooBig` because `stdout.end()` calls `setEndPos()` to
truncate the output. Windows does not support `SetEndOfFile` on pipes or
console handles - it returns `ERROR_INVALID_PARAMETER`, which Zig maps
to `error.FileTooBig`.

Using `flush()` instead of `end()` is correct here because:

1. `end()` flushes AND truncates - useful when overwriting files that
might have leftover content
2. For stdout captured as a pipe, there's nothing to truncate - we're
writing sequentially to a fresh pipe
3. `flush()` ensures all buffered data is sent, which is all that's
needed

CI before fix was failing with FileTooBig, after fix builds
successfully:
https://github.com/remorses/opentui/actions/runs/20671299561/job/59352503875
2026-01-05 11:44:13 -08:00
Mitchell Hashimoto
09ae4c200c Update iTerm2 colorschemes (#10157)
Upstream release:
https://github.com/mbadolato/iTerm2-Color-Schemes/releases/tag/release-20251229-150532-f279991
2026-01-05 11:35:32 -08:00
Mitchell Hashimoto
dda27d43be font/shaper: Fix CoreText position.y for some scripts (#10179)
This PR simplifies and corrects the logic for placing a glyph
vertically, by using the `position.y` from `CoreText` directly, instead
of using an offset from the cell's starting `y`. The logic was incorrect
from the beginning, always treating the first glyph of a cell as being
at `y` of zero. We only need to be subtracting the cell's starting `x`
to align the glyphs to the cell grid.

Enabling the commented out logging, I found no instances of `position.y
differs from old offset.y` lines with `JetBrains Mono` with ligatures
turned on, but running
[ttylang](https://github.com/jacobsandlund/ttylang) (printing the
Universal Declaration of Human Rights in various languages) revealed 676
instances of this, with many only slightly off.

An example log from some Tai Tham text is the following, and this PR
adds a test based on this:

```
...pos=(0.00,-8.21) run_offset=(69.41,-8.21) cell_offset=(69.41,-8.21) old offset.y=0.00 cps = \u{1a49}\u{1a60} \u{1a3f}▸\u{1a69} \u{1a2f} → ᩉ᩠ᨿᩩᨯ
```

Browsers display this as:

ᩉ᩠ᨿᩩ

`main` is printing:

<img width="852" height="90" alt="CleanShot 2026-01-05 at 10 28 17@2x"
src="https://github.com/user-attachments/assets/c97b738c-8fe4-48b5-81f8-e0e79f1a9269"
/>

this PR prints:

<img width="958" height="90" alt="CleanShot 2026-01-05 at 10 29 07@2x"
src="https://github.com/user-attachments/assets/88fd26a7-8041-4b33-ab02-56f411204b04"
/>

Since this is a ligature of two different grapheme clusters, Ghostty
ends up subtracting too much of the `x` value with the `cell_offset.x`
(starting x), so neither of the screenshots above are correct, but the
second is closer and gets the `y` value right.

AI disclaimer: I didn't use AI for the code, but did ask it about this
Tai Tham text and why it wasn't a single grapheme cluster:
https://ampcode.com/threads/T-019b8ea2-1822-75bb-a8eb-55a9ddb9f7ea
2026-01-05 11:17:16 -08:00
Mitchell Hashimoto
151dd33f31 fix: remove progress bar on reset terminal (#10178)
closes #10168

ai disclosure: i fully used claude code to generate this pr, but change
seems straightforward enough and have manually tested it.
2026-01-05 09:35:36 -08:00
Jacob Sandlund
15899b70fb simplify run_offset_x comment 2026-01-05 10:35:22 -05:00
Jacob Sandlund
7aec7effea Add test for Tai Tham letter position.y difference 2026-01-05 10:12:05 -05:00
Jacob Sandlund
41f63384f5 Turn off debugging 2026-01-05 09:59:37 -05:00
Jacob Sandlund
f31d2b99ae Merge remote-tracking branch 'upstream/main' into coretext-position-y 2026-01-05 09:58:10 -05:00
Jacob Sandlund
d38558aee1 Show current cp with ▸ in list of cps 2026-01-05 09:34:17 -05:00
Peter Cardenas
f36abed35a fix: reset progress bar on reset terminal 2026-01-05 05:26:33 -08:00
Jan Klass
b830a8397c Update po/de_DE.UTF-8.po
Co-authored-by: Klaus Hipp <khipp@users.noreply.github.com>
2026-01-05 10:48:09 +01:00
Jacob Sandlund
1d4a5d91e0 More debugging for position.y differences 2026-01-04 21:24:45 -05:00
Jan Klass
742c9ca390 i18n: Add missing German translation 2026-01-04 23:44:04 +01:00
mitchellh
bd20f844aa deps: Update iTerm2 color schemes 2026-01-04 00:16:28 +00:00
Tommy D. Rossi
e2de0bfd93 fix: clarify error codes in comment 2026-01-03 13:44:29 +01:00
Tommy D. Rossi
4ea669562e fix: use flush instead of end on stdout in code generators for Windows compatibility 2026-01-03 13:43:27 +01:00
Eric Bower
f316c969a5 chore: update test expectation 2026-01-01 20:24:33 -05:00
Eric Bower
ea03c5c8a2 fix: reset style to prevent bleeding bg colors newline 2026-01-01 20:15:41 -05:00
Eric Bower
6fdbc29b9a fix(formatter): preserve background colors on cells without text
The VT formatter was treating cells without text as blank and emitting
them as plain spaces, losing any background color styling. This caused
TUIs like htop to lose their background colors when rehydrating terminal
state (e.g., after detach/reattach in zmx).

For styled formats (VT/HTML), cells with background colors or style_id
are now emitted with proper SGR sequences and a space character instead
of being accumulated as unstyled blanks.

Adds handling for bg_color_palette and bg_color_rgb content tags which
were previously unreachable.

Reference: https://ampcode.com/threads/T-019b7a35-c3f3-73fc-adfa-00bbe9dbda3c
2026-01-01 20:07:27 -05:00
Mitchell Hashimoto
1c2db85aa4 fix: Mac window becomes unmovable after pane rearrangement (#10133)
On main, after rearranging panes, the window becomes permanently
immovable. Grab handles temporarily set `window.isMovable = false` on
hover to prevent window dragging from interfering with pane drags
(fixing [#10110](https://github.com/ghostty-org/ghostty/issues/10110)),
but the restoration logic failed when views were destroyed during pane
rearrangement (which happens each time a pane is rearranged).

The previous approach managed `window.isMovable` state across the view
lifecycle:

1. `mouseEntered` → saved and disabled `window.isMovable`
2. View removed during rearrangement → `mouseExited` never fired
3. `deinit` ran with `self.window` already nil → restoration failed
4. Window stuck with `isMovable = false`

Instead of managing window state, prevent the mouseDown event from
reaching the window's drag handler by overriding mouse event handling in
the grab handle view.

Per [Apple's Event Handling
Guide](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html):

> Custom NSView objects should not invoke super in their implementations
of NSResponder mouse-event-handling methods such as mouseDown:,
mouseDragged: and mouseUp: unless it is known that the inherited
implementation provides some needed functionality.

This eliminates all state management while solving both the original
issue (#10110) and the new bug.

AI disclosure: claude code found and wrote the fix. I tested it manually
to see that it works. I pressed claude quite hard here to come up with
the best fix, and looked at documentation to understand what the fix was
doing. It seems like this is a better approach overall to preventing the
main window from being dragged when grabbing the Surface Drag handle.
2026-01-01 16:21:15 -08:00
Martin Emde
c384cd050e Fix Mac window becomes unmovable after pane rearrangement
After rearranging panes, the window becomes permanently unmovable.
Grab handles temporarily set `window.isMovable = false` on hover to prevent
window dragging from interfering with pane dragging.

Override `viewWillMove(toWindow:)` to catch when the view is being removed from
the window. This lifecycle method is called before the window reference
becomes nil, allowing us to restore `window.isMovable`.
2026-01-01 15:56:25 -08:00
Mitchell Hashimoto
9a21e56311 Add iTimeFocus shader uniform to track time since focus (#10130)
When using split panes with custom shaders, unfocused panes receive
frame re-draws when mod keys are held or when the mouse hovers over a
link. This behavior is desirable in general, but shaders have no way to
detect when the frames they are drawing are "real" or a momentary glitch
frame.

Fixes #8456 indirectly, by allowing the shader to be updated to handle
this situation.

This PR adds two new shadertoy uniforms:

```glsl
float iTimeFocus
```

- Timestamp of when the surface last gained focus (set to current iTime,
similar to iTimeCursorChange timestamp)
- Allows calculating time since focus: iTime - iTimeFocus
- Resets on each focus gain, enabling "focus trigger" animations
- Uses the same focus state signal that changes unfocused-split-fill
config option

```glsl
float iFocus
```

- Current focus state: 1.0 when focused, 0.0 when unfocused
- Simple boolean check: if (iFocus == 1.0)
- This indicates that the frame being rendered is a defocused frame (for
example, upon leaving the surface, or when a mod key is held or an OSC8
link is hovered), allowing shaders to apply consistently instead of
flashing.

## Example

This does nothing, but it does show the two costumes and how you might
use them

```glsl
  void mainImage(out vec4 fragColor, in vec2 fragCoord) {
      if (iFocus == 1.0) {
          // Focused: animate based on time since focus
          float timeSinceFocus = iTime - iTimeFocus;
          // Resume normal animation
      } else {
          // Unfocused: dim or hide effects
      }
  }
```

Here's the included example shader being applied to this test build:


https://github.com/user-attachments/assets/4932e12f-6a1c-42dd-81f3-19da9a551c95

And here's a [more exciting
shader](https://github.com/martinemde/dotfiles/blob/main/home/dot_config/ghostty/focus_vignette.glsl)
that locates your cursor upon switching to a surface, renders a
fade/zoom in of the cursor on focus, and applies a shadow vignette to
the defocused surfaces.


https://github.com/user-attachments/assets/32b98956-59f0-4e4b-9c2f-ab79b147205f

AI disclosure: I used claude code to generate everything is this PR, but
I reviewed it, understand what it is doing, tested it manually, and
believe it is correct. I also tested by directly creating shadertoys
that use the new costumes (shown above) and have uploaded the examples
here showing that it works.
2026-01-01 13:14:30 -08:00
Martin Emde
ec2612f9ce Add iTimeFocus shader uniform to track time since focus 2026-01-01 13:11:54 -08:00
Mitchell Hashimoto
bde9578adc macOS: flash menu bar when using keyboard shortcuts (#10122)
When you press a keyboard shortcut that has a menu equivalent, the menu
bar should flash briefly. This is standard macOS behavior.

This change calls `performKeyEquivalent` on the main menu before
checking Ghostty bindings, so shortcuts with menu items get handled by
the menu system first.

This works for most shortcuts - Cmd+V, Cmd+N, Cmd+T, etc. all flash now.

Won't flash for `performable: true` (like Cmd+C copy) -- excluded from
menu: https://github.com/ghostty-org/ghostty/discussions/2811

The change skips menu handling when in a key sequence or key table, so
those still work correctly.
2026-01-01 12:47:47 -08:00
Ivan Buiko
c89627fe75 macOS: Add menu shortcut handling in macOS key event processing
Allow menu bar to flash for shortcuts and handle key equivalents before
checking for Ghostty key bindings
2026-01-01 12:47:16 -08:00
Mitchell Hashimoto
b3fbf11b0c macOS: temporarily disable window.isMovable to fix #10110 (#10125)
Fixes #10110
2026-01-01 12:45:08 -08:00
Jon Parise
2c6c6e1b69 macos: simplify .keyDown guard condition (#10127)
This condition is more naturally expressed as a `guard`.
2026-01-01 11:52:58 -05:00
Eric Bower
c081adce05 chore: write page vt test bg color with trailing row
The issue is in ghostty_src/src/terminal/formatter.zig#L1117-L1129:

- Cells without text are treated as "blank" (line 1117-1119) - this includes cells that only have background colors
- When blank cells are emitted, they're plain spaces (line 1129) - writer.splatByteAll(' ', blank_cells) outputs spaces without any SGR styling
- Background-only cells (bg_color_palette, bg_color_rgb) are marked unreachable (lines 1233-1235) because the code assumes hasText() already filtered them

This means when htop draws a row like:

`[green bg]CPU: 45%[red bg]          [default]`

The trailing cells with red background but no text get accumulated as blanks and emitted as plain spaces - losing the background color.
2026-01-01 10:47:40 -05:00
Jon Parise
12024ed831 macos: simplify .keyDown guard condition
This condition is more naturally expressed as a `guard`.
2026-01-01 10:17:48 -05:00
Lukas
1249f3b88c macOS: temporarily disable window.isMovable to fix #10110 2026-01-01 14:37:08 +01:00
Lukas
74fc48682a macOS: remove unused file 2026-01-01 14:31:11 +01:00
Mitchell Hashimoto
3a89c8ac54 Update Imgui from 1.90.6 to 1.92.5, use Dear Bindings instead of cimgui (#10118)
This updates our Imgui version from 1.90.6 to 1.92.5 which is almost 18
months of changes. In the process, we've also migrated from cimgui to
Dear Bindings, the official way to do C bindings.

This PR doesn't contain any functionality changes, only the dependency
change and API changes necessary to achieve the same behavior.
2025-12-31 13:53:36 -08:00