diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-05 00:40:18 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-05 00:40:18 +0300 |
| commit | b4b69b3539fc02d855c9b626cb205074e1541c78 (patch) | |
| tree | 71f61897e2847f4627b8cdb38b80cd036de49deb /src | |
| parent | 6b3f6462810e400fbbfbc21240b677732b0549ec (diff) | |
fix: open a default workspace when sessions are empty
refs #366
Diffstat (limited to 'src')
| -rw-r--r-- | src/app/creation.rs | 1 | ||||
| -rw-r--r-- | src/app/mod.rs | 43 | ||||
| -rw-r--r-- | src/app/runtime.rs | 10 | ||||
| -rw-r--r-- | src/server/headless.rs | 18 |
4 files changed, 69 insertions, 3 deletions
diff --git a/src/app/creation.rs b/src/app/creation.rs index f8edd676..3f643986 100644 --- a/src/app/creation.rs +++ b/src/app/creation.rs @@ -14,6 +14,7 @@ pub(crate) fn resolve_new_terminal_cwd( ) -> PathBuf { match policy { NewTerminalCwdConfig::Follow => follow_cwd + .or_else(|| std::env::var_os("HOME").map(PathBuf::from)) .or_else(|| std::env::current_dir().ok()) .unwrap_or_else(|| PathBuf::from("/")), NewTerminalCwdConfig::Home => std::env::var_os("HOME") diff --git a/src/app/mod.rs b/src/app/mod.rs index 0c2feb67..1914c895 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -806,6 +806,10 @@ impl App { needs_render = true; } + if self.ensure_default_workspace() { + needs_render = true; + } + let now = Instant::now(); self.sync_animation_timer(now); self.sync_host_mouse_capture(&mut host_mouse_capture_active)?; @@ -934,6 +938,33 @@ impl App { Ok(()) } + pub(crate) fn ensure_default_workspace(&mut self) -> bool { + if !self.state.workspaces.is_empty() || self.state.mode == Mode::Onboarding { + return false; + } + + let previous_mode = self.state.mode; + let preserve_mode = matches!( + previous_mode, + Mode::ReleaseNotes | Mode::ProductAnnouncement | Mode::Settings + ); + let cwd = self.resolve_new_terminal_cwd(None); + + match self.create_workspace_with_options(cwd, true) { + Ok(_) => { + if preserve_mode { + self.state.mode = previous_mode; + } + true + } + Err(err) => { + tracing::error!(err = %err, "failed to create default workspace"); + self.state.mode = Mode::Navigate; + false + } + } + } + pub(crate) fn dismiss_release_notes(&mut self) { let preview = self .state @@ -2644,6 +2675,18 @@ mod tests { } #[test] + fn new_terminal_cwd_follow_without_source_uses_home() { + let Some(home) = std::env::var_os("HOME").map(std::path::PathBuf::from) else { + return; + }; + + let cwd = + creation::resolve_new_terminal_cwd(&crate::config::NewTerminalCwdConfig::Follow, None); + + assert_eq!(cwd, home); + } + + #[test] fn new_terminal_cwd_path_uses_configured_path() { let cwd = creation::resolve_new_terminal_cwd( &crate::config::NewTerminalCwdConfig::Path("/tmp/herdr-fixed".into()), diff --git a/src/app/runtime.rs b/src/app/runtime.rs index 5bfa9141..fe971bf5 100644 --- a/src/app/runtime.rs +++ b/src/app/runtime.rs @@ -62,8 +62,16 @@ impl App { msg: crate::api::ApiRequestMessage, ) -> bool { let previous_mode = self.state.mode; - let changed = crate::api::request_changes_ui(&msg.request); + let mut changed = crate::api::request_changes_ui(&msg.request); + let skip_default_workspace = matches!( + &msg.request.method, + crate::api::schema::Method::ServerStop(_) + | crate::api::schema::Method::ServerLiveHandoff(_) + ); let response = self.handle_api_request(msg.request); + if !skip_default_workspace { + changed |= self.ensure_default_workspace(); + } let _ = msg.respond_to.send(response); self.sync_prefix_input_source(previous_mode); changed diff --git a/src/server/headless.rs b/src/server/headless.rs index 596c55df..11e5f6b8 100644 --- a/src/server/headless.rs +++ b/src/server/headless.rs @@ -499,6 +499,12 @@ impl HeadlessServer { crate::render_prof::event("full_render_cause.config_reload"); } + if latest_app_client(&self.clients).is_some() && self.app.ensure_default_workspace() { + needs_render = true; + needs_full_render = true; + crate::render_prof::event("full_render_cause.default_workspace"); + } + self.drain_client_config_reload_request(); self.stream_host_mouse_capture_mode(); @@ -2146,8 +2152,12 @@ impl HeadlessServer { return true; } - let changed = api::request_changes_ui(&msg.request); - let changed = self.drain_all_internal_events_with_forwarding() || changed; + let mut changed = api::request_changes_ui(&msg.request); + let skip_default_workspace = matches!( + &msg.request.method, + api::schema::Method::ServerStop(_) | api::schema::Method::ServerLiveHandoff(_) + ); + changed |= self.drain_all_internal_events_with_forwarding(); // Capture toast and effective pane states before the API call so we can // forward resulting client-local notifications. API requests like @@ -2337,6 +2347,10 @@ impl HeadlessServer { } } + if !skip_default_workspace && latest_app_client(&self.clients).is_some() { + changed |= self.app.ensure_default_workspace(); + } + changed } |
