aboutsummaryrefslogtreecommitdiff
path: root/src/pane
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-09-03 14:24:33 +0300
committerGitHub <noreply@github.com>2026-09-03 14:24:33 +0300
commit9a2a7af5402f2bc67ab24c8b4c14c6dd20a43bb2 (patch)
tree902f701de84d6fb7e08d16baaa85f99367cb9912 /src/pane
parent94f6d9c0d9bb9cf9ffae99d8bbfb09e9bf2fc9e0 (diff)
perf: compress idle terminal scrollback (#3556)
Diffstat (limited to 'src/pane')
-rw-r--r--src/pane/terminal.rs50
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