aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorakbash <akbash@herdr.dev>2026-08-09 14:50:11 +0300
committerGitHub <noreply@github.com>2026-08-09 14:50:11 +0300
commite7c38ab37f967d16e2eacdb0bbde2d933a332057 (patch)
tree3df712c664e7e33f192d8ce40a99fb0d06d51494
parentd277d2f83b749a38c90eb96ef7cd329cc2171cd7 (diff)
perf(ui): avoid full pane mode reads for scrollbars (#2554)
-rw-r--r--src/pane.rs4
-rw-r--r--src/pane/terminal.rs10
-rw-r--r--src/terminal/runtime.rs4
-rw-r--r--src/ui/panes.rs5
4 files changed, 19 insertions, 4 deletions
diff --git a/src/pane.rs b/src/pane.rs
index da99f55e..b2c01f01 100644
--- a/src/pane.rs
+++ b/src/pane.rs
@@ -2596,6 +2596,10 @@ impl PaneRuntime {
self.terminal.input_state()
}
+ pub fn alternate_screen_active(&self) -> bool {
+ self.terminal.alternate_screen_active()
+ }
+
pub fn cursor_state(&self, area: Rect, show_cursor: bool) -> Option<TerminalCursorState> {
if !show_cursor {
return None;
diff --git a/src/pane/terminal.rs b/src/pane/terminal.rs
index a6e5c1da..1c10726c 100644
--- a/src/pane/terminal.rs
+++ b/src/pane/terminal.rs
@@ -388,6 +388,10 @@ impl PaneTerminal {
self.ghostty.input_state()
}
+ pub fn alternate_screen_active(&self) -> bool {
+ self.ghostty.alternate_screen_active()
+ }
+
pub fn wheel_routing(&self) -> Option<crate::pane::WheelRouting> {
self.ghostty.wheel_routing()
}
@@ -1665,6 +1669,12 @@ impl GhosttyPaneTerminal {
core.kitty_keyboard.replay_ansi()
}
+ pub fn alternate_screen_active(&self) -> bool {
+ self.core.lock().is_ok_and(|core| {
+ core.terminal.active_screen().ok() == Some(crate::ghostty::ActiveScreen::Alternate)
+ })
+ }
+
pub fn input_state(&self) -> Option<InputState> {
let Ok(core) = self.core.lock() else {
return None;
diff --git a/src/terminal/runtime.rs b/src/terminal/runtime.rs
index 13e29690..d3900b68 100644
--- a/src/terminal/runtime.rs
+++ b/src/terminal/runtime.rs
@@ -315,6 +315,10 @@ impl TerminalRuntime {
self.0.input_state()
}
+ pub fn alternate_screen_active(&self) -> bool {
+ self.0.alternate_screen_active()
+ }
+
pub fn cursor_state(
&self,
area: Rect,
diff --git a/src/ui/panes.rs b/src/ui/panes.rs
index df9813cf..cce8ab02 100644
--- a/src/ui/panes.rs
+++ b/src/ui/panes.rs
@@ -32,10 +32,7 @@ fn pane_border_title(label: &str, pane_width: u16, _focused: bool) -> Option<Str
}
fn terminal_inner_rect(rt: &TerminalRuntime, pane_inner: Rect, pane_scrollbars: bool) -> Rect {
- if !pane_scrollbars
- || pane_inner.width <= 4
- || rt.input_state().is_some_and(|state| state.alternate_screen)
- {
+ if !pane_scrollbars || pane_inner.width <= 4 || rt.alternate_screen_active() {
return pane_inner;
}