From ea57a65321edfc44277555de73449bce8b5d58fa Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Tue, 31 Mar 2026 02:03:45 +0300 Subject: fix: make app rendering event-driven --- src/workspace.rs | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) (limited to 'src/workspace.rs') diff --git a/src/workspace.rs b/src/workspace.rs index 68b4e624..63e98912 100644 --- a/src/workspace.rs +++ b/src/workspace.rs @@ -1,8 +1,10 @@ use std::collections::HashMap; use std::path::{Path, PathBuf}; +use std::sync::atomic::AtomicBool; +use std::sync::Arc; use ratatui::layout::Direction; -use tokio::sync::mpsc; +use tokio::sync::{mpsc, Notify}; use tracing::info; use crate::detect::{Agent, AgentState}; @@ -29,6 +31,8 @@ pub struct Workspace { pub runtimes: HashMap, pub zoomed: bool, pub events: mpsc::Sender, + pub(crate) render_notify: Arc, + pub(crate) render_dirty: Arc, } impl Workspace { @@ -37,9 +41,19 @@ impl Workspace { rows: u16, cols: u16, events: mpsc::Sender, + render_notify: Arc, + render_dirty: Arc, ) -> std::io::Result { let (layout, root_id) = TileLayout::new(); - let runtime = PaneRuntime::spawn(root_id, rows, cols, initial_cwd, events.clone())?; + let runtime = PaneRuntime::spawn( + root_id, + rows, + cols, + initial_cwd, + events.clone(), + render_notify.clone(), + render_dirty.clone(), + )?; let mut panes = HashMap::new(); panes.insert(root_id, PaneState::new()); @@ -60,6 +74,8 @@ impl Workspace { runtimes, zoomed: false, events, + render_notify, + render_dirty, }) } @@ -74,7 +90,15 @@ impl Workspace { let new_id = self.layout.split_focused(direction); let actual_cwd = cwd.unwrap_or_else(|| std::env::current_dir().unwrap_or_else(|_| "/".into())); - let runtime = PaneRuntime::spawn(new_id, rows, cols, actual_cwd, self.events.clone())?; + let runtime = PaneRuntime::spawn( + new_id, + rows, + cols, + actual_cwd, + self.events.clone(), + self.render_notify.clone(), + self.render_dirty.clone(), + )?; self.panes.insert(new_id, PaneState::new()); self.public_pane_numbers .insert(new_id, self.next_public_pane_number); @@ -170,6 +194,12 @@ impl Workspace { .unwrap_or((AgentState::Unknown, true)) } + pub fn has_working_pane(&self) -> bool { + self.panes + .values() + .any(|pane| pane.state == AgentState::Working) + } + /// Per-pane (state, seen) in BSP tree order (left-to-right, top-to-bottom). #[cfg(test)] pub fn pane_states(&self) -> Vec<(AgentState, bool)> { @@ -346,6 +376,8 @@ impl Workspace { pub fn test_new(name: &str) -> Self { let (events, _) = mpsc::channel(64); let (layout, root_id) = TileLayout::new(); + let render_notify = Arc::new(Notify::new()); + let render_dirty = Arc::new(AtomicBool::new(false)); let mut panes = HashMap::new(); panes.insert(root_id, PaneState::new()); let mut public_pane_numbers = HashMap::new(); @@ -361,6 +393,8 @@ impl Workspace { runtimes: HashMap::new(), zoomed: false, events, + render_notify, + render_dirty, } } -- cgit v1.2.3