aboutsummaryrefslogtreecommitdiff
path: root/src/pane.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-03-31 02:03:45 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-03-31 02:03:45 +0300
commitea57a65321edfc44277555de73449bce8b5d58fa (patch)
tree30c403c00ecbc3e1cfcade5b24fa0094ebc14d01 /src/pane.rs
parent41a0269de8594a66f010db48b569567f2aa9c3f2 (diff)
fix: make app rendering event-driven
Diffstat (limited to 'src/pane.rs')
-rw-r--r--src/pane.rs11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/pane.rs b/src/pane.rs
index 9d62a0c9..7a5a75dd 100644
--- a/src/pane.rs
+++ b/src/pane.rs
@@ -1,13 +1,13 @@
use std::cell::Cell;
use std::io::{BufWriter, Read, Write};
use std::sync::{
- atomic::{AtomicU16, AtomicU32, Ordering},
+ atomic::{AtomicBool, AtomicU16, AtomicU32, Ordering},
Arc, RwLock,
};
use bytes::Bytes;
use portable_pty::{native_pty_system, CommandBuilder, PtySize};
-use tokio::sync::mpsc;
+use tokio::sync::{mpsc, Notify};
use tracing::{debug, error, info, warn};
use crate::detect::{Agent, AgentState};
@@ -167,6 +167,8 @@ impl PaneRuntime {
cols: u16,
cwd: std::path::PathBuf,
events: mpsc::Sender<AppEvent>,
+ render_notify: Arc<Notify>,
+ render_dirty: Arc<AtomicBool>,
) -> std::io::Result<Self> {
let pty_system = native_pty_system();
let pair = pty_system
@@ -241,6 +243,8 @@ impl PaneRuntime {
let parser = parser.clone();
let screen_content = screen_content.clone();
let response_writer = input_tx.clone();
+ let render_notify = render_notify.clone();
+ let render_dirty = render_dirty.clone();
tokio::task::spawn_blocking(move || {
let mut buf = [0u8; 8192];
loop {
@@ -277,6 +281,9 @@ impl PaneRuntime {
warn!(pane = pane_id.raw(), err = %e, "dropped terminal query response");
}
}
+ if !render_dirty.swap(true, Ordering::AcqRel) {
+ render_notify.notify_one();
+ }
}
}
}