aboutsummaryrefslogtreecommitdiff
path: root/src/app/actions.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-06-07 00:07:24 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-06-07 16:29:44 +0300
commit3c2b46d24aa6c8011a1e198143752f2aa414d585 (patch)
treea52280bccc824ca656f8bc986a756f30901974e4 /src/app/actions.rs
parent5d7e56737ef30d9de5802b0684a9428c40131dda (diff)
feat: add native windows beta support
Diffstat (limited to 'src/app/actions.rs')
-rw-r--r--src/app/actions.rs51
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);