aboutsummaryrefslogtreecommitdiff
path: root/src/app/ids.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/ids.rs')
-rw-r--r--src/app/ids.rs38
1 files changed, 34 insertions, 4 deletions
diff --git a/src/app/ids.rs b/src/app/ids.rs
index a18efd2d..0ce02c1f 100644
--- a/src/app/ids.rs
+++ b/src/app/ids.rs
@@ -18,8 +18,12 @@ impl App {
pub(super) fn public_tab_id(&self, ws_idx: usize, tab_idx: usize) -> Option<String> {
let ws = self.state.workspaces.get(ws_idx)?;
- ws.tabs.get(tab_idx)?;
- Some(format!("{}:{}", ws.id, tab_idx + 1))
+ let tab_number = ws.public_tab_number(tab_idx)?;
+ Some(format!(
+ "{}:t{}",
+ ws.id,
+ crate::workspace::encode_public_number(tab_number)
+ ))
}
pub(super) fn public_pane_id(
@@ -29,7 +33,11 @@ impl App {
) -> Option<String> {
let ws = self.state.workspaces.get(ws_idx)?;
let pane_number = ws.public_pane_number(pane_id)?;
- Some(format!("{}-{pane_number}", ws.id))
+ Some(format!(
+ "{}:p{}",
+ ws.id,
+ crate::workspace::encode_public_number(pane_number)
+ ))
}
pub(super) fn parse_workspace_id(&self, id: &str) -> Option<usize> {
@@ -52,7 +60,18 @@ impl App {
let (ws_raw, tab_raw) = id.rsplit_once(':')?;
let ws_idx = self.parse_workspace_id(ws_raw)?;
- let tab_idx = tab_raw.parse::<usize>().ok()?.checked_sub(1)?;
+ let tab_number = if let Some(encoded) = tab_raw.strip_prefix('t') {
+ crate::workspace::decode_public_number(encoded)?
+ } else {
+ tab_raw.parse::<usize>().ok()?
+ };
+ let tab_idx = self
+ .state
+ .workspaces
+ .get(ws_idx)?
+ .tabs
+ .iter()
+ .position(|tab| tab.number == tab_number)?;
self.state.workspaces.get(ws_idx)?.tabs.get(tab_idx)?;
Some((ws_idx, tab_idx))
}
@@ -81,6 +100,17 @@ impl App {
return self.find_pane(pane_id).map(|(ws_idx, _)| (ws_idx, pane_id));
}
+ if let Some((ws_raw, pane_number_raw)) = id.rsplit_once(":p") {
+ let ws_idx = self.parse_workspace_id(ws_raw)?;
+ let pane_number = crate::workspace::decode_public_number(pane_number_raw)?;
+ let ws = self.state.workspaces.get(ws_idx)?;
+ let pane_id = ws
+ .public_pane_numbers
+ .iter()
+ .find_map(|(pane_id, number)| (*number == pane_number).then_some(*pane_id))?;
+ return Some((ws_idx, pane_id));
+ }
+
let (ws_raw, pane_number_raw) = id.rsplit_once('-')?;
let ws_idx = self.parse_workspace_id(ws_raw)?;
let pane_number = pane_number_raw.parse::<usize>().ok()?;