diff options
Diffstat (limited to 'src/app/ids.rs')
| -rw-r--r-- | src/app/ids.rs | 38 |
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()?; |
