diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-28 23:29:11 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-28 23:29:11 +0300 |
| commit | e27a4ea427c9ed6248c0ee80570e94ed7b1928bd (patch) | |
| tree | 0cae21a2b3939293be129aaaecb23641f68bab54 /src/pane.rs | |
| parent | e16d7d8c07a20f5ee0b4111808680bbcfd7df9ac (diff) | |
perf: skip rendering hidden pty updates
Diffstat (limited to 'src/pane.rs')
| -rw-r--r-- | src/pane.rs | 23 |
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(); } } |
