diff options
| author | Can Celik <ogulcancelik@gmail.com> | 2026-09-03 14:24:33 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-09-03 14:24:33 +0300 |
| commit | 9a2a7af5402f2bc67ab24c8b4c14c6dd20a43bb2 (patch) | |
| tree | 902f701de84d6fb7e08d16baaa85f99367cb9912 /src/pane | |
| parent | 94f6d9c0d9bb9cf9ffae99d8bbfb09e9bf2fc9e0 (diff) | |
perf: compress idle terminal scrollback (#3556)
Diffstat (limited to 'src/pane')
| -rw-r--r-- | src/pane/terminal.rs | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/pane/terminal.rs b/src/pane/terminal.rs index 154a9539..ecc12ed5 100644 --- a/src/pane/terminal.rs +++ b/src/pane/terminal.rs @@ -176,6 +176,13 @@ pub(crate) struct TerminalReadSnapshot { pub truncated: bool, } +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum TerminalCompressionStep { + Busy, + ActivityChanged(u64), + Compressed(crate::ghostty::TerminalCompressionResult), +} + pub(crate) struct GhosttyPaneTerminal { pub core: Mutex<GhosttyPaneCore>, key_encoder: Mutex<crate::ghostty::KeyEncoder>, @@ -479,6 +486,18 @@ impl PaneTerminal { self.ghostty.detection_text() } + pub(crate) fn try_compression_activity(&self) -> Result<Option<u64>, crate::ghostty::Error> { + self.ghostty.try_compression_activity() + } + + pub(crate) fn try_compress_incremental_if_activity( + &self, + expected_activity: u64, + ) -> Result<TerminalCompressionStep, crate::ghostty::Error> { + self.ghostty + .try_compress_incremental_if_activity(expected_activity) + } + pub(crate) fn recent_text_snapshot(&self, lines: usize) -> TerminalReadSnapshot { self.ghostty.recent_text_snapshot(lines) } @@ -2074,6 +2093,37 @@ impl GhosttyPaneTerminal { .unwrap_or_default() } + fn try_lock_core(&self) -> Option<std::sync::MutexGuard<'_, GhosttyPaneCore>> { + match self.core.try_lock() { + Ok(core) => Some(core), + Err(std::sync::TryLockError::WouldBlock) => None, + Err(std::sync::TryLockError::Poisoned(poisoned)) => Some(poisoned.into_inner()), + } + } + + pub(crate) fn try_compression_activity(&self) -> Result<Option<u64>, crate::ghostty::Error> { + let Some(core) = self.try_lock_core() else { + return Ok(None); + }; + core.terminal.compression_activity().map(Some) + } + + pub(crate) fn try_compress_incremental_if_activity( + &self, + expected_activity: u64, + ) -> Result<TerminalCompressionStep, crate::ghostty::Error> { + let Some(mut core) = self.try_lock_core() else { + return Ok(TerminalCompressionStep::Busy); + }; + let activity = core.terminal.compression_activity()?; + if activity != expected_activity { + return Ok(TerminalCompressionStep::ActivityChanged(activity)); + } + core.terminal + .compress_incremental() + .map(TerminalCompressionStep::Compressed) + } + #[cfg(test)] pub fn recent_text(&self, lines: usize) -> String { self.recent_text_snapshot(lines).text |
