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/mod.rs | |
| parent | e16d7d8c07a20f5ee0b4111808680bbcfd7df9ac (diff) | |
perf: skip rendering hidden pty updates
Diffstat (limited to 'src/app/mod.rs')
| -rw-r--r-- | src/app/mod.rs | 17 |
1 files changed, 8 insertions, 9 deletions
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] |
