aboutsummaryrefslogtreecommitdiffstats
path: root/zellij-server
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2026-03-09 13:31:08 +0100
committerGitHub <noreply@github.com>2026-03-09 13:31:08 +0100
commite7985f0d77c4ee847d014b808eeede55d20f6d79 (patch)
treee41151bedba3bc525c117db3d82e264ac63464f9 /zellij-server
parentAdd cli paste action (#4817) (diff)
downloadsl0ppij-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.rs15
-rw-r--r--zellij-server/src/screen.rs20
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, &current_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 {