aboutsummaryrefslogtreecommitdiff
path: root/src/persist.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/persist.rs
parent41a0269de8594a66f010db48b569567f2aa9c3f2 (diff)
fix: make app rendering event-driven
Diffstat (limited to 'src/persist.rs')
-rw-r--r--src/persist.rs31
1 files changed, 28 insertions, 3 deletions
diff --git a/src/persist.rs b/src/persist.rs
index 9cc6205e..49a36141 100644
--- a/src/persist.rs
+++ b/src/persist.rs
@@ -4,12 +4,14 @@
use std::collections::HashMap;
use std::path::PathBuf;
+use std::sync::atomic::AtomicBool;
+use std::sync::Arc;
use ratatui::layout::Direction;
use serde::{Deserialize, Serialize};
use tracing::{error, info, warn};
-use tokio::sync::mpsc;
+use tokio::sync::{mpsc, Notify};
use crate::events::AppEvent;
use crate::layout::{Node, PaneId, TileLayout};
@@ -132,11 +134,22 @@ pub fn restore(
rows: u16,
cols: u16,
events: mpsc::Sender<AppEvent>,
+ render_notify: Arc<Notify>,
+ render_dirty: Arc<AtomicBool>,
) -> Vec<Workspace> {
snapshot
.workspaces
.iter()
- .filter_map(|ws_snap| restore_workspace(ws_snap, rows, cols, events.clone()))
+ .filter_map(|ws_snap| {
+ restore_workspace(
+ ws_snap,
+ rows,
+ cols,
+ events.clone(),
+ render_notify.clone(),
+ render_dirty.clone(),
+ )
+ })
.collect()
}
@@ -145,6 +158,8 @@ fn restore_workspace(
rows: u16,
cols: u16,
events: mpsc::Sender<AppEvent>,
+ render_notify: Arc<Notify>,
+ render_dirty: Arc<AtomicBool>,
) -> Option<Workspace> {
let (node, id_map) = restore_node_remapped(&snap.layout);
let pane_ids = collect_pane_ids(&node);
@@ -169,7 +184,15 @@ fn restore_workspace(
.map(|p| p.cwd.clone())
.unwrap_or_else(|| std::env::current_dir().unwrap_or_else(|_| "/".into()));
- match PaneRuntime::spawn(*id, rows, cols, cwd, events.clone()) {
+ match PaneRuntime::spawn(
+ *id,
+ rows,
+ cols,
+ cwd,
+ events.clone(),
+ render_notify.clone(),
+ render_dirty.clone(),
+ ) {
Ok(runtime) => {
panes.insert(*id, PaneState::new());
runtimes.insert(*id, runtime);
@@ -205,6 +228,8 @@ fn restore_workspace(
runtimes,
zoomed: snap.zoomed,
events,
+ render_notify,
+ render_dirty,
})
}