diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-07 00:07:24 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-07 16:29:44 +0300 |
| commit | 3c2b46d24aa6c8011a1e198143752f2aa414d585 (patch) | |
| tree | a52280bccc824ca656f8bc986a756f30901974e4 /src/app/actions.rs | |
| parent | 5d7e56737ef30d9de5802b0684a9428c40131dda (diff) | |
feat: add native windows beta support
Diffstat (limited to 'src/app/actions.rs')
| -rw-r--r-- | src/app/actions.rs | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/src/app/actions.rs b/src/app/actions.rs index 06ffe51b..371457a8 100644 --- a/src/app/actions.rs +++ b/src/app/actions.rs @@ -2334,6 +2334,25 @@ impl AppState { // Intercepted in App::handle_internal_event before reaching this // dispatch; never touches AppState. AppEvent::ClipboardWrite { .. } => Vec::new(), + AppEvent::TerminalCwdReported { pane_id, cwd } => { + if !cwd.is_absolute() || !cwd.is_dir() { + return Vec::new(); + } + let Some(terminal_id) = self.workspaces.iter().find_map(|ws| { + ws.pane_state(pane_id) + .map(|pane| pane.attached_terminal_id.clone()) + }) else { + return Vec::new(); + }; + let Some(terminal) = self.terminals.get_mut(&terminal_id) else { + return Vec::new(); + }; + if terminal.cwd != cwd { + terminal.cwd = cwd; + self.mark_session_dirty(); + } + Vec::new() + } AppEvent::GitStatusRefreshed { results, cache_updates, @@ -4282,6 +4301,9 @@ mod tests { fn hidden_session_ref_only_update_marks_session_dirty_without_visible_update() { let mut state = app_with_workspaces(&["active"]); let pane_id = *state.workspaces[0].panes.keys().next().unwrap(); + let test_dir = std::env::current_dir().unwrap(); + let first_session = test_dir.join("one.jsonl").display().to_string(); + let second_session = test_dir.join("two.jsonl").display().to_string(); let first_updates = state.handle_app_event(AppEvent::HookStateReported { pane_id, @@ -4291,7 +4313,7 @@ mod tests { message: None, custom_status: None, seq: Some(20), - session_ref: crate::agent_resume::AgentSessionRef::path("/tmp/one.jsonl"), + session_ref: crate::agent_resume::AgentSessionRef::path(first_session), }); assert_eq!(first_updates.len(), 1); state.session_dirty = false; @@ -4304,7 +4326,7 @@ mod tests { message: None, custom_status: None, seq: Some(21), - session_ref: crate::agent_resume::AgentSessionRef::path("/tmp/two.jsonl"), + session_ref: crate::agent_resume::AgentSessionRef::path(second_session), }); assert!(second_updates.is_empty()); @@ -4312,6 +4334,31 @@ mod tests { } #[test] + fn terminal_cwd_report_updates_terminal_cwd_and_marks_session_dirty() { + let mut state = app_with_workspaces(&["active"]); + let pane_id = *state.workspaces[0].panes.keys().next().unwrap(); + let terminal_id = state.workspaces[0] + .pane_state(pane_id) + .unwrap() + .attached_terminal_id + .clone(); + let cwd = + std::env::temp_dir().join(format!("herdr-cwd-report-test-{}", std::process::id())); + std::fs::create_dir_all(&cwd).unwrap(); + state.session_dirty = false; + + let updates = state.handle_app_event(AppEvent::TerminalCwdReported { + pane_id, + cwd: cwd.clone(), + }); + + assert!(updates.is_empty()); + assert_eq!(state.terminals.get(&terminal_id).unwrap().cwd, cwd); + assert!(state.session_dirty); + let _ = std::fs::remove_dir_all(cwd); + } + + #[test] fn background_idle_sets_finished_toast() { let mut state = app_with_workspaces(&["active", "background"]); state.active = Some(0); |
