aboutsummaryrefslogtreecommitdiff
path: root/src/pane.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/pane.rs')
-rw-r--r--src/pane.rs80
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)]