diff options
| author | Aram Drevekenin <aram@poor.dev> | 2026-03-09 13:31:08 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-03-09 13:31:08 +0100 |
| commit | e7985f0d77c4ee847d014b808eeede55d20f6d79 (patch) | |
| tree | e41151bedba3bc525c117db3d82e264ac63464f9 /zellij-server | |
| parent | Add cli paste action (#4817) (diff) | |
| download | sl0ppij-e7985f0d77c4ee847d014b808eeede55d20f6d79.tar.gz sl0ppij-e7985f0d77c4ee847d014b808eeede55d20f6d79.tar.xz sl0ppij-e7985f0d77c4ee847d014b808eeede55d20f6d79.zip | |
Single screen session manager (#4821)
* initial implementation
* adjust ui
* preserve selection
* width responsiveness
* behavior fixes
* fix: do not count suppressed panes
* ui improvements
* multi-screen config and prompt hint
* tests + refactoring
* improve performance
* add pr
Diffstat (limited to 'zellij-server')
| -rw-r--r-- | zellij-server/src/background_jobs.rs | 15 | ||||
| -rw-r--r-- | zellij-server/src/screen.rs | 20 |
2 files changed, 31 insertions, 4 deletions
diff --git a/zellij-server/src/background_jobs.rs b/zellij-server/src/background_jobs.rs index bf4b5829..435ae2e5 100644 --- a/zellij-server/src/background_jobs.rs +++ b/zellij-server/src/background_jobs.rs @@ -699,7 +699,7 @@ pub fn write_session_state_to_disk( } fn read_other_live_session_states(current_session_name: &str) -> BTreeMap<String, SessionInfo> { - let mut other_session_names = vec![]; + let mut other_session_names: Vec<(String, Duration)> = vec![]; let mut session_infos_on_machine = BTreeMap::new(); // we do this so that the session infos will be actual and we're // reasonably sure their session is running @@ -708,19 +708,26 @@ fn read_other_live_session_states(current_session_name: &str) -> BTreeMap<String if let Ok(file) = file { if let Ok(file_name) = file.file_name().into_string() { if is_ipc_socket(&file.file_type().unwrap()) { - other_session_names.push(file_name); + let creation_time = std::fs::metadata(&file.path()) + .ok() + .and_then(|f| f.created().ok().or_else(|| f.modified().ok())) + .and_then(|d| d.elapsed().ok()) + .map(|d| Duration::from_secs(d.as_secs())) + .unwrap_or_default(); + other_session_names.push((file_name, creation_time)); } } } }); } - for session_name in other_session_names { + for (session_name, creation_time) in other_session_names { let session_cache_file_name = session_info_cache_file_name(&session_name); if let Ok(raw_session_info) = fs::read_to_string(&session_cache_file_name) { - if let Ok(session_info) = + if let Ok(mut session_info) = SessionInfo::from_string(&raw_session_info, ¤t_session_name) { + session_info.creation_time = creation_time; session_infos_on_machine.insert(session_name, session_info); } } diff --git a/zellij-server/src/screen.rs b/zellij-server/src/screen.rs index 8ebe10c5..2e2e295d 100644 --- a/zellij-server/src/screen.rs +++ b/zellij-server/src/screen.rs @@ -2647,6 +2647,15 @@ impl Screen { } } let available_layouts = self.cached_layouts.clone(); + let creation_time = { + let sock_path = ZELLIJ_SOCK_DIR.join(&self.session_name); + std::fs::metadata(&sock_path) + .ok() + .and_then(|f| f.created().ok().or_else(|| f.modified().ok())) + .and_then(|d| d.elapsed().ok()) + .map(|d| Duration::from_secs(d.as_secs())) + .unwrap_or_default() + }; let session_info = SessionInfo { name: self.session_name.clone(), tabs: tab_infos, @@ -2668,6 +2677,7 @@ impl Screen { .iter() .map(|(k, v)| (*k, v.iter().map(|v| (*v).into()).collect())) .collect(), + creation_time, }; self.bus .senders @@ -7204,6 +7214,15 @@ pub(crate) fn screen_thread_main( #[cfg(test)] let available_layouts = vec![]; + let creation_time = { + let sock_path = ZELLIJ_SOCK_DIR.join(&screen.session_name); + std::fs::metadata(&sock_path) + .ok() + .and_then(|f| f.created().ok().or_else(|| f.modified().ok())) + .and_then(|d| d.elapsed().ok()) + .map(|d| Duration::from_secs(d.as_secs())) + .unwrap_or_default() + }; let session_info = SessionInfo { name: screen.session_name.clone(), tabs: tab_infos, @@ -7225,6 +7244,7 @@ pub(crate) fn screen_thread_main( .iter() .map(|(k, v)| (*k, v.iter().map(|v| (*v).into()).collect())) .collect(), + creation_time, }; let session_layout_metadata = if screen.session_serialization { |
