aboutsummaryrefslogtreecommitdiff
path: root/src/app
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/app
parente16d7d8c07a20f5ee0b4111808680bbcfd7df9ac (diff)
perf: skip rendering hidden pty updates
Diffstat (limited to 'src/app')
-rw-r--r--src/app/actions.rs2
-rw-r--r--src/app/api.rs11
-rw-r--r--src/app/mod.rs17
-rw-r--r--src/app/popup.rs3
-rw-r--r--src/app/theme_sync.rs6
-rw-r--r--src/app/worktrees.rs9
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();
}
}