From bf9cc201244946496b4d950046bf7edcc4892994 Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Thu, 28 May 2026 04:11:56 +0300 Subject: fix: preserve live handoff terminal state --- src/ghostty/mod.rs | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'src/ghostty') diff --git a/src/ghostty/mod.rs b/src/ghostty/mod.rs index 62d55835..9eda90d7 100644 --- a/src/ghostty/mod.rs +++ b/src/ghostty/mod.rs @@ -806,6 +806,64 @@ impl Terminal { ) } + pub fn keyboard_state_ansi(&self) -> Result { + self.format_keyboard_state_ansi(false) + } + + pub fn kitty_keyboard_state_ansi(&self) -> Result { + self.format_keyboard_state_ansi(true) + } + + fn format_keyboard_state_ansi(&self, kitty_keyboard: bool) -> Result { + let mut formatter: ffi::GhosttyFormatter_ptr = ptr::null_mut(); + let options = ffi::GhosttyFormatterTerminalOptions { + size: mem::size_of::(), + emit: FormatterFormat::Vt.as_raw(), + unwrap: false, + trim: false, + extra: ffi::GhosttyFormatterTerminalExtra { + size: mem::size_of::(), + keyboard: true, + screen: ffi::GhosttyFormatterScreenExtra { + size: mem::size_of::(), + kitty_keyboard, + ..Default::default() + }, + ..Default::default() + }, + selection: ptr::null(), + }; + unsafe { + ffi::ghostty_formatter_terminal_new(ptr::null(), &mut formatter, self.raw, options) + .into_result()?; + } + + let mut out_ptr = ptr::null_mut(); + let mut out_len = 0usize; + let result = unsafe { + ffi::ghostty_formatter_format_alloc(formatter, ptr::null(), &mut out_ptr, &mut out_len) + }; + unsafe { + ffi::ghostty_formatter_free(formatter); + } + result.into_result()?; + + let text = if out_len == 0 { + String::new() + } else { + let bytes = unsafe { slice::from_raw_parts(out_ptr.cast_const(), out_len) }; + String::from_utf8_lossy(bytes).into_owned() + }; + + if !out_ptr.is_null() { + unsafe { + ffi::ghostty_free(ptr::null(), out_ptr, out_len); + } + } + + Ok(text) + } + fn read_formatted_selection( &self, start: ffi::GhosttyPoint, -- cgit v1.2.3