aboutsummaryrefslogtreecommitdiff
path: root/src/pane.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-07-28 23:29:11 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-07-28 23:29:11 +0300
commite27a4ea427c9ed6248c0ee80570e94ed7b1928bd (patch)
tree0cae21a2b3939293be129aaaecb23641f68bab54 /src/pane.rs
parente16d7d8c07a20f5ee0b4111808680bbcfd7df9ac (diff)
perf: skip rendering hidden pty updates
Diffstat (limited to 'src/pane.rs')
-rw-r--r--src/pane.rs23
1 files changed, 12 insertions, 11 deletions
diff --git a/src/pane.rs b/src/pane.rs
index a26dad6b..3bf94ec0 100644
--- a/src/pane.rs
+++ b/src/pane.rs
@@ -22,6 +22,7 @@ use crate::detect::{Agent, AgentState};
use crate::events::AppEvent;
use crate::layout::PaneId;
use crate::pty::actor::{PtyIoActor, PtyIoActorConfig, PtyIoActorHandle, PtyReadResult};
+use crate::render_signal::RenderSignal;
mod agent_detection;
mod cursor;
@@ -1603,7 +1604,7 @@ impl PaneRuntime {
launch_env: &PaneLaunchEnv,
events: mpsc::Sender<AppEvent>,
render_notify: Arc<Notify>,
- render_dirty: Arc<AtomicBool>,
+ render_dirty: Arc<RenderSignal>,
) -> std::io::Result<Self> {
Self::spawn_with_initial_history(
pane_id,
@@ -1635,7 +1636,7 @@ impl PaneRuntime {
initial_history_ansi: Option<&str>,
events: mpsc::Sender<AppEvent>,
render_notify: Arc<Notify>,
- render_dirty: Arc<AtomicBool>,
+ render_dirty: Arc<RenderSignal>,
) -> std::io::Result<Self> {
let windows_powershell_prompt_cwd_reporting =
uses_windows_powershell_pane_shell(shell_config);
@@ -1677,7 +1678,7 @@ impl PaneRuntime {
host_terminal_theme: crate::terminal_theme::TerminalTheme,
events: mpsc::Sender<AppEvent>,
render_notify: Arc<Notify>,
- render_dirty: Arc<AtomicBool>,
+ render_dirty: Arc<RenderSignal>,
) -> std::io::Result<Self> {
let mut cmd = crate::platform::pane_custom_command_pty_builder(command);
cmd.cwd(cwd);
@@ -1713,7 +1714,7 @@ impl PaneRuntime {
host_terminal_theme: crate::terminal_theme::TerminalTheme,
events: mpsc::Sender<AppEvent>,
render_notify: Arc<Notify>,
- render_dirty: Arc<AtomicBool>,
+ render_dirty: Arc<RenderSignal>,
) -> std::io::Result<Self> {
let Some((program, args)) = argv.split_first() else {
return Err(std::io::Error::new(
@@ -1751,7 +1752,7 @@ impl PaneRuntime {
host_terminal_theme: crate::terminal_theme::TerminalTheme,
events: mpsc::Sender<AppEvent>,
render_notify: Arc<Notify>,
- render_dirty: Arc<AtomicBool>,
+ render_dirty: Arc<RenderSignal>,
) -> std::io::Result<Self> {
let crate::handoff_runtime::ImportedHandoffRuntime { master_fd, state } = import;
let crate::handoff_runtime::HandoffRuntimeState {
@@ -1819,7 +1820,7 @@ impl PaneRuntime {
let result =
terminal.process_pty_bytes(pane_id, shell_pid, bytes, &response_writer);
observe_detection_content_change(bytes, &detection_content_seq);
- if result.request_render && !render_dirty.swap(true, Ordering::AcqRel) {
+ if result.request_render && render_dirty.request_pty(pane_id) {
render_notify.notify_one();
}
if let Some(delay) = result.render_delay {
@@ -1827,7 +1828,7 @@ impl PaneRuntime {
let render_dirty = render_dirty.clone();
delay_rt.spawn(async move {
tokio::time::sleep(delay).await;
- if !render_dirty.swap(true, Ordering::AcqRel) {
+ if render_dirty.request_pty(pane_id) {
render_notify.notify_one();
}
});
@@ -1900,7 +1901,7 @@ impl PaneRuntime {
host_terminal_theme: crate::terminal_theme::TerminalTheme,
events: mpsc::Sender<AppEvent>,
render_notify: Arc<Notify>,
- render_dirty: Arc<AtomicBool>,
+ render_dirty: Arc<RenderSignal>,
cmd: CommandBuilder,
spawn_error_message: &'static str,
initial_state: SpawnInitialState<'_>,
@@ -1979,7 +1980,7 @@ impl PaneRuntime {
if agent_detection == AgentDetection::Enabled {
observe_detection_content_change(bytes, &detection_content_seq);
}
- if result.request_render && !render_dirty.swap(true, Ordering::AcqRel) {
+ if result.request_render && render_dirty.request_pty(pane_id) {
render_notify.notify_one();
}
if let Some(delay) = result.render_delay {
@@ -1987,7 +1988,7 @@ impl PaneRuntime {
let render_dirty = render_dirty.clone();
rt.spawn(async move {
tokio::time::sleep(delay).await;
- if !render_dirty.swap(true, Ordering::AcqRel) {
+ if render_dirty.request_pty(pane_id) {
render_notify.notify_one();
}
});
@@ -2253,7 +2254,7 @@ impl PaneRuntime {
// Keep the terminal restore side effect separate from render notification state.
#[allow(clippy::collapsible_if)]
if pid > 0 && terminal.maybe_restore_host_terminal_theme(pane_id, pid) {
- if !render_dirty.swap(true, Ordering::AcqRel) {
+ if render_dirty.request_pty(pane_id) {
render_notify.notify_one();
}
}