diff options
Diffstat (limited to 'src/pane.rs')
| -rw-r--r-- | src/pane.rs | 80 |
1 files changed, 65 insertions, 15 deletions
diff --git a/src/pane.rs b/src/pane.rs index 601334d9..7cb3e12b 100644 --- a/src/pane.rs +++ b/src/pane.rs @@ -59,6 +59,58 @@ fn apply_pane_terminal_env(cmd: &mut CommandBuilder) { cmd.env("COLORTERM", PANE_COLORTERM); } +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub(crate) struct PaneLaunchEnv { + extra: Vec<(String, String)>, + identity: Option<PaneLaunchIdentity>, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +struct PaneLaunchIdentity { + workspace_id: String, + tab_id: String, + pane_id: String, +} + +impl PaneLaunchEnv { + pub(crate) fn from_extra(extra: Vec<(String, String)>) -> Self { + Self { + extra, + identity: None, + } + } + + pub(crate) fn with_identity( + mut self, + workspace_id: String, + tab_id: String, + pane_id: String, + ) -> Self { + self.identity = Some(PaneLaunchIdentity { + workspace_id, + tab_id, + pane_id, + }); + self + } +} + +fn apply_pane_launch_env(cmd: &mut CommandBuilder, launch_env: &PaneLaunchEnv) { + for (key, value) in &launch_env.extra { + cmd.env(key, value); + } + cmd.env(crate::HERDR_ENV_VAR, crate::HERDR_ENV_VALUE); + crate::integration::apply_pane_base_env(cmd); + if let Some(identity) = &launch_env.identity { + cmd.env( + crate::integration::HERDR_WORKSPACE_ID_ENV_VAR, + &identity.workspace_id, + ); + cmd.env(crate::integration::HERDR_TAB_ID_ENV_VAR, &identity.tab_id); + cmd.env(crate::integration::HERDR_PANE_ID_ENV_VAR, &identity.pane_id); + } +} + #[derive(Debug, Clone, Copy)] struct PendingAgentRelease { agent: Agent, @@ -1320,10 +1372,10 @@ impl PaneRuntime { scrollback_limit_bytes: usize, host_terminal_theme: crate::terminal_theme::TerminalTheme, shell_config: PaneShellConfig<'_>, + launch_env: &PaneLaunchEnv, events: mpsc::Sender<AppEvent>, render_notify: Arc<Notify>, render_dirty: Arc<AtomicBool>, - public_pane_id: Option<&str>, ) -> std::io::Result<Self> { Self::spawn_with_initial_history( pane_id, @@ -1333,11 +1385,11 @@ impl PaneRuntime { scrollback_limit_bytes, host_terminal_theme, shell_config, + launch_env, None, events, render_notify, render_dirty, - public_pane_id, ) } @@ -1351,17 +1403,16 @@ impl PaneRuntime { scrollback_limit_bytes: usize, host_terminal_theme: crate::terminal_theme::TerminalTheme, shell_config: PaneShellConfig<'_>, + launch_env: &PaneLaunchEnv, initial_history_ansi: Option<&str>, events: mpsc::Sender<AppEvent>, render_notify: Arc<Notify>, render_dirty: Arc<AtomicBool>, - public_pane_id: Option<&str>, ) -> std::io::Result<Self> { let mut cmd = pane_shell_command_builder(shell_config)?; cmd.cwd(cwd); - cmd.env(crate::HERDR_ENV_VAR, crate::HERDR_ENV_VALUE); apply_pane_terminal_env(&mut cmd); - crate::integration::apply_pane_env(&mut cmd, pane_id, public_pane_id); + apply_pane_launch_env(&mut cmd, launch_env); Self::spawn_command_builder( pane_id, rows, @@ -1388,24 +1439,19 @@ impl PaneRuntime { cols: u16, cwd: std::path::PathBuf, command: &str, - extra_env: &[(String, String)], + launch_env: &PaneLaunchEnv, scrollback_limit_bytes: usize, host_terminal_theme: crate::terminal_theme::TerminalTheme, events: mpsc::Sender<AppEvent>, render_notify: Arc<Notify>, render_dirty: Arc<AtomicBool>, - public_pane_id: Option<&str>, ) -> std::io::Result<Self> { let mut cmd = CommandBuilder::new("/bin/sh"); cmd.arg("-c"); cmd.arg(command); cmd.cwd(cwd); - cmd.env(crate::HERDR_ENV_VAR, crate::HERDR_ENV_VALUE); apply_pane_terminal_env(&mut cmd); - crate::integration::apply_pane_env(&mut cmd, pane_id, public_pane_id); - for (key, value) in extra_env { - cmd.env(key, value); - } + apply_pane_launch_env(&mut cmd, launch_env); Self::spawn_command_builder( pane_id, rows, @@ -1427,12 +1473,12 @@ impl PaneRuntime { cols: u16, cwd: std::path::PathBuf, argv: &[String], + launch_env: &PaneLaunchEnv, scrollback_limit_bytes: usize, host_terminal_theme: crate::terminal_theme::TerminalTheme, events: mpsc::Sender<AppEvent>, render_notify: Arc<Notify>, render_dirty: Arc<AtomicBool>, - public_pane_id: Option<&str>, ) -> std::io::Result<Self> { let Some((program, args)) = argv.split_first() else { return Err(std::io::Error::new( @@ -1445,9 +1491,8 @@ impl PaneRuntime { cmd.arg(arg); } cmd.cwd(cwd); - cmd.env(crate::HERDR_ENV_VAR, crate::HERDR_ENV_VALUE); apply_pane_terminal_env(&mut cmd); - crate::integration::apply_pane_env(&mut cmd, pane_id, public_pane_id); + apply_pane_launch_env(&mut cmd, launch_env); Self::spawn_command_builder( pane_id, rows, @@ -2425,6 +2470,11 @@ impl PaneRuntime { crate::platform::process_cwd(pid) } + pub fn child_pid(&self) -> Option<u32> { + let pid = self.child_pid.load(Ordering::Acquire); + (pid > 0).then_some(pid) + } + /// Get the current working directory of the process group controlling the pane PTY. pub fn foreground_cwd(&self) -> Option<std::path::PathBuf> { #[cfg(unix)] |
