56 Commits

Author SHA1 Message Date
Mitchell Hashimoto
238015c171 termio: simplify logging to remove undefined access 2025-07-18 15:17:41 -07:00
Mitchell Hashimoto
81cef6e63b various cleanups around scroll timers 2025-06-30 09:40:49 -07:00
moni-dz
f73c90bf5d surface: add timer-based scrolling during selection 2025-06-30 09:17:20 -07:00
moni-dz
c00b8740aa termio: add selection scrolling callback 2025-06-30 09:15:53 -07:00
Mitchell Hashimoto
591ef0f40f Move child exit handling logic to apprt thread
Fixes #7500
Supersedes #7582

This commit moves the child exit handling logic from the IO thead to the
apprt thread. The IO thread now only sends a `child_exited` message to
the apprt thread with metadata about the exit conditions (exit code,
runtime).

From there, the apprt thread can handle the exit situation however is
necessary. This commit doesn't change the behavior but it does fix the
issue #7500. The behavior is: exit immediately, show abnormal exit
message, wait for user input, etc.

This also gets us closer to #7649.
2025-06-27 10:36:23 -07:00
Mitchell Hashimoto
1947afade9 input configuration to pass input as stdin on startup
This adds a new configuration `input` that allows passing either raw
text or file contents as stdin when starting the terminal.

The input is sent byte-for-byte to the terminal, so control characters
such as `\n` will be interpreted by the shell and can be used to run
programs in the context of the loaded shell.

Example: `ghostty --input="hello, world\n"` will start the your default
shell, run `echo hello, world`, and then show the prompt.
2025-06-22 18:18:16 -04:00
Qwerasd
7cfc906c60 debug: properly set thread names on macOS 2025-06-20 15:18:41 -06:00
Mitchell Hashimoto
d532a6e260 Update libxev to use dynamic backend, support Linux configurability
Related to #3224

Previously, Ghostty used a static API for async event handling: io_uring
on Linux, kqueue on macOS. This commit changes the backend to be dynamic
on Linux so that epoll will be used if io_uring isn't available, or if
the user explicitly chooses it.

This introduces a new config `async-backend` (default "auto") which can
be set by the user to change the async backend in use. This is a
best-effort setting: if the user requests io_uring but it isn't
available, Ghostty will fall back to something that is and that choice
is up to us.

Basic benchmarking both in libxev and Ghostty (vtebench) show no
noticeable performance differences introducing the dynamic API, nor
choosing epoll over io_uring.
2025-02-21 15:04:37 -08:00
Mitchell Hashimoto
dcb1ce8377 termio: change resize message to use new size struct 2024-11-14 13:23:24 -08:00
Mitchell Hashimoto
a436bd0af6 move datastructures to dedicated "datastruct" package 2024-11-07 14:39:10 -08:00
Tim Culverhouse
4f1cee8eb9 fix: report correct screen pixel size
Mode 2048 and CSI 14 t are size report control sequences which contain
the text area size in pixels. The text area is defined to be the extents
of the grid (rows and columns). Ghostty calculates the available size
for the text area by setting the available padding, and then filling as
much of the remaining space as possible. However, if there are remainder
pixels these are still reported as part of the text area size.

Pass the cell_size geometry through so that we can always report the
correct value: columns * cell width and rows * cell height.
2024-10-18 22:29:52 -05:00
Gregory Anders
df06697899 termio: send initial focus reports
When the focus reporting mode (1004) is enabled, send the current focus
state. This allows applications to track their own focus state without
first having to wait for a focus event (or query
it by sending a DECSET followed by a DECRST).

Ghostty's focus state is stored only in the renderer, where the termio
thread cannot access it. We duplicate the focus state tracking in the
Terminal struct with the addition of a new (1-bit) flag. We duplicate
the state because the renderer uses the focus state for its own purposes
(in particular, the Metal renderer uses the focus state to manage
its DisplayLink), and synchronizing access to the shared terminal state
is more cumbersome than simply tracking the focus state in the renderer
in addition to the terminal.
2024-09-04 22:13:52 -05:00
Mitchell Hashimoto
bae12993b3 crash: tag the thread type 2024-09-02 10:02:14 -07:00
Mitchell Hashimoto
d499f7795b input: crash binding can configure which thread to crash 2024-09-02 09:44:35 -07:00
Mitchell Hashimoto
8f477b00da renderer/termio attach thread local state for crash capture 2024-09-01 14:15:12 -07:00
Jeffrey C. Ollie
ce5e55d4aa Implement the XTWINOPS (CSI t) control sequences that "make sense".
These sequences were implemented:

CSI 14 t - report the text area size in pixels
CSI 16 t - report the cell size in pixels
CSI 18 t - report the text area size in cells
CSI 21 t - report the window title

These sequences were not implemented because they manuipulate the window
state in ways that we do not want.

CSI 1 t
CSI 2 t
CSI 3 ; x ; y t
CSI 4 ; height ; width ; t
CSI 5 t
CSI 6 t
CSI 7 t
CSI 8 ; height ; width ; t
CSI 9 ; 0 t
CSI 9 ; 1 t
CSI 9 ; 2 t
CSI 9 ; 3 t
CSI 10 ; 0 t
CSI 10 ; 1 t
CSI 10 ; 2 t
CSI 24 t

