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/app | |
| parent | e16d7d8c07a20f5ee0b4111808680bbcfd7df9ac (diff) | |
perf: skip rendering hidden pty updates
Diffstat (limited to 'src/app')
| -rw-r--r-- | src/app/actions.rs | 2 | ||||
| -rw-r--r-- | src/app/api.rs | 11 | ||||
| -rw-r--r-- | src/app/mod.rs | 17 | ||||
| -rw-r--r-- | src/app/popup.rs | 3 | ||||
| -rw-r--r-- | src/app/theme_sync.rs | 6 | ||||
| -rw-r--r-- | src/app/worktrees.rs | 9 |
6 files changed, 21 insertions, 27 deletions
diff --git a/src/app/actions.rs b/src/app/actions.rs index c92a91e5..9ef4af68 100644 --- a/src/app/actions.rs +++ b/src/app/actions.rs @@ -3708,7 +3708,7 @@ mod tests { &crate::pane::PaneLaunchEnv::default(), events, std::sync::Arc::new(tokio::sync::Notify::new()), - std::sync::Arc::new(std::sync::atomic::AtomicBool::new(false)), + std::sync::Arc::new(crate::render_signal::RenderSignal::new()), ) .unwrap(); diff --git a/src/app/api.rs b/src/app/api.rs index c46be676..76087e2d 100644 --- a/src/app/api.rs +++ b/src/app/api.rs @@ -1,4 +1,3 @@ -use std::sync::atomic::Ordering; use std::time::{Duration, Instant}; mod agent_view; @@ -91,7 +90,7 @@ impl App { .state .apply_workspace_git_statuses(&self.terminal_runtimes, results); if changed { - self.render_dirty.store(true, Ordering::Release); + self.render_dirty.request_generic(); self.render_notify.notify_one(); } changed @@ -194,7 +193,7 @@ impl App { && self.respawn_shell_for_launch_pane(*pane_id) { self.overlay_panes.remove(pane_id); - self.render_dirty.store(true, Ordering::Release); + self.render_dirty.request_generic(); self.render_notify.notify_one(); return; } @@ -293,7 +292,7 @@ impl App { self.sync_full_lifecycle_authority_detection_pauses(); if terminal_cwd_reported { self.request_git_identity_refresh(Instant::now()); - self.render_dirty.store(true, Ordering::Release); + self.render_dirty.request_generic(); self.render_notify.notify_one(); } for update in &pane_updates { @@ -1717,7 +1716,7 @@ mod tests { &crate::pane::PaneLaunchEnv::default(), events, std::sync::Arc::new(tokio::sync::Notify::new()), - std::sync::Arc::new(std::sync::atomic::AtomicBool::new(false)), + std::sync::Arc::new(crate::render_signal::RenderSignal::new()), ) .unwrap(); let deadline = std::time::Instant::now() + std::time::Duration::from_secs(2); @@ -1809,7 +1808,7 @@ mod tests { &crate::pane::PaneLaunchEnv::default(), events, std::sync::Arc::new(tokio::sync::Notify::new()), - std::sync::Arc::new(std::sync::atomic::AtomicBool::new(false)), + std::sync::Arc::new(crate::render_signal::RenderSignal::new()), ) .unwrap(); let deadline = std::time::Instant::now() + std::time::Duration::from_secs(2); diff --git a/src/app/mod.rs b/src/app/mod.rs index c8c8113a..1733e234 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -28,7 +28,6 @@ mod worktrees; use std::collections::{HashMap, HashSet}; use std::future::pending; use std::io::{self, Write}; -use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use std::time::{Duration, Instant}; @@ -140,7 +139,7 @@ pub struct App { HashMap<(InputSourceId, crossterm::event::KeyCode), PressedTerminalKey>, pub(crate) suppressed_repeat_keys: HashSet<(InputSourceId, crossterm::event::KeyCode)>, pub render_notify: Arc<Notify>, - pub render_dirty: Arc<AtomicBool>, + pub(crate) render_dirty: Arc<crate::render_signal::RenderSignal>, pub(crate) full_redraw_pending: bool, pub(crate) overlay_panes: HashMap<crate::layout::PaneId, OverlayPaneState>, pub(crate) local_terminal_notifications: bool, @@ -381,7 +380,7 @@ impl App { crate::kitty_graphics::set_enabled(config.experimental.kitty_graphics); let (event_tx, event_rx) = mpsc::channel::<AppEvent>(APP_EVENT_CHANNEL_CAPACITY); let render_notify = Arc::new(Notify::new()); - let render_dirty = Arc::new(AtomicBool::new(false)); + let render_dirty = Arc::new(crate::render_signal::RenderSignal::new()); // Try to restore previous session let mut restored_terminals = std::collections::HashMap::new(); @@ -919,7 +918,7 @@ impl App { while !self.state.should_quit { self.reap_finished_custom_commands(); - if self.render_dirty.load(Ordering::Acquire) { + if self.render_dirty.is_pending() { needs_render = true; } let terminal_title_changed = self.sync_terminal_titles(); @@ -1044,7 +1043,7 @@ impl App { self.sync_host_keyboard_report_all(&mut host_keyboard_report_all_active)?; if needs_render && self.can_render_now(now) { - self.render_dirty.swap(false, Ordering::AcqRel); + let _ = self.render_dirty.take(); let _sync_output = SyncOutputGuard::begin()?; let kitty_graphics_enabled = self.state.kitty_graphics_enabled; if self.full_redraw_pending { @@ -1094,7 +1093,7 @@ impl App { } self.sync_pending_agent_resume_deadline(now); if self.start_pending_agent_resumes(self.pending_agent_resume_due(now)) { - self.render_dirty.store(true, Ordering::Release); + self.render_dirty.request_generic(); self.render_notify.notify_one(); } self.last_render_at = Some(now); @@ -1144,7 +1143,7 @@ impl App { self.input_rx = None; } LoopEvent::RenderRequested => { - if self.render_dirty.load(Ordering::Acquire) { + if self.render_dirty.is_pending() { needs_render = true; } } @@ -2165,7 +2164,7 @@ mod tests { fn git_status_event_marks_render_dirty_when_status_changes() { let mut app = test_app(); app.state.workspaces.push(Workspace::test_new("one")); - app.render_dirty.store(false, Ordering::Release); + let _ = app.render_dirty.take(); let workspace_id = app.state.workspaces[0].id.clone(); let resolved_identity_cwd = app.state.workspaces[0].resolved_identity_cwd().unwrap(); @@ -2183,7 +2182,7 @@ mod tests { cache_updates: Vec::new(), }); - assert!(app.render_dirty.load(Ordering::Acquire)); + assert!(app.render_dirty.is_pending()); } #[test] diff --git a/src/app/popup.rs b/src/app/popup.rs index 3aeef35c..3356ab14 100644 --- a/src/app/popup.rs +++ b/src/app/popup.rs @@ -34,8 +34,7 @@ impl App { } else { Mode::Navigate }; - self.render_dirty - .store(true, std::sync::atomic::Ordering::Release); + self.render_dirty.request_generic(); self.render_notify.notify_one(); true } diff --git a/src/app/theme_sync.rs b/src/app/theme_sync.rs index c41ca24c..e4284f69 100644 --- a/src/app/theme_sync.rs +++ b/src/app/theme_sync.rs @@ -1,5 +1,3 @@ -use std::sync::atomic::Ordering; - use super::App; impl App { @@ -92,7 +90,7 @@ impl App { } self.state.theme_name = theme_name; self.state.palette = palette; - self.render_dirty.store(true, Ordering::Release); + self.render_dirty.request_generic(); self.render_notify.notify_one(); true } @@ -102,7 +100,7 @@ impl App { runtime.apply_host_terminal_theme(self.state.host_terminal_theme); } - self.render_dirty.store(true, Ordering::Release); + self.render_dirty.request_generic(); self.render_notify.notify_one(); } } diff --git a/src/app/worktrees.rs b/src/app/worktrees.rs index c839c04a..23e17b4d 100644 --- a/src/app/worktrees.rs +++ b/src/app/worktrees.rs @@ -1,4 +1,3 @@ -use std::sync::atomic::Ordering; use std::time::{SystemTime, UNIX_EPOCH}; use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; @@ -864,14 +863,14 @@ impl App { } } } - self.render_dirty.store(true, Ordering::Release); + self.render_dirty.request_generic(); self.render_notify.notify_one(); } Err(message) => { tracing::warn!(checkout_path = %create.checkout_path.display(), error = %message, "git worktree add failed"); create.creating = false; create.error = Some(message); - self.render_dirty.store(true, Ordering::Release); + self.render_dirty.request_generic(); self.render_notify.notify_one(); } } @@ -942,7 +941,7 @@ impl App { } else { Mode::Navigate }; - self.render_dirty.store(true, Ordering::Release); + self.render_dirty.request_generic(); self.render_notify.notify_one(); } Err(message) => { @@ -956,7 +955,7 @@ impl App { } else { remove.error = Some(message); } - self.render_dirty.store(true, Ordering::Release); + self.render_dirty.request_generic(); self.render_notify.notify_one(); } } |
