diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-03-31 02:03:45 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-03-31 02:03:45 +0300 |
| commit | ea57a65321edfc44277555de73449bce8b5d58fa (patch) | |
| tree | 30c403c00ecbc3e1cfcade5b24fa0094ebc14d01 /src/pane.rs | |
| parent | 41a0269de8594a66f010db48b569567f2aa9c3f2 (diff) | |
fix: make app rendering event-driven
Diffstat (limited to 'src/pane.rs')
| -rw-r--r-- | src/pane.rs | 11 |
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(); + } } } } |