These sequences were not implemented because they do not make sense in
a Wayland context:

CSI 11 t
CSI 13 t
CSI 14 ; 2 t

These sequences were not implemented because they provide information
about the screen that is unnecessary.

CSI 15 t
CSI 19 t

These sequences were not implemeted because Ghostty does not maintain an
icon title for windows.

CSI 20 t
CSI 22 ; 0 t
CSI 22 ; 1 t
CSI 23 ; 0 t
CSI 23 ; 1 t

These sequences were not implemented because of the additional
complexity of maintaining a stack of window titles.

CSI 22 ; 2 t
CSI 23 ; 2 t
2024-08-07 00:12:20 -05:00
Mitchell Hashimoto
137ba66211 terminal: implement in-band size reports (Mode 2048)
https://gist.github.com/rockorager/e695fb2924d36b2bcf1fff4a3704bd83
2024-07-17 10:18:15 -07:00
Mitchell Hashimoto
835d622baa termio: writer => mailbox 2024-07-15 10:23:09 -07:00
Mitchell Hashimoto
485346c694 termio: more windows fixes 2024-07-14 18:15:19 -07:00
Mitchell Hashimoto
af7adedb50 termio: writer abstraction 2024-07-14 14:48:48 -07:00
Mitchell Hashimoto
31144da845 termio: Thread doesn't need to hold termio pointer 2024-07-14 10:27:58 -07:00
Mitchell Hashimoto
c4484938c5 termio: wip but it builds 2024-07-13 15:19:38 -07:00
Mitchell Hashimoto
49c92fd0e6 termio: rename Exec to Termio throughout 2024-07-13 15:19:37 -07:00
Mitchell Hashimoto
25d84d697a termio/exec: get compiler errors gone 2024-03-22 20:27:44 -07:00
Mitchell Hashimoto
b87bbd55c5 termio: handle termio thread failure by showing a message in window
Fixes #1301
2024-01-15 20:22:55 -08:00
Mitchell Hashimoto
adb7958f61 remove tracy usage from all files 2024-01-13 15:06:08 -08:00
Jeffrey C. Ollie
792284fb69 Add exit code and runtime to abnormal exit error message. 2023-12-30 22:24:25 -06:00
Mitchell Hashimoto
f3aaa884c6 termio/exec: use message to writer thread so we can output failed cmd 2023-12-30 17:51:34 -08:00
Mitchell Hashimoto
5a299e14e4 all threads are notified of inspector state, trigger render 2023-10-24 15:27:15 -07:00
Mitchell Hashimoto
5ce50d08a1 terminal: linefeed mode 2023-10-12 20:46:26 -07:00
Mitchell Hashimoto
5168dc7645 renderer: do not render if synchronized output is on 2023-08-28 11:38:11 -07:00
Mitchell Hashimoto
2cc1e43716 termio: handle all the synchronized output setting, timer 2023-08-28 11:35:40 -07:00
Mitchell Hashimoto
a8380e937d scroll top, bot, page up, page down binding actions 2023-08-09 07:24:11 -07:00
Mitchell Hashimoto
9f86c48fd8 keybinding jump_to_prompt for semantic prompts 2023-07-06 10:30:29 -07:00
Mitchell Hashimoto
b0b3b0af2d update config messages use pointers now to make messages small again 2023-03-19 10:48:42 -07:00
Mitchell Hashimoto
8f0be3ad9e termio: use DerivedConfig 2023-03-19 10:09:17 -07:00
Mitchell Hashimoto
15b7e7fcd7 termio: coalesce resize events
On macOS, we were seeing resize events dropped by child processes if
too many SIGWNCH events were generated.
2023-03-08 08:43:42 -08:00
Mitchell Hashimoto
89d07fcd83 clear_history binding, default Cmd+K 2023-03-03 09:27:47 -08:00
Mitchell Hashimoto
fc3802e632 termio: use host-spawn for pty 2023-02-25 22:36:20 -08:00
Mitchell Hashimoto
11d6e91228 termio: reader thread is thread-safe for writing to writer 2023-02-06 14:52:24 -08:00
Mitchell Hashimoto
f07e21c22e remove libuv from build 2023-02-04 17:37:51 -08:00
Mitchell Hashimoto
7e6a86f065 termio: use libxev (with TODOs) 2023-02-04 11:47:51 -08:00
Mitchell Hashimoto
1273527048 renderer uses libxev
Still some bugs and TODOs, but it is workable.
2023-02-01 15:52:22 -08:00
Mitchell Hashimoto
a15afa8211 do not block channel send while draining channel 2022-11-20 20:16:40 -08:00
Mitchell Hashimoto
860fbc3aee padding needs to be sent to termio 2022-11-14 17:25:35 -08:00
Mitchell Hashimoto
5b52333e51 name threads and add more tracing 2022-11-07 07:45:46 -08:00
Mitchell Hashimoto
e0db46ac97 clean up some resources better on error 2022-11-06 16:23:36 -08:00
Mitchell Hashimoto
8f1fcc64e8 rename termio thread message struct 2022-11-05 19:34:41 -07:00
Mitchell Hashimoto
95d054b185 allocate data for paste data if its too large 2022-11-05 19:31:28 -07:00
Mitchell Hashimoto
f2d9475d5d Switch over to the IO thread. A messy commit! 2022-11-05 19:31:26 -07:00